Added support to spawn all types of slimes (have to use the full exact name)

Added SpawnNPC in TSServerPlayer
Warn user if multiple mob with name are found
This commit is contained in:
ricky 2011-06-17 11:21:37 +10:00
parent 7bccfbe441
commit 51aa337839
4 changed files with 98 additions and 67 deletions

View file

@ -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 <mob name/id> [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)
{

View file

@ -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);

View file

@ -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();

View file

@ -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<NPC> 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> { npc };
}
//Method #2 - allows impartial matching
var found = new List<NPC>();
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;
}
/// <summary>
/// Creates an NPC
/// </summary>