コード例 #1
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType fromZone      = (ItemZoneType)packet.data.ReadByte();
            byte         fromContainer = packet.data.ReadByte();
            short        fromSlot      = packet.data.ReadInt16();
            short        toSlot        = packet.data.ReadInt16();
            byte         quantity      = packet.data.ReadByte();

            ItemLocation fromLoc     = new ItemLocation(fromZone, fromContainer, fromSlot);
            ItemService  itemService = new ItemService(client.character);

            _itemInstance = itemService.GetIdentifiedItem(fromLoc); //To do; get regular item instead of identified item. Mark item as in trade.
            client.character.tradeWindowSlot[toSlot] = _itemInstance.instanceId;

            ItemLocation originalLocation = _itemInstance.location;

            _itemInstance.location = new ItemLocation(ItemZoneType.TradeWindow, 0, toSlot); //This is bad. it changes the stored location?

            NecClient targetClient = server.clients.GetByCharacterInstanceId((uint)client.character.eventSelectExecCode);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); // error check?
            router.Send(client, (ushort)AreaPacketId.recv_trade_add_item_r, res, ServerType.Area);

            if (targetClient != null)
            {
                RecvItemInstance itemInstance = new RecvItemInstance(targetClient, _itemInstance);
                router.Send(itemInstance);
            }

            _itemInstance.location = originalLocation;
        }
コード例 #2
0
 public ItemLocation(ItemZoneType zoneType, byte container, short slot)
 {
     this.zoneType  = zoneType;
     this.container = container;
     this.slot      = slot;
     _hashcode      = ((int)zoneType << 24) + (container << 16) + slot;
 }
コード例 #3
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zone     = (ItemZoneType)packet.data.ReadByte();
            byte         bag      = packet.data.ReadByte();
            short        slot     = packet.data.ReadInt16();
            byte         quantity = packet.data.ReadByte();

            ItemLocation location    = new ItemLocation(zone, bag, slot);
            ItemService  itemService = new ItemService(client.character);
            int          error       = 0;

            try
            {
                ItemInstance   item           = itemService.Remove(location, quantity);
                RecvItemRemove recvItemRemove = new RecvItemRemove(client, item);
                router.Send(recvItemRemove);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvItemDrop recvItemDrop = new RecvItemDrop(client, error);

            router.Send(recvItemDrop);
        }
コード例 #4
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zone     = (ItemZoneType)packet.data.ReadByte();
            byte         bag      = packet.data.ReadByte();
            short        slot     = packet.data.ReadInt16();
            ulong        saleGold = packet.data.ReadUInt64(); //irrelevant, check sale price server side
            byte         quantity = packet.data.ReadByte();

            ItemLocation location    = new ItemLocation(zone, bag, slot);
            ItemService  itemService = new ItemService(client.character);
            int          error       = 0;

            try
            {
                //ulong currentGold = itemService.Sell(location, quantity);
                ulong currentGold = itemService.AddGold(saleGold);
                RecvSelfMoneyNotify recvSelfMoneyNotify = new RecvSelfMoneyNotify(client, currentGold);
                router.Send(recvSelfMoneyNotify);

                ItemInstance   itemInstance   = itemService.Remove(new ItemLocation(zone, bag, slot), quantity);
                RecvItemRemove recvItemRemove = new RecvItemRemove(client, itemInstance);
                router.Send(recvItemRemove);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvShopSell recvShopSell = new RecvShopSell(client, error);

            router.Send(recvShopSell);
        }
コード例 #5
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zone     = (ItemZoneType)packet.data.ReadByte();
            byte         bag      = packet.data.ReadByte();
            short        slot     = packet.data.ReadInt16();
            ulong        saleGold = packet.data.ReadUInt64(); //irrelevant, check sale price server side
            byte         quantity = packet.data.ReadByte();

            //TODO

            ItemService  itemService  = new ItemService(client.character);
            ItemInstance itemInstance = itemService.GetIdentifiedItem(new ItemLocation(zone, bag, slot));

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_shop_sell_check_r, res, ServerType.Area);


            res = BufferProvider.Provide();
            res.WriteUInt64(itemInstance.instanceId);          // id?
            res.WriteInt64(Util.GetRandomNumber(1000, 25000)); // price?
            res.WriteInt64(Util.GetRandomNumber(100, 2500));   // identify?
            res.WriteInt64(Util.GetRandomNumber(100, 2500));   // curse?
            res.WriteInt64(Util.GetRandomNumber(1000, 2500));  // repair?
            router.Send(client, (ushort)AreaPacketId.recv_shop_notify_item_sell_price, res, ServerType.Area);
        }
