Esempio n. 1
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte[]  forgeItemStorageType = new byte[3];
            byte[]  forgeItemBag         = new byte[3];
            short[] forgeItemSlot        = new short[3];

            byte  storageType    = packet.data.ReadByte();
            byte  bag            = packet.data.ReadByte();
            short slot           = packet.data.ReadInt16();
            int   forgeItemCount = packet.data.ReadInt32();

            for (int i = 0; i < forgeItemCount; i++)
            {
                forgeItemStorageType[i] = packet.data.ReadByte();
                forgeItemBag[i]         = packet.data.ReadByte();
                forgeItemSlot[i]        = packet.data.ReadInt16();
            }

            byte  supportItemCount       = packet.data.ReadByte();
            byte  supportItemStorageType = packet.data.ReadByte();
            byte  supportItemBag         = packet.data.ReadByte();
            short supportItemSlot        = packet.data.ReadInt16();

            //5 bytes left
            //TODO

            ItemService     itemService     = new ItemService(client.character);
            ItemInstance    itemInstance    = client.character.itemLocationVerifier.GetItem(new ItemLocation((ItemZoneType)storageType, bag, slot));
            ForgeMultiplier forgeMultiplier = itemService.ForgeMultiplier(itemInstance.enhancementLevel + 1);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);                                      //err check
            res.WriteUInt64((ulong)Util.GetRandomNumber(500, 600)); //Forge Cost.   Not itemInstance.InstanceID
            res.WriteByte((byte)Util.GetRandomNumber(0, 11));       //'Masters Response' Probability of success cast as a sarcastic message.
            res.WriteInt32(itemInstance.physical * 100);
            res.WriteInt32(itemInstance.magical * 100);
            res.WriteInt32(itemInstance.maximumDurability);
            res.WriteByte(itemInstance.hardness);
            res.WriteInt32((int)(itemInstance.physical * forgeMultiplier.factor) * 100);
            res.WriteInt32((int)(itemInstance.magical * forgeMultiplier.factor) * 100);
            res.WriteInt32((int)(itemInstance.maximumDurability * forgeMultiplier.durability));
            res.WriteByte((byte)(itemInstance.hardness + forgeMultiplier.hardness));
            res.WriteInt32(itemInstance.weight - forgeMultiplier.weight);
            res.WriteInt16((short)Util.GetRandomNumber(0, 5)); //???
            res.WriteInt16((short)Util.GetRandomNumber(0, 5)); //???
            res.WriteInt16((short)Util.GetRandomNumber(0, 5)); //???

            router.Send(client, (ushort)AreaPacketId.recv_forge_check_r, res, ServerType.Area);
        }
        public override void Handle(NecClient client, NecPacket packet)
        {
            byte[]  forgeItemStorageType = new byte[3];
            byte[]  forgeItemBag         = new byte[3];
            short[] forgeItemSlot        = new short[3];

            byte  storageType    = packet.data.ReadByte();
            byte  bag            = packet.data.ReadByte();
            short slot           = packet.data.ReadInt16();
            int   forgeItemCount = packet.data.ReadInt32();

            for (int i = 0; i < forgeItemCount; i++)
            {
                forgeItemStorageType[i] = packet.data.ReadByte();
                forgeItemBag[i]         = packet.data.ReadByte();
                forgeItemSlot[i]        = packet.data.ReadInt16();
            }

            byte  supportItemCount       = packet.data.ReadByte();
            byte  supportItemStorageType = packet.data.ReadByte();
            byte  supportItemBag         = packet.data.ReadByte();
            short supportItemSlot        = packet.data.ReadInt16();

            int result = 1;

            int luckyChance = Util.GetRandomNumber(0, client.character.luck); //the more luck you have, the better your chances

            if (luckyChance < 5)
            {
                result = 2;
            }
            if ((result == 2) & (forgeItemCount > 1) && Util.GetRandomNumber(0, client.character.luck) < 4)
            {
                result = 1;                                                                                             // use 2 forge stone, get a 2nd chance
            }
            if ((result == 2) & (forgeItemCount > 2) && Util.GetRandomNumber(0, client.character.luck) < 3)
            {
                result = 1;                                                                                             // use 3 forge stone, get a 3rd chance
            }
            //if ((result == 2) & (forgeItemCount > 2) && Util.GetRandomNumber(0, client.Character.Luck) < 5) result = 1; // use 3 forge stone, get a 4th chance


            RecvForgeNotifyExecuteResult recvForgeNotifyExecuteResult = new RecvForgeNotifyExecuteResult(client.character.instanceId, result);

            router.Send(client, recvForgeNotifyExecuteResult.ToPacket());

            ItemService     itemService     = new ItemService(client.character);
            ItemInstance    itemInstance    = client.character.itemLocationVerifier.GetItem(new ItemLocation((ItemZoneType)storageType, bag, slot));
            ForgeMultiplier forgeMultiplier = itemService.ForgeMultiplier(itemInstance.enhancementLevel + 1);

            if (itemInstance.enhancementLevel > 9)
            {
                result = 0;                                    // no forging beyond 10. sorry.
            }
            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0);      // 0 is a pass, anything but 0 is a fail; seems like a check for if you can still upgrade the weapon
            res.WriteInt32(result); // anything but a 1 here is a fail condition, 1 here is a pass condition.
            router.Send(client, (ushort)AreaPacketId.recv_forge_execute_r, res, ServerType.Area);

            itemInstance.enhancementLevel += 1;
            itemInstance.physical          = (short)(itemInstance.physical * forgeMultiplier.factor);
            itemInstance.magical           = (short)(itemInstance.magical * forgeMultiplier.factor);
            itemInstance.maximumDurability = (short)(itemInstance.maximumDurability * forgeMultiplier.durability);
            itemInstance.hardness          = (byte)(itemInstance.hardness + forgeMultiplier.hardness);
            itemInstance.weight            = (short)(itemInstance.weight - forgeMultiplier.weight);

            if (result == 1)
            {
                RecvItemUpdateLevel recvItemUpdateLevel = new RecvItemUpdateLevel(itemInstance.instanceId, itemInstance.enhancementLevel);
                router.Send(client, recvItemUpdateLevel.ToPacket());
                RecvItemUpdatePhysics recvItemUpdatePhysics = new RecvItemUpdatePhysics(itemInstance.instanceId, itemInstance.physical);
                router.Send(client, recvItemUpdatePhysics.ToPacket());
                RecvItemUpdateMagic recvItemUpdateMagic = new RecvItemUpdateMagic(itemInstance.instanceId, itemInstance.magical);
                router.Send(client, recvItemUpdateMagic.ToPacket());
                RecvItemUpdateMaxDur recvItemUpdateMaxDur = new RecvItemUpdateMaxDur(itemInstance.instanceId, itemInstance.maximumDurability);
                router.Send(client, recvItemUpdateMaxDur.ToPacket());
                RecvItemUpdateHardness recvItemUpdateHardness = new RecvItemUpdateHardness(itemInstance.instanceId, itemInstance.hardness);
                router.Send(client, recvItemUpdateHardness.ToPacket());
                RecvItemUpdateWeight recvItemUpdateWeight = new RecvItemUpdateWeight(itemInstance.instanceId, itemInstance.weight);
                router.Send(client, recvItemUpdateWeight.ToPacket());

                itemService.UpdateEnhancementLevel(itemInstance);
            }
            else if (supportItemCount == 0)
            {
                itemService.Remove(itemInstance.location, itemInstance.quantity);
                RecvItemRemove recvItemRemove = new RecvItemRemove(client, itemInstance);
                router.Send(recvItemRemove);
            }
            else if (itemInstance.enhancementLevel > 4) //if forge fails but gaurd exists, do not lose item.
            {
                itemInstance.enhancementLevel = 4;

                ForgeMultiplier forgeDehancementMultiplier = itemService.LoginLoadMultiplier(itemInstance.enhancementLevel);
                server.settingRepository.itemLibrary.TryGetValue(itemInstance.baseId, out ItemLibrarySetting itemLibrarySetting); //ToDo,  load Nec_Item_Library into memory for queries like this.
                if (itemLibrarySetting != null)
                {
                    itemInstance.physical          = (short)itemLibrarySetting.physicalAttack;
                    itemInstance.magical           = (short)itemLibrarySetting.magicalAttack;
                    itemInstance.maximumDurability = itemLibrarySetting.durability;
                    itemInstance.hardness          = (byte)itemLibrarySetting.hardness;
                    itemInstance.weight            = (int)itemLibrarySetting.weight;
                }

                itemInstance.physical          = (short)(itemInstance.physical * forgeDehancementMultiplier.factor);
                itemInstance.magical           = (short)(itemInstance.magical * forgeDehancementMultiplier.factor);
                itemInstance.maximumDurability = (short)(itemInstance.maximumDurability * forgeDehancementMultiplier.durability);
                itemInstance.hardness          = (byte)(itemInstance.hardness + forgeDehancementMultiplier.hardness);
                itemInstance.weight            = (short)(itemInstance.weight - forgeDehancementMultiplier.weight);

                RecvItemUpdateLevel recvItemUpdateLevel = new RecvItemUpdateLevel(itemInstance.instanceId, itemInstance.enhancementLevel);
                router.Send(client, recvItemUpdateLevel.ToPacket());
                RecvItemUpdatePhysics recvItemUpdatePhysics = new RecvItemUpdatePhysics(itemInstance.instanceId, itemInstance.physical);
                router.Send(client, recvItemUpdatePhysics.ToPacket());
                RecvItemUpdateMagic recvItemUpdateMagic = new RecvItemUpdateMagic(itemInstance.instanceId, itemInstance.magical);
                router.Send(client, recvItemUpdateMagic.ToPacket());
                RecvItemUpdateMaxDur recvItemUpdateMaxDur = new RecvItemUpdateMaxDur(itemInstance.instanceId, itemInstance.maximumDurability);
                router.Send(client, recvItemUpdateMaxDur.ToPacket());
                RecvItemUpdateHardness recvItemUpdateHardness = new RecvItemUpdateHardness(itemInstance.instanceId, itemInstance.hardness);
                router.Send(client, recvItemUpdateHardness.ToPacket());
                RecvItemUpdateWeight recvItemUpdateWeight = new RecvItemUpdateWeight(itemInstance.instanceId, itemInstance.weight);
                router.Send(client, recvItemUpdateWeight.ToPacket());

                itemService.UpdateEnhancementLevel(itemInstance);
            }

            for (int i = 0; i < forgeItemCount; i++)
            {
                ItemInstance forgeItemInstance = client.character.itemLocationVerifier.GetItem(new ItemLocation((ItemZoneType)forgeItemStorageType[i], forgeItemBag[i], forgeItemSlot[i]));
                if (forgeItemInstance != null)
                {
                    RecvItemRemove recvItemRemove = new RecvItemRemove(client, forgeItemInstance);
                    router.Send(recvItemRemove);
                    itemService.Remove(forgeItemInstance.location, forgeItemInstance.quantity);
                }
            }

            for (int i = 0; i < supportItemCount; i++)
            {
                ItemInstance supportItemInstance = client.character.itemLocationVerifier.GetItem(new ItemLocation((ItemZoneType)supportItemStorageType, supportItemBag, supportItemSlot));
                if (supportItemInstance != null)
                {
                    RecvItemRemove recvItemRemove = new RecvItemRemove(client, supportItemInstance);
                    router.Send(recvItemRemove);
                    itemService.Remove(supportItemInstance.location, supportItemInstance.quantity);
                }
            }
        }