Пример #1
0
    public void OnReceiveUseItemPacket(int node, PacketId id, byte[] data)
    {
        ItemUsePacket packet  = new ItemUsePacket(data);
        ItemUseData   useData = packet.GetPacket();

        Debug.Log("Receive UseItemPacket:" + useData.userId + " -> " +
                  useData.targetId + " (" + useData.itemCategory + ")");

        chrController user = CharacterRoot.getInstance().findPlayer(useData.userId);

        AccountData account_data = AccountManager.get().getAccountData(GlobalParam.getInstance().global_account_id);

        if (user != null && account_data.avator_id != useData.userId)
        {
            Debug.Log("use item. favor:" + useData.itemFavor);

            Item.Favor favor = new Item.Favor();
            favor.category = (Item.CATEGORY)useData.itemCategory;
            this.useItem(-1, favor, useData.userId, useData.targetId, false);
        }
        else
        {
            Debug.Log("Receive packet is already done.");
        }
    }
    private static void HandleOpenBox(GameSession session, IReadOnlyCollection <Item> items, int amount)
    {
        int           opened = 0;
        OpenBoxResult result = OpenBoxResult.Success;

        foreach (Item item in items)
        {
            for (int i = opened; i < amount; i++)
            {
                if (item.Amount <= 0)
                {
                    break;
                }

                if (!ItemBoxHelper.GiveItemFromOpenBox(session, item, out result))
                {
                    break;
                }

                opened++;
            }
        }

        session.Send(ItemUsePacket.Use(items.First().Id, opened, result));
    }
Пример #3
0
        public override void HandleMessageContents(NetworkMessage message, Connection connection)
        {
            var itemUsePacket = new ItemUsePacket(message);
            var player        = Game.Instance.GetCreatureWithId(connection.PlayerId) as Player;

            if (player == null)
            {
                return;
            }

            player.ClearPendingActions();

            // Before actually using the item, check if we're close enough to use it.
            if (itemUsePacket.FromLocation.Type == LocationType.Ground)
            {
                var locationDiff = itemUsePacket.FromLocation - player.Location;

                if (locationDiff.Z != 0)
                {
                    // it's on a different floor...
                    ResponsePackets.Add(new TextMessagePacket
                    {
                        Type    = MessageType.StatusSmall,
                        Message = "There is no way."
                    });

                    return;
                }

                if (locationDiff.MaxValueIn2D > 1)
                {
                    // Too far away to use it.
                    Location retryLoc;
                    var      directions = Game.Instance.Pathfind(player.Location, itemUsePacket.FromLocation, out retryLoc).ToArray();

                    player.SetPendingAction(new UseItemPlayerAction(player, itemUsePacket, retryLoc));

                    if (directions.Any())
                    {
                        player.AutoWalk(directions);
                    }
                    else
                    {
                        // we found no way...
                        ResponsePackets.Add(new TextMessagePacket
                        {
                            Type    = MessageType.StatusSmall,
                            Message = "There is no way."
                        });
                    }

                    return;
                }
            }

            new UseItemPlayerAction(player, itemUsePacket, itemUsePacket.FromLocation).Perform();
        }
Пример #4
0
        public static ItemUsePacket Parse(NetworkMessage message)
        {
            ItemUsePacket packet = new ItemUsePacket();

            packet.FromLocation      = message.GetLocation();
            packet.SpriteId          = message.GetUInt16();
            packet.FromStackPosition = message.GetByte();
            packet.Index             = message.GetByte();

            return(packet);
        }
Пример #5
0
        public override void Handle(GameSession session, PacketReader packet)
        {
            int boxId = packet.ReadInt();

            packet.ReadShort(); // Unknown
            int amount = packet.ReadInt();

            short       opened = 0;                                                       // Amount of opened boxes
            List <Item> items  = new List <Item> (session.Player.Inventory.Items.Values); // Make copy of items in-case new item is added

            foreach (Item item in items)
            {
                // Continue over non-matching item ids
                if (item.Id != boxId)
                {
                    continue;
                }

                for (int i = opened; i < amount; i++)
                {
                    // Create new item from opening box
                    Item newItem = new Item(30001001);

                    // Remove box if there is only 1 left
                    if (item.Amount <= 1)
                    {
                        session.Player.Inventory.Remove(item.Uid, out Item removed);
                        session.Send(ItemInventoryPacket.Remove(item.Uid));
                        InventoryController.Add(session, newItem);

                        opened++;

                        break; // Break out of the amount loop because this stack of boxes is empty, look for next stack
                    }

                    // Update box amount if there is more than 1
                    item.Amount -= 1;
                    session.Send(ItemInventoryPacket.Update(item.Uid, item.Amount));
                    InventoryController.Add(session, newItem);

                    opened++;
                }
            }

            session.Send(ItemUsePacket.Use(boxId, amount));

            // Need to handle opening boxes, probably serialize the item xml
        }
