mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 05:43:41 +03:00
Implement unique key generation for weapon grants to prevent overwrites
This commit is contained in:
@@ -291,11 +291,11 @@ func (s *GachaServiceServer) Draw(ctx context.Context, req *pb.DrawRequest) (*pb
|
||||
bs := updatedUser.Gacha.BannerStates[entry.GachaId]
|
||||
nextGacha := toProtoGacha(*entry, &bs)
|
||||
|
||||
diff := userdata.BuildDiffFromTables(userdata.SelectTables(
|
||||
userdata.FullClientTableMap(updatedUser),
|
||||
gachaDiffTables,
|
||||
))
|
||||
userdata.AddWeaponStoryDiff(diff, updatedUser, s.handler.Granter.DrainChangedStoryWeaponIds())
|
||||
changedStoryIds := s.handler.Granter.DrainChangedStoryWeaponIds()
|
||||
diffOrder := append(gachaDiffTables, "IUserWeaponStory")
|
||||
allTables := userdata.FullClientTableMap(updatedUser)
|
||||
diff := userdata.BuildDiffFromTablesOrdered(userdata.SelectTables(allTables, diffOrder), diffOrder)
|
||||
userdata.AddWeaponStoryDiff(diff, updatedUser, changedStoryIds)
|
||||
|
||||
return &pb.DrawResponse{
|
||||
NextGacha: nextGacha,
|
||||
|
||||
@@ -156,6 +156,15 @@ func (g *PossessionGranter) GrantCostume(user *UserState, costumeId int32, nowMi
|
||||
|
||||
func (g *PossessionGranter) GrantWeapon(user *UserState, weaponId int32, nowMillis int64) {
|
||||
key := fmt.Sprintf("reward-weapon-%d-%d", weaponId, nowMillis)
|
||||
if _, exists := user.Weapons[key]; exists {
|
||||
for i := 2; ; i++ {
|
||||
candidate := fmt.Sprintf("%s-%d", key, i)
|
||||
if _, exists := user.Weapons[candidate]; !exists {
|
||||
key = candidate
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
user.Weapons[key] = WeaponState{
|
||||
UserWeaponUuid: key,
|
||||
WeaponId: weaponId,
|
||||
|
||||
@@ -45,6 +45,7 @@ func init() {
|
||||
UserId: user.UserId,
|
||||
PaidGem: user.Gem.PaidGem,
|
||||
FreeGem: user.Gem.FreeGem,
|
||||
LatestVersion: gametime.NowMillis(),
|
||||
})
|
||||
return s
|
||||
})
|
||||
|
||||
@@ -115,6 +115,9 @@ func FirstEntranceClientTableMap(user store.UserState) map[string]string {
|
||||
"IUserParts",
|
||||
"IUserWeaponNote",
|
||||
"IUserWeaponStory",
|
||||
"IUserWeaponSkill",
|
||||
"IUserWeaponAbility",
|
||||
"IUserWeaponAwaken",
|
||||
"IUserCostumeActiveSkill",
|
||||
"IUserDeckTypeNote",
|
||||
} {
|
||||
|
||||
@@ -107,12 +107,13 @@ type EntityIUserStatus struct {
|
||||
LatestVersion int64 // Key(5)
|
||||
}
|
||||
|
||||
// EntityIUserGem mirrors EntityIUserGem [Key(0..2)].
|
||||
// EntityIUserGem mirrors EntityIUserGem [Key(0..3)].
|
||||
type EntityIUserGem struct {
|
||||
_msgpack struct{} `msgpack:",asArray"`
|
||||
UserId int64 `json:"userId"` // Key(0)
|
||||
PaidGem int32 `json:"paidGem"` // Key(1)
|
||||
FreeGem int32 `json:"freeGem"` // Key(2)
|
||||
LatestVersion int64 `json:"latestVersion"` // Key(3)
|
||||
}
|
||||
|
||||
// EntityIUserProfile mirrors EntityIUserProfile [Key(0..7)].
|
||||
|
||||
Reference in New Issue
Block a user