public Chunk(int chunkX, int chunkZ, Map world) { ChunkX = chunkX; ChunkZ = chunkZ; _World = world; Entities = new List<Entity>(); Items = new List<Item>(); Load(); }
public void Run() { World = new Map(WorldName); if (!World.LoadLevel()) { // The generation is missing /*CXMineServer.Log("Generating world " + WorldName); World.Generate(); World.ForceSave();*/ return; } _MinecraftTime = CXMineServer.Server.World.Time; for (int i = 0; i < 50; ++i) { ReadPool.Push(new SocketAsyncEventArgs()); WritePool.Push(new SocketAsyncEventArgs()); } try { _Listener.Start(); } catch (System.Exception ex) { CXMineServer.Log(ex.Message); Console.ReadLine(); } CXMineServer.Log("Listening on port " + Port); Running = true; TimerThread.Start(); while (_Signal.WaitOne()) { lock (queue) { Queue<NetState> tmp = currentQueue; currentQueue = queue; queue = tmp; } while(currentQueue.Count > 0) { NetState ns = currentQueue.Dequeue(); ByteQueue buffer = ns.Buffer; lock (buffer) { int length = buffer.Length; while (length > 0 && ns.Running) { CXMineServer.ReceiveLogFile("Current buffer: " + BitConverter.ToString(buffer.UnderlyingBuffer, buffer.Head, buffer.Size) + "\r\n"); CXMineServer.ReceiveLogFile("Head: " + buffer.Head + " Tail: " + buffer.Tail + " Size: " + buffer.Size + "\r\n"); int packetID = buffer.GetPacketID(); PacketType type = (PacketType)packetID; CXMineServer.ReceiveLogFile(type.ToString() + ": "); PacketHandler handler = PacketHandlers.GetHandler(type); //CXMineServer.Log("arrived: " + ((PacketType)packetID).ToString()); byte[] data; if (handler == null) { data = new byte[length]; length = buffer.Dequeue(data, 0, length); CXMineServer.Log("Unhandled packet arrived"); CXMineServer.ReceiveLogFile("Unhandled packet arrived"); ns.Dispose(); Console.ReadLine(); break; } if (buffer.UnderlyingBuffer.Length > 2048) ns.Disconnect(); PacketReader packetReader; if (handler.Length == 0) { if (length >= handler.MinimumLength) { packetReader = new PacketReader(buffer.UnderlyingBuffer, buffer.Length); handler.OnReceive(ns, packetReader); data = new byte[packetReader.Index]; if (!packetReader.Failed) { buffer.Dequeue(data, 0, packetReader.Index); CXMineServer.ReceiveLogFile("Dequeued: " + packetReader.Index + " "); CXMineServer.ReceiveLogFile("Complete \r\n\r\n"); length = buffer.Length; } else { CXMineServer.ReceiveLogFile("Packet not complete \r\n\r\n"); length = 0; } } else { CXMineServer.ReceiveLogFile("Not enough data \r\n\r\n"); length = 0; } } else if (length >= handler.Length) { data = new byte[handler.Length]; int packetLength = buffer.Dequeue(data, 0, handler.Length); CXMineServer.ReceiveLogFile("Dequeued: " + packetLength + " "); packetReader = new PacketReader(data, packetLength); handler.OnReceive(ns, packetReader); if (packetReader.Failed) ns.Disconnect(); CXMineServer.ReceiveLogFile("Complete \r\n\r\n"); length = buffer.Length; } else { CXMineServer.ReceiveLogFile("Not enough data \r\n\r\n"); length = 0; } } } if(ns.Owner.Moved) { ns.Owner.FindPickupObjects(CXMineServer.Server.World.GetChunkAt((int)ns.Owner.X, (int)ns.Owner.Z)); ns.Owner.Moved = false; } } Timer.Slice(); lock(playerList) { for (int i = 0; i < playerList.Count; ++i) { playerList[i].State.Flush(); } } } World.ForceSave(); }