コード例 #6
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zone = (ItemZoneType)packet.data.ReadByte();
            byte         bag  = packet.data.ReadByte();
            short        slot = packet.data.ReadInt16();
            //9 bytes left TODO investigate, probably one is identify price which is irrelevant, check price server side

            ItemLocation location    = new ItemLocation(zone, bag, slot);
            ItemService  itemService = new ItemService(client.character);
            ItemInstance identifiedItem;
            int          error = 0;

            try
            {
                identifiedItem = itemService.GetIdentifiedItem(location);
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, identifiedItem);
                router.Send(recvItemInstance);

                identifiedItem.currentDurability = identifiedItem.maximumDurability;
                RecvItemUpdateDurability recvItemUpdateDurability = new RecvItemUpdateDurability(client, identifiedItem);
                router.Send(recvItemUpdateDurability);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvShopIdentify recvShopIdentify = new RecvShopIdentify(client, error);

            router.Send(recvShopIdentify);
        }
コード例 #7
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType fromZone = (ItemZoneType)packet.data.ReadByte();
            byte         fromBag  = packet.data.ReadByte();
            short        fromSlot = packet.data.ReadInt16();
            ItemZoneType toZone   = (ItemZoneType)packet.data.ReadByte();
            byte         toBag    = packet.data.ReadByte();
            short        toSlot   = packet.data.ReadInt16();
            byte         quantity = packet.data.ReadByte();

            _Logger.Debug($"fromStoreType byte [{fromZone}] toStoreType byte [{toZone}]");
            _Logger.Debug($"fromBagId byte [{fromBag}] toBagId byte [{toBag}]");
            _Logger.Debug($"fromSlot byte [{fromSlot}] toSlot[{toSlot}]");
            _Logger.Debug($"itemCount [{quantity}]");

            ItemLocation fromLoc     = new ItemLocation(fromZone, fromBag, fromSlot);
            ItemLocation toLoc       = new ItemLocation(toZone, toBag, toSlot);
            ItemService  itemService = new ItemService(client.character);
            int          error       = 0;

            try
            {
                MoveResult            moveResult = itemService.Move(fromLoc, toLoc, quantity);
                List <PacketResponse> responses  = itemService.GetMoveResponses(client, moveResult);
                router.Send(client, responses);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvStorageDrawItem2 recvStorageDrawItem2 = new RecvStorageDrawItem2(client, error);

            router.Send(recvStorageDrawItem2);
        }
コード例 #8
0
 public ItemLocation[] NextOpenSlots(ItemZoneType itemZoneType, int amount)
 {
     if (amount > _zoneMap[itemZoneType].totalFreeSpace)
     {
         throw new ArgumentOutOfRangeException("Not enough open slots");
     }
     return(_zoneMap[itemZoneType].GetNextXFreeSpaces(itemZoneType, amount));
 }
コード例 #9
0
        public ItemInstance SpawnItemInstance(ItemZoneType itemZoneType, int baseId, ItemSpawnParams spawnParam)
        {
            int[]             itemIds     = { baseId };
            ItemSpawnParams[] spawmParams = new ItemSpawnParams[1];
            spawmParams[0] = spawnParam;
            List <ItemInstance> items = SpawnItemInstances(itemZoneType, itemIds, spawmParams);

            return(items[0]);
        }
コード例 #10
0
        public ItemLocation PutItemInNextOpenSlot(ItemZoneType itemZoneType, ItemInstance item)
        {
            ItemLocation nextOpenSlot = NextOpenSlot(itemZoneType);

            if (!nextOpenSlot.Equals(ItemLocation.InvalidLocation))
            {
                PutItem(nextOpenSlot, item);
            }
            return(nextOpenSlot);
        }
