📄 world.cs
字号:
for (int x = StartX - StepX; x != EndX; x += StepX)
{
for (int y = StartY - StepY; y != EndY; y += StepY)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
Cli.SendData(PacketBuilder.SpawnEntity(Client.Char));
Client.SendData(PacketBuilder.SpawnEntity(Cli.Char));
}
}
}
}
//Console.WriteLine("Step 2 complete");
//3 - Clients here will not be able to see the jumper after the jump. A remove entity must be sent.
if (StepX > 0)
{
StartX = PrevX - VIEWTHRESHOLD;
EndX = NewX - VIEWTHRESHOLD;
}
else
{
StartX = PrevX + VIEWTHRESHOLD;
EndX = NewX + VIEWTHRESHOLD;
}
if (StepY > 0)
{
StartY = PrevY - VIEWTHRESHOLD;
EndY = PrevY + VIEWTHRESHOLD;
}
else
{
StartY = PrevY + VIEWTHRESHOLD;
EndY = PrevY - VIEWTHRESHOLD;
}
for (int x = StartX - StepX; x != EndX; x += StepX)
{
for (int y = StartY - StepY; y != EndY; y += StepY)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
Cli.SendData(PacketBuilder.RemoveEntity(Char.CharID));
}
}
}
}
//Console.WriteLine("Step 3 complete");
//4 - Clients here will not be able to see the jumper after the jump. A remove entity must be sent.
if (StepX > 0)
{
StartX = NewX - VIEWTHRESHOLD;
EndX = PrevX + VIEWTHRESHOLD;
}
else
{
StartX = NewX + VIEWTHRESHOLD;
EndX = PrevX - VIEWTHRESHOLD;
}
if (StepY > 0)
{
StartY = PrevY - VIEWTHRESHOLD;
EndY = NewY - VIEWTHRESHOLD;
}
else
{
StartY = PrevY + VIEWTHRESHOLD;
EndY = NewY + VIEWTHRESHOLD;
}
for (int x = StartX - StepX; x != EndX; x += StepX)
{
for (int y = StartY - StepY; y != EndY; y += StepY)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
Cli.SendData(PacketBuilder.RemoveEntity(Char.CharID));
}
}
}
}
//Console.WriteLine("Step 4 complete");
//5 - Last, clients that will see the jump
if (StepX > 0)
{
StartX = NewX - VIEWTHRESHOLD;
EndX = PrevX + VIEWTHRESHOLD;
}
else
{
StartX = NewX + VIEWTHRESHOLD;
EndX = PrevX - VIEWTHRESHOLD;
}
if (StepY > 0)
{
StartY = NewY - VIEWTHRESHOLD;
EndY = PrevY + VIEWTHRESHOLD;
}
else
{
StartY = NewY + VIEWTHRESHOLD;
EndY = PrevY - VIEWTHRESHOLD;
}
for (int x = StartX - StepX; x != EndX; x += StepX)
{
for (int y = StartY - StepY; y != EndY; y += StepY)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
Cli.SendData(Packet);
}
}
}
}
//Console.WriteLine("Step 5 complete");
}
private static ArrayList[,] GetTarget(Maps Map)
{
if (Map == Maps.TwinCity)
{
return TCLocHash;
}
else if (Map == Maps.MapleForest)
{
return MFLocHash;
}
else
{
throw new Exception("Character in invalid map. Map lookup failed.");
}
}
public static void DropClient(COClient Client, string DropReason)
{
System.Threading.Thread.Sleep(5000);
Character Char = Client.Char;
COClient Cli;
ArrayList[,] Target = GetTarget(Char.Map);
byte[] RemoveData = PacketBuilder.RemoveEntity(Char.CharID);
for (int x = Char.CurrentLoc.X - VIEWTHRESHOLD; x < Char.CurrentLoc.X + VIEWTHRESHOLD; x++)
{
for (int y = Char.CurrentLoc.Y - VIEWTHRESHOLD; y < Char.CurrentLoc.Y + VIEWTHRESHOLD; y++)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
if (Cli != Client)
{
try
{
Cli.SendData(RemoveData);
}
catch { }
}
}
}
}
}
try
{
Target[Char.CurrentLoc.X, Char.CurrentLoc.Y].Remove(Client);
}
catch (Exception) {}
ClientHash.Remove(Client.Char.CharID);
if (Client.Room != null)
{
Client.Room.Leave(Client);
}
BackendDB.SynchronizeCharacter(Char);
if (Client.Sock != null)
Client.Sock.Shutdown(System.Net.Sockets.SocketShutdown.Send);
//Client.Sock.Close();
Client.Sock = null;
//throw new Exception(DropReason);
}
public static void DisapperClient(COClient Client)
{
Character Char = Client.Char;
COClient Cli;
ArrayList[,] Target = GetTarget(Char.Map);
byte[] RemoveData = PacketBuilder.RemoveEntity(Char.CharID);
for (int x = Char.CurrentLoc.X - VIEWTHRESHOLD; x < Char.CurrentLoc.X + VIEWTHRESHOLD; x++)
{
for (int y = Char.CurrentLoc.Y - VIEWTHRESHOLD; y < Char.CurrentLoc.Y + VIEWTHRESHOLD; y++)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
if (Cli != Client)
{
Cli.SendData(RemoveData);
}
}
}
}
}
}
public static void Chat(COClient Client, byte[] Packet)
{
int Count = 0;
int Position = 0;
int Len = 0;
ChatType CType = ChatType.Talk;
Character Char = Client.Char;
string From = "";
string To = "";
string Message = "";
CType = (ChatType)(Packet[0x08] | (Packet[0x09] << 8));
Position = 0x12;
for (Count = 0; Count < Packet[0x11]; Count++)
{
From += Convert.ToChar(Packet[Position]);
Position++;
}
Len = Packet[Position];
Position++;
for(Count = 0; Count < Len; Count++)
{
To += Convert.ToChar(Packet[Position]);
Position++;
}
Position++;
Len = Packet[Position];
Position++;
for(Count = 0; Count < Len; Count++)
{
Message += Convert.ToChar(Packet[Position]);
Position++;
}
Console.WriteLine(From + " to " + To + ": " + Message);
if (ParseCommand(Message, To, Client))
{
return;
}
else
{
if (CType == ChatType.Talk)
{
SendMessageLocal(Client, Packet);
}
else if (CType == ChatType.Team)
{
if (Client.Room != null)
Client.Room.SendMessage(Message, Client);
}
else if (CType == ChatType.Whisper)
{
int TargetCharID = IDFromName(To);
if (TargetCharID != -1)
{
((COClient)ClientHash[(uint)TargetCharID]).SendData(PacketBuilder.Message(((COClient)ClientHash[TargetCharID]).MessageID, From, To, Message, ChatType.Whisper));
}
else
{
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "Target is not online.", ChatType.Talk));
}
}
}
}
public static void SendMessageLocal(COClient Client, byte[] Packet)
{
COClient Cli;
Character Char = Client.Char;
ArrayList[,] Target = GetTarget(Char.Map);
for (int x = Char.CurrentLoc.X - VIEWTHRESHOLD; x < Char.CurrentLoc.X + VIEWTHRESHOLD; x++)
{
for (int y = Char.CurrentLoc.Y - VIEWTHRESHOLD; y < Char.CurrentLoc.Y + VIEWTHRESHOLD; y++)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
if (Cli != Client)
{
Cli.SendData(Packet);
}
}
}
}
}
}
public static void SendMessageServer(byte[] Packet)
{
COClient Client;
foreach (DictionaryEntry DE in ClientHash)
{
Client = (COClient)DE.Value;
Client.SendData(Packet);
}
}
private static bool ParseCommand(string Message, string To, COClient Client)
{
if (Message[0] == '/')
{
string[] Splitter = Message.Split(' ');
Splitter[0] = Splitter[0].ToLower();
if ((Client.AccountStatus & 8) == 8) //Character is a GM and the message must be checked for a command
{
if (Splitter[0] == "/gm")
{
SendMessageServer(PacketBuilder.Message(Client.MessageID, "GM", "ALL", Message.Remove(0, 4), ChatType.Center));
}
else if (Splitter[0] == "/id")
{
if (Splitter.Length == 2)
{
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, IDFromName(Splitter[1]) > 0 ? IDFromName(Splitter[1]).ToString() : "Character not found online.", ChatType.Talk));
}
else if (Splitter.Length == 1 && To != "")
{
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, IDFromName(To) > 0 ? IDFromName(To).ToString() : "Character not found online.", ChatType.Talk));
}
else
{
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "Usage of /id: /id charname", ChatType.Talk));
}
}
}
if (Splitter[0] == "/newchar" || Splitter[0] == "/newcharacter")
{
BackendDB.SetStatus(Client.Account, 2);
World.DropClient(Client, "Creating new character.");
}
else if (Splitter[0] == "/join")
{
string RoomName = "";
string Password = "";
if (Splitter.Length > 1)
{
RoomName = Splitter[1];
}
if (Splitter.Length > 2)
{
Password = Splitter[2];
}
if (Client.Room != null)
{
if (Client.Room.Leave(Client)) //Room is empty, kill it
{
Chatrooms.Remove(Client.Room.Name);
}
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "Left " + Client.Room.Name, ChatType.Talk));
Client.Room = null;
}
if (Chatrooms[RoomName] != null)
{
if(((ChatRoom)(Chatrooms[RoomName])).Join(Client, Password))
{
Client.Room = (ChatRoom)Chatrooms[RoomName];
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "Joined " + RoomName, ChatType.Talk));
}
else
{
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "Room is password protected and an incorrect password was supplied", ChatType.Talk));
}
}
else
{
ChatRoom CR = new ChatRoom(RoomName, Password, Client);
CR.Join(Client, Password);
Client.Room = CR;
Chatrooms[RoomName] = CR;
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "Joined " + RoomName, ChatType.Talk));
}
}
else if (Splitter[0] == "/list")
{
if (Client.Room != null)
Client.Room.ListMembers(Client);
else
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "You must be in a channel to use /list.", ChatType.Talk));
}
else if (Splitter[0] == "/leave")
{
if (Client.Room != null)
{
Client.Room.Leave(Client);
Client.Room = null;
}
else
Client.SendData(PacketBuilder.Message(Client.MessageID, "SYSTEM", Client.Char.Name, "You must be in a channel to use /leave.", ChatType.Talk));
}
return true;
}
return false;
}
private static int IDFromName(string Name)
{
COClient Client;
foreach (DictionaryEntry DE in ClientHash)
{
Client = (COClient)DE.Value;
if (Client.Char.Name == Name)
return (int)Client.Char.CharID;
}
return -1;
}
public static void SendLocal(COClient Client, byte[] Packet)
{
COClient Cli;
Character Char = Client.Char;
ArrayList[,] Target = GetTarget(Char.Map);
for (int x = Char.CurrentLoc.X - VIEWTHRESHOLD; x < Char.CurrentLoc.X + VIEWTHRESHOLD; x++)
{
for (int y = Char.CurrentLoc.Y - VIEWTHRESHOLD; y < Char.CurrentLoc.Y + VIEWTHRESHOLD; y++)
{
for (int z = 0; z < Target[x,y].Count; z++)
{
if (Target[x,y][z].GetType().Name == "COClient")
{
Cli = (COClient)Target[x,y][z];
Cli.SendData(Packet);
}
}
}
}
}
public static void AttackEntity(COClient Client, byte [] Packet)
{
uint Target;
uint Spell;
uint SpellLevel;
int SpellRange;
COClient TClient = null;
byte[] AttackReturn;
Character Attacker = Client.Char;
IEntity TargetEntity = null;
Target = Packet[0x0f];
Target = (Target << 8) | Packet[0x0e];
Target = (Target << 8) | Packet[0x0d];
Target = (Target << 8) | Packet[0x0c];
if (ClientHash[Target] != null)
{
TClient = (COClient)ClientHash[Target];
TargetEntity = (IEntity)TClient.Char;
}
//TODO: Implement Dodge checking
int AttackDamage = RND.Next(Attacker.MinAttack, Attacker.MaxAttack);
AttackDamage = AttackDamage - TargetEntity.Defense;
AttackDamage = Math.Max(1, AttackDamage);
AttackReturn = PacketBuilder.Attack(Attacker.CharID, Target, TargetEntity.CurrentLoc, (uint)AttackDamage, AttackMode.Melee);
SendLocal(Client, AttackReturn);
if (AttackDamage >= TargetEntity.HP)
{
AttackReturn = PacketBuilder.Attack(Attacker.CharID, Target, TargetEntity.CurrentLoc, 1, AttackMode.Kill); //0e60
SendLocal(Client, AttackReturn);
}
TargetEntity.HP = Math.Max(0, TargetEntity.HP - AttackDamage);
if (TClient != null)
{
TClient.SendData(PacketBuilder.Vital(TClient.Char.CharID, Vitals.HP, (uint)TargetEntity.HP));
}
//AttackReturn = PacketBuilder.EntityDamage(Client.Char.CharID, Target, 3, 0x0000, 0x0000);
//Client.SendData(AttackReturn);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -