Beispiel #1
0
        static bool CursedLand(Client player, PlayerBlockPlacement placement)
        {
            SlotItem i = player.Session.ActiveItem;

            if (i != null && i.ItemID == BlockID.Bucket)
            {
                var pps = new PlayerPositionLookClient();
                pps.Position    = placement.BlockPosition.CloneDouble();
                pps.OnGround    = false;
                pps.Position.Y += 1.1;
                pps.Position.X += 0.5;
                pps.Position.Z += 0.5;
                pps.Pitch       = Math.PI / 2;
                pps.Yaw         = player.Session.Yaw;
                player.FromClient(pps);

                var ppc = new PlayerPositionLookServer(pps.Position);
                ppc.Pitch = Math.PI / 2;
                ppc.Yaw   = player.Session.Yaw;
                player.SendToClient(ppc);
            }

            BlockChange bc = new BlockChange(placement.BlockPosition.Offset(placement.FaceDirection), BlockID.Air);

            player.SendToClient(bc);

            //Block all actions
            return(true);
        }
Beispiel #2
0
        static bool FilterFire(VanillaSession session, PlayerBlockPlacement placement)
        {
            //Prevent fire, lava and TNT
            SlotItem i = session.ActiveItem;

            //A bit safer but not correctly implemented need to consider WindowClick
            if (i != null)
            {
                if (i.ItemID == BlockID.FlintandSteel ||
                    i.ItemID == BlockID.Fireball ||
                    i.ItemID == BlockID.Lava ||
                    i.ItemID == BlockID.TNT ||
                    i.ItemID == BlockID.Lavabucket ||
                    i.ItemID == BlockID.CartWithTNT)
                {
                    return(true);
                }
            }

            //Safer but forgable client side
            i = placement.Item;
            if (i != null)
            {
                if (i.ItemID == BlockID.FlintandSteel ||
                    i.ItemID == BlockID.Fireball ||
                    i.ItemID == BlockID.Lava ||
                    i.ItemID == BlockID.TNT ||
                    i.ItemID == BlockID.Lavabucket)
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #3
0
        static internal bool FilterClient(Client player, Packet packet)
        {
            if (player.Session.Mode == GameMode.Creative)
            {
                return(false);
            }

            //Pick up lava is drawn into it
            PlayerBlockPlacement placement = packet as PlayerBlockPlacement;

            if (placement != null)
            {
                return(CursedLand(player, placement));
            }

            PlayerDigging pd = packet as PlayerDigging;

            if (pd != null)
            {
                if (DiggProtect(player, pd))
                {
                    return(true);
                }
            }

            return(false);
        }
Beispiel #4
0
        bool FilterLava(PlayerBlockPlacement placement)
        {
            if (Player.Admin(Permissions.AnyAdmin))
            {
                return(false);
            }

            //Log lava
            SlotItem i = ActiveItem;

            //Prevent fire, lava and TNT
            if (i == null)
            {
                return(false);
            }


            if ((i.ItemID == BlockID.Lava || i.ItemID == BlockID.Lavabucket) &&
                CurrentRegion == null &&
                (placement.BlockPosition.IsNull() == false) &&
                (placement.BlockPosition.Y > 80))
            {
                string msg = "High lava at " + placement.BlockPosition;
                Log.WritePlayer(this, msg);
                Chatting.Parser.TellAdmin(Permissions.Ban, Chat.Red + Player.MinecraftUsername + " " + msg);
                return(true);
            }

            if (i.ItemID == BlockID.FlintandSteel ||
                i.ItemID == BlockID.Fireball ||
                i.ItemID == BlockID.Lava ||
                i.ItemID == BlockID.TNT ||
                i.ItemID == BlockID.Lavabucket)
            {
                if (placement.BlockPosition.IsNull() == false)
                {
                    if (Player.Uptime < TimeSpan.FromHours(48))
                    {
                        //Prevent youngsters to place lava in wilderness
                        return(true);
                    }

                    string msg = "put " + i.ItemID + " at " + placement.BlockPosition;
                    Log.WritePlayer(this, msg);
                    Chatting.Parser.TellAdmin(Permissions.Ban, Chat.Red + Player.MinecraftUsername + " " + msg);
                }
            }
            return(false);
        }
Beispiel #5
0
        internal async Task BroadcastBlockPlacementAsync(Player player, PlayerBlockPlacement pbp)
        {
            player.Inventory.RemoveItem(player.CurrentSlot);

            foreach (var(_, other) in this.OnlinePlayers.Except(player))
            {
                var client = other.client;

                var location = pbp.Location;
                var face     = pbp.Face;

                switch (face)
                {
                case BlockFace.Bottom:
                    location.Y -= 1;
                    break;

                case BlockFace.Top:
                    location.Y += 1;
                    break;

                case BlockFace.North:
                    location.Z -= 1;
                    break;

                case BlockFace.South:
                    location.Z += 1;
                    break;

                case BlockFace.West:
                    location.X -= 1;
                    break;

                case BlockFace.East:
                    location.X += 1;
                    break;

                default:
                    break;
                }

                await client.QueuePacketAsync(new BlockChange(location, Registry.GetBlock(player.GetHeldItem().Type).Id));
            }
        }
        private object DeserializePlayPacket(UncompressedPacket packet)
        {
            var    br = new SpanReader(packet.Data);
            object innerPacket;

            switch (packet.PacketId)
            {
            // Teleport Confirm
            case 0x00:
                innerPacket = TeleportConfirm.Deserialize(ref br);
                break;

            // Chat Message
            case 0x03:
                innerPacket = ServerboundChatMessage.Deserialize(ref br);
                break;

            // Client Settings
            case 0x05:
                innerPacket = ClientSettings.Deserialize(ref br);
                break;

            // Plugin Message
            case 0x0A:
                innerPacket = ServerboundPluginMessage.Deserialize(ref br);
                break;

            // Keep Alive
            case 0x0C:
                innerPacket = ServerboundKeepAlive.Deserialize(ref br);
                break;

            // Player On Ground
            case 0x0D:
                innerPacket = PlayerOnGround.Deserialize(ref br);
                break;

            // Player Position
            case 0x0E:
                innerPacket = PlayerPosition.Deserialize(ref br);
                break;

            // Position And Look
            case 0x0F:
                innerPacket = ServerboundPositionAndLook.Deserialize(ref br);
                break;

            // Player Look
            case 0x10:
                innerPacket = PlayerLook.Deserialize(ref br);
                break;

            // Player Digging
            case 0x14:
                innerPacket = PlayerDigging.Deserialize(ref br);
                break;

            // Entity Action
            case 0x15:
                innerPacket = EntityAction.Deserialize(ref br);
                break;

            // Held Item Change
            case 0x1A:
                innerPacket = ServerboundHeldItemChange.Deserialize(ref br);
                break;

            // Animation
            case 0x1D:
                innerPacket = ServerboundAnimation.Deserialize(ref br);
                break;

            // Player Block Placement
            case 0x1F:
                innerPacket = PlayerBlockPlacement.Deserialize(ref br);
                break;

            // Use Item
            case 0x20:
                innerPacket = UseItem.Deserialize(ref br);
                break;

            // Click Window
            case 0x08:
                innerPacket = ClickWindow.Deserialize(ref br);
                break;

            // Close Window
            case 0x09:
                innerPacket = ServerboundCloseWindow.Deserialize(ref br);
                break;

            default:
                Logger.LogWarning($"Unrecognizable packet id: 0x{packet.PacketId:X2}.");
                return(null);
            }

            if (!br.IsCosumed)
            {
                throw new InvalidDataException($"Packet data is not fully consumed.");
            }
            return(innerPacket);
        }
 private async Task DispatchPacket(PlayerBlockPlacement packet)
 {
     var face = ConvertDiggingFace(packet.Face);
     await AttachedObject.GetComponent <BlockPlacementComponent>()
     .PlaceBlock(packet.Location, (EntityInteractHand)packet.Hand, face, new Vector3(packet.CursorPositionX, packet.CursorPositionY, packet.CursorPositionZ));
 }
Beispiel #8
0
        public static bool ProtectBlockPlace(VanillaSession session, WorldRegion region, PlayerBlockPlacement bp)
        {
            if (IsBlockProtected(session, region) == false)
            {
                return(false);
            }

            if (FilterFire(session, bp))
            {
                string i = "";
                if (session.ActiveItem != null)
                {
                    i += "(server)" + session.ActiveItem.ItemID;
                }
                if (bp.Item != null)
                {
                    i += "(client)" + bp.Item.ItemID;
                }

                Chatting.Parser.TellAdmin(Permissions.Ban, session.Player.Name + " tried to use " + i + " in " + region.Name + " at " + session.Position);
                //session.Player.Kick("Arson");
                return(true);
            }

            //If adventure protection is active, allow all actions
            if (session.Mode == GameMode.Adventure) //buggy but best bet so far
            {
                return(false);                      //ok, only activate levers and chests
            }
            //Block all placements, non resident must be inside the region
            session.TellSystem(Chat.Aqua, "move inside the region before you open a door or chest");

            //New method, works - no longer works

            /*
             * PlayerDigging pd = new PlayerDigging();
             * pd.Position = bp.BlockPosition.Offset(bp.FaceDirection);
             * pd.Face = Face.Down;
             * pd.Status = PlayerDigging.StatusEnum.CheckBlock;
             * session.FromClient(pd);
             */

            //Old method - not perfect, disabling:

            /*BlockChange bc = new BlockChange(bp.BlockPosition.Offset(bp.FaceDirection), BlockID.Air);
             * session.Player.SendToClient(bc);*/
            return(true);
        }
Beispiel #9
0
        /// <summary>
        /// What the Client sends to the server.
        /// </summary>
        public override void FromClient(PacketFromClient packet)
        {
            while (phase == Phases.Handshake)
            {
                Thread.Sleep(100);
            }
            //Wait for handshake to complete
            if (phase == Phases.FinalClose)
            {
                throw new SessionClosedException();
            }

            if (packet.PacketID == PassThrough.ID)
            {
                SendToBackend(packet);
                return;
            }

            //Fix players eid to what is known for the server
            if (packet is IEntity)
            {
                IEntity ie = (IEntity)packet;
                if (ie.EID == Player.EntityID)
                {
                    ie.EID = EID;
                    packet.SetPacketBuffer(null);
                }
            }

            WorldRegion region = CurrentRegion;

            switch (packet.PacketID)
            {
            case PlayerPosition.ID:
                if (AttachedEntity > 0)
                {
                    //Ignore relative movements
                }
                else
                {
                    var pp = ((PlayerPosition)packet);
                    if (pp.Position.Y > -900)
                    {
                        SetPosition(pp.Position, true);
                        OnGround = pp.OnGround != 0;
                    }
                }
                break;

            case PlayerPositionLookClient.ID:
                if (AttachedEntity > 0)
                {
                    //Ignore relative movements
                }
                else
                {
                    PlayerPositionLookClient pp = ((PlayerPositionLookClient)packet);
                    if (pp.Position.Y > -900)
                    {
                        SetPosition(pp.Position, true);
                        OnGround = pp.OnGround;
                    }
                }
                Pitch = ((PlayerPositionLookClient)packet).Pitch;
                Yaw   = ((PlayerPositionLookClient)packet).Yaw;
                break;

            case PlayerGround.ID:
                OnGround = ((PlayerGround)packet).OnGround;
                //Good but a few false positives

                /*
                 * if (Sprinting)//Hacked client: Invalid sprint
                 * {
                 *  Chatting.Parser.TellAdmin(Player.Name + Chat.Gray + " sprinting standing still");
                 * }*/
                break;

            case  EntityAction.ID:
                EntityAction ea = packet as EntityAction;
                switch (ea.Action)
                {
                case EntityAction.Actions.LeaveBed:
                    Sleeping = false;
                    break;

                case EntityAction.Actions.Crounch:
                    Crouched = true;
                    break;

                case EntityAction.Actions.Uncrounch:
                    Crouched = false;
                    break;

                case EntityAction.Actions.StartSprinting:
                    Sprinting = true;
                    break;

                case EntityAction.Actions.StopSprinting:
                    Sprinting = false;
                    break;
                }
                break;

            case UseEntity.ID:
                if (Mode == GameMode.Creative && (Player.Admin(Permissions.AnyAdmin) == false))
                {
                    return;     //Donors can't hurt while in creative mode
                }
                if (UseEntityFromClient((UseEntity)packet))
                {
                    return;
                }
                break;

            case HeldItemClient.ID:
                //Active item
                var hc = (HeldItemClient)packet;
                if (hc.SlotID >= 0 && hc.SlotID <= 8)
                {
                    ActiveInventoryIndex = hc.SlotID;
                }
                else
                {
                    Log.Write(
                        new InvalidOperationException("Invalid holding slot id: " + hc.SlotID),
                        this.Player
                        );
                }
                break;

            //Prevent non admins from getting items in creative
            case CreativeInventory.ID:
                if (Player.Admin(Permissions.CreativeBuild) == false)
                {
                    Player.SendToClient(new EntityStatus(Player.EntityID, EntityStatuses.EntityHurt));
                    Player.TellSystem(Chat.Yellow, "Creative Inventory Disabled");
                    return;
                }

                CreativeInventory ci = (CreativeInventory)packet;
                if (0 <= ci.Slot && ci.Slot <= Inventory.Length)
                {
                    Inventory[ci.Slot] = ci.Item;
                }
                break;

            //If block action is done from another region
            case PlayerBlockPlacement.ID:
                //AfkTime = DateTime.Now;

                //Non admins can't place block
                if (Mode == GameMode.Creative && (Player.Admin(Permissions.CreativeBuild) == false))
                {
                    Player.SendToClient(new EntityStatus(Player.EntityID, EntityStatuses.EntityHurt));
                    Player.TellSystem(Chat.Yellow, "Creative Build Disabled");
                    return;
                }

                PlayerBlockPlacement pb = (PlayerBlockPlacement)packet;
                if (pb.BlockPosition.IsNull() == false)
                {
                    CoordDouble pos = pb.BlockPosition.CloneDouble();
                    region = RegionCrossing.GetRegion(pos, Dimension, World.Regions);
                    //Remember the last position clicked so we can do better chest protection
                    LastClickRegion = region;     //this is obsolete since we moved to blocking open across regions
                }
                else
                {
                    if (pb.Item != null)
                    {
                        Charge = new ChargeState(pb.Item.ItemID);
                    }
                }

                if (FilterDirection(pb.BlockPosition))
                {
                    return;
                }

                if (region == null)
                {
                    if (Dimension == 0 && FilterLava(pb))
                    {
                        return;
                    }
                }
                if (Protected.ProtectBlockPlace(this, region, pb))
                {
                    return;
                }

                break;

            case PlayerDigging.ID:
                //AfkTime = DateTime.Now;
                PlayerDigging pd = (PlayerDigging)packet;
                if (pd.Status == PlayerDigging.StatusEnum.FinishedDigging || pd.Status == PlayerDigging.StatusEnum.StartedDigging)
                {
                    CoordDouble pos = pd.Position.CloneDouble();
                    region = RegionCrossing.GetRegion(pos, Dimension, World.Regions);
                }
                //Log breaking blocks to determine if they found the diamond
                if (pd.Status == PlayerDigging.StatusEnum.FinishedDigging)
                {
                    OreTracker.BrokeBlock = DateTime.Now;
                }

                if (pd.Status == PlayerDigging.StatusEnum.ShootArrow)
                {
                    Charge = null;
                }

                //Prevent non admin creative from digging
                if (Mode == GameMode.Creative && Player.Admin(Permissions.AnyAdmin) == false)
                {
                    return;
                }
                if (FilterDirection(pd.Position))
                {
                    return;
                }

                if (Protected.ProtectBlockBreak(this, region, pd))
                {
                    return;
                }
                break;

            case WindowClick.ID:
                var wc = packet as WindowClick;
                if (wc.WindowID == 0)
                {
                    //TODO: handle
                }
                //AfkTime = DateTime.Now;
                if (Protected.ProtectChestsClick(this, wc))
                {
                    return;
                }

                ///Workaround bug clicky items duplication
                if (wc.Item != null)
                {
                    if (wc.Item.Count > 64)
                    {
                        return;
                    }
                }
                break;

            case WindowCloseClient.ID:
                WindowClose((WindowCloseClient)packet);
                break;
            }

            if (region != null)
            {
                if (region.Type == SpawnRegion.Type)
                {
                    if (SpawnRegion.FilterClient(Player, packet))
                    {
                        return;
                    }
                }
                if (region.Type == SpawnTimeRegion.Type)
                {
                    if (SpawnTimeRegion.FilterClient(region, Player, packet))
                    {
                        return;
                    }
                }
            }

            SendToBackend(packet);
        }
Beispiel #10
0
        private Task DispatchPacket(UncompressedPacket packet)
        {
            var  br = new SpanReader(packet.Data);
            Task task;

            switch (packet.PacketId)
            {
            // Teleport Confirm
            case 0x00:
                task = DispatchPacket(TeleportConfirm.Deserialize(ref br));
                break;

            // Chat Message
            case 0x03:
                task = DispatchPacket(ServerboundChatMessage.Deserialize(ref br));
                break;

            // Client Settings
            case 0x05:
                task = DispatchPacket(ClientSettings.Deserialize(ref br));
                break;

            // Plugin Message
            case 0x0B:
                task = DispatchPacket(ServerboundPluginMessage.Deserialize(ref br));
                break;

            // Keep Alive
            case 0x0F:
                task = DispatchPacket(ServerboundKeepAlive.Deserialize(ref br));
                break;

            // Player On Ground
            case 0x0D:
                task = DispatchPacket(PlayerOnGround.Deserialize(ref br));
                break;

            // Player Position
            case 0x11:
                task = DispatchPacket(PlayerPosition.Deserialize(ref br));
                break;

            // Position And Look (In new wiki, it is Player Position And Rotation)
            case 0x12:
                task = DispatchPacket(ServerboundPositionAndLook.Deserialize(ref br));
                break;

            // Player Look (In new wiki, it is Player Rotation)
            case 0x13:
                task = DispatchPacket(PlayerLook.Deserialize(ref br));
                break;

            // Player Digging
            case 0x1A:
                task = DispatchPacket(PlayerDigging.Deserialize(ref br));
                break;

            // Entity Action
            case 0x1B:
                task = DispatchPacket(EntityAction.Deserialize(ref br));
                break;

            // Held Item Change
            case 0x23:
                task = DispatchPacket(ServerboundHeldItemChange.Deserialize(ref br));
                break;

            // Animation
            case 0x2A:
                task = DispatchPacket(ServerboundAnimation.Deserialize(ref br));
                break;

            // Player Block Placement
            case 0x2C:
                task = DispatchPacket(PlayerBlockPlacement.Deserialize(ref br));
                break;

            // Use Item
            case 0x2D:
                task = DispatchPacket(UseItem.Deserialize(ref br));
                break;

            // Click Window
            case 0x09:
                task = DispatchPacket(ClickWindow.Deserialize(ref br));
                break;

            // Close Window
            case 0x0A:
                task = DispatchPacket(ServerboundCloseWindow.Deserialize(ref br));
                break;

            default:
                Logger.LogWarning($"Unrecognizable packet id: 0x{packet.PacketId:X2}.");
                return(Task.CompletedTask);
            }

            // Logger.LogInformation($"Got packet id: 0x{packet.PacketId:X2}.");
            if (!br.IsCosumed)
            {
                throw new InvalidDataException($"Packet data is not fully consumed, packet id: 0x{packet.PacketId:X2}.");
            }
            return(task);
        }
 private void InvokePlayerBlockPlacement(PlayerBlockPlacement packet)
 {
     packetListener.OnPlayerBlockPlacement(packet);
 }
 public virtual void OnPlayerBlockPlacement(PlayerBlockPlacement packet)
 {
 }
Beispiel #13
0
 public void EnqueuePlacing(PlayerBlockPlacement pbp)
 {
     _placed.Enqueue(pbp);
 }