コード例 #11
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType fromZone      = (ItemZoneType)packet.data.ReadByte();
            byte         fromContainer = packet.data.ReadByte();
            short        fromSlot      = packet.data.ReadInt16();

            if (fromZone == ItemZoneType.CorpseAdventureBag)
            {
                fromZone = ItemZoneType.AdventureBag;
            }
            if (fromZone == ItemZoneType.CorpseEquippedBags)
            {
                fromZone = ItemZoneType.EquippedBags;
            }
            if (fromZone == ItemZoneType.CorpsePremiumBag)
            {
                fromZone = ItemZoneType.PremiumBag;
            }
            ItemLocation fromLoc = new ItemLocation(fromZone, fromContainer, fromSlot); //subtract 71 to get from BodyCollection to Adventurer

            client.map.deadBodies.TryGetValue(client.character.eventSelectReadyCode, out DeadBody deadBody);
            Character deadCharacter = _server.instances.GetInstance(deadBody.characterInstanceId) as Character;
            NecClient deadClient    = _server.clients.GetByCharacterInstanceId(deadBody.characterInstanceId);

            if (deadCharacter != null)
            {
                deadCharacter.lootNotify = fromLoc;                        //gotta be able to pass this information to loot_complete2 on successful loot
            }
            //Tell your character to start looting the dead body.  Updates Pose
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);  //result / err check
            res.WriteInt32(10); //loot time
            router.Send(client, (ushort)AreaPacketId.recv_charabody_loot_start2_r, res, ServerType.Area);

            if (deadClient != null)
            {
                //Tell the other player that they are getting lootified.
                res = BufferProvider.Provide();
                res.WriteByte((byte)fromZone);
                res.WriteByte(fromContainer);
                res.WriteInt16(fromSlot);
                res.WriteFloat(1);                            //base loot time
                res.WriteFloat(10);                           // loot time
                res.WriteCString($"{client.soul.name}");      // soul name
                res.WriteCString($"{client.character.name}"); // chara name
                router.Send(deadClient, (ushort)AreaPacketId.recv_charabody_notify_loot_start2, res, ServerType.Area);

                RecvDataNotifyCharaData cData = new RecvDataNotifyCharaData(client.character, client.soul.name);
                _server.router.Send(deadClient, cData.ToPacket());
            }
        }
コード例 #12
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType zoneType    = (ItemZoneType)packet.data.ReadInt32();
            byte         container   = packet.data.ReadByte();
            int          itemsToSort = packet.data.ReadInt32();

            _Logger.Debug($"zoneType [{zoneType}] container [{container}] itemCount [{itemsToSort}]");

            short[] fromSlots  = new short[itemsToSort];
            short[] toSlots    = new short[itemsToSort];
            short[] quantities = new short[itemsToSort];
            for (int i = 0; i < itemsToSort; i++)
            {
                fromSlots[i]  = packet.data.ReadInt16();
                toSlots[i]    = packet.data.ReadInt16();
                quantities[i] = packet.data.ReadInt16();

                _Logger.Debug($"fromSlot short [{fromSlots[i]}] toSlot short [{toSlots[i]}] amount [{quantities[i]}]");
            }


            ItemService itemService = new ItemService(client.character);
            int         error       = 0;

            try
            {
                for (int i = 0; i < itemsToSort; i++)
                {
                    ItemLocation fromLoc  = new ItemLocation(zoneType, container, fromSlots[i]);
                    ItemLocation toLoc    = new ItemLocation(zoneType, container, toSlots[i]);
                    byte         quantity = (byte)quantities[i];

                    MoveResult            moveResult = itemService.Move(fromLoc, toLoc, quantity);
                    List <PacketResponse> responses  = itemService.GetMoveResponses(client, moveResult);
                    router.Send(client, responses);
                }
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }
            catch (Exception e1)
            {
                error = (int)ItemExceptionType.Generic;
                _Logger.Exception(client, e1);
            }

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(error);
            router.Send(client, (ushort)AreaPacketId.recv_item_sort_r, res, ServerType.Area);
        }
コード例 #13
0
        public List <ItemInstance> SpawnItemInstances(ItemZoneType itemZoneType, int[] baseIds, ItemSpawnParams[] spawnParams)
        {
            if (_character.itemLocationVerifier.GetTotalFreeSpace(itemZoneType) < baseIds.Length)
            {
                throw new ItemException(ItemExceptionType.InventoryFull);
            }
            ItemLocation[]      nextOpenLocations = _character.itemLocationVerifier.NextOpenSlots(itemZoneType, baseIds.Length);
            List <ItemInstance> itemInstances     = _itemDao.InsertItemInstances(_character.id, nextOpenLocations, baseIds, spawnParams);

            foreach (ItemInstance item in itemInstances)
            {
                _character.itemLocationVerifier.PutItem(item.location, item);
            }
            return(itemInstances);
        }
コード例 #14
0
        public ItemLocation NextOpenSlot(ItemZoneType itemZoneType)
        {
            int nextContainerWithSpace = _zoneMap[itemZoneType].nextContainerWithSpace;

            if (nextContainerWithSpace != ItemZone.NO_CONTAINERS_WITH_SPACE)
            {
                int nextOpenSlot = _zoneMap[itemZoneType].GetContainer(nextContainerWithSpace).nextOpenSlot;
                if (nextOpenSlot != Container.NO_OPEN_SLOTS)
                {
                    ItemLocation itemLocation = new ItemLocation(itemZoneType, (byte)nextContainerWithSpace, (short)nextOpenSlot);
                    return(itemLocation);
                }
            }

            return(ItemLocation.InvalidLocation);
        }
