diff --git a/Common/Util/GameConstants.cs b/Common/Util/GameConstants.cs index 13bdc32c..b4bf2ca8 100644 --- a/Common/Util/GameConstants.cs +++ b/Common/Util/GameConstants.cs @@ -3,6 +3,7 @@ public static class GameConstants { public const string GAME_VERSION = "3.2.0"; + public const string AvatarDbVersion = "20250430"; public const int GameVersionInt = 3200; public const int MAX_STAMINA = 300; public const int MAX_STAMINA_RESERVE = 2400; diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 690af4cf..6230c8e2 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -164,6 +164,8 @@ public class PlayerInstance(PlayerData data) Uid = Data.Uid; ActivityManager = new ActivityManager(this); AvatarManager = new AvatarManager(this); + AvatarManager.AvatarData.DatabaseVersion = GameConstants.AvatarDbVersion; + LineupManager = new LineupManager(this); InventoryManager = new InventoryManager(this); BattleManager = new BattleManager(this); @@ -326,12 +328,13 @@ public class PlayerInstance(PlayerData data) public async ValueTask ChangeAvatarPathType(int baseAvatarId, MultiPathAvatarTypeEnum type) { + FormalAvatarInfo avatar; if (baseAvatarId == 8001) { var id = (int)((int)type + Data.CurrentGender - 1); if (Data.CurBasicType == id) return; Data.CurBasicType = id; - var avatar = AvatarManager!.GetHero()!; + avatar = AvatarManager!.GetHero()!; // Set avatar path avatar.AvatarId = id; avatar.ValidateHero(Data.CurrentGender); @@ -343,7 +346,7 @@ public class PlayerInstance(PlayerData data) } else { - var avatar = AvatarManager!.GetFormalAvatar(baseAvatarId)!; + avatar = AvatarManager!.GetFormalAvatar(baseAvatarId)!; avatar.AvatarId = (int)type; avatar.SetCurSp(0, LineupManager!.GetCurLineup()!.IsExtraLineup()); // Save new skill tree @@ -351,6 +354,15 @@ public class PlayerInstance(PlayerData data) await SendPacket(new PacketAvatarPathChangedNotify((uint)avatar.AvatarId, (MultiPathAvatarType)type)); await SendPacket(new PacketPlayerSyncScNotify(avatar)); } + + // check if avatar is in scene + if (SceneInstance != null) + { + var avatarScene = SceneInstance.AvatarInfo.Values.FirstOrDefault(x => x.AvatarInfo.BaseAvatarId == baseAvatarId); + if (avatarScene == null) return; + + await avatarScene.ClearAllBuff(); + } } public async ValueTask ChangeAvatarSkin(int avatarId, int skinId) diff --git a/Program/Program/EntryPoint.cs b/Program/Program/EntryPoint.cs index 59d9830b..257ac326 100644 --- a/Program/Program/EntryPoint.cs +++ b/Program/Program/EntryPoint.cs @@ -287,7 +287,7 @@ public class EntryPoint var updated = false; foreach (var avatarData in DatabaseHelper.GetAllInstanceFromMap()!) { - if (avatarData.DatabaseVersion == "20250430") continue; + if (avatarData.DatabaseVersion == GameConstants.AvatarDbVersion) continue; foreach (var avatar in avatarData.Avatars) { @@ -308,6 +308,8 @@ public class EntryPoint foreach (var info in avatar.PathInfoes) { + if (info.Value.PathId == 0) + info.Value.PathId = info.Key; formalAvatar.PathInfos.Add(info.Key, new PathInfo(info.Value.PathId) { PathId = info.Value.PathId,