private void PacketHandler_0x75_TickHeartbeat(object obj, ClientPacket packet) { var user = (User) obj; var serverTick = packet.ReadInt32(); var clientTick = packet.ReadInt32(); // Dunno what to do with this right now, so we just store it if (!user.IsHeartbeatValid(serverTick, clientTick)) { Logger.InfoFormat("{0}: tick heartbeat not valid, disconnecting", user.Name); user.Logoff(); } else { Logger.DebugFormat("{0}: tick heartbeat valid", user.Name); } }
private void PacketHandler_0x08_DropItem(Object obj, ClientPacket packet) { var user = (User) obj; var slot = packet.ReadByte(); var x = packet.ReadInt16(); var y = packet.ReadInt16(); var count = packet.ReadInt32(); Logger.DebugFormat("{0} {1} {2} {3}", slot, x, y, count); // Do a few sanity checks // // Is the distance valid? (Can't drop things beyond // MAXIMUM_DROP_DISTANCE tiles away) if (Math.Abs(x - user.X) > Constants.PICKUP_DISTANCE || Math.Abs(y - user.Y) > Constants.PICKUP_DISTANCE) { Logger.ErrorFormat("Request to drop item exceeds maximum distance {0}", Hybrasyl.Constants.MAXIMUM_DROP_DISTANCE); return; } // Is this a valid slot? if ((slot == 0) || (slot > Hybrasyl.Constants.MAXIMUM_INVENTORY)) { Logger.ErrorFormat("Slot not valid. Aborting"); return; } // Does the player actually have an item in the slot? Does the count in the packet exceed the // count in the player's inventory? Are they trying to drop the item on something that // is impassable (i.e. a wall)? if ((user.Inventory[slot] == null) || (count > user.Inventory[slot].Count) || (user.Map.IsWall[x, y] == true) || !user.Map.IsValidPoint(x, y)) { Logger.ErrorFormat( "Slot {0} is null, or count {1} exceeds count {2}, or {3},{4} is a wall, or {3},{4} is out of bounds", slot, count, user.Inventory[slot].Count, x, y); return; } Item toDrop = user.Inventory[slot]; if (toDrop.Stackable && count < toDrop.Count) { toDrop.Count -= count; user.SendItemUpdate(toDrop, slot); toDrop = new Item(toDrop); toDrop.Count = count; Insert(toDrop); } else { user.RemoveItem(slot); } // Are we dropping an item onto a reactor? Reactor reactor; var coordinates = new Tuple<byte, byte>((byte) x, (byte) y); if (user.Map.Reactors.TryGetValue(coordinates, out reactor)) { reactor.OnDrop(user, toDrop); } else user.Map.AddItem(x, y, toDrop); }
private void PacketHandler_0x4A_Trade(object obj, ClientPacket packet) { var user = (User) obj; var tradeStage = packet.ReadByte(); if (tradeStage == 0 && user.ActiveExchange != null) return; if (tradeStage != 0 && user.ActiveExchange == null) return; if (user.ActiveExchange != null && !user.ActiveExchange.ConditionsValid) return; switch (tradeStage) { case 0x00: { // Starting trade var x0PlayerId = packet.ReadInt32(); WorldObject target; if (Objects.TryGetValue((uint)x0PlayerId, out target)) { if (target is User) { var playerTarget = (User)target; if (Exchange.StartConditionsValid(user, playerTarget)) { user.SendMessage("That can't be done right now.", MessageTypes.SYSTEM); return; } // Initiate exchange var exchange = new Exchange(user, playerTarget); exchange.StartExchange(); } } } break; case 0x01: // Add item to trade { // We ignore playerId because we only allow one exchange at a time and we // keep track of the participants on both sides var x1playerId = packet.ReadInt32(); var x1ItemSlot = packet.ReadByte(); if (user.Inventory[x1ItemSlot] != null && user.Inventory[x1ItemSlot].Count > 1) { // Send quantity request user.SendExchangeQuantityPrompt(x1ItemSlot); } else user.ActiveExchange.AddItem(user, x1ItemSlot); } break; case 0x02: // Add item with quantity var x2PlayerId = packet.ReadInt32(); var x2ItemSlot = packet.ReadByte(); var x2ItemQuantity = packet.ReadByte(); user.ActiveExchange.AddItem(user, x2ItemSlot, x2ItemQuantity); break; case 0x03: // Add gold to trade var x3PlayerId = packet.ReadInt32(); var x3GoldQuantity = packet.ReadUInt32(); user.ActiveExchange.AddGold(user, x3GoldQuantity); break; case 0x04: // Cancel trade Logger.Debug("Cancelling trade"); user.ActiveExchange.CancelExchange(user); break; case 0x05: // Confirm trade Logger.Debug("Confirming trade"); user.ActiveExchange.ConfirmExchange(user); break; default: return; } }