コード例 #15
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType fromZone      = (ItemZoneType)packet.data.ReadByte();
            byte         fromContainer = packet.data.ReadByte();
            short        fromSlot      = packet.data.ReadInt16();
            ItemLocation fromLoc       = new ItemLocation(fromZone, fromContainer, fromSlot);

            client.map.deadBodies.TryGetValue(client.character.eventSelectReadyCode, out DeadBody deadBody);
            Character   deadCharacter            = _server.instances.GetInstance(deadBody.characterInstanceId) as Character;
            ItemService itemService              = new ItemService(client.character);
            ItemService deadCharacterItemService = new ItemService(deadCharacter);

            ItemInstance iteminstance = deadCharacterItemService.GetLootedItem(fromLoc);

            itemService.PutLootedItem(iteminstance);

            RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, iteminstance);

            router.Send(client, recvItemInstanceUnidentified.ToPacket());
        }
コード例 #16
0
        public ItemLocation[] GetNextXFreeSpaces(ItemZoneType itemZoneType, int amount)
        {
            ItemLocation[] freeSpaces = new ItemLocation[amount];
            int            index      = 0;

            for (int i = 0; i < maxContainers; i++)
            {
                if (containers[i] != null && !containers[i].isFull)
                {
                    int nextOpenSlot = containers[i].nextOpenSlot;
                    while (index < amount)
                    {
                        freeSpaces[index] = new ItemLocation(itemZoneType, (byte)i, (short)nextOpenSlot);
                        index++;
                        nextOpenSlot = containers[i].GetNextOpenSlot(nextOpenSlot);
                    }
                }
            }

            return(freeSpaces);
        }
コード例 #17
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);
            router.Send(client, (ushort)AreaPacketId.recv_union_storage_move_item_r, res, ServerType.Area);

            byte         fromStoreType = packet.data.ReadByte();
            byte         fromBagId     = packet.data.ReadByte();
            short        fromSlot      = packet.data.ReadInt16();
            ItemZoneType toZone        = (ItemZoneType)packet.data.ReadByte();
            byte         toBagId       = packet.data.ReadByte();
            short        toSlot        = packet.data.ReadInt16();
            byte         quantity      = packet.data.ReadByte();

            _Logger.Debug($"fromStoreType byte [{fromStoreType}] toStoreType byte [{toZone}]");
            _Logger.Debug($"fromBagId byte [{fromBagId}] toBagIdId byte [{toBagId}]");
            _Logger.Debug($"fromSlot byte [{fromSlot}] toSlot [{toSlot}]");
            _Logger.Debug($"itemCount [{quantity}]");

            ItemLocation fromLoc     = new ItemLocation((ItemZoneType)fromStoreType, fromBagId, fromSlot);
            ItemLocation toLoc       = new ItemLocation(toZone, toBagId, toSlot);
            ItemService  itemService = new ItemService(client.character);
            int          error       = 0;

            try
            {
                MoveResult            moveResult = itemService.Move(fromLoc, toLoc, quantity);
                List <PacketResponse> responses  = itemService.GetMoveResponses(client, moveResult);
                router.Send(client, responses);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvUnionStorageMoveItem recvUnionStorageMoveItem = new RecvUnionStorageMoveItem(client, error);

            router.Send(recvUnionStorageMoveItem);
        }
コード例 #18
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            List<ItemLocation> itemLocations = new List<ItemLocation>();
            int repairCount = packet.data.ReadInt32();
            for (int i = 0; i < repairCount; i++)
            {
                ItemZoneType zone = (ItemZoneType)packet.data.ReadByte();
                byte bag = packet.data.ReadByte();
                short slot = packet.data.ReadInt16();

                ItemLocation location = new ItemLocation(zone, bag, slot);
                itemLocations.Add(location);
            }

            ulong repairFee = packet.data.ReadUInt64();

            ItemService itemService = new ItemService(client.character);
            int error = 0;
            try
            {
                ulong currentGold = itemService.SubtractGold(repairFee); //TODO ignore the "repair fee" and check server side
                RecvSelfMoneyNotify recvSelfMoneyNotify = new RecvSelfMoneyNotify(client, currentGold);
                router.Send(recvSelfMoneyNotify);

                List<ItemInstance> repairedItems = itemService.Repair(itemLocations);
                foreach (ItemInstance repairedItem in repairedItems)
                {
                    repairedItem.currentDurability = repairedItem.maximumDurability;
                    RecvItemUpdateDurability recvItemUpdateDurability = new RecvItemUpdateDurability(client, repairedItem);
                    router.Send(recvItemUpdateDurability);
                }
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            RecvShopRepair recvShopRepair = new RecvShopRepair(client, error);
            router.Send(recvShopRepair);
        }
