private async Task DispatchPacket(PlayerDigging packet) { var face = ConvertDiggingFace(packet.Face); var component = AttachedObject.GetComponent <DiggingComponent>(); switch (packet.Status) { case PlayerDiggingStatus.StartedDigging: await component.StartDigging(packet.Location, face); break; case PlayerDiggingStatus.CancelledDigging: await component.CancelDigging(packet.Location, face); break; case PlayerDiggingStatus.FinishedDigging: await component.FinishDigging(packet.Location, face); break; default: Logger.LogWarning($"Not implemented digging status: {packet.Status}"); break; } }
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); }
static bool DiggProtect(Client player, PlayerDigging pd) { if (pd.Status == PlayerDigging.StatusEnum.FinishedDigging) { BlockChange bc = new BlockChange(pd.Position.Offset(pd.Face), BlockID.Fire); player.SendToClient(bc); player.TellAbove(Chat.Purple, "You are still in spawn"); return(true); } return(false); }
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); }
/// <summary> /// Prevent block modification, aplies to all, residents should never get called here /// </summary> public static bool ProtectBlockBreak(VanillaSession session, WorldRegion region, PlayerDigging d) { if (IsBlockProtected(session, region) == false) { return(false); } //Block single click from outside the adventure mode if (d.Status == PlayerDigging.StatusEnum.StartedDigging) { return(true); } if (d.Status != PlayerDigging.StatusEnum.FinishedDigging) { return(false); } //Old method - not needed BlockChange bc = new BlockChange(d.Position, BlockID.Bedrock); session.Player.SendToClient(bc); //New method - Works /* * PlayerDigging pd = new PlayerDigging(); * pd.Position = d.Position; * pd.Face = Face.Down; * pd.Status = PlayerDigging.StatusEnum.CheckBlock; * session.FromClient(pd); */ return(true); }
/// <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); }
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 InvokePlayerDigging(PlayerDigging packet) { packetListener.OnPlayerDigging(packet); }
public virtual void OnPlayerDigging(PlayerDigging packet) { }
public void EnqueueDigging(PlayerDigging d) { _diggers.Enqueue(d); }
public override void FromClient(PacketFromClient packet) { switch (packet.PacketID) { #region Block place/break case PlayerDigging.ID: PlayerDigging pd = packet as PlayerDigging; if (pd.Status == PlayerDigging.StatusEnum.FinishedDigging) { QueueToAll(new BlockChange(pd.Position, BlockID.Air)); } return; /* TODO: fix: crashes with new items such as pot * case PlayerBlockPlacement.ID: * PlayerBlockPlacement pbp = packet as PlayerBlockPlacement; * if(pbp.Item == null) * return; * var bc = new BlockChange(pbp.BlockPosition.Offset(pbp.FaceDirection), pbp.Item.ItemID); * bc.Metadata = (byte)pbp.Item.Uses; * QueueToAll(bc); * return;*/ #endregion #region Moving Looking case PlayerPositionLookClient.ID: { PlayerPositionLookClient p = (PlayerPositionLookClient)packet; SetPosition(p.Position, true); Pitch = p.Pitch; Yaw = p.Yaw; if (Player.Settings.Cloaked == null) { EntityTeleport et = new EntityTeleport(Player.EntityID, p.Position); et.Yaw = p.Yaw; et.Pitch = p.Pitch; QueueToAllButMe(et); QueueToAllButMe(new EntityHeadYaw(Player.EntityID, Yaw)); } CheckPosition(); return; } #endregion case UseEntity.ID: //UseEntity ue = (UseEntity)packet; //Sender see hurt //New: hurt attacker, old: ue.Target QueueToAll(new EntityStatus(this.Player.EntityID, EntityStatuses.EntityHurt)); QueueToAll(new Effect(SoundEffects.MobSpawn, Position.CloneInt())); return; #if DEBUG case PlayerGround.ID: case KeepAlivePing.ID: //case KeepAlivePong.ID: return; default: //Console.WriteLine("Unhandled: " + packet); return; #endif } }