Exemplo n.º 1
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     Client.PlayerEntity.Location = Server.Levels[Client.PlayerEntity.LevelIndex].Spawn;
     Client.PacketQueue.Enqueue(new RespawnPacket(Client, Server.GetWorld(Client)));
 }
Exemplo n.º 2
0
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient client)
        {
            if (client.LoggedIn)
            {
                Server.KickPlayer(client.PlayerEntity.Name, "Invalid packet recieved!");
                return;
            }
            if (ProtocolVersionOrEID < MultiplayerServer.ProtocolVersion)
            {
                client.PacketQueue.Clear();
                client.PacketQueue.Enqueue(new DisconnectPacket("Outdated client!"));
                return;
            }
            if (ProtocolVersionOrEID > MultiplayerServer.ProtocolVersion)
            {
                client.PacketQueue.Clear();
                client.PacketQueue.Enqueue(new DisconnectPacket("Outdated server!"));
                return;
            }

            client.PlayerEntity = Server.Levels[0].LoadPlayer(Username);

            if (Server.CurrentServer.OnlineMode)
            {
                WebClient webClient = new WebClient();
                try
                {
                    StreamReader r = new StreamReader(webClient.OpenRead("http://session.minecraft.net/game/checkserver.jsp?user="******"&serverId=" + client.OnlineModeHash));
                    if (!r.ReadToEnd().ToUpper().Contains("YES"))
                    {
                        Server.KickPlayer(client.PlayerEntity.Name, "Failed to verify username!");
                        r.Close();
                        return;
                    }
                    r.Close();
                }
                catch
                {
                    Server.KickPlayer(client.PlayerEntity.Name, "Failed to verify username!");
                    return;
                }
            }

            this.ProtocolVersionOrEID = client.PlayerEntity.ID;
            this.WorldMode = Server.Levels[0].GameMode;
            this.LevelType = Server.Levels[0].WorldGenerator.Name;
            this.IsServerContext = false;
            this.MaxPlayers = (byte)Server.CurrentServer.MaxPlayers;
            client.PacketQueue.Enqueue(this);
            this.IsServerContext = true;
            this.Username = client.PlayerEntity.Name;

            ChunkManager.RecalculateClientColumns(client, Server, true);

            // TODO: Send inventory
            client.PacketQueue.Enqueue(new SpawnPositionPacket(Server.Levels[client.PlayerEntity.LevelIndex].Spawn));
            client.PlayerEntity.Location = Server.Levels[client.PlayerEntity.LevelIndex].Spawn;

            // Send Position
            client.PacketQueue.Enqueue(new PlayerPositionAndLookPacket(client.PlayerEntity));
            client.LoggedIn = true;
            client.PlayerEntity.GameMode = Server.Levels[client.PlayerEntity.LevelIndex].GameMode;

            // Send the new client to all logged in clients
            Server.EnqueueToAllClients(new PlayerListItemPacket(client.PlayerEntity.Name, true, 0));

            // Send all logged in clients to the new client
            foreach (RemoteClient c in Server.GetLoggedInClients())
                if (c.PlayerEntity.Name != client.PlayerEntity.Name)
                    client.PacketQueue.Enqueue(new PlayerListItemPacket(c.PlayerEntity.Name, true, 0));

            // Add entity
            Server.GetWorld(client).AddEntity(client.PlayerEntity);
            foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
            {
                c.PacketQueue.Enqueue(new SpawnNamedEntityPacket(client.PlayerEntity.ID, client.PlayerEntity.Name,
                    client.PlayerEntity.Location, client.PlayerEntity.Rotation, client.PlayerEntity.InHand.ID));
                c.PacketQueue.Enqueue(new EntityPacket());

                client.PacketQueue.Enqueue(new SpawnNamedEntityPacket(c.PlayerEntity.ID, c.PlayerEntity.Name,
                    c.PlayerEntity.Location, c.PlayerEntity.Rotation, c.PlayerEntity.InHand.ID));
            }
            client.PacketQueue.Enqueue(new TimeUpdatePacket(Server.Levels[client.PlayerEntity.LevelIndex].Time));

            if (Server.GetLevel(client).WeatherManager.WeatherOccuring)
                client.PacketQueue.Enqueue(new ChangeGameStatePacket(NewOrInvalidState.BeginRain));

            SetWindowItemsPacket swip = new SetWindowItemsPacket(0, client.PlayerEntity.Inventory);
            client.PacketQueue.Enqueue(swip);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient client)
        {
            // TODO: More stuff
            Block b = Server.Levels[client.PlayerEntity.LevelIndex].GetBlock(new Vector3(X, Y, Z));

            if (Status == 0x00 && client.PlayerEntity.GameMode == GameMode.Creative ||
                Server.Levels[client.PlayerEntity.LevelIndex].GetBlock(new Vector3(X, Y, Z)).InstantBreak)
                Status = 0x02;

            switch (Status)
            {
                case 0x00:
                    foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
                        c.PacketQueue.Enqueue(new AnimationPacket(client.PlayerEntity.ID, Animation.SwingArm));
                    break;
                case 0x02:
                    Block blockDestroyed = Server.Levels[client.PlayerEntity.LevelIndex].GetBlock(new Vector3(X, Y, Z));
                    blockDestroyed.BlockDestroyed(Server.GetWorld(client), new Vector3(X, Y, Z),
                        client.PlayerEntity);
                    Server.GetWorld(client).SetBlock(new Vector3(X, Y, Z), new AirBlock());
                    foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
                        c.PacketQueue.Enqueue(new AnimationPacket(client.PlayerEntity.ID, Animation.SwingArm));
                    Server.EnqueueToAllClientsExcept(new SoundOrParticleEffectPacket(SoundOrParticleEffect.BlockBreak,
                            new Vector3(X, Y, Z), blockDestroyed), client.PlayerEntity);
                    break;
                case 0x04:
                case 0x05:
                    break;
            }
        }
