Scripts/Commands: Convert argument parsing of .npc commands

Port From (https://github.com/TrinityCore/TrinityCore/commit/4d62cc70d6a7726d6619ba5c722fcb74d1123396)
This commit is contained in:
hondacrx
2022-06-04 18:24:49 -04:00
parent 91226121c4
commit 5473f9b82e
+121 -315
View File
@@ -34,27 +34,19 @@ namespace Game.Chat
class NPCCommands class NPCCommands
{ {
[Command("despawngroup", RBACPermissions.CommandNpcDespawngroup)] [Command("despawngroup", RBACPermissions.CommandNpcDespawngroup)]
static bool HandleNpcDespawnGroup(CommandHandler handler, StringArguments args) static bool HandleNpcDespawnGroup(CommandHandler handler, string[] opts)
{ {
if (args.Empty()) if (opts.Empty())
return false; return false;
bool deleteRespawnTimes = false; bool deleteRespawnTimes = false;
uint groupId = 0; uint groupId = 0;
// Decode arguments // Decode arguments
string arg = args.NextString(); foreach (var variant in opts)
while (!arg.IsEmpty())
{ {
string thisArg = arg.ToLower(); if (!uint.TryParse(variant, out groupId))
if (thisArg == "removerespawntime")
deleteRespawnTimes = true; deleteRespawnTimes = true;
else if (thisArg.IsEmpty() || !thisArg.IsNumber())
return false;
else
groupId = uint.Parse(thisArg);
arg = args.NextString();
} }
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
@@ -69,7 +61,7 @@ namespace Game.Chat
} }
[Command("evade", RBACPermissions.CommandNpcEvade)] [Command("evade", RBACPermissions.CommandNpcEvade)]
static bool HandleNpcEvadeCommand(CommandHandler handler, StringArguments args) static bool HandleNpcEvadeCommand(CommandHandler handler, EvadeReason? why, string force)
{ {
Creature creatureTarget = handler.GetSelectedCreature(); Creature creatureTarget = handler.GetSelectedCreature();
if (!creatureTarget || creatureTarget.IsPet()) if (!creatureTarget || creatureTarget.IsPet())
@@ -84,36 +76,15 @@ namespace Game.Chat
return false; return false;
} }
string type_str = args.NextString(); if (force.Equals("force"))
string force_str = args.NextString();
EvadeReason why = EvadeReason.Other;
bool force = false;
if (!type_str.IsEmpty())
{
if (type_str.Equals("NO_HOSTILES") || type_str.Equals("EVADE_REASON_NO_HOSTILES"))
why = EvadeReason.NoHostiles;
else if (type_str.Equals("BOUNDARY") || type_str.Equals("EVADE_REASON_BOUNDARY"))
why = EvadeReason.Boundary;
else if (type_str.Equals("SEQUENCE_BREAK") || type_str.Equals("EVADE_REASON_SEQUENCE_BREAK"))
why = EvadeReason.SequenceBreak;
else if (type_str.Equals("FORCE"))
force = true;
if (!force && !force_str.IsEmpty())
if (force_str.Equals("FORCE"))
force = true;
}
if (force)
creatureTarget.ClearUnitState(UnitState.Evade); creatureTarget.ClearUnitState(UnitState.Evade);
creatureTarget.GetAI().EnterEvadeMode(why); creatureTarget.GetAI().EnterEvadeMode(why.GetValueOrDefault(EvadeReason.Other));
return true; return true;
} }
[Command("info", RBACPermissions.CommandNpcInfo)] [Command("info", RBACPermissions.CommandNpcInfo)]
static bool HandleNpcInfoCommand(CommandHandler handler, StringArguments args) static bool HandleNpcInfoCommand(CommandHandler handler)
{ {
Creature target = handler.GetSelectedCreature(); Creature target = handler.GetSelectedCreature();
if (!target) if (!target)
@@ -202,28 +173,17 @@ namespace Game.Chat
} }
[Command("move", RBACPermissions.CommandNpcMove)] [Command("move", RBACPermissions.CommandNpcMove)]
static bool HandleNpcMoveCommand(CommandHandler handler, StringArguments args) static bool HandleNpcMoveCommand(CommandHandler handler, ulong? spawnId)
{ {
ulong lowguid;
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
if (player == null) if (player == null)
return false; return false;
if (creature != null) if (!spawnId.HasValue && creature == null)
lowguid = creature.GetSpawnId(); return false;
else
{
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
string cId = handler.ExtractKeyFromLink(args, "Hcreature");
if (cId.IsEmpty())
return false;
if (!ulong.TryParse(cId, out lowguid))
return false;
}
ulong lowguid = spawnId.HasValue ? spawnId.Value : creature.GetSpawnId();
// Attempting creature load from DB data // Attempting creature load from DB data
CreatureData data = Global.ObjectMgr.GetCreatureData(lowguid); CreatureData data = Global.ObjectMgr.GetCreatureData(lowguid);
@@ -254,23 +214,17 @@ namespace Game.Chat
DB.World.Execute(stmt); DB.World.Execute(stmt);
// respawn selected creature at the new location // respawn selected creature at the new location
if (creature) if (creature != null)
{ creature.DespawnOrUnsummon(TimeSpan.FromSeconds(0), TimeSpan.FromSeconds(1));
if (creature.IsAlive())
creature.SetDeathState(DeathState.JustDied);
creature.Respawn(true);
if (!creature.GetRespawnCompatibilityMode())
creature.AddObjectToRemoveList();
}
handler.SendSysMessage(CypherStrings.CommandCreaturemoved); handler.SendSysMessage(CypherStrings.CommandCreaturemoved);
return true; return true;
} }
[Command("near", RBACPermissions.CommandNpcNear)] [Command("near", RBACPermissions.CommandNpcNear)]
static bool HandleNpcNearCommand(CommandHandler handler, StringArguments args) static bool HandleNpcNearCommand(CommandHandler handler, float? dist)
{ {
float distance = args.Empty() ? 10.0f : args.NextSingle(); float distance = dist.GetValueOrDefault(10.0f);
uint count = 0; uint count = 0;
Player player = handler.GetPlayer(); Player player = handler.GetPlayer();
@@ -314,10 +268,8 @@ namespace Game.Chat
} }
[Command("playemote", RBACPermissions.CommandNpcPlayemote)] [Command("playemote", RBACPermissions.CommandNpcPlayemote)]
static bool HandleNpcPlayEmoteCommand(CommandHandler handler, StringArguments args) static bool HandleNpcPlayEmoteCommand(CommandHandler handler, uint emote)
{ {
uint emote = args.NextUInt32();
Creature target = handler.GetSelectedCreature(); Creature target = handler.GetSelectedCreature();
if (!target) if (!target)
{ {
@@ -331,9 +283,9 @@ namespace Game.Chat
} }
[Command("say", RBACPermissions.CommandNpcSay)] [Command("say", RBACPermissions.CommandNpcSay)]
static bool HandleNpcSayCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSayCommand(CommandHandler handler, string text)
{ {
if (args.Empty()) if (text.IsEmpty())
return false; return false;
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
@@ -342,7 +294,7 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.SelectCreature); handler.SendSysMessage(CypherStrings.SelectCreature);
return false; return false;
} }
string text = args.GetString();
creature.Say(text, Language.Universal); creature.Say(text, Language.Universal);
// make some emotes // make some emotes
@@ -363,7 +315,7 @@ namespace Game.Chat
} }
[Command("showloot", RBACPermissions.CommandNpcShowloot)] [Command("showloot", RBACPermissions.CommandNpcShowloot)]
static bool HandleNpcShowLootCommand(CommandHandler handler, StringArguments args) static bool HandleNpcShowLootCommand(CommandHandler handler, string all)
{ {
Creature creatureTarget = handler.GetSelectedCreature(); Creature creatureTarget = handler.GetSelectedCreature();
if (creatureTarget == null || creatureTarget.IsPet()) if (creatureTarget == null || creatureTarget.IsPet())
@@ -382,7 +334,7 @@ namespace Game.Chat
handler.SendSysMessage(CypherStrings.CommandNpcShowLootHeader, creatureTarget.GetName(), creatureTarget.GetEntry()); handler.SendSysMessage(CypherStrings.CommandNpcShowLootHeader, creatureTarget.GetName(), creatureTarget.GetEntry());
handler.SendSysMessage(CypherStrings.CommandNpcShowLootMoney, loot.gold / MoneyConstants.Gold, (loot.gold % MoneyConstants.Gold) / MoneyConstants.Silver, loot.gold % MoneyConstants.Silver); handler.SendSysMessage(CypherStrings.CommandNpcShowLootMoney, loot.gold / MoneyConstants.Gold, (loot.gold % MoneyConstants.Gold) / MoneyConstants.Silver, loot.gold % MoneyConstants.Silver);
if (args.NextString() == "all") // nonzero from strcmp <. not equal if (all.Equals("all")) // nonzero from strcmp <. not equal
{ {
handler.SendSysMessage(CypherStrings.CommandNpcShowLootLabel, "Standard items", loot.items.Count); handler.SendSysMessage(CypherStrings.CommandNpcShowLootLabel, "Standard items", loot.items.Count);
foreach (LootItem item in loot.items) foreach (LootItem item in loot.items)
@@ -424,9 +376,9 @@ namespace Game.Chat
} }
[Command("spawngroup", RBACPermissions.CommandNpcSpawngroup)] [Command("spawngroup", RBACPermissions.CommandNpcSpawngroup)]
static bool HandleNpcSpawnGroup(CommandHandler handler, StringArguments args) static bool HandleNpcSpawnGroup(CommandHandler handler, string[] opts)
{ {
if (args.Empty()) if (opts.Empty())
return false; return false;
bool ignoreRespawn = false; bool ignoreRespawn = false;
@@ -434,20 +386,20 @@ namespace Game.Chat
uint groupId = 0; uint groupId = 0;
// Decode arguments // Decode arguments
string arg = args.NextString(); foreach (var variant in opts)
while (!arg.IsEmpty())
{ {
string thisArg = arg.ToLower(); switch (variant)
if (thisArg == "ignorerespawn") {
ignoreRespawn = true; case "force":
else if (thisArg == "force") force = true;
force = true; break;
else if (thisArg.IsEmpty() || !thisArg.IsNumber()) case "ignorerespawn":
return false; ignoreRespawn = true;
else break;
groupId = uint.Parse(thisArg); default:
uint.TryParse(variant, out groupId);
arg = args.NextString(); break;
}
} }
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
@@ -465,7 +417,7 @@ namespace Game.Chat
} }
[Command("tame", RBACPermissions.CommandNpcTame)] [Command("tame", RBACPermissions.CommandNpcTame)]
static bool HandleNpcTameCommand(CommandHandler handler, StringArguments args) static bool HandleNpcTameCommand(CommandHandler handler)
{ {
Creature creatureTarget = handler.GetSelectedCreature(); Creature creatureTarget = handler.GetSelectedCreature();
if (!creatureTarget || creatureTarget.IsPet()) if (!creatureTarget || creatureTarget.IsPet())
@@ -528,34 +480,24 @@ namespace Game.Chat
} }
[Command("textemote", RBACPermissions.CommandNpcTextemote)] [Command("textemote", RBACPermissions.CommandNpcTextemote)]
static bool HandleNpcTextEmoteCommand(CommandHandler handler, StringArguments args) static bool HandleNpcTextEmoteCommand(CommandHandler handler, string text)
{ {
if (args.Empty())
return false;
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature) if (!creature)
{ {
handler.SendSysMessage(CypherStrings.SelectCreature); handler.SendSysMessage(CypherStrings.SelectCreature);
return false; return false;
} }
creature.TextEmote(args.NextString()); creature.TextEmote(text);
return true; return true;
} }
[Command("whisper", RBACPermissions.CommandNpcWhisper)] [Command("whisper", RBACPermissions.CommandNpcWhisper)]
static bool HandleNpcWhisperCommand(CommandHandler handler, StringArguments args) static bool HandleNpcWhisperCommand(CommandHandler handler, string recv, string text)
{ {
if (args.Empty()) if (text.IsEmpty())
return false;
string receiver_str = args.NextString();
string text = args.NextString("");
if (string.IsNullOrEmpty(receiver_str) || string.IsNullOrEmpty(text))
{ {
handler.SendSysMessage(CypherStrings.CmdSyntax); handler.SendSysMessage(CypherStrings.CmdSyntax);
return false; return false;
@@ -568,13 +510,8 @@ namespace Game.Chat
return false; return false;
} }
if (!ulong.TryParse(receiver_str, out ulong guid))
return false;
ObjectGuid receiver_guid = ObjectGuid.Create(HighGuid.Player, guid);
// check online security // check online security
Player receiver = Global.ObjAccessor.FindPlayer(receiver_guid); Player receiver = Global.ObjAccessor.FindPlayerByName(recv);
if (handler.HasLowerSecurity(receiver, ObjectGuid.Empty)) if (handler.HasLowerSecurity(receiver, ObjectGuid.Empty))
return false; return false;
@@ -583,9 +520,9 @@ namespace Game.Chat
} }
[Command("yell", RBACPermissions.CommandNpcYell)] [Command("yell", RBACPermissions.CommandNpcYell)]
static bool HandleNpcYellCommand(CommandHandler handler, StringArguments args) static bool HandleNpcYellCommand(CommandHandler handler, string text)
{ {
if (args.Empty()) if (text.IsEmpty())
return false; return false;
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
@@ -595,7 +532,7 @@ namespace Game.Chat
return false; return false;
} }
creature.Yell(args.NextString(), Language.Universal); creature.Yell(text, Language.Universal);
// make an emote // make an emote
creature.HandleEmoteCommand(Emote.OneshotShout); creature.HandleEmoteCommand(Emote.OneshotShout);
@@ -639,16 +576,9 @@ namespace Game.Chat
class AddCommands class AddCommands
{ {
[Command("", RBACPermissions.CommandNpcAdd)] [Command("", RBACPermissions.CommandNpcAdd)]
static bool HandleNpcAddCommand(CommandHandler handler, StringArguments args) static bool HandleNpcAddCommand(CommandHandler handler, uint id)
{ {
if (args.Empty()) if (Global.ObjectMgr.GetCreatureTemplate(id) == null)
return false;
string charID = handler.ExtractKeyFromLink(args, "Hcreature_entry");
if (string.IsNullOrEmpty(charID))
return false;
if (!uint.TryParse(charID, out uint id) || Global.ObjectMgr.GetCreatureTemplate(id) == null)
return false; return false;
Player chr = handler.GetSession().GetPlayer(); Player chr = handler.GetSession().GetPlayer();
@@ -695,28 +625,14 @@ namespace Game.Chat
} }
[Command("item", RBACPermissions.CommandNpcAddItem)] [Command("item", RBACPermissions.CommandNpcAddItem)]
static bool HandleNpcAddVendorItemCommand(CommandHandler handler, StringArguments args) static bool HandleNpcAddVendorItemCommand(CommandHandler handler, uint itemId, uint? mc, uint? it, uint? ec, string bonusListIds)
{ {
if (args.Empty()) if (itemId == 0)
return false;
byte type = 1; // FIXME: make type (1 item, 2 currency) an argument
string pitem = handler.ExtractKeyFromLink(args, "Hitem");
if (string.IsNullOrEmpty(pitem))
{ {
handler.SendSysMessage(CypherStrings.CommandNeeditemsend); handler.SendSysMessage(CypherStrings.CommandNeeditemsend);
return false; return false;
} }
if (!uint.TryParse(pitem, out uint itemId) || itemId == 0)
return false;
uint maxcount = args.NextUInt32();
uint incrtime = args.NextUInt32();
uint extendedcost = args.NextUInt32();
string fbonuslist = args.NextString();
Creature vendor = handler.GetSelectedCreature(); Creature vendor = handler.GetSelectedCreature();
if (!vendor) if (!vendor)
{ {
@@ -724,6 +640,9 @@ namespace Game.Chat
return false; return false;
} }
uint maxcount = mc.GetValueOrDefault(0);
uint incrtime = it.GetValueOrDefault(0);
uint extendedcost = ec.GetValueOrDefault(0);
uint vendor_entry = vendor.GetEntry(); uint vendor_entry = vendor.GetEntry();
VendorItem vItem = new(); VendorItem vItem = new();
@@ -731,11 +650,11 @@ namespace Game.Chat
vItem.maxcount = maxcount; vItem.maxcount = maxcount;
vItem.incrtime = incrtime; vItem.incrtime = incrtime;
vItem.ExtendedCost = extendedcost; vItem.ExtendedCost = extendedcost;
vItem.Type = (ItemVendorType)type; vItem.Type = ItemVendorType.Item;
if (fbonuslist.IsEmpty()) if (!bonusListIds.IsEmpty())
{ {
var bonusListIDsTok = new StringArray(fbonuslist, ';'); var bonusListIDsTok = new StringArray(bonusListIds, ';');
if (!bonusListIDsTok.IsEmpty()) if (!bonusListIDsTok.IsEmpty())
{ {
foreach (string token in bonusListIDsTok) foreach (string token in bonusListIDsTok)
@@ -758,14 +677,8 @@ namespace Game.Chat
} }
[Command("move", RBACPermissions.CommandNpcAddMove)] [Command("move", RBACPermissions.CommandNpcAddMove)]
static bool HandleNpcAddMoveCommand(CommandHandler handler, StringArguments args) static bool HandleNpcAddMoveCommand(CommandHandler handler, ulong lowGuid)
{ {
if (args.Empty())
return false;
ulong lowGuid = args.NextUInt64();
string waitStr = args.NextString();
// attempt check creature existence by DB data // attempt check creature existence by DB data
CreatureData data = Global.ObjectMgr.GetCreatureData(lowGuid); CreatureData data = Global.ObjectMgr.GetCreatureData(lowGuid);
if (data == null) if (data == null)
@@ -774,9 +687,6 @@ namespace Game.Chat
return false; return false;
} }
if (!int.TryParse(waitStr, out int wait) || wait < 0)
wait = 0;
// Update movement type // Update movement type
PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_MOVEMENT_TYPE); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_MOVEMENT_TYPE);
stmt.AddValue(0, (byte)MovementGeneratorType.Waypoint); stmt.AddValue(0, (byte)MovementGeneratorType.Waypoint);
@@ -789,14 +699,9 @@ namespace Game.Chat
} }
[Command("formation", RBACPermissions.CommandNpcAddFormation)] [Command("formation", RBACPermissions.CommandNpcAddFormation)]
static bool HandleNpcAddFormationCommand(CommandHandler handler, StringArguments args) static bool HandleNpcAddFormationCommand(CommandHandler handler, ulong leaderGUID)
{ {
if (args.Empty())
return false;
uint leaderGUID = args.NextUInt32();
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature || creature.GetSpawnId() == 0) if (!creature || creature.GetSpawnId() == 0)
{ {
handler.SendSysMessage(CypherStrings.SelectCreature); handler.SendSysMessage(CypherStrings.SelectCreature);
@@ -835,30 +740,24 @@ namespace Game.Chat
} }
[Command("temp", RBACPermissions.CommandNpcAddTemp)] [Command("temp", RBACPermissions.CommandNpcAddTemp)]
static bool HandleNpcAddTempSpawnCommand(CommandHandler handler, StringArguments args) static bool HandleNpcAddTempSpawnCommand(CommandHandler handler, string lootStr, uint id)
{ {
if (args.Empty())
return false;
bool loot = false; bool loot = false;
string spawntype_str = args.NextString(); if (!lootStr.IsEmpty())
if (spawntype_str.Equals("LOOT")) {
loot = true; if (lootStr.Equals("loot"))
else if (spawntype_str.Equals("NOLOOT")) loot = true;
loot = false; else if (lootStr.Equals("noloot"))
loot = false;
string charID = handler.ExtractKeyFromLink(args, "Hcreature_entry"); else
if (string.IsNullOrEmpty(charID)) return false;
return false; }
if (!uint.TryParse(charID, out uint id) || id == 0)
return false;
if (Global.ObjectMgr.GetCreatureTemplate(id) == null) if (Global.ObjectMgr.GetCreatureTemplate(id) == null)
return false; return false;
Player chr = handler.GetSession().GetPlayer(); Player chr = handler.GetSession().GetPlayer();
chr.SummonCreature(id, chr, loot ? TempSummonType.CorpseTimedDespawn : TempSummonType.CorpseDespawn, TimeSpan.FromSeconds(30)); chr.SummonCreature(id, chr.GetPosition(), loot ? TempSummonType.CorpseTimedDespawn : TempSummonType.CorpseDespawn, TimeSpan.FromSeconds(30));
return true; return true;
} }
@@ -868,26 +767,14 @@ namespace Game.Chat
class DeleteCommands class DeleteCommands
{ {
[Command("", RBACPermissions.CommandNpcDelete)] [Command("", RBACPermissions.CommandNpcDelete)]
static bool HandleNpcDeleteCommand(CommandHandler handler, StringArguments args) static bool HandleNpcDeleteCommand(CommandHandler handler, ulong? spawnIdArg)
{ {
ulong spawnId; ulong spawnId;
if (spawnIdArg.HasValue)
if (!args.Empty()) spawnId = spawnIdArg.Value;
{
// number or [name] Shift-click form |color|Hcreature:creature_guid|h[name]|h|r
string cId = handler.ExtractKeyFromLink(args, "Hcreature");
if (string.IsNullOrEmpty(cId))
return false;
if (!ulong.TryParse(cId, out ulong guidLow) || guidLow == 0)
return false;
spawnId = guidLow;
}
else else
{ {
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature || creature.IsPet() || creature.IsTotem()) if (!creature || creature.IsPet() || creature.IsTotem())
{ {
handler.SendSysMessage(CypherStrings.SelectCreature); handler.SendSysMessage(CypherStrings.SelectCreature);
@@ -915,11 +802,8 @@ namespace Game.Chat
} }
[Command("item", RBACPermissions.CommandNpcDeleteItem)] [Command("item", RBACPermissions.CommandNpcDeleteItem)]
static bool HandleNpcDeleteVendorItemCommand(CommandHandler handler, StringArguments args) static bool HandleNpcDeleteVendorItemCommand(CommandHandler handler, uint itemId)
{ {
if (args.Empty())
return false;
Creature vendor = handler.GetSelectedCreature(); Creature vendor = handler.GetSelectedCreature();
if (!vendor || !vendor.IsVendor()) if (!vendor || !vendor.IsVendor())
{ {
@@ -927,19 +811,10 @@ namespace Game.Chat
return false; return false;
} }
string pitem = handler.ExtractKeyFromLink(args, "Hitem"); if (itemId == 0)
if (string.IsNullOrEmpty(pitem))
{
handler.SendSysMessage(CypherStrings.CommandNeeditemsend);
return false;
}
if (!uint.TryParse(pitem, out uint itemId))
return false; return false;
ItemVendorType type = ItemVendorType.Item; // FIXME: make type (1 item, 2 currency) an argument if (!Global.ObjectMgr.RemoveVendorItem(vendor.GetEntry(), itemId, ItemVendorType.Item))
if (!Global.ObjectMgr.RemoveVendorItem(vendor.GetEntry(), itemId, type))
{ {
handler.SendSysMessage(CypherStrings.ItemNotInList, itemId); handler.SendSysMessage(CypherStrings.ItemNotInList, itemId);
return false; return false;
@@ -955,7 +830,7 @@ namespace Game.Chat
class FollowCommands class FollowCommands
{ {
[Command("", RBACPermissions.CommandNpcFollow)] [Command("", RBACPermissions.CommandNpcFollow)]
static bool HandleNpcFollowCommand(CommandHandler handler, StringArguments args) static bool HandleNpcFollowCommand(CommandHandler handler)
{ {
Player player = handler.GetSession().GetPlayer(); Player player = handler.GetSession().GetPlayer();
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
@@ -974,7 +849,7 @@ namespace Game.Chat
} }
[Command("stop", RBACPermissions.CommandNpcFollowStop)] [Command("stop", RBACPermissions.CommandNpcFollowStop)]
static bool HandleNpcUnFollowCommand(CommandHandler handler, StringArguments args) static bool HandleNpcUnFollowCommand(CommandHandler handler)
{ {
Player player = handler.GetPlayer(); Player player = handler.GetPlayer();
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
@@ -1011,7 +886,7 @@ namespace Game.Chat
class SetCommands class SetCommands
{ {
[Command("allowmove", RBACPermissions.CommandNpcSetAllowmove)] [Command("allowmove", RBACPermissions.CommandNpcSetAllowmove)]
static bool HandleNpcSetAllowMovementCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetAllowMovementCommand(CommandHandler handler)
{ {
/* /*
if (Global.WorldMgr.getAllowMovement()) if (Global.WorldMgr.getAllowMovement())
@@ -1029,17 +904,8 @@ namespace Game.Chat
} }
[Command("data", RBACPermissions.CommandNpcSetData)] [Command("data", RBACPermissions.CommandNpcSetData)]
static bool HandleNpcSetDataCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetDataCommand(CommandHandler handler, uint data_1, uint data_2)
{ {
if (args.Empty())
return false;
uint data_1 = args.NextUInt32();
uint data_2 = args.NextUInt32();
if (data_1 == 0 || data_2 == 0)
return false;
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature) if (!creature)
{ {
@@ -1054,12 +920,8 @@ namespace Game.Chat
} }
[Command("entry", RBACPermissions.CommandNpcSetEntry)] [Command("entry", RBACPermissions.CommandNpcSetEntry)]
static bool HandleNpcSetEntryCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetEntryCommand(CommandHandler handler, uint newEntryNum)
{ {
if (args.Empty())
return false;
uint newEntryNum = args.NextUInt32();
if (newEntryNum == 0) if (newEntryNum == 0)
return false; return false;
@@ -1079,13 +941,8 @@ namespace Game.Chat
} }
[Command("factionid", RBACPermissions.CommandNpcSetFactionid)] [Command("factionid", RBACPermissions.CommandNpcSetFactionid)]
static bool HandleNpcSetFactionIdCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetFactionIdCommand(CommandHandler handler, uint factionId)
{ {
if (args.Empty())
return false;
uint factionId = args.NextUInt32();
if (!CliDB.FactionTemplateStorage.ContainsKey(factionId)) if (!CliDB.FactionTemplateStorage.ContainsKey(factionId))
{ {
handler.SendSysMessage(CypherStrings.WrongFaction, factionId); handler.SendSysMessage(CypherStrings.WrongFaction, factionId);
@@ -1093,7 +950,6 @@ namespace Game.Chat
} }
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature) if (!creature)
{ {
handler.SendSysMessage(CypherStrings.SelectCreature); handler.SendSysMessage(CypherStrings.SelectCreature);
@@ -1145,12 +1001,8 @@ namespace Game.Chat
} }
[Command("level", RBACPermissions.CommandNpcSetLevel)] [Command("level", RBACPermissions.CommandNpcSetLevel)]
static bool HandleNpcSetLevelCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetLevelCommand(CommandHandler handler, byte lvl)
{ {
if (args.Empty())
return false;
byte lvl = args.NextByte();
if (lvl < 1 || lvl > WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel) + 3) if (lvl < 1 || lvl > WorldConfig.GetIntValue(WorldCfg.MaxPlayerLevel) + 3)
{ {
handler.SendSysMessage(CypherStrings.BadValue); handler.SendSysMessage(CypherStrings.BadValue);
@@ -1173,13 +1025,8 @@ namespace Game.Chat
} }
[Command("link", RBACPermissions.CommandNpcSetLink)] [Command("link", RBACPermissions.CommandNpcSetLink)]
static bool HandleNpcSetLinkCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetLinkCommand(CommandHandler handler, ulong linkguid)
{ {
if (args.Empty())
return false;
ulong linkguid = args.NextUInt64();
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature) if (!creature)
{ {
@@ -1204,15 +1051,9 @@ namespace Game.Chat
} }
[Command("model", RBACPermissions.CommandNpcSetModel)] [Command("model", RBACPermissions.CommandNpcSetModel)]
static bool HandleNpcSetModelCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetModelCommand(CommandHandler handler, uint displayId)
{ {
if (args.Empty())
return false;
uint displayId = args.NextUInt32();
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature || creature.IsPet()) if (!creature || creature.IsPet())
{ {
handler.SendSysMessage(CypherStrings.SelectCreature); handler.SendSysMessage(CypherStrings.SelectCreature);
@@ -1221,7 +1062,7 @@ namespace Game.Chat
if (!CliDB.CreatureDisplayInfoStorage.ContainsKey(displayId)) if (!CliDB.CreatureDisplayInfoStorage.ContainsKey(displayId))
{ {
handler.SendSysMessage(CypherStrings.CommandInvalidParam, args); handler.SendSysMessage(CypherStrings.CommandInvalidParam, displayId);
return false; return false;
} }
@@ -1234,11 +1075,8 @@ namespace Game.Chat
} }
[Command("movetype", RBACPermissions.CommandNpcSetMovetype)] [Command("movetype", RBACPermissions.CommandNpcSetMovetype)]
static bool HandleNpcSetMoveTypeCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetMoveTypeCommand(CommandHandler handler, ulong? lowGuid, string type, string nodel)
{ {
if (args.Empty())
return false;
// 3 arguments: // 3 arguments:
// GUID (optional - you can also select the creature) // GUID (optional - you can also select the creature)
// stay|random|way (determines the kind of movement) // stay|random|way (determines the kind of movement)
@@ -1246,56 +1084,28 @@ namespace Game.Chat
// this is very handy if you want to do waypoints, that are // this is very handy if you want to do waypoints, that are
// later switched on/off according to special events (like escort // later switched on/off according to special events (like escort
// quests, etc) // quests, etc)
string guid_str = args.NextString(); bool doNotDelete = !nodel.IsEmpty();
string type = args.NextString();
string dontdel_str = args.NextString();
bool doNotDelete = false;
if (string.IsNullOrEmpty(guid_str))
return false;
ulong lowguid = 0;
Creature creature = null; Creature creature = null;
if (!string.IsNullOrEmpty(dontdel_str)) if (!lowGuid.HasValue) // case .setmovetype $move_type (with selected creature)
{ {
Log.outDebug(LogFilter.Misc, "DEBUG: All 3 params are set");
// All 3 params are set
// GUID
// type
// doNotDEL
if (dontdel_str == "NODEL")
doNotDelete = true;
}
else
{
// Only 2 params - but maybe NODEL is set
if (!string.IsNullOrEmpty(type))
{
Log.outDebug(LogFilter.Server, "DEBUG: Only 2 params ");
if (type == "NODEL")
{
doNotDelete = true;
type = null;
}
}
}
if (string.IsNullOrEmpty(type)) // case .setmovetype $move_type (with selected creature)
{
type = guid_str;
creature = handler.GetSelectedCreature(); creature = handler.GetSelectedCreature();
if (!creature || creature.IsPet()) if (!creature || creature.IsPet())
return false; return false;
lowguid = creature.GetSpawnId();
} }
else // case .setmovetype #creature_guid $move_type (with selected creature) else
{ {
if (!ulong.TryParse(guid_str, out ulong lowguid) || lowguid != 0) lowguid = lowGuid.Value;
if (lowguid != 0)
creature = handler.GetCreatureFromPlayerMapByDbGuid(lowguid); creature = handler.GetCreatureFromPlayerMapByDbGuid(lowguid);
// attempt check creature existence by DB data // attempt check creature existence by DB data
if (!creature) if (creature == null)
{ {
CreatureData data = Global.ObjectMgr.GetCreatureData(lowguid); CreatureData data = Global.ObjectMgr.GetCreatureData(lowguid);
if (data == null) if (data == null)
@@ -1304,6 +1114,10 @@ namespace Game.Chat
return false; return false;
} }
} }
else
{
lowguid = creature.GetSpawnId();
}
} }
// now lowguid is low guid really existed creature // now lowguid is low guid really existed creature
@@ -1311,19 +1125,25 @@ namespace Game.Chat
MovementGeneratorType move_type; MovementGeneratorType move_type;
if (type == "stay") switch (type)
move_type = MovementGeneratorType.Idle; {
else if (type == "random") case "stay":
move_type = MovementGeneratorType.Random; move_type = MovementGeneratorType.Idle;
else if (type == "way") break;
move_type = MovementGeneratorType.Waypoint; case "random":
else move_type = MovementGeneratorType.Random;
return false; break;
case "way":
move_type = MovementGeneratorType.Waypoint;
break;
default:
return false;
}
if (creature) if (creature)
{ {
// update movement type // update movement type
if (doNotDelete == false) if (!doNotDelete)
creature.LoadPath(0); creature.LoadPath(0);
creature.SetDefaultMovementType(move_type); creature.SetDefaultMovementType(move_type);
@@ -1335,6 +1155,7 @@ namespace Game.Chat
} }
creature.SaveToDB(); creature.SaveToDB();
} }
if (!doNotDelete) if (!doNotDelete)
{ {
handler.SendSysMessage(CypherStrings.MoveTypeSet, type); handler.SendSysMessage(CypherStrings.MoveTypeSet, type);
@@ -1348,13 +1169,9 @@ namespace Game.Chat
} }
[Command("phase", RBACPermissions.CommandNpcSetPhase)] [Command("phase", RBACPermissions.CommandNpcSetPhase)]
static bool HandleNpcSetPhaseCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetPhaseCommand(CommandHandler handler, uint phaseId)
{ {
if (args.Empty()) if (phaseId == 0)
return false;
uint phaseId = args.NextUInt32();
if (!CliDB.PhaseStorage.ContainsKey(phaseId))
{ {
handler.SendSysMessage(CypherStrings.PhaseNotfound); handler.SendSysMessage(CypherStrings.PhaseNotfound);
return false; return false;
@@ -1400,12 +1217,8 @@ namespace Game.Chat
} }
[Command("wanderdistance", RBACPermissions.CommandNpcSetSpawndist)] [Command("wanderdistance", RBACPermissions.CommandNpcSetSpawndist)]
static bool HandleNpcSetWanderDistanceCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetWanderDistanceCommand(CommandHandler handler, float option)
{ {
if (args.Empty())
return false;
float option = args.NextSingle();
if (option < 0.0f) if (option < 0.0f)
{ {
handler.SendSysMessage(CypherStrings.BadValue); handler.SendSysMessage(CypherStrings.BadValue);
@@ -1445,22 +1258,15 @@ namespace Game.Chat
} }
[Command("spawntime", RBACPermissions.CommandNpcSetSpawntime)] [Command("spawntime", RBACPermissions.CommandNpcSetSpawntime)]
static bool HandleNpcSetSpawnTimeCommand(CommandHandler handler, StringArguments args) static bool HandleNpcSetSpawnTimeCommand(CommandHandler handler, uint spawnTime)
{ {
if (args.Empty())
return false;
uint spawnTime = args.NextUInt32();
Creature creature = handler.GetSelectedCreature(); Creature creature = handler.GetSelectedCreature();
if (!creature) if (!creature)
return false; return false;
ulong guidLow = creature.GetSpawnId();
PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_SPAWN_TIME_SECS); PreparedStatement stmt = DB.World.GetPreparedStatement(WorldStatements.UPD_CREATURE_SPAWN_TIME_SECS);
stmt.AddValue(0, spawnTime); stmt.AddValue(0, spawnTime);
stmt.AddValue(1, guidLow); stmt.AddValue(1, creature.GetSpawnId());
DB.World.Execute(stmt); DB.World.Execute(stmt);
creature.SetRespawnDelay(spawnTime); creature.SetRespawnDelay(spawnTime);