Пример #6
0
    public void SendItemUseData(Item.Favor item_favor, string user_name, string target_name)
    {
        ItemUseData data = new ItemUseData();

        Debug.Log("[CLIENT] SendItemUseData: user:"******" target:" + target_name);
        dbwin.console().print("[CLIENT] SendItemUseData: user:"******" target:" + target_name);

        data.userId       = user_name;
        data.targetId     = target_name;
        data.itemCategory = (int)item_favor.category;

        ItemUsePacket packet = new ItemUsePacket(data);

        if (m_network != null)
        {
            int serverNode = m_network.GetServerNode();
            m_network.SendReliable <ItemUseData>(serverNode, packet);
        }
    }
Пример #7
0
        void HookProxy_OutgoingPacket(byte[] data)
        {
            NetworkMessage msg = new NetworkMessage(client, data);

            if (OutgoingPacket != null)
            {
                OutgoingPacket.Invoke(data);
            }
            byte Type = msg.GetByte();

            switch (Type)
            {
            case 0x82:
                Location loc      = msg.GetLocation();
                uint     itemId   = msg.GetUInt16();
                byte     stackPos = msg.GetByte();
                byte     Index    = msg.GetByte();
                if (ItemUsePacket != null)
                {
                    ItemUsePacket.Invoke(loc, stackPos, (int)itemId, Index);
                }

                break;

            case 0x96:
                byte   type    = msg.GetByte();
                string message = msg.PeekString();
                msg.AddString(message);
                break;

            case 101:
            case 102:
            case 103:
            case 104:
            case 106:
            case 107:
            case 108:
            case 109:
                client.Map.PlayerHavedMoved = true;
                // client.StatusBar = "moved " + Type.ToString("X");
                break;
            }
        }
Пример #8
0
        private static void HandleOpenBox(GameSession session, Dictionary <long, Item> items, /*OpenItemBox box,*/ int amount)
        {
            int opened = 0;

            foreach (KeyValuePair <long, Item> kvp in items)
            {
                Item item = kvp.Value;

                for (int i = opened; i < amount; i++)
                {
                    if (item.Amount <= 0)
                    {
                        break;
                    }

                    opened++;
                    ItemBoxHelper.GiveItemFromOpenBox(session, item);
                }
            }

            session.Send(ItemUsePacket.Use(items.FirstOrDefault().Value.Id, amount));
        }
Пример #9
0
        private static void HandleSelectBox(GameSession session, Dictionary <long, Item> items, SelectItemBox box, int index, int amount)
        {
            ItemDropMetadata metadata = ItemDropMetadataStorage.GetItemDropMetadata(box.BoxId);
            int opened = 0;

            foreach (KeyValuePair <long, Item> kvp in items)
            {
                Item item = kvp.Value;

                for (int i = opened; i < amount; i++)
                {
                    if (item.Amount <= 0)
                    {
                        break;
                    }

                    opened++;
                    ItemBoxHelper.GiveItemFromSelectBox(session, item, index);
                }
            }

            session.Send(ItemUsePacket.Use(items.FirstOrDefault().Value.Id, amount));
        }
        public override void Handle(GameSession session, PacketReader packet)
        {
            int boxId = packet.ReadInt();

            packet.ReadShort(); // Unknown
            int     amount  = packet.ReadInt();
            BoxType boxType = (BoxType)packet.ReadShort();

            int index = 0;

            if (boxType == BoxType.SELECT)
            {
                index = packet.ReadShort() - 0x30; // Starts at 0x30 for some reason
                if (index < 0)
                {
                    return;
                }
            }

            short       opened = 0;                                                      // Amount of opened boxes
            List <Item> items  = new List <Item>(session.Player.Inventory.Items.Values); // Make copy of items in-case new item is added

            foreach (Item item in items)
            {
                // Continue over non-matching item ids
                if (item.Id != boxId)
                {
                    continue;
                }

                // Do nothing if box has no data stored
                if (item.Content.Count <= 0)
                {
                    break;
                }

                for (int i = opened; i < amount; i++)
                {
                    bool breakOut = false; // Needed to remove box before adding item to prevent item duping

                    // Remove box if there is only 1 left
                    if (item.Amount <= 1)
                    {
                        InventoryController.Remove(session, item.Uid, out Item removed);
                        opened++;

                        breakOut = true; // Break out of the amount loop because this stack of boxes is empty, look for next stack
                    }
                    else
                    {
                        // Update box amount if there is more than 1
                        item.Amount -= 1;
                        InventoryController.Update(session, item.Uid, item.Amount);

                        opened++;
                    }

                    // Handle selection box
                    if (boxType == BoxType.SELECT)
                    {
                        if (index < item.Content.Count)
                        {
                            ItemUseHelper.GiveItem(session, item.Content[index]);
                        }
                    }

                    // Handle open box
                    else if (boxType == BoxType.OPEN)
                    {
                        ItemUseHelper.OpenBox(session, item.Content);
                    }

                    if (breakOut)
                    {
                        break;
                    }
                }
            }

            session.Send(ItemUsePacket.Use(boxId, amount));
        }
