⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 world.cs

📁 网络游戏征服的服务端部分完整源码 VC编译 绝少的源码 有兴趣的可以
💻 CS
📖 第 1 页 / 共 2 页
字号:
			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 + -