コード例 #19
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte         exhibitSlot = packet.data.ReadByte();
            ItemZoneType zone        = (ItemZoneType)packet.data.ReadByte();
            byte         bag         = packet.data.ReadByte();
            short        slot        = packet.data.ReadInt16();
            byte         quantity    = packet.data.ReadByte();
            int          time        = packet.data.ReadInt32(); //0:4hours 1:8 hours 2:12 hours 3:24 hours
            ulong        minBid      = packet.data.ReadUInt64();
            ulong        buyoutPrice = packet.data.ReadUInt64();
            string       comment     = packet.data.ReadCString();

            ItemLocation fromLoc      = new ItemLocation(zone, bag, slot);
            ItemService  itemService  = new ItemService(client.character);
            ulong        instanceId   = 0;
            int          auctionError = 0;

            try
            {
                MoveResult moveResult = itemService.Exhibit(fromLoc, exhibitSlot, quantity, time, minBid, buyoutPrice, comment);
                instanceId = moveResult.destItem.instanceId;
                List <PacketResponse> responses = itemService.GetMoveResponses(client, moveResult);
                router.Send(client, responses);
            }
            catch (AuctionException e)
            {
                auctionError = (int)e.type;
            }

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(auctionError);     //error check.
            res.WriteInt32((int)buyoutPrice); //unknown
            res.WriteUInt64(instanceId);      //unknown
            router.Send(client.map, (ushort)AreaPacketId.recv_auction_exhibit_r, res, ServerType.Area);
        }
コード例 #20
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            ItemZoneType   zone      = (ItemZoneType)packet.data.ReadByte();
            byte           bag       = packet.data.ReadByte();
            short          slot      = packet.data.ReadInt16();
            ItemEquipSlots equipSlot = (ItemEquipSlots)packet.data.ReadInt32();

            _Logger.Debug($"storageType:{zone} bagId:{bag} bagSlotIndex:{slot} equipBit:{equipSlot}");

            ItemLocation location    = new ItemLocation(zone, bag, slot);
            ItemService  itemService = new ItemService(client.character);
            int          error       = 0;

            try
            {
                if (equipSlot.HasFlag(ItemEquipSlots.LeftHand | ItemEquipSlots.RightHand)) //two handed weapon replaces 1h weapon and shield
                {
                    ItemInstance itemRight = itemService.CheckAlreadyEquipped(ItemEquipSlots.RightHand);
                    if (itemRight != null)
                    {
                        itemRight = itemService.Unequip(itemRight.currentEquipSlot);
                        itemRight.currentEquipSlot = ItemEquipSlots.None;
                        RecvItemUpdateEqMask recvItemUpdateEqMaskCurr = new RecvItemUpdateEqMask(client, itemRight);
                        router.Send(recvItemUpdateEqMaskCurr, client);
                    }

                    ItemInstance itemLeft = itemService.CheckAlreadyEquipped(ItemEquipSlots.LeftHand);
                    if (itemLeft != null)
                    {
                        itemLeft = itemService.Unequip(itemLeft.currentEquipSlot);
                        itemLeft.currentEquipSlot = ItemEquipSlots.None;
                        RecvItemUpdateEqMask recvItemUpdateEqMaskCurr = new RecvItemUpdateEqMask(client, itemLeft);
                        router.Send(recvItemUpdateEqMaskCurr, client);
                    }
                }
                else //everything else besides 2h weapons.
                {
                    //update the equipment array
                    ItemInstance equippedItem = itemService.CheckAlreadyEquipped(equipSlot);
                    if (equippedItem != null)
                    {
                        equippedItem = itemService.Unequip(equippedItem.currentEquipSlot);
                        equippedItem.currentEquipSlot = ItemEquipSlots.None;
                        RecvItemUpdateEqMask recvItemUpdateEqMaskCurr = new RecvItemUpdateEqMask(client, equippedItem);
                        router.Send(recvItemUpdateEqMaskCurr, client);
                    }
                }

                //update the equipment array
                ItemInstance newEquippedItem = itemService.Equip(location, equipSlot);

                //Tell the client to move the icons to equipment slots
                RecvItemUpdateEqMask recvItemUpdateEqMask = new RecvItemUpdateEqMask(client, newEquippedItem);
                router.Send(client, recvItemUpdateEqMask.ToPacket());

                //notify other players of your new look
                RecvDataNotifyCharaData myCharacterData = new RecvDataNotifyCharaData(client.character, client.soul.name);
                router.Send(client.map, myCharacterData, client);
            }
            catch (ItemException e)
            {
                error = (int)e.type;
            }

            //tell the send if everything went well or not.  notify the client chat of any errors
            RecvItemEquip recvItemEquip = new RecvItemEquip(client, error);

            router.Send(recvItemEquip);

            //Re-do all your stats
            router.Send(client, itemService.CalculateBattleStats(client));
        }
