Пример #1
0
 public Chunk(int chunkX, int chunkZ, Map world)
 {
     ChunkX = chunkX;
     ChunkZ = chunkZ;
     _World = world;
     Entities = new List<Entity>();
     Items = new List<Item>();
     Load();
 }
Пример #2
0
        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();
        }