From 969adeca343981bd850da28a2a8ba4c65721ecb0 Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Sat, 14 Jun 2025 16:51:41 +0800 Subject: [PATCH] feat: add valk command --- Common/Data/Excel/AvatarDataExcel.cs | 2 + Common/Database/DatabaseHelper.cs | 2 - Common/Database/Player/PlayerData.cs | 4 +- .../Message/LanguageEN.cs | 377 +----------------- GameServer/Command/Commands/CommandValk.cs | 42 ++ GameServer/Game/Avatar/AvatarManager.cs | 11 +- GameServer/Game/Inventory/InventoryManager.cs | 6 +- GameServer/Game/Player/PlayerInstance.cs | 8 + .../Send/Item/PacketGetEquipmentDataRsp.cs | 2 +- SdkServer/Handlers/Sdk/MdkController.cs | 15 +- 10 files changed, 98 insertions(+), 371 deletions(-) create mode 100644 GameServer/Command/Commands/CommandValk.cs diff --git a/Common/Data/Excel/AvatarDataExcel.cs b/Common/Data/Excel/AvatarDataExcel.cs index 2c75718..c8da8c8 100644 --- a/Common/Data/Excel/AvatarDataExcel.cs +++ b/Common/Data/Excel/AvatarDataExcel.cs @@ -9,6 +9,8 @@ public class AvatarDataExcel : ExcelResource [JsonPropertyName("unlockStar")] public int UnlockStar { get; set; } [JsonPropertyName("initialWeapon")] public int InitialWeapon { get; set; } [JsonPropertyName("skillList")] public List SkillList { get; set; } = []; + public string FaceAnimationGroupName { get; set; } = ""; + public int DefaultDressId { get; set; } public override int GetId() diff --git a/Common/Database/DatabaseHelper.cs b/Common/Database/DatabaseHelper.cs index ea4b99d..b429647 100644 --- a/Common/Database/DatabaseHelper.cs +++ b/Common/Database/DatabaseHelper.cs @@ -164,8 +164,6 @@ public class DatabaseHelper } return null; - - return null; } catch (Exception e) { diff --git a/Common/Database/Player/PlayerData.cs b/Common/Database/Player/PlayerData.cs index dc48a39..27eacef 100644 --- a/Common/Database/Player/PlayerData.cs +++ b/Common/Database/Player/PlayerData.cs @@ -15,9 +15,9 @@ public class PlayerData : BaseDatabaseDataHelper public int Exp { get; set; } = 0; public int HCoin { get; set; } = 0; public int Stamina { get; set; } = 240; - public int HeadIcon { get; set; } = 161090; + public int HeadIcon { get; set; } = 161001; public int HeadFrame { get; set; } = 200001; - public int WarshipId { get; set; } = 400004; + public int WarshipId { get; set; } = 0; public int PhonePendantId { get; set; } = 350005; public int AssistantAvatarId { get; set; } = 101; public int BirthDay { get; set; } = 0; diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index 7fd126a..aa3dcde 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -118,30 +118,8 @@ public class WordTextEN public class CommandTextEN { public NoticeTextEN Notice { get; } = new(); - - public GenderTextEN Gender { get; } = new(); - public AvatarTextEN Avatar { get; } = new(); - public AnnounceTextEN Announce { get; } = new(); - public BanTextEN Ban { get; } = new(); - public GiveTextEN Give { get; } = new(); - public GiveAllTextEN GiveAll { get; } = new(); - public LineupTextEN Lineup { get; } = new(); public HelpTextEN Help { get; } = new(); - public KickTextEN Kick { get; } = new(); - public MissionTextEN Mission { get; } = new(); - public RelicTextEN Relic { get; } = new(); - public ReloadTextEN Reload { get; } = new(); - public RogueTextEN Rogue { get; } = new(); - public SceneTextEN Scene { get; } = new(); - public UnlockAllTextEN UnlockAll { get; } = new(); - public MailTextEN Mail { get; } = new(); - public RaidTextEN Raid { get; } = new(); - public AccountTextEN Account { get; } = new(); - public UnstuckTextEN Unstuck { get; } = new(); - public SetlevelTextEN Setlevel { get; } = new(); - public PermissionTextEN Permission { get; } = new(); - public RemoveItemTextEN RemoveItem { get; } = new(); - public SkipTextEN Skip { get; } = new(); + public ValkTextEN Valk { get; } = new(); } #endregion @@ -210,98 +188,14 @@ public class ServerInfoTextEN /// public class NoticeTextEN { - public string PlayerNotFound => "Player tidak ditemukan!"; - public string InvalidArguments => "Argumen command ngawur!"; - public string NoPermission => "Ga ada akses buat make command ini!"; - public string CommandNotFound => "Ga ketemu itu command. Ketik '/help' untuk cek command yang ada."; - public string TargetNotFound => "Target {0} tidak ditemukan!"; - public string TargetOffline => "Target {0}({1}) lagi offline! Target akan di clear."; - public string TargetFound => "Online player {0}({1}) ditemukan, command selanjutnya bakal target dia secara default."; - public string InternalError => "Error menjalankan command! {0}"; -} - -/// -/// path: Game.Command.Gender -/// -public class GenderTextEN -{ - public string Desc => "Ganti gender & path"; - public string Usage => "Pengunaan: /gender [man/woman] [id path]"; - public string GenderNotSpecified => "Gender tidak ditemukan!"; - public string GenderChanged => "Gender telah diganti!"; -} - -/// -/// path: Game.Command.UnlockAll -/// -public class UnlockAllTextEN -{ - public string Desc => - "Sesuai nama, unlock semuanya." + - "'/unlockall mission' buat finish all missions. Nanti bakal di kick setelah jalanin. Ada kemungkinan bakal stuck di tutorial, gunakan dengan hati-hati" + - "'/unlockall tutorial' buat unlock all tutorials. Nanti bakal di kick setelah jalanin. Dipakai untuk ketika stuck in some pages\n" + - "'/unlockall rogue' buat unlock all rogue types. Nanti bakal di kick setelah jalanin. Pakai bersamaan dengan '/unlockall tutorial' untuk dapatkan performance yg lebih baik"; - public string Usage => "Penggunaan: /unlockall [mission/tutorial/rogue]"; - public string UnlockedAll => "Unlocked All {0}!"; -} - -/// -/// path: Game.Command.Avatar -/// -public class AvatarTextEN -{ - public string Desc => "Set properti untuk karakter yang dimiliki. Untuk target semua karakter, set Avatar ID ke -1 ya!"; - public string Usage => - "Penggunaan: /avatar talent [Avatar ID/-1] [Talent Level]\n" + - "Penggunaan: /avatar rank [Avatar ID/-1] [Rank]\n" + - "Penggunaan: /avatar level [Avatar ID/-1] [Avatar Level]"; - public string InvalidLevel => "Invalid {0} level!"; - public string AllAvatarsLevelSet => "Semua karakter {0}nya telah di set ke level {1}."; - public string AvatarLevelSet => "Karakter {0} {1}nya telah di set ke level {2}"; - public string AvatarNotFound => "Karakter tidak ditemukan!"; -} - -/// -/// path: Game.Command.Give -/// -public class GiveTextEN -{ - public string Desc => "Untuk memberi item ke player. Jangan pakai ini untuk relic."; - public string Usage => "Penggunaan: /give [item ID] l[level] x[jumlah] r[rank]"; - public string ItemNotFound => "Item tidak ditemukan!"; - public string GiveItem => "Telah diberi {0} {1} item {2}."; -} - -/// -/// path: Game.Command.GiveAll -/// -public class GiveAllTextEN -{ - public string Desc => "Untuk memberi player semua jenis item."; - public string Usage => - "Penggunaan: /giveall avatar r[rank] l[level]\n" + - "Penggunaan: /giveall material x[jumlah]\n" + - "Penggunaan: /giveall equipment r[rank] l[level] x[jumlah]\n" + - "Penggunaan: /giveall relic x[jumlah]\n" + - "Penggunaan: /giveall unlock\n" + - "Penggunaan: /giveall train\n" + - "Penggunaan: /giveall path"; - public string GiveAllItems => "Telah diberikan semua {0}, masing-masing berjumlah {1}"; -} - -/// -/// path: Game.Command.Lineup -/// -public class LineupTextEN -{ - public string Desc => "Atur properti overworld lineup. Mp = tech point, Sp = energy, heal ya heal."; - public string Usage => - "Penggunaan: /lineup mp\n" + - "Penggunaan: /lineup sp\n" + - "Penggunaan: /lineup heal"; - public string GainedMp => "Player telah diberikan tech points!"; - public string GainedSp => "Player telah diberikan energy!"; - public string HealedAllAvatars => "Satu lineup telah di heal!"; + public string PlayerNotFound => "Player not found!"; + public string InvalidArguments => "Invalid arguments!"; + public string NoPermission => "You don't have permission!"; + public string CommandNotFound => "Command not found! Type '/help' for assistance"; + public string TargetOffline => "Target {0}({1}) is offline! Clearing current target"; + public string TargetFound => "Target {0}({1}) found. Next command will default to this target"; + public string TargetNotFound => "Target {0} not found!"; + public string InternalError => "Internal error occurred while processing command!"; } /// @@ -311,257 +205,28 @@ public class HelpTextEN { public string Desc => "Show help information"; public string Usage => - "Penggunaan: /help\n" + - "Penggunaan: /help [cmd]"; + "Usage: /help\n" + + "Usage: /help [cmd]"; public string Commands => "Commands: "; - public string CommandUsage => "Penggunaan: "; - public string CommandPermission => "Level Permission Untuk Akses: "; + public string CommandUsage => "Usage: "; + public string CommandPermission => "Level Permission Untuk Access: "; public string CommandAlias => "Command Alias:"; } /// -/// path: Game.Command.Kick +/// path: Game.Command.Valk /// -public class KickTextEN +public class ValkTextEN { - public string Desc => "Kick out player"; - public string Usage => "Penggunaan: /kick"; - public string PlayerKicked => "Player {0} telah di kick!"; -} - -/// -/// path: Game.Command.Mission -/// -public class MissionTextEN -{ - public string Desc => - "Mengelola misi pemain\n" + - "Gunakan 'pass' untuk menyelesaikan semua misi yang sedang berjalan, perintah ini dapat menyebabkan lag yang parah, harap gunakan '/mission finish' sebagai gantinya\n" + - "Gunakan 'finish [SubMissionID]' untuk menyelesaikan sub-misi tertentu, silakan cari ID sub-misi di buku panduan\n" + - "Gunakan 'finishmain [MainMissionID]' untuk menyelesaikan misi utama tertentu, silakan cari ID misi utama di buku panduan\n" + - "Gunakan 'running <-all>' untuk melihat misi yang sedang dilacak, menambahkan '-all' akan menampilkan semua misi yang sedang berjalan dan kemungkinan misi yang macet, setelah digunakan, daftar misi yang lebih panjang mungkin muncul, harap diperhatikan\n" + - "Gunakan 'reaccept' untuk menerima kembali misi utama tertentu, silakan cari ID misi utama di buku panduan"; - - public string Usage => - "Penggunaan: /mission pass\n" + - "Penggunaan: /mission finish [ID Sub Misi]\n" + - "Penggunaan: /mission running\n" + - "Penggunaan: /mission reaccept [ID Misi Utama]\n" + - "Penggunaan: /mission finishmain [ID Misi Utama]"; - - public string AllMissionsFinished => "Semua tugas telah diselesaikan!"; - public string AllRunningMissionsFinished => "Sebanyak {0} tugas yang sedang berjalan telah diselesaikan!"; - public string MissionFinished => "Tugas {0} telah diselesaikan!"; - public string InvalidMissionId => "ID tugas tidak valid!"; - public string NoRunningMissions => "Tidak ada tugas yang sedang berjalan!"; - public string RunningMissions => "Tugas yang sedang berjalan: "; - public string PossibleStuckMissions => "Tugas yang kemungkinan macet: "; - public string MainMission => "Tugas utama"; - public string MissionReAccepted => "Tugas {0} telah diterima kembali!"; -} - - -/// -/// path: Game.Command.Relic -/// -public class RelicTextEN -{ - public string Desc => "Mengelola relic pemain, Batas level: 1 ≤ Level ≤ 9999"; - public string Usage => - "Penggunaan: /relic [ID relic] [ID main affix] [ID sub affix:jumlah roll] l[level] x[jumlah]\n" + - "Catatan:\n" + - "- 'ID sub affix:jumlah roll' dapat diulang hingga 4 kali.\n" + - "- Jika tidak diberikan, sub affix akan dipilih secara acak."; - public string RelicNotFound => "Relic tidak ditemukan!"; - public string InvalidMainAffixId => "ID main affix tidak valid!"; - public string InvalidSubAffixId => "ID sub affix tidak valid!"; - public string RelicGiven => "Memberikan kepada pemain @{0} {1} relic {2}, main affix {3}."; -} - - -/// -/// path: Game.Command.Reload -/// -public class ReloadTextEN -{ - public string Desc => "Muat ulang konfigurasi yang ditentukan"; - public string Usage => "Penggunaan: /reload [banner/activity]"; - public string ConfigReloaded => "Konfigurasi {0} telah dimuat ulang!"; -} - -/// -/// path: Game.Command.Rogue -/// -public class RogueTextEN -{ - public string Desc => "Command ini tidak work. Digunakan untuk mengelola data pemain dalam simulated universe, -1 berarti semua blessing, 'buff' untuk mendapatkan blessing, 'enhance' untuk meningkatkan blessing"; - public string Usage => - "Penggunaan: /rogue money [Jumlah Universe Debris]\n" + - "Penggunaan: /rogue buff [ID blessing/-1]\n" + - "Penggunaan: /rogue miracle [ID miracle]\n" + - "Penggunaan: /rogue enhance [ID blessing/-1]\n" + - "Penggunaan: /rogue unstuck - Keluar dari event"; - public string PlayerGainedMoney => "Pemain mendapatkan {0} universe debris."; - public string PlayerGainedAllItems => "Pemain mendapatkan semua {0}."; - public string PlayerGainedItem => "Pemain mendapatkan {0} {1}."; - public string PlayerEnhancedBuff => "Pemain meningkatkan blessing {0}."; - public string PlayerEnhancedAllBuffs => "Pemain meningkatkan semua blessing."; - public string PlayerUnstuck => "Pemain keluar dari event."; - public string NotFoundItem => "{0} tidak ditemukan!"; - public string PlayerNotInRogue => "Pemain tidak berada dalam simulated universe!"; -} - -/// -/// path: Game.Command.Scene -/// -public class SceneTextEN -{ - public string Desc => - "Mengelola scene pemain\n" + - "Catatan: Sebagian besar perintah dalam grup ini digunakan untuk debugging. Pastikan Anda memahami apa yang Anda lakukan sebelum menggunakan perintah apa pun.\n" + - "Gunakan 'prop' untuk mengatur status sebuah prop. Untuk daftar status, lihat Common/Enums/Scene/PropStateEnum.cs\n" + - "Gunakan 'unlockall' untuk membuka semua prop dalam scene (misalnya, mengatur semua prop yang dapat dibuka ke status 'open'). Perintah ini dapat menyebabkan game terhenti di 90% saat memuat. Gunakan '/scene reset ' untuk mengatasi masalah ini.\n" + - "Gunakan 'change' untuk memasuki scene tertentu. Untuk EntryId, lihat Resources/MapEntrance.json\n" + - "Gunakan 'reload' untuk memuat ulang scene saat ini dan kembali ke posisi awal.\n" + - "Gunakan 'reset' untuk mengatur ulang status semua prop dalam scene yang ditentukan. Untuk mengetahui FloorId saat ini, gunakan '/scene cur'."; + public string Desc => "Set attributes for owned characters\n" + + "Note: -1 means all owned characters"; public string Usage => - "Penggunaan: /scene [entry id]\n" + - "Penggunaan: /scene cur\n" + - "Penggunaan: /scene reload\n" + - "Penggunaan: /scene group\n" + - "Penggunaan: /scene unlockall\n" + - "Penggunaan: /scene reset [floor id]\n" + - "Penggunaan: /scene prop [group id] [prop id] [state]\n" + - "Penggunaan: /scene remove [entity id]\n"; - public string LoadedGroups => "Grup yang dimuat: {0}."; - public string PropStateChanged => "Prop: {0} diatur ke status {1}."; - public string PropNotFound => "Prop tidak ditemukan!"; - public string EntityRemoved => "Entity {0} telah dihapus."; - public string EntityNotFound => "Entity tidak ditemukan!"; - public string AllPropsUnlocked => "Semua prop telah dibuka!"; - public string SceneChanged => "Memasuki scene {0}."; - public string SceneReloaded => "Scene telah dimuat ulang!"; - public string SceneReset => "Status prop di floor {0} telah direset!"; - public string CurrentScene => "Scene saat ini Entry Id: {0}, Plane Id: {1}, Floor Id: {2}."; -} + "Usage: /valk add [AvatarID/-1] l s\n\n"; -/// -/// path: Game.Command.Mail -/// -public class MailTextEN -{ - public string Desc => "Mengelola mail pemain"; - public string Usage => "Penggunaan: /mail [namaPengirim] [judul] [isi] [ID1:jumlah,ID2:jumlah]"; - public string MailSent => "Surat telah dikirim!"; -} - -/// -/// path: Game.Command.Raid -/// -public class RaidTextEN -{ - public string Desc => "Mengelola scene sementara pemain"; - public string Usage => "Penggunaan: /raid leave"; - public string Leaved => "Keluar dari scene sementara!"; -} - -/// -/// path: Game.Command.Account -/// -public class AccountTextEN -{ - public string Desc => "Mengelola akun database"; - public string Usage => - "Penggunaan: /account create [username] [UID] [password]\n" + - "Penggunaan: /account delete [UID]"; - public string InvalidUid => "Argumen UID tidak valid!"; - public string InvalidAccount => "Akun {0} tidak valid!"; - public string CreateSuccess => "Akun {0} berhasil dibuat!"; - public string DeleteSuccess => "Akun {0} berhasil dihapus!"; -} - -/// -/// path: Game.Command.Announce -/// -public class AnnounceTextEN -{ - public string Desc => "Mengirim pengumuman sistem pusat"; - public string Usage => "Penggunaan: /announce [Teks] [Warna]"; - public string SendSuccess => "Pengumuman berhasil dikirim!"; -} - -/// -/// path: Game.Command.Ban -/// -public class BanTextEN -{ - public string Desc => "Blokir atau buka blokir pengguna"; - public string Usage => "Penggunaan: /ban [add/delete]"; - public string BanSuccess => "Akun telah diblokir!"; - public string UnBanSuccess => "Akun telah dibuka blokirnya!"; -} - -/// -/// path: Game.Command.Unstuck -/// -public class UnstuckTextEN -{ - public string Desc => "Teleport pemain kembali ke lokasi default"; - public string Usage => "Penggunaan: /unstuck [UID]"; - public string UnstuckSuccess => "Berhasil memindahkan pemain kembali ke lokasi default."; - public string UidNotExist => "UID tidak ditemukan!"; - public string PlayerIsOnline => "Pemain sedang online!"; -} - -/// -/// path: Game.Command.Setlevel -/// -public class SetlevelTextEN -{ - public string Desc => "Mengatur level pemain"; - public string Usage => "Penggunaan: /setlevel [Level]"; - public string SetlevelSuccess => "Berhasil mengatur level pemain!"; -} - -/// -/// path: Game.Command.Permission -/// -public class PermissionTextEN -{ - public string Desc => "Mengelola permission pemain"; - public string Usage => - "Penggunaan: /permission add [permission]\n" + - "Penggunaan: /permission remove [permission]\n" + - "Penggunaan: /permission clean [permission]"; - public string InvalidPerm => "Permission {0} tidak ditemukan!"; - public string Added => "Menambahkan permission {0} ke pemain {1}!"; - public string Removed => "Menghapus permission {1} dari pemain {0}!"; - public string Cleaned => "Menghapus semua permission dari pemain {0}!"; -} - -/// -/// path: Game.Command.RemoveItem -/// -public class RemoveItemTextEN -{ - public string Desc => "Menghapus Relic atau Lightcone"; - public string Usage => - "Penggunaan: /remove relic\n" + - "Penggunaan: /remove lightcone"; - public string InvalidPerm => "Permission {0} tidak ditemukan!"; - public string RemovedRelics => "Relic telah dihapus dari pemain {0}!"; - public string RemovedLightcones => "Lightcone telah dihapus dari pemain {0}!"; -} - -/// -/// path: Game.Command.Skip -/// -public class SkipTextEN -{ - public string Desc => "Skip 1st half MOC / PF / AS dan langsung ke 2nd half"; - public string Usage => "Penggunaan: /skip" ; - public string Success => "Berhasil menyetel skip 1st half ke {0}!"; + public string ValkNotFound => "Character does not exist!"; + public string ValkAddedAll => "Granted all characters to player!"; + public string ValkAdded => "Granted character {0} to player!"; } diff --git a/GameServer/Command/Commands/CommandValk.cs b/GameServer/Command/Commands/CommandValk.cs new file mode 100644 index 0000000..87a3a3e --- /dev/null +++ b/GameServer/Command/Commands/CommandValk.cs @@ -0,0 +1,42 @@ +using KianaBH.Data; +using KianaBH.Enums.Player; +using KianaBH.Internationalization; + +namespace KianaBH.GameServer.Command.Commands; + +[CommandInfo("valk", "Game.Command.Valk.Desc", "Game.Command.Valk.Usage", ["v"], [PermEnum.Admin, PermEnum.Support])] +public class CommandValk : ICommands +{ + [CommandMethod("add")] + public async ValueTask GetRole(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + + var valkId = arg.GetInt(0); + if (await arg.GetOption('l') is not int level) return; + if (await arg.GetOption('s') is not int star) return; + + level = Math.Clamp(level, 1, 80); + star = Math.Clamp(star, 1, 5); + + if (valkId == -1) + { + // add all + foreach (var config in GameData.AvatarData.Values) + await arg.Target!.Player!.AvatarManager!.AddAvatar(config.AvatarID, level, star,false); + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkAddedAll")); + await arg.Target!.Player!.SyncAll(); + } + else + { + var valk = await arg.Target!.Player!.AvatarManager!.AddAvatar(valkId, level, star); + if (valk == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkNotFound")); + return; + } + await arg.SendMsg(I18NManager.Translate("Game.Command.Valk.ValkAdded", + valk!.FaceAnimationGroupName ?? valkId.ToString())); + } + } +} \ No newline at end of file diff --git a/GameServer/Game/Avatar/AvatarManager.cs b/GameServer/Game/Avatar/AvatarManager.cs index 6350d49..8b2e3c0 100644 --- a/GameServer/Game/Avatar/AvatarManager.cs +++ b/GameServer/Game/Avatar/AvatarManager.cs @@ -13,16 +13,17 @@ namespace KianaBH.GameServer.Game.Avatar; public class AvatarManager(PlayerInstance player) : BasePlayerManager(player) { public AvatarData AvatarData { get; } = DatabaseHelper.GetInstanceOrCreateNew(player.Uid); - public async ValueTask AddAvatar(int avatarId, bool sync = true) + public async ValueTask AddAvatar(int avatarId, int level = 1, int? star = null, bool sync = true) { + if (AvatarData.Avatars.Any(a => a.AvatarId == avatarId)) return null; GameData.AvatarData.TryGetValue(avatarId, out var avatarExcel); if (avatarExcel == null) return null; var avatar = new AvatarInfo { - Level = 1, + Level = level, Timestamp = Extensions.GetUnixSec(), - Star = avatarExcel.UnlockStar, + Star = star ?? avatarExcel.UnlockStar, DressId = avatarExcel.DefaultDressId, DressList = {avatarExcel.DefaultDressId}, AvatarId = avatarExcel.AvatarID, @@ -39,15 +40,13 @@ public class AvatarManager(PlayerInstance player) : BasePlayerManager(player) var weapon = GameData.WeaponData.TryGetValue(avatarExcel.InitialWeapon, out var weaponConfig); if (weaponConfig != null) { - var item = await Player.InventoryManager!.AddItem(avatarExcel.InitialWeapon, 1, ItemMainTypeEnum.Weapon, weaponConfig.MaxLv, avatarId); + var item = await Player.InventoryManager!.AddItem(avatarExcel.InitialWeapon, 1, ItemMainTypeEnum.Weapon, weaponConfig.MaxLv, avatarId, sync: sync); if (item != null) { avatar.WeaponUniqueId = item!.UniqueId; }; }; - - AvatarData.Avatars.Add(avatar); if (sync) await Player.SendPacket(new PacketGetAvatarDataRsp(new List { avatar }, false)); diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index f573add..328a903 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -3,6 +3,7 @@ using KianaBH.Database; using KianaBH.Database.Inventory; using KianaBH.Enums.Item; using KianaBH.GameServer.Game.Player; +using KianaBH.GameServer.Server.Packet.Send.Item; using KianaBH.Proto; using KianaBH.Util; using static KianaBH.Proto.MasterPupilRetcode.Types; @@ -13,8 +14,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) { public InventoryData Data = DatabaseHelper.GetInstanceOrCreateNew(player.Uid); - public async ValueTask AddItem(int itemId, int count, ItemMainTypeEnum type, int level = 1, int equipAvatar = 0, bool notify = true, - bool sync = true) + public async ValueTask AddItem(int itemId, int count, ItemMainTypeEnum type, int level = 1, int equipAvatar = 0, bool sync = true) { ItemData? itemData = null; @@ -34,6 +34,8 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) break; } + if (sync) await Player.SendPacket(new PacketGetEquipmentDataRsp(Player)); + return itemData; } diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index e7d085f..77ffc5f 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -7,6 +7,8 @@ using KianaBH.GameServer.Game.Avatar; using KianaBH.GameServer.Game.Battle; using KianaBH.GameServer.Game.Inventory; using KianaBH.GameServer.Server; +using KianaBH.GameServer.Server.Packet.Send.Avatar; +using KianaBH.GameServer.Server.Packet.Send.Item; using KianaBH.KcpSharp; using KianaBH.Util.Extensions; @@ -109,5 +111,11 @@ public class PlayerInstance(PlayerData data) return Data.ToProto(); } + public async ValueTask SyncAll() + { + await SendPacket(new PacketGetEquipmentDataRsp(this)); + await SendPacket(new PacketGetAvatarDataRsp(AvatarManager!.AvatarData!.Avatars!.ToList(), true)); + } + #endregion } \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Item/PacketGetEquipmentDataRsp.cs b/GameServer/Server/Packet/Send/Item/PacketGetEquipmentDataRsp.cs index 746434c..f35a46d 100644 --- a/GameServer/Server/Packet/Send/Item/PacketGetEquipmentDataRsp.cs +++ b/GameServer/Server/Packet/Send/Item/PacketGetEquipmentDataRsp.cs @@ -8,7 +8,7 @@ public class PacketGetEquipmentDataRsp : BasePacket { public PacketGetEquipmentDataRsp(PlayerInstance player) : base(CmdIds.GetEquipmentDataRsp) { - var proto = new GetEquipmentDataRsp // TODO + var proto = new GetEquipmentDataRsp { WeaponList = { player.InventoryManager!.Data.WeaponItems.Select(weapon => weapon.ToWeaponProto()) } }; diff --git a/SdkServer/Handlers/Sdk/MdkController.cs b/SdkServer/Handlers/Sdk/MdkController.cs index 3ba6b12..1117052 100644 --- a/SdkServer/Handlers/Sdk/MdkController.cs +++ b/SdkServer/Handlers/Sdk/MdkController.cs @@ -1,5 +1,6 @@ using KianaBH.Data.Models.Sdk; using KianaBH.Database.Account; +using KianaBH.Util; using Microsoft.AspNetCore.Mvc; namespace KianaBH.SdkServer.Models.Sdk; @@ -12,13 +13,23 @@ public class MdkController : Controller { var account = AccountData.GetAccountByUserName(request.Account!); + if (account == null && !ConfigManager.Config.ServerOption.AutoCreateUser) + { + return Ok(new ResponseBase + { + Retcode = -101, + Success = false, + Message = "Account not found" + }); + }; + // Make new account - if (account == null) + if (account == null && ConfigManager.Config.ServerOption.AutoCreateUser) { AccountData.CreateAccount(request.Account!, 0, request.Password!); account = AccountData.GetAccountByUserName(request.Account!)!; - } + }; return Ok(new MdkShieldResponse {