コード例 #21
0
        private ItemInstance MakeItemInstance(DbDataReader reader)
        {
            ulong        instanceId   = (ulong)reader.GetInt64("id");
            ItemInstance itemInstance = new ItemInstance(instanceId);

            itemInstance.ownerId = reader.GetInt32("owner_id");

            ItemZoneType zone         = (ItemZoneType)reader.GetByte("zone");
            byte         bag          = reader.GetByte("container");
            short        slot         = reader.GetInt16("slot");
            ItemLocation itemLocation = new ItemLocation(zone, bag, slot);

            itemInstance.location = itemLocation;

            itemInstance.baseId = reader.GetInt32("base_id");

            itemInstance.quantity = reader.GetByte("quantity");

            itemInstance.statuses = (ItemStatuses)reader.GetInt32("statuses");

            itemInstance.currentEquipSlot = (ItemEquipSlots)reader.GetInt32("current_equip_slot");

            itemInstance.currentDurability = reader.GetInt32("current_durability");
            itemInstance.maximumDurability = reader.GetInt32("plus_maximum_durability");
            if (itemInstance.maximumDurability == 0)
            {
                itemInstance.maximumDurability = 10;                                      //toDo  update item library.  items shouldnt have 0 for core stats
            }
            itemInstance.enhancementLevel = reader.GetByte("enhancement_level");

            itemInstance.specialForgeLevel = reader.GetByte("special_forge_level");

            itemInstance.physical = reader.GetInt16("physical");
            itemInstance.magical  = reader.GetInt16("magical");

            itemInstance.hardness         = reader.GetByte("hardness");
            itemInstance.plusPhysical     = reader.GetInt16("plus_physical");
            itemInstance.plusMagical      = reader.GetInt16("plus_magical");
            itemInstance.plusGp           = reader.GetInt16("plus_gp");
            itemInstance.plusWeight       = (short)(reader.GetInt16("plus_weight") * 10); //TODO REMOVE THIS MULTIPLICATION AND FIX TRHOUGHOUT CODE
            itemInstance.plusRangedEff    = reader.GetInt16("plus_ranged_eff");
            itemInstance.plusReservoirEff = reader.GetInt16("plus_reservoir_eff");

            int gemSlotNum   = 0;
            int gemSlot1Type = reader.GetByte("gem_slot_1_type");

            if (gemSlot1Type != 0)
            {
                gemSlotNum++;
            }
            int gemSlot2Type = reader.GetByte("gem_slot_2_type");

            if (gemSlot2Type != 0)
            {
                gemSlotNum++;
            }
            int gemSlot3Type = reader.GetByte("gem_slot_3_type");

            if (gemSlot3Type != 0)
            {
                gemSlotNum++;
            }
            GemSlot[] gemSlot = new GemSlot[gemSlotNum];

            itemInstance.enchantId    = reader.GetInt32("enchant_id");
            itemInstance.gp           = reader.GetInt16("plus_gp");
            itemInstance.type         = (ItemType)Enum.Parse(typeof(ItemType), reader.GetString("item_type"));
            itemInstance.quality      = (ItemQualities)Enum.Parse(typeof(ItemQualities), reader.GetString("quality"), true);
            itemInstance.maxStackSize = reader.GetByte("max_stack_size");

            if (reader.GetBoolean("es_hand_r"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.RightHand;
            }
            if (reader.GetBoolean("es_hand_l"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.LeftHand;
            }
            if (reader.GetBoolean("es_quiver"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Quiver;
            }
            if (reader.GetBoolean("es_head"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Head;
            }
            if (reader.GetBoolean("es_body"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Torso;
            }
            if (reader.GetBoolean("es_legs"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Legs;
            }
            if (reader.GetBoolean("es_arms"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Arms;
            }
            if (reader.GetBoolean("es_feet"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Feet;
            }
            if (reader.GetBoolean("es_mantle"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Cloak;
            }
            if (reader.GetBoolean("es_ring"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Ring;
            }
            if (reader.GetBoolean("es_earring"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Earring;
            }
            if (reader.GetBoolean("es_necklace"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Necklace;
            }
            if (reader.GetBoolean("es_belt"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Belt;
            }
            if (reader.GetBoolean("es_talkring"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.Talkring;
            }
            if (reader.GetBoolean("es_avatar_head"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.AvatarHead;
            }
            if (reader.GetBoolean("es_avatar_body"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.AvatarTorso;
            }
            if (reader.GetBoolean("es_avatar_legs"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.AvatarLegs;
            }
            if (reader.GetBoolean("es_avatar_arms"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.AvatarArms;
            }
            if (reader.GetBoolean("es_avatar_feet"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.AvatarFeet;
            }
            if (reader.GetBoolean("es_avatar_feet"))
            {
                itemInstance.equipAllowedSlots |= ItemEquipSlots.AvatarCloak;
            }

            if (reader.GetBoolean("req_hum_m"))
            {
                itemInstance.requiredRaces |= Races.HumanMale;
            }
            if (reader.GetBoolean("req_hum_f"))
            {
                itemInstance.requiredRaces |= Races.HumanFemale;
            }
            if (reader.GetBoolean("req_elf_m"))
            {
                itemInstance.requiredRaces |= Races.ElfMale;
            }
            if (reader.GetBoolean("req_elf_f"))
            {
                itemInstance.requiredRaces |= Races.ElfFemale;
            }
            if (reader.GetBoolean("req_dwf_m"))
            {
                itemInstance.requiredRaces |= Races.DwarfMale;
            }
            if (reader.GetBoolean("req_por_m"))
            {
                itemInstance.requiredRaces |= Races.PorkulMale;
            }
            if (reader.GetBoolean("req_por_f"))
            {
                itemInstance.requiredRaces |= Races.PorkulFemale;
            }
            if (reader.GetBoolean("req_gnm_f"))
            {
                itemInstance.requiredRaces |= Races.GnomeFemale;
            }

            if (reader.GetBoolean("req_fighter"))
            {
                itemInstance.requiredClasses |= Classes.Fighter;
            }
            if (reader.GetBoolean("req_thief"))
            {
                itemInstance.requiredClasses |= Classes.Thief;
            }
            if (reader.GetBoolean("req_mage"))
            {
                itemInstance.requiredClasses |= Classes.Mage;
            }
            if (reader.GetBoolean("req_priest"))
            {
                itemInstance.requiredClasses |= Classes.Priest;
            }
            if (reader.GetBoolean("req_samurai"))
            {
                itemInstance.requiredClasses |= Classes.Samurai;
            }
            if (reader.GetBoolean("req_bishop"))
            {
                itemInstance.requiredClasses |= Classes.Bishop;
            }
            if (reader.GetBoolean("req_ninja"))
            {
                itemInstance.requiredClasses |= Classes.Ninja;
            }
            if (reader.GetBoolean("req_lord"))
            {
                itemInstance.requiredClasses |= Classes.Lord;
            }
            if (reader.GetBoolean("req_clown"))
            {
                itemInstance.requiredClasses |= Classes.Clown;
            }
            if (reader.GetBoolean("req_alchemist"))
            {
                itemInstance.requiredClasses |= Classes.Alchemist;
            }

            if (reader.GetBoolean("req_lawful"))
            {
                itemInstance.requiredAlignments |= Alignments.Lawful;
            }
            if (reader.GetBoolean("req_neutral"))
            {
                itemInstance.requiredAlignments |= Alignments.Neutral;
            }
            if (reader.GetBoolean("req_chaotic"))
            {
                itemInstance.requiredAlignments |= Alignments.Chaotic;
            }

            itemInstance.requiredStrength     = reader.GetByte("req_str");
            itemInstance.requiredVitality     = reader.GetByte("req_vit");
            itemInstance.requiredDexterity    = reader.GetByte("req_dex");
            itemInstance.requiredAgility      = reader.GetByte("req_agi");
            itemInstance.requiredIntelligence = reader.GetByte("req_int");
            itemInstance.requiredPiety        = reader.GetByte("req_pie");
            itemInstance.requiredLuck         = reader.GetByte("req_luk");

            itemInstance.requiredSoulRank = reader.GetByte("req_soul_rank");
            //todo max soul rank
            itemInstance.requiredLevel = reader.GetByte("req_lvl");

            itemInstance.physicalSlash  = reader.GetByte("phys_slash");
            itemInstance.physicalStrike = reader.GetByte("phys_strike");
            itemInstance.physicalPierce = reader.GetByte("phys_pierce");

            itemInstance.physicalDefenseFire  = reader.GetByte("pdef_fire");
            itemInstance.physicalDefenseWater = reader.GetByte("pdef_water");
            itemInstance.physicalDefenseWind  = reader.GetByte("pdef_wind");
            itemInstance.physicalDefenseEarth = reader.GetByte("pdef_earth");
            itemInstance.physicalDefenseLight = reader.GetByte("pdef_light");
            itemInstance.physicalDefenseDark  = reader.GetByte("pdef_dark");

            itemInstance.magicalAttackFire  = reader.GetByte("matk_fire");
            itemInstance.magicalAttackWater = reader.GetByte("matk_water");
            itemInstance.magicalAttackWind  = reader.GetByte("matk_wind");
            itemInstance.magicalAttackEarth = reader.GetByte("matk_earth");
            itemInstance.magicalAttackLight = reader.GetByte("matk_light");
            itemInstance.magicalAttackDark  = reader.GetByte("matk_dark");

            itemInstance.hp   = reader.GetByte("seffect_hp");
            itemInstance.mp   = reader.GetByte("seffect_mp");
            itemInstance.str  = reader.GetByte("seffect_str");
            itemInstance.vit  = reader.GetByte("seffect_vit");
            itemInstance.dex  = reader.GetByte("seffect_dex");
            itemInstance.agi  = reader.GetByte("seffect_agi");
            itemInstance.@int = reader.GetByte("seffect_int");
            itemInstance.pie  = reader.GetByte("seffect_pie");
            itemInstance.luk  = reader.GetByte("seffect_luk");

            itemInstance.resistPoison    = reader.GetByte("res_poison");
            itemInstance.resistParalyze  = reader.GetByte("res_paralyze");
            itemInstance.resistPetrified = reader.GetByte("res_petrified");
            itemInstance.resistFaint     = reader.GetByte("res_faint");
            itemInstance.resistBlind     = reader.GetByte("res_blind");
            itemInstance.resistSleep     = reader.GetByte("res_sleep");
            itemInstance.resistSilence   = reader.GetByte("res_silent");
            itemInstance.resistCharm     = reader.GetByte("res_charm");
            itemInstance.resistConfusion = reader.GetByte("res_confusion");
            itemInstance.resistFear      = reader.GetByte("res_fear");

            //itemInstance.StatusMalus = (ItemStatusEffect)Enum.Parse(typeof(ItemStatusEffect), reader.GetString("status_malus"));
            itemInstance.statusMalusPercent = reader.GetInt32("status_percent");

            itemInstance.objectType = reader.GetString("object_type");              //not sure what this is for
            itemInstance.equipSlot2 = reader.GetString("equip_slot");               //not sure what this is for

            itemInstance.isUseableInTown    = !reader.GetBoolean("no_use_in_town"); //not sure what this is for
            itemInstance.isStorable         = !reader.GetBoolean("no_storage");
            itemInstance.isDiscardable      = !reader.GetBoolean("no_discard");
            itemInstance.isSellable         = !reader.GetBoolean("no_sell");
            itemInstance.isTradeable        = !reader.GetBoolean("no_trade");
            itemInstance.isTradableAfterUse = !reader.GetBoolean("no_trade_after_used");
            itemInstance.isStealable        = !reader.GetBoolean("no_stolen");

            itemInstance.isGoldBorder = reader.GetBoolean("gold_border");

            //itemInstance.Lore = reader.GetString("lore");

            itemInstance.iconId = reader.GetInt32("icon");

            itemInstance.talkRingName = "";
            //TODO fix all the data types once mysql is implemented
            itemInstance.bagSize = reader.GetByte("num_of_bag_slots");

            //grade,
            //weight
            itemInstance.weight = (int)(reader.GetDouble("weight") * 10000); // TODO DOUBLE CHECK THIS IS CORRECT SCALE

            //auction
            itemInstance.consignerSoulName      = reader.IsDBNull("consigner_soul_name") ? "" : reader.GetString("consigner_soul_name");
            itemInstance.secondsUntilExpiryTime = reader.IsDBNull("expiry_datetime") ? 0 : CalcSecondsToExpiry(reader.GetInt64("expiry_datetime"));
            itemInstance.minimumBid             = reader.IsDBNull("min_bid") ? 0 : (ulong)reader.GetInt64("min_bid");
            itemInstance.buyoutPrice            = reader.IsDBNull("buyout_price") ? 0 : (ulong)reader.GetInt64("buyout_price");
            itemInstance.comment = reader.IsDBNull("comment") ? "" : reader.GetString("comment");

            //enhancement
            itemInstance = CalcEnhancement(itemInstance);

            return(itemInstance);
        }
コード例 #22
0
 public bool IsEmptyContainer(ItemZoneType itemZoneType, int container)
 {
     return(_zoneMap[itemZoneType].GetContainer(container).count == 0);
 }
コード例 #23
0
 public int GetTotalFreeSpace(ItemZoneType itemZoneType)
 {
     return(_zoneMap[itemZoneType].totalFreeSpace);
 }