Exemplo n.º 4
0
 /// <summary>
 /// Handles the packet.
 /// </summary>
 /// <param name="Server">The server.</param>
 /// <param name="Client">The client.</param>
 /// <remarks></remarks>
 public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
 {
     Block b = Server.GetWorld(Client).GetBlock(this.SignLocation);
     if (!(b is SignPostBlock) && !(b is WallSignBlock))
     {
         Server.KickPlayer(Client.PlayerEntity.Name, "Sign hacking!");
         return;
     }
     if (b is SignPostBlock)
         (b as SignPostBlock).Data.Text = this.Text;
     else
         (b as WallSignBlock).Data.Text = this.Text;
     Server.Levels[Client.PlayerEntity.LevelIndex].SetBlock(this.SignLocation, b);
     Server.EnqueueToAllClientsExcept(this, Client.PlayerEntity);
 }
Exemplo n.º 5
0
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="Client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient Client)
        {
            if (EntityID != Client.PlayerEntity.ID)
            {
                Server.KickPlayer(Client.PlayerEntity.Name, "Hacking!");
                return;
            }

            if (Action == EntityAction.Crouch || Action == EntityAction.UnCrouch)
            {
                Animation animation = Action == EntityAction.Crouch ? Animation.Crouch : Animation.UnCrouch;
                foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(Client), Client))
                {
                    c.PacketQueue.Enqueue(new AnimationPacket(Client.PlayerEntity.ID, animation));
                }
            }
            if (Action == EntityAction.LeaveBed)
            {
                //Unoccupy the metadata of the block
                Block bed = Server.GetWorld(Client.PlayerEntity).GetBlock(Client.PlayerEntity.OccupiedBed); //Get the block
                bed.Metadata = (byte)(bed.Metadata & ~0x4); // Remove flag
                Server.GetWorld(Client.PlayerEntity).SetBlock(Client.PlayerEntity.OccupiedBed, bed); //Set block

                Client.PlayerEntity.OccupiedBed = null; //Nullify the clients bed position

                Server.EnqueueToAllClients(new AnimationPacket(Client.PlayerEntity.ID, Animation.LeaveBed));
            }
        }