public override void Handle(NecClient client, NecPacket packet)
        {
            client.map.deadBodies.TryGetValue(client.character.eventSelectReadyCode, out DeadBody deadBody);
            Character deadCharacter = _server.instances.GetCharacterByInstanceId(deadBody.characterInstanceId);
            //Todo - server or map needs to maintain characters in memory for a period of time after disconnect
            NecClient deadClient = _server.clients.GetByCharacterInstanceId(deadBody.characterInstanceId);

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); //result, 0 sucess.  interupted, etc.
            res.WriteFloat(0); // time remaining
            router.Send(client, (ushort)AreaPacketId.recv_charabody_loot_complete2_r, res, ServerType.Area);

            if (deadClient != null)
            {
                res = BufferProvider.Provide();
                res.WriteByte((byte)deadCharacter.lootNotify.zoneType);
                res.WriteByte(deadCharacter.lootNotify.container);
                res.WriteInt16(deadCharacter.lootNotify.slot);

                res.WriteInt16(1 /*iteminstance.Quantity*/);  //Number here is "pieces"
                res.WriteCString($"{client.soul.name}");      // soul name
                res.WriteCString($"{client.character.name}"); // chara name
                router.Send(deadClient, (ushort)AreaPacketId.recv_charabody_notify_loot_item, res, ServerType.Area);
            }

            //if (successfull loot condition here)
            {
                ItemService itemService = new ItemService(client.character);
                ItemService deadCharacterItemService = new ItemService(deadCharacter);

                ItemInstance iteminstance = deadCharacterItemService.GetLootedItem(deadCharacter.lootNotify);
                //remove the icon from the deadClient's inventory if they are online.
                RecvItemRemove recvItemRemove = new RecvItemRemove(deadClient, iteminstance);
                if (deadClient != null)
                {
                    router.Send(recvItemRemove);
                }

                //Add RecvItemRemove to remove the icon from the charabody window on successfull loot as well.//ToDo - this didnt work
                RecvItemRemove recvItemRemove2 = new RecvItemRemove(client, iteminstance);
                router.Send(recvItemRemove2);

                //update the item statuses to unidentified
                iteminstance.statuses |= ItemStatuses.Unidentified;
                //put the item in the new owners inventory
                itemService.PutLootedItem(iteminstance);

                RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, iteminstance);
                router.Send(client, recvItemInstanceUnidentified.ToPacket());
            }
        }
        public void LoadInventory(NecClient client, NecServer server)
        {
            ItemService         itemService = new ItemService(client.character);
            List <ItemInstance> ownedItems  = itemService.LoadOwneditemInstances(server);

            foreach (ItemInstance itemInstance in ownedItems)
            {
                if (itemInstance.statuses.HasFlag(ItemStatuses.Unidentified))
                {
                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                    _Logger.Debug($" Unidentified item : {itemInstance.location.zoneType}");
                }
                else
                {
                    RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                    router.Send(client, recvItemInstance.ToPacket());
                }
            }
        }
        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());
        }
