mirror of Walter-Sparrow / lunar-tear
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Implement unique key generation for weapon grants to prevent overwrites

+27 -13
+5 -5
server/internal/service/gacha.go
··· 291 291 bs := updatedUser.Gacha.BannerStates[entry.GachaId] 292 292 nextGacha := toProtoGacha(*entry, &bs) 293 293 294 - diff := userdata.BuildDiffFromTables(userdata.SelectTables( 295 - userdata.FullClientTableMap(updatedUser), 296 - gachaDiffTables, 297 - )) 298 - userdata.AddWeaponStoryDiff(diff, updatedUser, s.handler.Granter.DrainChangedStoryWeaponIds()) 294 + changedStoryIds := s.handler.Granter.DrainChangedStoryWeaponIds() 295 + diffOrder := append(gachaDiffTables, "IUserWeaponStory") 296 + allTables := userdata.FullClientTableMap(updatedUser) 297 + diff := userdata.BuildDiffFromTablesOrdered(userdata.SelectTables(allTables, diffOrder), diffOrder) 298 + userdata.AddWeaponStoryDiff(diff, updatedUser, changedStoryIds) 299 299 300 300 return &pb.DrawResponse{ 301 301 NextGacha: nextGacha,
+9
server/internal/store/helpers.go
··· 156 156 157 157 func (g *PossessionGranter) GrantWeapon(user *UserState, weaponId int32, nowMillis int64) { 158 158 key := fmt.Sprintf("reward-weapon-%d-%d", weaponId, nowMillis) 159 + if _, exists := user.Weapons[key]; exists { 160 + for i := 2; ; i++ { 161 + candidate := fmt.Sprintf("%s-%d", key, i) 162 + if _, exists := user.Weapons[candidate]; !exists { 163 + key = candidate 164 + break 165 + } 166 + } 167 + } 159 168 user.Weapons[key] = WeaponState{ 160 169 UserWeaponUuid: key, 161 170 WeaponId: weaponId,
+4 -3
server/internal/userdata/proj_user.go
··· 42 42 }) 43 43 register("IUserGem", func(user store.UserState) string { 44 44 s, _ := encodeJSONRecords(&EntityIUserGem{ 45 - UserId: user.UserId, 46 - PaidGem: user.Gem.PaidGem, 47 - FreeGem: user.Gem.FreeGem, 45 + UserId: user.UserId, 46 + PaidGem: user.Gem.PaidGem, 47 + FreeGem: user.Gem.FreeGem, 48 + LatestVersion: gametime.NowMillis(), 48 49 }) 49 50 return s 50 51 })
+3
server/internal/userdata/state_projection.go
··· 115 115 "IUserParts", 116 116 "IUserWeaponNote", 117 117 "IUserWeaponStory", 118 + "IUserWeaponSkill", 119 + "IUserWeaponAbility", 120 + "IUserWeaponAwaken", 118 121 "IUserCostumeActiveSkill", 119 122 "IUserDeckTypeNote", 120 123 } {
+6 -5
server/internal/userdata/userdata.go
··· 107 107 LatestVersion int64 // Key(5) 108 108 } 109 109 110 - // EntityIUserGem mirrors EntityIUserGem [Key(0..2)]. 110 + // EntityIUserGem mirrors EntityIUserGem [Key(0..3)]. 111 111 type EntityIUserGem struct { 112 - _msgpack struct{} `msgpack:",asArray"` 113 - UserId int64 `json:"userId"` // Key(0) 114 - PaidGem int32 `json:"paidGem"` // Key(1) 115 - FreeGem int32 `json:"freeGem"` // Key(2) 112 + _msgpack struct{} `msgpack:",asArray"` 113 + UserId int64 `json:"userId"` // Key(0) 114 + PaidGem int32 `json:"paidGem"` // Key(1) 115 + FreeGem int32 `json:"freeGem"` // Key(2) 116 + LatestVersion int64 `json:"latestVersion"` // Key(3) 116 117 } 117 118 118 119 // EntityIUserProfile mirrors EntityIUserProfile [Key(0..7)].