diff --git a/Source/Game/Chat/Commands/DisableCommands.cs b/Source/Game/Chat/Commands/DisableCommands.cs index bf8837fa6..99f701ec4 100644 --- a/Source/Game/Chat/Commands/DisableCommands.cs +++ b/Source/Game/Chat/Commands/DisableCommands.cs @@ -14,88 +14,91 @@ namespace Game.Chat.Commands [CommandGroup("add")] class DisableAddCommands { - static bool HandleAddDisables(uint entry, uint flags, string disableComment, CommandHandler handler, DisableType disableType) + static bool HandleAddDisables(CommandHandler handler, DisableType disableType, uint entry, uint? flags, Tail disableComment) { - if (entry == 0) - return false; - - if (disableComment.IsEmpty()) - return false; - switch (disableType) { case DisableType.Spell: + { + if (!Global.SpellMgr.HasSpellInfo(entry, Difficulty.None)) { - if (!Global.SpellMgr.HasSpellInfo(entry, Difficulty.None)) - { - handler.SendSysMessage(CypherStrings.CommandNospellfound); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNospellfound); + return false; } + break; + } case DisableType.Quest: + { + if (Global.ObjectMgr.GetQuestTemplate(entry) == null) { - if (Global.ObjectMgr.GetQuestTemplate(entry) == null) - { - handler.SendSysMessage(CypherStrings.CommandNoquestfound, entry); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNoquestfound, entry); + return false; } + break; + } case DisableType.Map: + { + if (!CliDB.MapStorage.ContainsKey(entry)) { - if (!CliDB.MapStorage.ContainsKey(entry)) - { - handler.SendSysMessage(CypherStrings.CommandNomapfound); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNomapfound); + return false; } + break; + } case DisableType.Battleground: + { + if (!CliDB.BattlemasterListStorage.ContainsKey(entry)) { - if (!CliDB.BattlemasterListStorage.ContainsKey(entry)) - { - handler.SendSysMessage(CypherStrings.CommandNoBattlegroundFound); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNoBattlegroundFound); + return false; } + break; + } case DisableType.Criteria: + { + if (Global.CriteriaMgr.GetCriteria(entry) == null) { - if (Global.CriteriaMgr.GetCriteria(entry) == null) - { - handler.SendSysMessage(CypherStrings.CommandNoAchievementCriteriaFound); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNoAchievementCriteriaFound); + return false; } + break; + } case DisableType.OutdoorPVP: + { + if (entry > (int)OutdoorPvPTypes.Max) { - if (entry > (int)OutdoorPvPTypes.Max) - { - handler.SendSysMessage(CypherStrings.CommandNoOutdoorPvpForund); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNoOutdoorPvpForund); + return false; } + break; + } case DisableType.VMAP: + { + if (!CliDB.MapStorage.ContainsKey(entry)) { - if (!CliDB.MapStorage.ContainsKey(entry)) - { - handler.SendSysMessage(CypherStrings.CommandNomapfound); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNomapfound); + return false; } + break; + } case DisableType.MMAP: + { + if (!CliDB.MapStorage.ContainsKey(entry)) { - if (!CliDB.MapStorage.ContainsKey(entry)) - { - handler.SendSysMessage(CypherStrings.CommandNomapfound); - return false; - } - break; + handler.SendSysMessage(CypherStrings.CommandNomapfound); + return false; } + break; + } + case DisableType.LFGMap: + { + if (!CliDB.MapStorage.ContainsKey(entry)) + { + handler.SendSysMessage(CypherStrings.CommandNomapfound); + return false; + } + break; + } default: break; } @@ -113,7 +116,7 @@ namespace Game.Chat.Commands stmt = WorldDatabase.GetPreparedStatement(WorldStatements.INS_DISABLES); stmt.AddValue(0, entry); stmt.AddValue(1, (byte)disableType); - stmt.AddValue(2, flags); + stmt.AddValue(2, flags.GetValueOrDefault(0)); stmt.AddValue(3, disableComment); DB.World.Execute(stmt); @@ -122,62 +125,59 @@ namespace Game.Chat.Commands } [Command("spell", RBACPermissions.CommandDisableAddSpell, true)] - static bool HandleAddDisableSpellCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableSpellCommand(CommandHandler handler, uint entry, uint? flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Spell); + return HandleAddDisables(handler, DisableType.Spell, entry, flags, disableComment); } [Command("quest", RBACPermissions.CommandDisableAddQuest, true)] - static bool HandleAddDisableQuestCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableQuestCommand(CommandHandler handler, uint entry, uint? flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Quest); + return HandleAddDisables(handler, DisableType.Quest, entry, flags, disableComment); } [Command("map", RBACPermissions.CommandDisableAddMap, true)] - static bool HandleAddDisableMapCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableMapCommand(CommandHandler handler, uint entry, uint? flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Map); + return HandleAddDisables(handler, DisableType.Map, entry, flags, disableComment); } [Command("Battleground", RBACPermissions.CommandDisableAddBattleground, true)] - static bool HandleAddDisableBattlegroundCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableBattlegroundCommand(CommandHandler handler, uint entry, uint flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Battleground); + return HandleAddDisables(handler, DisableType.Battleground, entry, flags, disableComment); } [Command("criteria", RBACPermissions.CommandDisableAddCriteria, true)] - static bool HandleAddDisableCriteriaCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableCriteriaCommand(CommandHandler handler, uint entry, uint flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.Criteria); + return HandleAddDisables(handler, DisableType.Criteria, entry, flags, disableComment); } [Command("outdoorpvp", RBACPermissions.CommandDisableAddOutdoorpvp, true)] - static bool HandleAddDisableOutdoorPvPCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableOutdoorPvPCommand(CommandHandler handler, uint entry, uint flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.OutdoorPVP); + return HandleAddDisables(handler, DisableType.OutdoorPVP, entry, flags, disableComment); } [Command("vmap", RBACPermissions.CommandDisableAddVmap, true)] - static bool HandleAddDisableVmapCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableVmapCommand(CommandHandler handler, uint entry, uint flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.VMAP); + return HandleAddDisables(handler, DisableType.VMAP, entry, flags, disableComment); } [Command("mmap", RBACPermissions.CommandDisableAddMmap, true)] - static bool HandleAddDisableMMapCommand(CommandHandler handler, uint entry, uint flags, string disableComment) + static bool HandleAddDisableMMapCommand(CommandHandler handler, uint entry, uint flags, Tail disableComment) { - return HandleAddDisables(entry, flags, disableComment, handler, DisableType.MMAP); + return HandleAddDisables(handler, DisableType.MMAP, entry, flags, disableComment); } } [CommandGroup("remove")] class DisableRemoveCommands { - static bool HandleRemoveDisables(uint entry, CommandHandler handler, DisableType disableType) + static bool HandleRemoveDisables(CommandHandler handler, DisableType disableType, uint entry) { - if (entry == 0) - return false; - PreparedStatement stmt = WorldDatabase.GetPreparedStatement(WorldStatements.SEL_DISABLES); stmt.AddValue(0, entry); stmt.AddValue(1, (byte)disableType); @@ -200,49 +200,49 @@ namespace Game.Chat.Commands [Command("spell", RBACPermissions.CommandDisableRemoveSpell, true)] static bool HandleRemoveDisableSpellCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.Spell); + return HandleRemoveDisables(handler, DisableType.Spell, entry); } [Command("quest", RBACPermissions.CommandDisableRemoveQuest, true)] static bool HandleRemoveDisableQuestCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.Quest); + return HandleRemoveDisables(handler, DisableType.Quest, entry); } [Command("map", RBACPermissions.CommandDisableRemoveMap, true)] static bool HandleRemoveDisableMapCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.Map); + return HandleRemoveDisables(handler, DisableType.Map, entry); } [Command("Battleground", RBACPermissions.CommandDisableRemoveBattleground, true)] static bool HandleRemoveDisableBattlegroundCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.Battleground); + return HandleRemoveDisables(handler, DisableType.Battleground, entry); } [Command("criteria", RBACPermissions.CommandDisableRemoveCriteria, true)] static bool HandleRemoveDisableCriteriaCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.Criteria); + return HandleRemoveDisables(handler, DisableType.Criteria, entry); } [Command("outdoorpvp", RBACPermissions.CommandDisableRemoveOutdoorpvp, true)] static bool HandleRemoveDisableOutdoorPvPCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.OutdoorPVP); + return HandleRemoveDisables(handler, DisableType.OutdoorPVP, entry); } [Command("vmap", RBACPermissions.CommandDisableRemoveVmap, true)] static bool HandleRemoveDisableVmapCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.VMAP); + return HandleRemoveDisables(handler, DisableType.VMAP, entry); } [Command("mmap", RBACPermissions.CommandDisableRemoveMmap, true)] static bool HandleRemoveDisableMMapCommand(CommandHandler handler, uint entry) { - return HandleRemoveDisables(entry, handler, DisableType.MMAP); + return HandleRemoveDisables(handler, DisableType.MMAP, entry); } } } diff --git a/Source/Game/Chat/Commands/GroupCommands.cs b/Source/Game/Chat/Commands/GroupCommands.cs index 8058803a8..84ce84706 100644 --- a/Source/Game/Chat/Commands/GroupCommands.cs +++ b/Source/Game/Chat/Commands/GroupCommands.cs @@ -133,40 +133,22 @@ namespace Game.Chat } [Command("list", RBACPermissions.CommandGroupList)] - static bool HandleGroupListCommand(CommandHandler handler, StringArguments args) + static bool HandleGroupListCommand(CommandHandler handler, PlayerIdentifier target) { - // Get ALL the variables! - Player playerTarget; - ObjectGuid guidTarget; - string nameTarget; - string zoneName = ""; - string onlineState; - - // Parse the guid to uint32... - ObjectGuid parseGUID = ObjectGuid.Create(HighGuid.Player, args.NextUInt64()); - - // ... and try to extract a player out of it. - if (Global.CharacterCacheStorage.GetCharacterNameByGuid(parseGUID, out nameTarget)) - { - playerTarget = Global.ObjAccessor.FindPlayer(parseGUID); - guidTarget = parseGUID; - } - // If not, we return false and end right away. - else if (!handler.ExtractPlayerTarget(args, out playerTarget, out guidTarget, out nameTarget)) - return false; + string zoneName = ""; + string onlineState = "Offline"; // Next, we need a group. So we define a group variable. Group groupTarget = null; // We try to extract a group from an online player. - if (playerTarget) - groupTarget = playerTarget.GetGroup(); - - // If not, we extract it from the SQL. - if (!groupTarget) + if (target.IsConnected()) + groupTarget = target.GetConnectedPlayer().GetGroup(); + else { + // If not, we extract it from the SQL. PreparedStatement stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_GROUP_MEMBER); - stmt.AddValue(0, guidTarget.GetCounter()); + stmt.AddValue(0, target.GetGUID().GetCounter()); SQLResult resultGroup = DB.Characters.Query(stmt); if (!resultGroup.IsEmpty()) groupTarget = Global.GroupMgr.GetGroupByDbStoreId(resultGroup.Read(0)); @@ -175,7 +157,7 @@ namespace Game.Chat // If both fails, players simply has no party. Return false. if (!groupTarget) { - handler.SendSysMessage(CypherStrings.GroupNotInGroup, nameTarget); + handler.SendSysMessage(CypherStrings.GroupNotInGroup, target.GetName()); return false; } @@ -228,12 +210,6 @@ namespace Game.Chat zoneName = zone.AreaName[handler.GetSessionDbcLocale()]; } } - else - { - // ... else, everything is set to offline or neutral values. - zoneName = ""; - onlineState = "Offline"; - } // Now we can print those informations for every single member of each group! handler.SendSysMessage(CypherStrings.GroupPlayerNameGuid, slot.name, onlineState, diff --git a/Source/Game/Chat/Commands/GuildCommands.cs b/Source/Game/Chat/Commands/GuildCommands.cs index b6c498270..e581b7c73 100644 --- a/Source/Game/Chat/Commands/GuildCommands.cs +++ b/Source/Game/Chat/Commands/GuildCommands.cs @@ -167,20 +167,23 @@ namespace Game.Chat } [Command("info", RBACPermissions.CommandGuildInfo, true)] - static bool HandleGuildInfoCommand(CommandHandler handler, StringArguments args) + static bool HandleGuildInfoCommand(CommandHandler handler, [OptionalArg][VariantArg(typeof(ulong), typeof(string))] dynamic guildIdentifier) { Guild guild = null; - Player target = handler.GetSelectedPlayerOrSelf(); - if (!args.Empty() && args[0] != '\0') + if (guildIdentifier != null) { - if (char.IsDigit(args[0])) - guild = Global.GuildMgr.GetGuildById(args.NextUInt64()); + if (guildIdentifier is ulong) + guild = Global.GuildMgr.GetGuildById(guildIdentifier); else - guild = Global.GuildMgr.GetGuildByName(args.NextString()); + guild = Global.GuildMgr.GetGuildByName(guildIdentifier); + } + else + { + PlayerIdentifier target = PlayerIdentifier.FromTargetOrSelf(handler); + if (target != null && target.IsConnected()) + guild = target.GetConnectedPlayer().GetGuild(); } - else if (target) - guild = target.GetGuild(); if (!guild) return false; diff --git a/Source/Game/Chat/Commands/MiscCommands.cs b/Source/Game/Chat/Commands/MiscCommands.cs index bfd95be1e..6167ba887 100644 --- a/Source/Game/Chat/Commands/MiscCommands.cs +++ b/Source/Game/Chat/Commands/MiscCommands.cs @@ -213,51 +213,8 @@ namespace Game.Chat } [CommandNonGroup("damage", RBACPermissions.CommandDamage)] - static bool HandleDamageCommand(CommandHandler handler, StringArguments args) + static bool HandleDamageCommand(CommandHandler handler, uint damage, SpellSchools? school, [OptionalArg]SpellInfo spellInfo) { - if (args.Empty()) - return false; - - string str = args.NextString(); - - if (str == "go") - { - ulong guidLow = args.NextUInt64(); - if (guidLow == 0) - { - handler.SendSysMessage(CypherStrings.BadValue); - return false; - } - - int damage = args.NextInt32(); - if (damage == 0) - { - handler.SendSysMessage(CypherStrings.BadValue); - return false; - } - Player player = handler.GetSession().GetPlayer(); - if (player) - { - GameObject go = handler.GetObjectFromPlayerMapByDbGuid(guidLow); - if (!go) - { - handler.SendSysMessage(CypherStrings.CommandObjnotfound, guidLow); - return false; - } - - if (!go.IsDestructibleBuilding()) - { - handler.SendSysMessage(CypherStrings.InvalidGameobjectType); - return false; - } - - go.ModifyHealth(-damage, player); - handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), guidLow, -damage, go.GetGoValue().Building.Health); - } - - return true; - } - Unit target = handler.GetSelectedUnit(); if (!target || handler.GetSession().GetPlayer().GetTarget().IsEmpty()) { @@ -272,74 +229,72 @@ namespace Game.Chat if (!target.IsAlive()) return true; - if (!int.TryParse(str, out int damage_int)) - return false; - - if (damage_int <= 0) - return true; - - uint damage_ = (uint)damage_int; - - string schoolStr = args.NextString(); - Player attacker = handler.GetSession().GetPlayer(); // flat melee damage without resistence/etc reduction - if (string.IsNullOrEmpty(schoolStr)) + if (school.HasValue) { - Unit.DealDamage(attacker, target, damage_, null, DamageEffectType.Direct, SpellSchoolMask.Normal, null, false); + Unit.DealDamage(attacker, target, damage, null, DamageEffectType.Direct, SpellSchoolMask.Normal, null, false); if (target != attacker) - attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, SpellSchoolMask.Normal, damage_, 0, 0, VictimState.Hit, 0); + attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, SpellSchoolMask.Normal, damage, 0, 0, VictimState.Hit, 0); return true; } - if (!int.TryParse(schoolStr, out int school) || school >= (int)SpellSchools.Max) - return false; - - SpellSchoolMask schoolmask = (SpellSchoolMask)(1 << school); + SpellSchoolMask schoolmask = (SpellSchoolMask)(1 << (int)school.Value); if (Unit.IsDamageReducedByArmor(schoolmask)) - damage_ = Unit.CalcArmorReducedDamage(handler.GetPlayer(), target, damage_, null, WeaponAttackType.BaseAttack); - - string spellStr = args.NextString(); + damage = Unit.CalcArmorReducedDamage(handler.GetPlayer(), target, damage, null, WeaponAttackType.BaseAttack); // melee damage by specific school - if (string.IsNullOrEmpty(spellStr)) + if (spellInfo == null) { - DamageInfo dmgInfo = new(attacker, target, damage_, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack); + DamageInfo dmgInfo = new(attacker, target, damage, null, schoolmask, DamageEffectType.SpellDirect, WeaponAttackType.BaseAttack); Unit.CalcAbsorbResist(dmgInfo); if (dmgInfo.GetDamage() == 0) return true; - damage_ = dmgInfo.GetDamage(); + damage = dmgInfo.GetDamage(); uint absorb = dmgInfo.GetAbsorb(); uint resist = dmgInfo.GetResist(); - Unit.DealDamageMods(attacker, target, ref damage_, ref absorb); - Unit.DealDamage(attacker, target, damage_, null, DamageEffectType.Direct, schoolmask, null, false); - attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, schoolmask, damage_, absorb, resist, VictimState.Hit, 0); + Unit.DealDamageMods(attacker, target, ref damage, ref absorb); + Unit.DealDamage(attacker, target, damage, null, DamageEffectType.Direct, schoolmask, null, false); + attacker.SendAttackStateUpdate(HitInfo.AffectsVictim, target, schoolmask, damage, absorb, resist, VictimState.Hit, 0); return true; } // non-melee damage - // number or [name] Shift-click form |color|Hspell:spell_id|h[name]|h|r or Htalent form - uint spellid = handler.ExtractSpellIdFromLink(args); - if (spellid == 0) - return false; - - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellid, attacker.GetMap().GetDifficultyID()); - if (spellInfo == null) - return false; SpellNonMeleeDamage damageInfo = new(attacker, target, spellInfo, new SpellCastVisual(spellInfo.GetSpellXSpellVisualId(attacker), 0), spellInfo.SchoolMask); - damageInfo.damage = damage_; + damageInfo.damage = damage; Unit.DealDamageMods(damageInfo.attacker, damageInfo.target, ref damageInfo.damage, ref damageInfo.absorb); target.DealSpellDamage(damageInfo, true); target.SendSpellNonMeleeDamageLog(damageInfo); return true; } + [CommandNonGroup("damage go", RBACPermissions.CommandDamage)] + static bool HandleDamageGoCommand(CommandHandler handler, ulong spawnId, int damage) + { + GameObject go = handler.GetObjectFromPlayerMapByDbGuid(spawnId); + if (go == null) + { + handler.SendSysMessage(CypherStrings.CommandObjnotfound, spawnId); + return false; + } + + if (!go.IsDestructibleBuilding()) + { + handler.SendSysMessage(CypherStrings.InvalidGameobjectType); + return false; + } + + go.ModifyHealth(-damage, handler.GetSession().GetPlayer()); + handler.SendSysMessage(CypherStrings.GameobjectDamaged, go.GetName(), spawnId, -damage, go.GetGoValue().Building.Health); + return true; + } + [CommandNonGroup("dev", RBACPermissions.CommandDev)] static bool HandleDevCommand(CommandHandler handler, bool? enableArg) { @@ -1149,27 +1104,20 @@ namespace Game.Chat } [CommandNonGroup("pinfo", RBACPermissions.CommandPinfo, true)] - static bool HandlePInfoCommand(CommandHandler handler, StringArguments args) + static bool HandlePInfoCommand(CommandHandler handler, [OptionalArg]PlayerIdentifier arg) { - // Define ALL the player variables! - Player target; - ObjectGuid targetGuid; - string targetName; - PreparedStatement stmt; + if (arg == null) + arg = PlayerIdentifier.FromTargetOrSelf(handler); - // To make sure we get a target, we convert our guid to an omniversal... - ObjectGuid parseGUID = ObjectGuid.Create(HighGuid.Player, args.NextUInt64()); - - // ... and make sure we get a target, somehow. - if (Global.CharacterCacheStorage.GetCharacterNameByGuid(parseGUID, out targetName)) - { - target = Global.ObjAccessor.FindPlayer(parseGUID); - targetGuid = parseGUID; - } - // if not, then return false. Which shouldn't happen, now should it ? - else if (!handler.ExtractPlayerTarget(args, out target, out targetGuid, out targetName)) + if (arg == null) return false; + // Define ALL the player variables! + Player target = arg.GetConnectedPlayer(); + ObjectGuid targetGuid = arg.GetGUID(); + string targetName = arg.GetName(); + PreparedStatement stmt; + /* The variables we extract for the command. They are * default as "does not exist" to prevent problems * The output is printed in the follow manner: diff --git a/Source/Game/Chat/Commands/ModifyCommands.cs b/Source/Game/Chat/Commands/ModifyCommands.cs index 2dd4e175b..43e5627cd 100644 --- a/Source/Game/Chat/Commands/ModifyCommands.cs +++ b/Source/Game/Chat/Commands/ModifyCommands.cs @@ -94,10 +94,8 @@ namespace Game.Chat } [Command("faction", RBACPermissions.CommandModifyFaction)] - static bool HandleModifyFactionCommand(CommandHandler handler, StringArguments args) + static bool HandleModifyFactionCommand(CommandHandler handler, uint? factionid, uint? flag, ulong? npcflag, uint? dyflag) { - string pfactionid = handler.ExtractKeyFromLink(args, "Hfaction"); - Creature target = handler.GetSelectedCreature(); if (!target) { @@ -105,34 +103,30 @@ namespace Game.Chat return false; } - if (!uint.TryParse(pfactionid, out uint factionid)) + if (!flag.HasValue) + flag = target.m_unitData.Flags; + + if (!npcflag.HasValue) + npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1]; + + if (!dyflag.HasValue) + dyflag = target.m_objectData.DynamicFlags; + + if (!factionid.HasValue) { - uint _factionid = target.GetFaction(); - uint _flag = target.m_unitData.Flags; - ulong _npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1]; - uint _dyflag = target.m_objectData.DynamicFlags; - handler.SendSysMessage(CypherStrings.CurrentFaction, target.GetGUID().ToString(), _factionid, _flag, _npcflag, _dyflag); + handler.SendSysMessage(CypherStrings.CurrentFaction, target.GetGUID().ToString(), factionid.Value, flag.Value, npcflag.Value, dyflag.Value); return true; } - if (!uint.TryParse(args.NextString(), out uint flag)) - flag = target.m_unitData.Flags; - - if (!ulong.TryParse(args.NextString(), out ulong npcflag)) - npcflag = (ulong)target.m_unitData.NpcFlags[0] << 32 | target.m_unitData.NpcFlags[1]; - - if (!uint.TryParse(args.NextString(), out uint dyflag)) - dyflag = target.m_objectData.DynamicFlags; - - if (!CliDB.FactionTemplateStorage.ContainsKey(factionid)) + if (!CliDB.FactionTemplateStorage.ContainsKey(factionid.Value)) { - handler.SendSysMessage(CypherStrings.WrongFaction, factionid); + handler.SendSysMessage(CypherStrings.WrongFaction, factionid.Value); return false; } - handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid, flag, npcflag, dyflag); + handler.SendSysMessage(CypherStrings.YouChangeFaction, target.GetGUID().ToString(), factionid.Value, flag.Value, npcflag.Value, dyflag.Value); - target.SetFaction(factionid); + target.SetFaction(factionid.Value); target.ReplaceAllUnitFlags((UnitFlags)flag); target.ReplaceAllNpcFlags((NPCFlags)(npcflag & 0xFFFFFFFF)); target.ReplaceAllNpcFlags2((NPCFlags2)(npcflag >> 32)); @@ -208,14 +202,8 @@ namespace Game.Chat } [Command("mount", RBACPermissions.CommandModifyMount)] - static bool HandleModifyMountCommand(CommandHandler handler, StringArguments args) + static bool HandleModifyMountCommand(CommandHandler handler, uint mount, float speed) { - if (args.Empty()) - return false; - - if (!uint.TryParse(args.NextString(), out uint mount)) - return false; - if (!CliDB.CreatureDisplayInfoStorage.HasRecord(mount)) { handler.SendSysMessage(CypherStrings.NoMount); @@ -233,8 +221,7 @@ namespace Game.Chat if (handler.HasLowerSecurity(target, ObjectGuid.Empty)) return false; - float speed; - if (!CheckModifySpeed(args, handler, target, out speed, 0.1f, 50.0f)) + if (!CheckModifySpeed(handler, target, speed, 0.1f, 50.0f)) return false; NotifyModification(handler, target, CypherStrings.YouGiveMount, CypherStrings.MountGived); @@ -440,14 +427,8 @@ namespace Game.Chat } [Command("phase", RBACPermissions.CommandModifyPhase)] - static bool HandleModifyPhaseCommand(CommandHandler handler, StringArguments args) + static bool HandleModifyPhaseCommand(CommandHandler handler, uint phaseId, uint? visibleMapId) { - if (args.Empty()) - return false; - - uint phaseId = args.NextUInt32(); - uint visibleMapId = args.NextUInt32(); - if (phaseId != 0 && !CliDB.PhaseStorage.ContainsKey(phaseId)) { handler.SendSysMessage(CypherStrings.PhaseNotfound); @@ -456,19 +437,19 @@ namespace Game.Chat Unit target = handler.GetSelectedUnit(); - if (visibleMapId != 0) + if (visibleMapId.HasValue) { - MapRecord visibleMap = CliDB.MapStorage.LookupByKey(visibleMapId); + MapRecord visibleMap = CliDB.MapStorage.LookupByKey(visibleMapId.Value); if (visibleMap == null || visibleMap.ParentMapID != target.GetMapId()) { handler.SendSysMessage(CypherStrings.PhaseNotfound); return false; } - if (!target.GetPhaseShift().HasVisibleMapId(visibleMapId)) - PhasingHandler.AddVisibleMapId(target, visibleMapId); + if (!target.GetPhaseShift().HasVisibleMapId(visibleMapId.Value)) + PhasingHandler.AddVisibleMapId(target, visibleMapId.Value); else - PhasingHandler.RemoveVisibleMapId(target, visibleMapId); + PhasingHandler.RemoveVisibleMapId(target, visibleMapId.Value); } if (phaseId != 0) @@ -686,22 +667,17 @@ namespace Game.Chat } [CommandNonGroup("morph", RBACPermissions.CommandMorph)] - static bool HandleModifyMorphCommand(CommandHandler handler, StringArguments args) + static bool HandleModifyMorphCommand(CommandHandler handler, uint displayId) { - if (args.Empty()) - return false; - - uint display_id = args.NextUInt32(); - Unit target = handler.GetSelectedUnit(); - if (!target) + if (target == null) target = handler.GetSession().GetPlayer(); // check online security else if (target.IsTypeId(TypeId.Player) && handler.HasLowerSecurity(target.ToPlayer(), ObjectGuid.Empty)) return false; - target.SetDisplayId(display_id); + target.SetDisplayId(displayId); return true; } @@ -842,14 +818,8 @@ namespace Game.Chat return true; } - static bool CheckModifySpeed(StringArguments args, CommandHandler handler, Unit target, out float speed, float minimumBound, float maximumBound, bool checkInFlight = true) + static bool CheckModifySpeed(CommandHandler handler, Unit target, float speed, float minimumBound, float maximumBound, bool checkInFlight = true) { - speed = 0f; - if (args.Empty()) - return false; - - speed = args.NextSingle(); - if (speed > maximumBound || speed < minimumBound) { handler.SendSysMessage(CypherStrings.BadValue); @@ -877,5 +847,16 @@ namespace Game.Chat } return true; } + + static bool CheckModifySpeed(CommandHandler handler, StringArguments args, Unit target, out float speed, float minimumBound, float maximumBound, bool checkInFlight = true) + { + speed = 0f; + + if (args.Empty()) + return false; + + speed = (float)args.NextSingle(); + return CheckModifySpeed(handler, target, speed, minimumBound, maximumBound, checkInFlight); + } } } diff --git a/Source/Game/Chat/Commands/PetCommands.cs b/Source/Game/Chat/Commands/PetCommands.cs index 171d67b94..8961928e2 100644 --- a/Source/Game/Chat/Commands/PetCommands.cs +++ b/Source/Game/Chat/Commands/PetCommands.cs @@ -62,7 +62,7 @@ namespace Game.Chat } [Command("learn", RBACPermissions.CommandPetLearn)] - static bool HandlePetLearnCommand(CommandHandler handler, uint spellId) + static bool HandlePetLearnCommand(CommandHandler handler, SpellInfo spellInfo) { Pet pet = GetSelectedPlayerPetOrOwn(handler); if (!pet) @@ -71,8 +71,7 @@ namespace Game.Chat return false; } - if (spellId == 0 || !Global.SpellMgr.HasSpellInfo(spellId, Difficulty.None)) - return false; + uint spellId = spellInfo.Id; // Check if pet already has it if (pet.HasSpell(spellId)) @@ -82,8 +81,7 @@ namespace Game.Chat } // Check if spell is valid - SpellInfo spellInfo = Global.SpellMgr.GetSpellInfo(spellId, Difficulty.None); - if (spellInfo == null || !Global.SpellMgr.IsSpellValid(spellInfo)) + if (!Global.SpellMgr.IsSpellValid(spellInfo)) { handler.SendSysMessage(CypherStrings.CommandSpellBroken, spellId); return false; @@ -96,7 +94,7 @@ namespace Game.Chat } [Command("unlearn", RBACPermissions.CommandPetUnlearn)] - static bool HandlePetUnlearnCommand(CommandHandler handler, uint spellId) + static bool HandlePetUnlearnCommand(CommandHandler handler, SpellInfo spellInfo) { Pet pet = GetSelectedPlayerPetOrOwn(handler); if (!pet) @@ -105,6 +103,8 @@ namespace Game.Chat return false; } + uint spellId = spellInfo.Id; + if (pet.HasSpell(spellId)) pet.RemoveSpell(spellId, false); else @@ -114,7 +114,7 @@ namespace Game.Chat } [Command("level", RBACPermissions.CommandPetLevel)] - static bool HandlePetLevelCommand(CommandHandler handler, int level) + static bool HandlePetLevelCommand(CommandHandler handler, int? level) { Pet pet = GetSelectedPlayerPetOrOwn(handler); Player owner = pet ? pet.GetOwner() : null; @@ -124,15 +124,16 @@ namespace Game.Chat return false; } - if (level == 0) + if (!level.HasValue) level = (int)(owner.GetLevel() - pet.GetLevel()); + if (level == 0 || level < -SharedConst.StrongMaxLevel || level > SharedConst.StrongMaxLevel) { handler.SendSysMessage(CypherStrings.BadValue); return false; } - int newLevel = (int)pet.GetLevel() + level; + int newLevel = (int)pet.GetLevel() + level.Value; if (newLevel < 1) newLevel = 1; else if (newLevel > owner.GetLevel()) diff --git a/Source/Game/Chat/Commands/SendCommands.cs b/Source/Game/Chat/Commands/SendCommands.cs index 7949f69da..8faef0cc6 100644 --- a/Source/Game/Chat/Commands/SendCommands.cs +++ b/Source/Game/Chat/Commands/SendCommands.cs @@ -122,20 +122,8 @@ namespace Game.Chat.Commands } [Command("money", RBACPermissions.CommandSendMoney, true)] - static bool HandleSendMoneyCommand(CommandHandler handler, PlayerIdentifier playerIdentifier, QuotedString subject, QuotedString text, long money) + static bool HandleSendMoneyCommand(CommandHandler handler, PlayerIdentifier receiver, QuotedString subject, QuotedString text, long money) { - // format: name "subject text" "mail text" money - if (playerIdentifier == null) - playerIdentifier = PlayerIdentifier.FromTarget(handler); - if (playerIdentifier == null) - return false; - - if (subject.IsEmpty() || text.IsEmpty()) - return false; - - if (money <= 0) - return false; - // from console show not existed sender MailSender sender = new(MailMessageType.Normal, handler.GetSession() ? handler.GetSession().GetPlayer().GetGUID().GetCounter() : 0, MailStationery.Gm); @@ -143,11 +131,11 @@ namespace Game.Chat.Commands new MailDraft(subject, text) .AddMoney((uint)money) - .SendMailTo(trans, new MailReceiver(playerIdentifier.GetGUID().GetCounter()), sender); + .SendMailTo(trans, new MailReceiver(receiver.GetConnectedPlayer(), receiver.GetGUID().GetCounter()), sender); DB.Characters.CommitTransaction(trans); - string nameLink = handler.PlayerLink(playerIdentifier.GetName()); + string nameLink = handler.PlayerLink(receiver.GetName()); handler.SendSysMessage(CypherStrings.MailSent, nameLink); return true; }