mirror of
https://github.com/ClassiCube/MCGalaxy.git
synced 2025-09-27 07:11:04 -04:00
Despawn bots on level unload.
This commit is contained in:
parent
02b09db0d5
commit
ceb6e5a1a5
@ -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;
|
||||
}
|
||||
|
@ -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.");
|
||||
}
|
||||
}
|
||||
|
@ -317,6 +317,7 @@ namespace MCGalaxy
|
||||
|
||||
try
|
||||
{
|
||||
PlayerBot.RemoveAllFromLevel(this);
|
||||
//physChecker.Stop();
|
||||
//physChecker.Dispose();
|
||||
physThread.Abort();
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user