예제 #1
0
파일: World.cs 프로젝트: saroque/server
        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);
            }
        }
예제 #2
0
파일: World.cs 프로젝트: saroque/server
        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);
        }
예제 #3
0
파일: World.cs 프로젝트: saroque/server
        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;
            }   
        }