diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs index 0e611543..86b71180 100755 --- a/TShockAPI/Commands.cs +++ b/TShockAPI/Commands.cs @@ -291,19 +291,19 @@ namespace TShockAPI } string plStr = args.Parameters[0]; - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { string reason = args.Parameters.Count > 1 ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) : "Misbehaviour."; - if (!Tools.Kick(player[0], reason)) + if (!Tools.Kick(players[0], reason)) { args.Player.SendMessage("You can't kick another admin!", Color.Red); } @@ -324,19 +324,19 @@ namespace TShockAPI } string plStr = args.Parameters[0]; - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { string reason = args.Parameters.Count > 1 ? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1)) : "Misbehaviour."; - if (!Tools.Ban(player[0], reason)) + if (!Tools.Ban(players[0], reason)) { args.Player.SendMessage("You can't ban another admin!", Color.Red); } @@ -547,24 +547,43 @@ namespace TShockAPI args.Player.SendMessage("Missing mob name/id", Color.Red); return; } - - int type = -1; int amount = 1; - - if (!int.TryParse(args.Parameters[0], out type)) - type = TShock.GetNPCID(args.Parameters[0]); if (args.Parameters.Count == 2 && !int.TryParse(args.Parameters[1], out amount)) { args.Player.SendMessage("Invalid syntax! Proper syntax: /spawnmob [amount]", Color.Red); return; } - if (type >= 1 && type < Main.maxNPCTypes) + NPC npc; + int type = -1; + if (int.TryParse(args.Parameters[0], out type)) { - int npcid = -1; - for (int i = 0; i < amount; i++) - npcid = NPC.NewNPC((int)args.Player.X, (int)args.Player.Y, type, 0); - Tools.Broadcast(string.Format("{0} was spawned {1} time(s).", Main.npc[npcid].name, amount)); + npc = Tools.GetNPCById(type); + } + else + { + var npcs = Tools.GetNPCByName(args.Parameters[0]); + if (npcs.Count == 0) + { + args.Player.SendMessage("Invalid mob type!", Color.Red); + return; + } + else if (npcs.Count > 1) + { + args.Player.SendMessage("More than one mob matched!", Color.Red); + return; + } + else + { + npc = npcs[0]; + type = npc.type; + } + } + + if (npc.type >= 1 && npc.type < Main.maxNPCTypes) + { + TSPlayer.Server.SpawnNPC(npc.type, npc.name, (int)args.Player.X, (int)args.Player.Y); + Tools.Broadcast(string.Format("{0} was spawned {1} time(s).", npc.name, amount)); } else args.Player.SendMessage("Invalid mob type!", Color.Red); @@ -597,14 +616,14 @@ namespace TShockAPI } string plStr = String.Join(" ", args.Parameters); - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) args.Player.SendMessage("Invalid player!", Color.Red); - else if (player.Count > 1) + else if (players.Count > 1) args.Player.SendMessage("More than one player matched!", Color.Red); else { - var plr = player[0]; + var plr = players[0]; TShock.Teleport(args.Player.Index, plr.X, plr.Y); args.Player.SendMessage(string.Format("Teleported to {0}", plr.Name)); } @@ -619,18 +638,18 @@ namespace TShockAPI } string plStr = String.Join(" ", args.Parameters); - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { - var plr = player[0]; + var plr = players[0]; TShock.Teleport(plr.Index, args.Player.X, args.Player.Y); plr.SendMessage(string.Format("You were teleported to {0}.", plr.Name)); args.Player.SendMessage(string.Format("You brought {0} here.", plr.Name)); @@ -878,18 +897,18 @@ namespace TShockAPI } string plStr = args.Parameters[0]; - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { - var plr = player[0]; + var plr = players[0]; int damage = 5; if (args.Parameters.Count == 2) { @@ -910,18 +929,18 @@ namespace TShockAPI } string plStr = String.Join(" ", args.Parameters); - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { - var plr = player[0]; + var plr = players[0]; plr.DamagePlayer(999999); args.Player.SendMessage(string.Format("You just killed {0}!", plr.Name)); plr.SendMessage(string.Format("{0} just killed you!", args.Player.Name)); @@ -1019,18 +1038,18 @@ namespace TShockAPI } string plStr = args.Parameters[1]; - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { - var plr = player[0]; + var plr = players[0]; bool flag = false; for (int i = 0; i < 40; i++) { @@ -1057,18 +1076,18 @@ namespace TShockAPI if (args.Parameters.Count > 0) { string plStr = String.Join(" ", args.Parameters); - var player = Tools.FindPlayer(plStr); - if (player.Count == 0) + var players = Tools.FindPlayer(plStr); + if (players.Count == 0) { args.Player.SendMessage("Invalid player!", Color.Red); } - else if (player.Count > 1) + else if (players.Count > 1) { args.Player.SendMessage("More than one player matched!", Color.Red); } else { - var plr = player[0]; + var plr = players[0]; DropHearts(plr.X, plr.Y, 20); if (plr == args.Player) { diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index d02ce43a..59194123 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -195,6 +195,14 @@ namespace TShockAPI NetMessage.syncPlayers(); } + public int SpawnNPC(int type, string name, int x, int y) + { + int npcid = NPC.NewNPC(x, y, type, 0); + // This is for special slimes + Main.npc[npcid].SetDefaults(name); + return npcid; + } + public void StrikeNPC(int npcid, int damage, float knockBack, int hitDirection) { Main.npc[npcid].StrikeNPC(damage, knockBack, hitDirection); diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index 7c10110b..5da50112 100755 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -464,31 +464,6 @@ namespace TShockAPI } } - //TODO : Notify the player if there is more than one match. (or do we want a First() kinda thing?) - public static int GetNPCID(string name, bool exact = false) - { - NPC npc = new NPC(); - for (int i = 1; i < Main.maxNPCTypes; i++) - { - if (exact) - { - //Method #1 - must be exact match, allows support for different coloured slimes - npc.SetDefaults(name); - if (npc.name == name) - return i; - } - else - { - //Method #2 - allows impartial matching - name = name.ToLower(); - npc.SetDefaults(i); - if (npc.name.ToLower().StartsWith(name)) - return i; - } - } - return -1; - } - public static int GetItemID(string name) { Item item = new Item(); diff --git a/TShockAPI/Tools.cs b/TShockAPI/Tools.cs index 1883db11..c63c41f2 100755 --- a/TShockAPI/Tools.cs +++ b/TShockAPI/Tools.cs @@ -163,6 +163,35 @@ namespace TShockAPI return found; } + public static NPC GetNPCById(int id) + { + NPC npc = new NPC(); + npc.SetDefaults(id); + return npc; + } + + public static List GetNPCByName(string name) + { + //Method #1 - must be exact match, allows support for different coloured slimes + for (int i = 1; i < Main.maxNPCTypes; i++) + { + NPC npc = new NPC(); + npc.SetDefaults(name); + if (npc.name == name) + return new List { npc }; + } + //Method #2 - allows impartial matching + var found = new List(); + for (int i = 1; i < Main.maxNPCTypes; i++) + { + NPC npc = new NPC(); + npc.SetDefaults(i); + if (npc.name.ToLower().StartsWith(name.ToLower())) + found.Add(npc); + } + return found; + } + /// /// Creates an NPC ///