예제 #4
0
        public override void Handle(NecClient client, NecPacket packet)
        {
            uint instanceId = packet.data.ReadUInt32();

            _Logger.Debug($"Accessing Body ID {instanceId}");
            client.character.eventSelectReadyCode = instanceId; // store the Instance of the body you are looting on your character.

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(0); //Insert logic gate here. should not always succeed
            router.Send(client, (ushort)AreaPacketId.recv_charabody_access_start_r, res, ServerType.Area);
            //SALVAGE_DEADBODY,-510,It is protected by a mysterious power., SYSTEM_IMPORTANCE,
            //SALVAGE_DEADBODY,-513, It is protected by a mysterious power., SYSTEM_IMPORTANCE,
            // SALVAGE_DEADBODY,-514, It is protected by a mysterious power., SYSTEM_IMPORTANCE,
            //  SALVAGE_DEADBODY,-528, It is protected by a mysterious power., SYSTEM_IMPORTANCE,
            //   SALVAGE_DEADBODY,-526, It cannot be stolen from party members., SYSTEM_IMPORTANCE,
            //   SALVAGE_DEADBODY,-519, The soul is about to revive..., SYSTEM_NOTIFY,
            //   SALVAGE_DEADBODY,-507, No more corpses can be recovered., SYSTEM_NOTIFY,


            if (instanceId == 0)
            {
                return;
            }
            if (instanceId == client.character.deadBodyInstanceId)
            {
                _Logger.Debug("You've met with a terrible fate haven't you!");
                /////////
                //////  Insert Warp to Ressurection statue logic here.
                ///////
                return;
            }

            IInstance instance = server.instances.GetInstance(instanceId);

            switch (instance)
            {
            case DeadBody deadBody1:
                client.map.deadBodies.TryGetValue(deadBody1.instanceId, out deadBody1);
                _Logger.Debug($"Lootin  {deadBody1.soulName}? You Criminal!!");
                ItemService         itemService   = new ItemService(client.character);
                List <ItemInstance> lootableItems = itemService.GetLootableItems(deadBody1.characterInstanceId);
                foreach (ItemInstance itemInstance in lootableItems)
                {
                    ItemLocation originalLocation = itemInstance.location;
                    if (itemInstance.location.zoneType == ItemZoneType.AdventureBag)
                    {
                        itemInstance.location = new ItemLocation(ItemZoneType.CorpseAdventureBag, originalLocation.container, originalLocation.slot);
                    }
                    ;
                    if (itemInstance.location.zoneType == ItemZoneType.EquippedBags)
                    {
                        itemInstance.location = new ItemLocation(ItemZoneType.CorpseEquippedBags, originalLocation.container, originalLocation.slot);
                    }
                    ;
                    if (itemInstance.location.zoneType == ItemZoneType.PremiumBag)
                    {
                        itemInstance.location = new ItemLocation(ItemZoneType.CorpsePremiumBag, originalLocation.container, originalLocation.slot);
                    }
                    ;
                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                    itemInstance.location = originalLocation;
                }

                break;

            case MonsterSpawn monsterSpawn:
                client.map.monsterSpawns.TryGetValue(monsterSpawn.instanceId, out monsterSpawn);
                _Logger.Debug($"Lootin a {monsterSpawn.name}? Hope you get some good stuff");
                /////
                ///     ---- Insert Monster Loot table logic here.  including draw box for parties
                /////
                break;

            case Character character:
                //NecClient targetClient = client.Map.ClientLookup.GetByCharacterInstanceId(instance.InstanceId);
                _Logger.Error($"Lootin a {character.name}? Shouldn't be doin that.  only deadbodies are lootable");
                break;

            case NpcSpawn npcSpawn:
                client.map.npcSpawns.TryGetValue(npcSpawn.instanceId, out npcSpawn);
                _Logger.Error("how are you looting an NPC?");
                break;

            default:
                _Logger.Error($"Instance with InstanceId: {instance.instanceId} does not exist");
                break;
            }
        }
        public override void Execute(string[] command, NecClient client, ChatMessage message,
                                     List <ChatResponse> responses)
        {
            if (command.Length < 1)
            {
                responses.Add(ChatResponse.CommandError(client, "To few arguments"));
                return;
            }

            if (!int.TryParse(command[0], out int itemId))
            {
                responses.Add(ChatResponse.CommandError(client, $"Invalid Number: {command[0]}"));
                return;
            }

            if (client.character == null)
            {
                responses.Add(ChatResponse.CommandError(client, "Character is null"));
                return;
            }

            if (!server.settingRepository.itemInfo.ContainsKey(itemId))
            {
                responses.Add(ChatResponse.CommandError(client, $"ItemId: '{itemId}' does not exist"));
                return;
            }


            ItemSpawnParams spawmParam = new ItemSpawnParams();

            spawmParam.itemStatuses = ItemStatuses.Identified;
            if (command.Length > 1 && command[1] == "u")
            {
                spawmParam.itemStatuses = ItemStatuses.Unidentified;
            }

            ItemService  itemService      = new ItemService(client.character);
            ItemInstance itemInstance     = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, itemId, spawmParam);
            byte         itemZoneOverride = 0;
            IBuffer      res = BufferProvider.Provide();

            res.WriteInt32(2);
            router.Send(client, (ushort)AreaPacketId.recv_situation_start, res, ServerType.Area);

            if (command.Length > 1 && command[1] == "u")
            {
                if (command.Length > 2 && command[2] != "")
                {
                    itemZoneOverride = byte.Parse(command[2]);
                }
                else
                {
                    itemZoneOverride = (byte)itemInstance.location.zoneType;
                }
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                router.Send(client, recvItemInstanceUnidentified.ToPacket());
            }
            else
            {
                _Logger.Debug(itemInstance.type.ToString());
                RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                router.Send(client, recvItemInstance.ToPacket());
            }

            res = BufferProvider.Provide();
            router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
        }
        private void RandomItemGuy(NecClient client, NpcSpawn npcSpawn)
        {
            ItemSpawnParams spawmParam = new ItemSpawnParams();

            spawmParam.itemStatuses = ItemStatuses.Unidentified;
            ItemService  itemService  = new ItemService(client.character);
            ItemInstance itemInstance = null;

            IBuffer res = BufferProvider.Provide();

            res.WriteInt32(2);
            router.Send(client, (ushort)AreaPacketId.recv_situation_start, res, ServerType.Area);

            ItemLocation nextOpenLocation = client.character.itemLocationVerifier.NextOpenSlot(ItemZoneType.AdventureBag);

            if (nextOpenLocation.zoneType == ItemZoneType.InvalidZone)
            {
                res = BufferProvider.Provide();
                res.WriteCString($"Your Adventure Bag is full.  Go away already! {client.soul.name}");     // Length 0xC01
                router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
            }
            else
            {
                if (client.character.eventSelectExecCode == 0)
                {
                    List <ItemInfoSetting> weaponlist = new List <ItemInfoSetting>();
                    foreach (ItemInfoSetting weapon in server.settingRepository.itemInfo.Values)
                    {
                        if ((weapon.id > 10100101) & (weapon.id < 15300101))
                        {
                            weaponlist.Add(weapon);
                        }
                    }

                    int baseId = weaponlist[Util.GetRandomNumber(0, weaponlist.Count)].id;
                    itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, baseId, spawmParam);

                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                }
                else if (client.character.eventSelectExecCode == 1)
                {
                    List <ItemInfoSetting> armorList = new List <ItemInfoSetting>();
                    foreach (ItemInfoSetting armor in server.settingRepository.itemInfo.Values)
                    {
                        if ((armor.id > 16100101) & (armor.id < 30499901))
                        {
                            armorList.Add(armor);
                        }
                    }

                    int baseId = armorList[Util.GetRandomNumber(0, armorList.Count)].id;
                    itemInstance = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, baseId, spawmParam);

                    RecvItemInstanceUnidentified recvItemInstanceUnidentified = new RecvItemInstanceUnidentified(client, itemInstance);
                    router.Send(client, recvItemInstanceUnidentified.ToPacket());
                }
                else if (client.character.eventSelectExecCode == 2)
                {
                    //50401040,Moist Cudgel
                    int baseId = 50401040; //This can select from a small array of items, and a small array of custom names
                    spawmParam.itemStatuses = ItemStatuses.Identified;
                    itemInstance            = itemService.SpawnItemInstance(ItemZoneType.AdventureBag, baseId, spawmParam);

                    RecvItemInstance recvItemInstance = new RecvItemInstance(client, itemInstance);
                    router.Send(client, recvItemInstance.ToPacket());
                }

                if (itemInstance == null)
                {
                    res = BufferProvider.Provide();
                    res.WriteCString("Better Luck Next Time.  I ran out of items!");                           // Length 0xC01
                    router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
                    res = BufferProvider.Provide();
                    router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
                    RecvEventEnd(client); //End The Event
                    return;
                }

                res = BufferProvider.Provide();
                res.WriteCString($"Enjoy your new Super {itemInstance.unidentifiedName}");                 // Length 0xC01
                router.Send(client, (ushort)AreaPacketId.recv_event_system_message, res, ServerType.Area); // show system message on middle of the screen.
            }

            res = BufferProvider.Provide();
            router.Send(client, (ushort)AreaPacketId.recv_situation_end, res, ServerType.Area);
            RecvEventEnd(client); //End The Event
        }