Пример #11
0
	public void OnReceiveUseItemPacket(int node, PacketId id, byte[] data)
	{
		ItemUsePacket packet = new ItemUsePacket(data);
		ItemUseData useData = packet.GetPacket();

		Debug.Log ("Receive UseItemPacket:" + useData.userId + " -> " + 
		           								useData.targetId + " (" + useData.itemCategory + ")");

		chrController	user = CharacterRoot.getInstance().findPlayer(useData.userId);

		AccountData	account_data = AccountManager.get().getAccountData(GlobalParam.getInstance().global_account_id);

		if (user != null && account_data.avator_id != useData.userId) {
			Debug.Log("use item. favor:" + useData.itemFavor);

			Item.Favor	favor = new Item.Favor();
			favor.category = (Item.CATEGORY) useData.itemCategory;
			this.useItem(-1, favor, useData.userId, useData.targetId, false);
		}
		else {
			Debug.Log("Receive packet is already done.");
		}
	}
Пример #12
0
	public void SendItemUseData(Item.Favor item_favor, string user_name, string target_name)
	{
		ItemUseData data = new ItemUseData();
		
		Debug.Log("[CLIENT] SendItemUseData: user:"******" target:" + target_name);
		dbwin.console().print("[CLIENT] SendItemUseData: user:"******" target:" + target_name);

		data.userId = user_name;
		data.targetId = target_name;
		data.itemCategory = (int)item_favor.category;

		ItemUsePacket packet = new ItemUsePacket(data);
		
		if (m_network != null) {
			int serverNode = m_network.GetServerNode();
			m_network.SendReliable<ItemUseData>(serverNode, packet);
		}
	}
Пример #13
0
 public UseItemPlayerAction(IPlayer player, ItemUsePacket itemUsePacket, Location retryLocation)
     : base(player, itemUsePacket, retryLocation)
 {
 }
Пример #14
0
        public void ParseItemUse(NetworkMessage message)
        {
            ItemUsePacket packet = ItemUsePacket.Parse(message);

            Game.ItemUse(Player, packet.SpriteId, packet.FromLocation, packet.FromStackPosition, packet.Index);
        }
        public override void Handle(GameSession session, PacketReader packet)
        {
            int boxId = packet.ReadInt();

            packet.ReadShort(); // Unknown
            int     amount  = packet.ReadInt();
            BoxType boxType = (BoxType)packet.ReadShort();

            int index = 0;

            if (boxType == BoxType.SELECT)
            {
                index = packet.ReadShort() - 0x30; // Starts at 0x30 for some reason
                if (index < 0)
                {
                    return;
                }
            }

            int opened = 0;
            Dictionary <long, Item> items = new Dictionary <long, Item>(session.Player.Inventory.Items.Where(x => x.Value.Id == boxId)); // Make copy of items in-case new item is added

            foreach (KeyValuePair <long, Item> kvp in items)
            {
                Item item = kvp.Value;
                // Do nothing if box has no data stored
                if (item.Content.Count <= 0)
                {
                    break;
                }

                for (int i = opened; i < amount; i++)
                {
                    bool breakOut = false; // Needed to remove box before adding item to prevent item duping

                    if (item.Amount <= 1)
                    {
                        breakOut = true; // Break out of the amount loop because this stack of boxes is empty, look for next stack
                    }

                    opened++;
                    InventoryController.Consume(session, item.Uid, 1);

                    // Handle selection box
                    if (boxType == BoxType.SELECT)
                    {
                        if (index < item.Content.Count)
                        {
                            ItemUseHelper.GiveItem(session, item.Content[index]);
                        }
                    }

                    // Handle open box
                    else if (boxType == BoxType.OPEN)
                    {
                        ItemUseHelper.OpenBox(session, item.Content);
                    }

                    if (breakOut)
                    {
                        break;
                    }
                }
            }

            session.Send(ItemUsePacket.Use(boxId, amount));
        }