From a762ec8241293dd009e0a29d9a0e15d5cd60889c Mon Sep 17 00:00:00 2001 From: thexeondev <149735250+thexeondev@users.noreply.github.com> Date: Fri, 5 Jan 2024 00:17:25 +0300 Subject: [PATCH] Avatar swap, fix invisible weapons --- .../Controllers/AvatarController.cs | 13 ++++++++++++ .../Controllers/SceneController.cs | 5 +---- .../Game/Avatar/GameAvatar.cs | 3 +-- .../Game/Entity/AvatarEntity.cs | 6 ++++-- .../Game/Entity/Factory/EntityFactory.cs | 2 +- NahidaImpact.Gameserver/Game/Player.cs | 3 ++- .../Game/Scene/SceneManager.cs | 20 ++++++++++++++----- 7 files changed, 37 insertions(+), 15 deletions(-) diff --git a/NahidaImpact.Gameserver/Controllers/AvatarController.cs b/NahidaImpact.Gameserver/Controllers/AvatarController.cs index 4957ba9..3c31cf4 100644 --- a/NahidaImpact.Gameserver/Controllers/AvatarController.cs +++ b/NahidaImpact.Gameserver/Controllers/AvatarController.cs @@ -9,6 +9,19 @@ namespace NahidaImpact.Gameserver.Controllers; [NetController] internal class AvatarController : ControllerBase { + [NetCommand(CmdType.ChangeAvatarReq)] + public async ValueTask OnChangeAvatarReq(SceneManager sceneManager) + { + ChangeAvatarReq request = Packet!.DecodeBody(); + + await sceneManager.ReplaceCurrentAvatarAsync(request.Guid); + + return Response(CmdType.ChangeAvatarRsp, new ChangeAvatarRsp + { + CurGuid = request.Guid + }); + } + [NetCommand(CmdType.SetUpAvatarTeamReq)] public async ValueTask OnSetUpAvatarTeamReq(NetSession session, SceneManager sceneManager) { diff --git a/NahidaImpact.Gameserver/Controllers/SceneController.cs b/NahidaImpact.Gameserver/Controllers/SceneController.cs index 5902ee3..04a48ff 100644 --- a/NahidaImpact.Gameserver/Controllers/SceneController.cs +++ b/NahidaImpact.Gameserver/Controllers/SceneController.cs @@ -9,9 +9,6 @@ namespace NahidaImpact.Gameserver.Controllers; [NetController] internal class SceneController : ControllerBase { - // TODO: Scene management, Entity management!!! - public const uint WeaponEntityId = 100663300; - [NetCommand(CmdType.GetScenePointReq)] public ValueTask OnGetScenePointReq(SceneManager sceneManager, Player player) { @@ -37,7 +34,7 @@ internal class SceneController : ControllerBase SceneId = sceneManager.CurrentSceneId }; - for (uint i = 1; i <= 20; i++) + for (uint i = 1; i <= 100; i++) { rsp.AreaIdList.Add(i); } diff --git a/NahidaImpact.Gameserver/Game/Avatar/GameAvatar.cs b/NahidaImpact.Gameserver/Game/Avatar/GameAvatar.cs index bffd4af..600e37f 100644 --- a/NahidaImpact.Gameserver/Game/Avatar/GameAvatar.cs +++ b/NahidaImpact.Gameserver/Game/Avatar/GameAvatar.cs @@ -5,14 +5,13 @@ using NahidaImpact.Protocol; namespace NahidaImpact.Gameserver.Game.Avatar; internal class GameAvatar { - public const ulong WeaponGuid = 2281337; - public ulong Guid { get; set; } public uint AvatarId { get; set; } public uint SkillDepotId { get; set; } public uint WearingFlycloakId { get; set; } public uint BornTime { get; set; } + public ulong WeaponGuid { get; set; } public uint WeaponId { get; set; } // TODO: Weapon class! diff --git a/NahidaImpact.Gameserver/Game/Entity/AvatarEntity.cs b/NahidaImpact.Gameserver/Game/Entity/AvatarEntity.cs index 43fe47b..0c271a2 100644 --- a/NahidaImpact.Gameserver/Game/Entity/AvatarEntity.cs +++ b/NahidaImpact.Gameserver/Game/Entity/AvatarEntity.cs @@ -12,11 +12,13 @@ internal class AvatarEntity : SceneEntity public override ProtEntityType EntityType => ProtEntityType.Avatar; public uint Uid { get; } + public uint WeaponEntityId { get; } public GameAvatar GameAvatar { get; } - public AvatarEntity(GameAvatar gameAvatar, uint uid, uint entityId) : base(entityId) + public AvatarEntity(GameAvatar gameAvatar, uint uid, uint entityId, uint weaponEntityId) : base(entityId) { Uid = uid; + WeaponEntityId = ((uint)ProtEntityType.Weapon << 24) + weaponEntityId; // temporary solution, need real weapon entity object. GameAvatar = gameAvatar; Properties = gameAvatar.Properties; FightProperties = gameAvatar.FightProperties; @@ -65,7 +67,7 @@ internal class AvatarEntity : SceneEntity SkillDepotId = GameAvatar.SkillDepotId, Weapon = new SceneWeaponInfo { - EntityId = SceneController.WeaponEntityId, + EntityId = WeaponEntityId, GadgetId = 50000000 + GameAvatar.WeaponId, ItemId = GameAvatar.WeaponId, Guid = GameAvatar.WeaponGuid, diff --git a/NahidaImpact.Gameserver/Game/Entity/Factory/EntityFactory.cs b/NahidaImpact.Gameserver/Game/Entity/Factory/EntityFactory.cs index ed46456..bdb08aa 100644 --- a/NahidaImpact.Gameserver/Game/Entity/Factory/EntityFactory.cs +++ b/NahidaImpact.Gameserver/Game/Entity/Factory/EntityFactory.cs @@ -7,6 +7,6 @@ internal class EntityFactory public AvatarEntity CreateAvatar(GameAvatar gameAvatar, uint belongUid) { - return new(gameAvatar, belongUid, ++_entityIdSeed); + return new(gameAvatar, belongUid, ++_entityIdSeed, ++_entityIdSeed); } } diff --git a/NahidaImpact.Gameserver/Game/Player.cs b/NahidaImpact.Gameserver/Game/Player.cs index 0c2da5c..ac18043 100644 --- a/NahidaImpact.Gameserver/Game/Player.cs +++ b/NahidaImpact.Gameserver/Game/Player.cs @@ -57,7 +57,8 @@ internal class Player(ExcelTableCollection excelTables) WeaponId = avatarExcel.InitialWeapon, BornTime = currentTimestamp, Guid = NextGuid(), - WearingFlycloakId = 140001 + WearingFlycloakId = 140001, + WeaponGuid = NextGuid() }; avatar.InitDefaultProps(avatarExcel); diff --git a/NahidaImpact.Gameserver/Game/Scene/SceneManager.cs b/NahidaImpact.Gameserver/Game/Scene/SceneManager.cs index 1981197..4f77742 100644 --- a/NahidaImpact.Gameserver/Game/Scene/SceneManager.cs +++ b/NahidaImpact.Gameserver/Game/Scene/SceneManager.cs @@ -60,13 +60,23 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent _enterState = SceneEnterState.Complete; } + public async ValueTask ReplaceCurrentAvatarAsync(ulong replaceToGuid) + { + // TODO: add logic checks. + + AvatarEntity avatar = _teamAvatars.Find(a => a.GameAvatar.Guid == replaceToGuid) + ?? throw new ArgumentException($"ReplaceCurrentAvatar: avatar with guid {replaceToGuid} not in team!"); + + await _entityManager.SpawnEntityAsync(avatar, VisionType.Replace); + } + public async ValueTask ChangeTeamAvatarsAsync(ulong[] guidList) { _teamAvatars.Clear(); foreach (ulong guid in guidList) { - GameAvatar gameAvatar = _player.Avatars.Find(avatar => avatar.Guid == guid)!; // currently only first one + GameAvatar gameAvatar = _player.Avatars.Find(avatar => avatar.Guid == guid)!; AvatarEntity avatarEntity = _entityFactory.CreateAvatar(gameAvatar, _player.Uid); avatarEntity.SetPosition(2336.789f, 249.98896f, -751.3081f); @@ -152,9 +162,9 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent sceneTeamUpdate.SceneTeamAvatarList.Add(new SceneTeamAvatar { SceneEntityInfo = avatar.AsInfo(), - WeaponEntityId = SceneController.WeaponEntityId, + WeaponEntityId = avatar.WeaponEntityId, PlayerUid = _player.Uid, - WeaponGuid = GameAvatar.WeaponGuid, + WeaponGuid = avatar.GameAvatar.WeaponGuid, EntityId = avatar.EntityId, AvatarGuid = avatar.GameAvatar.Guid, AbilityControlBlock = avatar.BuildAbilityControlBlock(_binData), @@ -191,8 +201,8 @@ internal class SceneManager(NetSession session, Player player, EntityManager ent { AvatarGuid = avatar.GameAvatar.Guid, AvatarEntityId = avatar.EntityId, - WeaponEntityId = SceneController.WeaponEntityId, - WeaponGuid = GameAvatar.WeaponGuid + WeaponEntityId = avatar.WeaponEntityId, + WeaponGuid = avatar.GameAvatar.WeaponGuid }); }