Despawn bots on level unload.

This commit is contained in:
UnknownShadow200 2016-01-23 10:09:31 +11:00
parent 02b09db0d5
commit ceb6e5a1a5
5 changed files with 326 additions and 350 deletions

View File

@ -31,8 +31,9 @@ namespace MCGalaxy.Commands
if (message == "") { Help(p); return; }
if (p != null)
{
if (!PlayerBot.ValidName(message)) { Player.SendMessage(p, "bot name " + message + " not valid!"); return; }
PlayerBot.playerbots.Add(new PlayerBot(message, p.level, p.pos[0], p.pos[1], p.pos[2], p.rot[0], 0));
if (!Player.ValidName(message)) { Player.SendMessage(p, "bot name " + message + " not valid!"); return; }
PlayerBot bot = new PlayerBot(message, p.level, p.pos[0], p.pos[1], p.pos[2], p.rot[0], 0);
PlayerBot.Add(bot);
//who.SendMessage("You were summoned by " + p.color + p.name + "&e.");
return;
}

View File

@ -31,32 +31,21 @@ namespace MCGalaxy.Commands
public override void Use(Player p, string message)
{
if (message == "") { Help(p); return; }
if (p == null)
{
Player.SendMessage(p, "This command can only be used in-game!");
return;
if (p == null) {
Player.SendMessage(p, "This command can only be used in-game!"); return;
}
try
{
if (message.ToLower() == "all")
{
for (int i = 0; i < PlayerBot.playerbots.Count; i++)
{
if (PlayerBot.playerbots[i].level == p.level)
{
// PlayerBot.playerbots.Remove(PlayerBot.playerbots[i]);
PlayerBot Pb = PlayerBot.playerbots[i];
Pb.removeBot();
i--;
}
}
PlayerBot.RemoveAllFromLevel(p.level);
}
else
{
PlayerBot who = PlayerBot.Find(message);
if (who == null) { Player.SendMessage(p, "There is no bot " + who + "!"); return; }
if (p.level != who.level) { Player.SendMessage(p, who.name + " is in a different level."); return; }
who.removeBot();
PlayerBot.Remove(who);
Player.SendMessage(p, "Removed bot.");
}
}

View File

@ -317,6 +317,7 @@ namespace MCGalaxy
try
{
PlayerBot.RemoveAllFromLevel(this);
//physChecker.Stop();
//physChecker.Dispose();
physThread.Abort();

View File

@ -2835,7 +2835,7 @@ Next: continue;
}
return lines;
}
public static bool ValidName(string name, Player p = null) {
public static bool ValidName(string name) {
string allowedchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890._+";
return name.All(ch => allowedchars.IndexOf(ch) != -1);
}

View File

@ -19,14 +19,15 @@ using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
namespace MCGalaxy
{
public sealed class PlayerBot
{
using System.Timers;
namespace MCGalaxy {
public sealed class PlayerBot {
public static List<PlayerBot> playerbots = new List<PlayerBot>(64);
public bool hunt = false;
public bool kill = false;
public bool hunt = false, kill = false;
public string AIName = "";
public string name;
@ -46,51 +47,32 @@ namespace MCGalaxy
bool jumping = false;
int currentjump = 0;
public System.Timers.Timer botTimer = new System.Timers.Timer(100);
public System.Timers.Timer moveTimer = new System.Timers.Timer(100 / 24);
public System.Timers.Timer jumpTimer = new System.Timers.Timer(95);
System.Timers.Timer botTimer = new System.Timers.Timer(100);
System.Timers.Timer moveTimer = new System.Timers.Timer(100 / 24);
System.Timers.Timer jumpTimer = new System.Timers.Timer(95);
static readonly object botsLock = new object();
#region == constructors ==
public PlayerBot(string n, Level l)
{
Server.s.Log("adding " + n + " bot");
public PlayerBot(string n, Level lvl, ushort x, ushort y, ushort z, byte rotx, byte roty) {
name = n;
color = "&1";
id = FreeId();
level = l;
ushort x = (ushort)((0.5 + level.spawnx) * 32);
ushort y = (ushort)((1 + level.spawny) * 32);
ushort z = (ushort)((0.5 + level.spawnz) * 32);
pos = new ushort[3] { x, y, z }; rot = new byte[2] { level.rotx, level.roty };
GlobalSpawn();
}
public PlayerBot(string n, Level l, ushort x, ushort y, ushort z, byte rotx, byte roty)
{
name = n;
color = "&1";
id = FreeId();
level = lvl;
SetPos(x, y, z, rotx, roty);
level = l;
pos = new ushort[3] { x, y, z }; rot = new byte[2] { rotx, roty };
GlobalSpawn();
foreach (Player p in Player.players)
{
if (p.level == level)
{
Player.SendMessage(p, color + name + Server.DefaultColor + ", the bot, has been added.");
}
botTimer.Elapsed += BotTimerFunc;
botTimer.Start();
moveTimer.Elapsed += MoveTimerFunc;
moveTimer.Start();
}
botTimer.Elapsed += delegate
{
void BotTimerFunc(object sender, ElapsedEventArgs e) {
int currentNum, foundNum = (32 * 75);
Random rand = new Random();
x = (ushort)Math.Round((decimal)pos[0] / (decimal)32);
y = (ushort)((pos[1] - 33) / 32);
z = (ushort)Math.Round((decimal)pos[2] / (decimal)32);
ushort x = (ushort)Math.Round((decimal)pos[0] / 32);
ushort y = (ushort)((pos[1] - 33) / 32);
ushort z = (ushort)Math.Round((decimal)pos[2] / 32);
if (kill)
{
@ -109,7 +91,7 @@ namespace MCGalaxy
}
}
if (Waypoints.Count < 1)
if (Waypoints.Count == 0)
{
if (hunt)
Player.players.ForEach(delegate(Player p)
@ -251,7 +233,7 @@ namespace MCGalaxy
currentPoint = 0;
return;
case "remove":
removeBot();
PlayerBot.Remove(this);
return;
case "linkscript":
if (File.Exists("bots/" + Waypoints[currentPoint].newscript))
@ -297,12 +279,9 @@ namespace MCGalaxy
else if (rot[1] > 250) rot[1] = 0;
else rot[1] += 4;
}
};
}
botTimer.Start();
moveTimer.Elapsed += delegate
{
void MoveTimerFunc(object sender, ElapsedEventArgs e) {
moveTimer.Interval = Server.updateTimer.Interval / movementSpeed;
if (!movement) return;
int newNum; Random rand = new Random();
@ -312,9 +291,9 @@ namespace MCGalaxy
pos[1] = (ushort)((pos[1] + 19) - (pos[1] % 32));
}
x = (ushort)Math.Round((decimal)(pos[0] - 16) / (decimal)32);
y = (ushort)((pos[1] - 64) / 32);
z = (ushort)Math.Round((decimal)(pos[2] - 16) / (decimal)32);
ushort x = (ushort)Math.Round((decimal)(pos[0] - 16) / 32);
ushort y = (ushort)((pos[1] - 64) / 32);
ushort z = (ushort)Math.Round((decimal)(pos[2] - 16) / 32);
byte b = Block.Convert(level.GetTile(x, y, z));
byte b1, b2, b3;//, b4;
@ -372,48 +351,65 @@ namespace MCGalaxy
pos[1] = (ushort)(pos[1] + (Math.Sign(foundPos[1] - pos[1])));
}
}*/
};
moveTimer.Start();
}
#endregion
#region ==Input ==
public void SetPos(ushort x, ushort y, ushort z, byte rotx, byte roty)
{
public void SetPos(ushort x, ushort y, ushort z, byte rotx, byte roty) {
pos = new ushort[3] { x, y, z };
rot = new byte[2] { rotx, roty };
}
#endregion
public void removeBot()
{
this.botTimer.Stop();
GlobalDie();
PlayerBot.playerbots.Remove(this);
public static void Add(PlayerBot bot) {
lock (botsLock)
playerbots.Add(bot);
bot.GlobalSpawn();
foreach (Player p in Player.players) {
if (p.level == bot.level)
Player.SendMessage(p, bot.color + bot.name + "%S, the bot, has been added.");
}
}
public void GlobalSpawn()
{
Player.players.ForEach(delegate(Player p) //bots dont need to be informed of other bots here
{
public static void Remove(PlayerBot bot) {
lock (botsLock)
playerbots.Remove(bot);
bot.GlobalDespawn();
bot.botTimer.Stop();
bot.moveTimer.Stop();
bot.jumpTimer.Stop();
}
public static void RemoveAllFromLevel(Level lvl) {
lock (botsLock)
RemoveAll(lvl);
}
static void RemoveAll(Level lvl) {
for (int i = 0; i < PlayerBot.playerbots.Count; i++) {
PlayerBot bot = PlayerBot.playerbots[i];
if (PlayerBot.playerbots[i].level == lvl) {
Remove(bot);
i--;
}
}
}
public void GlobalSpawn() {
Player.players.ForEach(p => {
if (p.level == level)
p.SendSpawn(id, color + name, pos[0], pos[1], pos[2], rot[0], rot[1]);
});
}
public void GlobalDie()
{
Server.s.Log("removing " + name + " bot");
Player.players.ForEach(delegate(Player p)
{
if (p.level != level) { return; }
public void GlobalDespawn() {
Player.players.ForEach(p => {
if (p.level == level)
p.SendDespawn(id);
});
playerbots.Remove(this); //dont know if this is allowed really calling itself to kind of die
}
public void Update() {
}
public void Update() { }
void UpdatePosition() {
byte[] packet = NetUtils.GetPositionPacket(id, pos, oldpos, rot, oldrot, rot[1], true);
@ -454,30 +450,19 @@ namespace MCGalaxy
}
return matches == 1 ? match : null;
}
public static bool ValidName(string name)
{
string allowedchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890_";
foreach (char ch in name) { if (allowedchars.IndexOf(ch) == -1) { return false; } } return true;
}
#endregion
#region Global ==
public static void GlobalUpdatePosition()
{
public static void GlobalUpdatePosition() {
playerbots.ForEach(
delegate(PlayerBot b) { b.UpdatePosition(); }
);
}
public static void GlobalUpdate()
{
while (true)
{
public static void GlobalUpdate() {
while (true) {
Thread.Sleep(100);
playerbots.ForEach(delegate(PlayerBot b) { b.Update(); });
}
}
#endregion
}
}