Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
ziqian zhang
Grasscutter
Commits
12501944
Commit
12501944
authored
Apr 20, 2022
by
Melledy
Browse files
Fix weapon skills (and artifact sets) not working when you equip them
parent
8a890609
Changes
4
Hide whitespace changes
Inline
Side-by-side
src/main/java/emu/grasscutter/game/avatar/GenshinAvatar.java
View file @
12501944
...
...
@@ -13,6 +13,7 @@ import dev.morphia.annotations.Indexed;
import
dev.morphia.annotations.PostLoad
;
import
dev.morphia.annotations.PrePersist
;
import
dev.morphia.annotations.Transient
;
import
emu.grasscutter.Grasscutter
;
import
emu.grasscutter.data.GenshinData
;
import
emu.grasscutter.data.common.FightPropData
;
import
emu.grasscutter.data.custom.OpenConfigEntry
;
...
...
@@ -42,6 +43,7 @@ import emu.grasscutter.game.props.FightProperty;
import
emu.grasscutter.game.props.PlayerProperty
;
import
emu.grasscutter.net.proto.AvatarFetterInfoOuterClass.AvatarFetterInfo
;
import
emu.grasscutter.net.proto.AvatarInfoOuterClass.AvatarInfo
;
import
emu.grasscutter.server.packet.send.PacketAbilityChangeNotify
;
import
emu.grasscutter.server.packet.send.PacketAvatarEquipChangeNotify
;
import
emu.grasscutter.server.packet.send.PacketAvatarFightPropNotify
;
import
emu.grasscutter.utils.ProtoHelper
;
...
...
@@ -69,7 +71,7 @@ public class GenshinAvatar {
@Transient
private
final
Int2ObjectMap
<
GenshinItem
>
equips
;
@Transient
private
final
Int2FloatOpenHashMap
fightProp
;
@Transient
private
final
Set
<
String
>
bonus
Ability
List
;
@Transient
private
Set
<
String
>
extra
Ability
Embryos
;
private
Map
<
Integer
,
Integer
>
skillLevelMap
;
// Talent levels
private
Map
<
Integer
,
Integer
>
proudSkillBonusMap
;
// Talent bonus levels (from const)
...
...
@@ -86,7 +88,7 @@ public class GenshinAvatar {
// Morhpia only!
this
.
equips
=
new
Int2ObjectOpenHashMap
<>();
this
.
fightProp
=
new
Int2FloatOpenHashMap
();
this
.
bonus
Ability
List
=
new
HashSet
<>();
this
.
extra
Ability
Embryos
=
new
HashSet
<>();
this
.
proudSkillBonusMap
=
new
HashMap
<>();
// TODO Move to genshin avatar
}
...
...
@@ -260,8 +262,8 @@ public class GenshinAvatar {
return
proudSkillBonusMap
;
}
public
Set
<
String
>
get
Bonus
Ability
List
()
{
return
bonus
Ability
List
;
public
Set
<
String
>
get
Extra
Ability
Embryos
()
{
return
extra
Ability
Embryos
;
}
public
float
getCurrentHp
()
{
...
...
@@ -347,14 +349,14 @@ public class GenshinAvatar {
item
.
setEquipCharacter
(
this
.
getAvatarId
());
item
.
save
();
if
(
this
.
getPlayer
().
hasSentAvatarDataNotify
())
{
this
.
getPlayer
().
sendPacket
(
new
PacketAvatarEquipChangeNotify
(
this
,
item
));
}
if
(
shouldRecalc
)
{
this
.
recalcStats
();
}
if
(
this
.
getPlayer
().
hasSentAvatarDataNotify
())
{
this
.
getPlayer
().
sendPacket
(
new
PacketAvatarEquipChangeNotify
(
this
,
item
));
}
return
true
;
}
...
...
@@ -371,11 +373,18 @@ public class GenshinAvatar {
}
public
void
recalcStats
()
{
recalcStats
(
false
);
}
public
void
recalcStats
(
boolean
forceSendAbilityChange
)
{
// Setup
AvatarData
data
=
this
.
getAvatarData
();
AvatarPromoteData
promoteData
=
GenshinData
.
getAvatarPromoteData
(
data
.
getAvatarPromoteId
(),
this
.
getPromoteLevel
());
Int2IntOpenHashMap
setMap
=
new
Int2IntOpenHashMap
();
this
.
getBonusAbilityList
().
clear
();
// Extra ability embryos
Set
<
String
>
prevExtraAbilityEmbryos
=
this
.
getExtraAbilityEmbryos
();
this
.
extraAbilityEmbryos
=
new
HashSet
<>();
// Get hp percent, set to 100% if none
float
hpPercent
=
this
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
)
<=
0
?
1
f
:
this
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_CUR_HP
)
/
this
.
getFightProperty
(
FightProperty
.
FIGHT_PROP_MAX_HP
);
...
...
@@ -458,7 +467,7 @@ public class GenshinAvatar {
}
// Add any skill strings from this affix
this
.
addToAbility
List
(
affix
.
getOpenConfig
(),
true
);
this
.
addTo
Extra
Ability
Embryos
(
affix
.
getOpenConfig
(),
true
);
}
else
{
break
;
}
...
...
@@ -505,7 +514,7 @@ public class GenshinAvatar {
}
// Add any skill strings from this affix
this
.
addToAbility
List
(
affix
.
getOpenConfig
(),
true
);
this
.
addTo
Extra
Ability
Embryos
(
affix
.
getOpenConfig
(),
true
);
}
}
}
...
...
@@ -538,7 +547,7 @@ public class GenshinAvatar {
}
// Add any skill strings from this proud skill
this
.
addToAbility
List
(
proudSkillData
.
getOpenConfig
(),
true
);
this
.
addTo
Extra
Ability
Embryos
(
proudSkillData
.
getOpenConfig
(),
true
);
}
// Constellations
...
...
@@ -550,7 +559,7 @@ public class GenshinAvatar {
}
// Add any skill strings from this constellation
this
.
addToAbility
List
(
avatarTalentData
.
getOpenConfig
(),
false
);
this
.
addTo
Extra
Ability
Embryos
(
avatarTalentData
.
getOpenConfig
(),
false
);
}
}
...
...
@@ -573,11 +582,17 @@ public class GenshinAvatar {
// Packet
if
(
getPlayer
()
!=
null
&&
getPlayer
().
hasSentAvatarDataNotify
())
{
// Update stats for client
getPlayer
().
sendPacket
(
new
PacketAvatarFightPropNotify
(
this
));
// Update client abilities
EntityAvatar
entity
=
this
.
getAsEntity
();
if
(
entity
!=
null
&&
(!
this
.
getExtraAbilityEmbryos
().
equals
(
prevExtraAbilityEmbryos
)
||
forceSendAbilityChange
))
{
getPlayer
().
sendPacket
(
new
PacketAbilityChangeNotify
(
entity
));
}
}
}
public
void
addToAbility
List
(
String
openConfig
,
boolean
forceAdd
)
{
public
void
addTo
Extra
Ability
Embryos
(
String
openConfig
,
boolean
forceAdd
)
{
if
(
openConfig
==
null
||
openConfig
.
length
()
==
0
)
{
return
;
}
...
...
@@ -586,14 +601,14 @@ public class GenshinAvatar {
if
(
entry
==
null
)
{
if
(
forceAdd
)
{
// Add config string to ability skill list anyways
this
.
get
Bonus
Ability
List
().
add
(
openConfig
);
this
.
get
Extra
Ability
Embryos
().
add
(
openConfig
);
}
return
;
}
if
(
entry
.
getAddAbilities
()
!=
null
)
{
for
(
String
ability
:
entry
.
getAddAbilities
())
{
this
.
get
Bonus
Ability
List
().
add
(
ability
);
this
.
get
Extra
Ability
Embryos
().
add
(
ability
);
}
}
}
...
...
src/main/java/emu/grasscutter/game/entity/EntityAvatar.java
View file @
12501944
...
...
@@ -223,8 +223,8 @@ public class EntityAvatar extends GenshinEntity {
}
}
// Add equip abilities
if
(
this
.
getAvatar
().
get
Bonus
Ability
List
().
size
()
>
0
)
{
for
(
String
skill
:
this
.
getAvatar
().
get
Bonus
Ability
List
())
{
if
(
this
.
getAvatar
().
get
Extra
Ability
Embryos
().
size
()
>
0
)
{
for
(
String
skill
:
this
.
getAvatar
().
get
Extra
Ability
Embryos
())
{
AbilityEmbryo
emb
=
AbilityEmbryo
.
newBuilder
()
.
setAbilityId
(++
embryoId
)
.
setAbilityNameHash
(
Utils
.
abilityHash
(
skill
))
...
...
src/main/java/emu/grasscutter/game/managers/InventoryManager.java
View file @
12501944
...
...
@@ -589,7 +589,6 @@ public class InventoryManager {
// Update proud skills
AvatarSkillDepotData
skillDepot
=
GenshinData
.
getAvatarSkillDepotDataMap
().
get
(
avatar
.
getSkillDepotId
());
boolean
hasAddedProudSkill
=
false
;
if
(
skillDepot
!=
null
&&
skillDepot
.
getInherentProudSkillOpens
()
!=
null
)
{
for
(
InherentProudSkillOpens
openData
:
skillDepot
.
getInherentProudSkillOpens
())
{
...
...
@@ -599,7 +598,6 @@ public class InventoryManager {
if
(
openData
.
getNeedAvatarPromoteLevel
()
==
avatar
.
getPromoteLevel
())
{
int
proudSkillId
=
(
openData
.
getProudSkillGroupId
()
*
100
)
+
1
;
if
(
GenshinData
.
getProudSkillDataMap
().
containsKey
(
proudSkillId
))
{
hasAddedProudSkill
=
true
;
avatar
.
getProudSkillList
().
add
(
proudSkillId
);
player
.
sendPacket
(
new
PacketProudSkillChangeNotify
(
avatar
));
}
...
...
@@ -607,20 +605,13 @@ public class InventoryManager {
}
}
// Racalc stats and save avatar
avatar
.
recalcStats
();
avatar
.
save
();
// Resend ability embryos if proud skill has been added
if
(
hasAddedProudSkill
&&
avatar
.
getAsEntity
()
!=
null
)
{
player
.
sendPacket
(
new
PacketAbilityChangeNotify
(
avatar
.
getAsEntity
()));
}
// TODO Send entity prop update packet to world
// Packets
player
.
sendPacket
(
new
PacketAvatarPropNotify
(
avatar
));
player
.
sendPacket
(
new
PacketAvatarPromoteRsp
(
avatar
));
// TODO Send entity prop update packet to world
avatar
.
recalcStats
(
true
);
avatar
.
save
();
}
public
void
upgradeAvatar
(
GenshinPlayer
player
,
long
guid
,
int
itemId
,
int
count
)
{
...
...
@@ -827,25 +818,20 @@ public class InventoryManager {
// Apply + recalc
avatar
.
getTalentIdList
().
add
(
talentData
.
getId
());
avatar
.
setCoreProudSkillLevel
(
currentTalentLevel
+
1
);
avatar
.
recalcStats
();
// Packet
player
.
sendPacket
(
new
PacketAvatarUnlockTalentNotify
(
avatar
,
nextTalentId
));
player
.
sendPacket
(
new
PacketUnlockAvatarTalentRsp
(
avatar
,
nextTalentId
));
// Proud skill bonus map
// Proud skill bonus map
(Extra skills)
OpenConfigEntry
entry
=
GenshinData
.
getOpenConfigEntries
().
get
(
talentData
.
getOpenConfig
());
if
(
entry
!=
null
&&
entry
.
getExtraTalentIndex
()
>
0
)
{
avatar
.
recalcProudSkillBonusMap
();
player
.
sendPacket
(
new
PacketProudSkillExtraLevelNotify
(
avatar
,
entry
.
getExtraTalentIndex
()));
}
// Resend ability embryos
if
(
avatar
.
getAsEntity
()
!=
null
)
{
player
.
sendPacket
(
new
PacketAbilityChangeNotify
(
avatar
.
getAsEntity
()));
}
// Save avatar
// Recalc + save avatar
avatar
.
recalcStats
(
true
);
avatar
.
save
();
}
...
...
src/main/java/emu/grasscutter/server/packet/send/PacketAbilityChangeNotify.java
View file @
12501944
...
...
@@ -8,8 +8,8 @@ import emu.grasscutter.net.proto.AbilityChangeNotifyOuterClass.AbilityChangeNoti
public
class
PacketAbilityChangeNotify
extends
GenshinPacket
{
public
PacketAbilityChangeNotify
(
EntityAvatar
entity
)
{
super
(
PacketOpcodes
.
AbilityChangeNotify
);
super
(
PacketOpcodes
.
AbilityChangeNotify
,
true
);
AbilityChangeNotify
proto
=
AbilityChangeNotify
.
newBuilder
()
.
setEntityId
(
entity
.
getId
())
.
setAbilityControlBlock
(
entity
.
getAbilityControlBlock
())
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment