Exemplo n.º 1
0
        public static object find(Room.Room room, PlayerSetup.Player player, int findNth, string itemToFind)
        {
            //search room items 1st

            var foundItem = FindItem.Item(room.items, findNth, itemToFind);

            if (foundItem != null)
            {
                return(foundItem);
            }

            //search player inventory
            foundItem = FindItem.Item(player.Inventory, findNth, itemToFind);

            if (foundItem != null)
            {
                return(foundItem);
            }

            //search mob
            var foundMob = FindItem.Player(room.mobs, findNth, itemToFind);

            if (foundMob != null)
            {
                return(foundMob);
            }

            //search players
            var foundPlayer = FindItem.Player(room.players, findNth, itemToFind);

            if (foundPlayer != null)
            {
                return(foundPlayer);
            }
            else
            {
                BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You don't see anything by that name here", player.Name + " something something...");
            }

            return(null);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Close
        /// </summary>
        /// <param name="room">room object</param>
        /// <param name="player">player object</param>
        /// <param name="userInput">text entered by user</param>
        /// <param name="commandKey">command entered</param>
        public static void Close(Room room, Player player, string userInput, string commandKey)
        {
            var currentRoom = room;

            var findObject = Events.FindNth.Findnth(userInput);
            int nth        = findObject.Key;

            Item foundItem = null;
            Exit foundExit = null;

            foundItem = FindItem.Item(room.items, nth, userInput);


            if (foundItem == null)
            {
                foundExit = FindItem.Exit(room.exits, nth, userInput);

                if (foundExit.canOpen == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You can't close that", player.Name + " tries to close the " + foundExit.name);
                    return;
                }
            }

            if (foundItem != null)
            {
                if (foundItem.canOpen == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You can't close that", player.Name + " tries to close the " + foundItem.name);
                    return;
                }

                if (foundItem.open == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "It's already closed", player.Name + " tries to close the " + foundItem.name + " which is already closed");
                    return;
                }

                if (foundItem.locked)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You need to unlock that before you can close it", player.Name + " tries to close the " + foundItem.name + "without a key");
                    return;
                }


                if (foundItem.open)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(
                        player.HubGuid,
                        player.Name,
                        room.players,
                        "You close the chest",
                        player.Name + " close the " + foundItem.name);
                    foundItem.open = false;
                }
                else
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(
                        player.HubGuid,
                        player.Name,
                        room.players,
                        "the " + foundItem.name + " is already close  " + foundItem.name,
                        player.Name + " tries to close the already close chest" + foundItem.name);

                    return;
                }
            }
            else if (foundExit != null)
            {
                if (foundExit.open != true)
                {
                    if (foundExit.locked)
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(
                            player.HubGuid,
                            player.Name,
                            room.players,
                            "You need to unlock that before you can close it",
                            player.Name + " tries to close the " + foundExit.name + "without a key");
                        return;
                    }

                    BroadcastPlayerAction.BroadcastPlayerActions(
                        player.HubGuid,
                        player.Name,
                        room.players,
                        "You close " + foundExit.name,
                        player.Name + " closes the " + foundExit.name);
                    foundExit.open = false;
                }
                else
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(
                        player.HubGuid,
                        player.Name,
                        room.players,
                        "the " + foundExit.name + " is already closed  " + foundExit.name,
                        player.Name + " tries to close the already closed chest" + foundExit.name);
                    return;
                }
            }
            //save to cache
            Cache.updateRoom(room, currentRoom);
        }
Exemplo n.º 3
0
        /// <summary>
        /// lock Item
        /// </summary>
        /// <param name="room">room object</param>
        /// <param name="player">player object</param>
        /// <param name="userInput">text entered by user</param>
        /// <param name="commandKey">command entered</param>
        public static void LockItem(Room room, Player player, string userInput, string commandKey)
        {
            var currentRoom   = room;
            var currentPlayer = player;

            string[] all = userInput.Split();
            // var lockedItem = (KeyValuePair<Item, Item>)FindObject(room, player, commandKey, userInput, FindInventory);
            // var container = lockedItem.Key;
            //  var item = lockedItem.Value;

            var findObject = Events.FindNth.Findnth(userInput);
            int nth        = findObject.Key;

            Item foundItem = null;
            Exit foundExit = null;

            foundItem = FindItem.Item(room.items, nth, userInput);



            if (foundItem == null)
            {
                foundExit = FindItem.Exit(room.exits, nth, userInput);

                if (foundExit.canLock == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You can't lock that", player.Name + " tries to lock the " + foundItem.name);
                    return;
                }
            }

            if (foundItem != null)
            {
                if (foundItem.canLock == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You can't lock that", player.Name + " tries to lock the " + foundItem.name);
                    return;
                }

                // find key matching chest lock id
                var hasKey = false;

                foreach (var key in player.Inventory)
                {
                    if (key.keyValue != null)
                    {
                        if (key.keyValue == foundItem.keyId)
                        {
                            hasKey = true;
                        }
                    }
                }

                if (hasKey == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You don't have a key for that", player.Name + " tries to lock the " + foundItem.name + " without the key");
                    return;
                }

                if (foundItem.locked != true)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You lock the chest", player.Name + " locks the " + foundItem.name);
                    foundItem.locked = true;
                }
                else
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "the chest is already locked  " + foundItem.name, player.Name + " tries to locked the already locked chest" + foundItem.name);

                    return;
                }
            }
            else
            {
                // find key matching chest lock id
                var hasKey = false;

                foreach (var key in player.Inventory.Where(key => key.keyValue != null).Where(key => key.keyValue == foundExit.keyId))
                {
                    hasKey = true;
                }

                if (hasKey == false)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You don't have a key for that", player.Name + " tries to lock the " + foundExit.name + " without the key");
                    return;
                }

                if (foundExit.locked != true)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You lock the chest", player.Name + " locks the " + foundExit.name);
                    foundExit.locked = true;
                }
                else
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "the chest is already locked  " + foundExit.name, player.Name + " tries to locked the already locked chest" + foundExit.name);

                    return;
                }
            }



            //save to cache
            Cache.updateRoom(room, currentRoom);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Drops item from player inventory
        /// </summary>
        /// <param name="room">room object</param>
        /// <param name="player">player object</param>
        /// <param name="userInput">text entered by user</param>
        /// <param name="commandKey">command entered</param>
        public static void DropItem(Room room, Player player, string userInput, string commandKey)
        {
            var currentRoom   = room;
            var currentPlayer = player;

            string[] all          = userInput.Split();
            var      returnedItem = (KeyValuePair <Item, Item>)FindObject(room, player, commandKey, userInput, FindInventory);
            var      container    = returnedItem.Key;
            var      item         = returnedItem.Value;

            if (all[0].Equals("all", StringComparison.InvariantCultureIgnoreCase))
            {
                var playerInv      = player.Inventory;
                var playerInvCount = player.Inventory.Count;

                for (int i = playerInvCount - 1; i >= 0; i--)
                {
                    playerInv[i].location = Item.ItemLocation.Room;


                    if (container == null)
                    {
                        playerInv[i].location = Item.ItemLocation.Room;
                        room.items.Add(playerInv[i]);


                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You drop a " + playerInv[i].name, player.Name + " drops a " + playerInv[i].name);
                    }
                    else
                    {
                        if (container.locked == true)
                        {
                            BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "Container is locked", player.Name + " container is locked");

                            return;
                        }

                        if (container.open == false)
                        {
                            HubContext.SendToClient("You have to open the " + container.name + " before you can put somthing inside", player.HubGuid);
                            return;
                        }

                        container.containerItems.Add(playerInv[i]);

                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You drop a " + playerInv[i].name + " into a " + container.name, player.Name + " drops a " + playerInv[i].name + " into a " + container.name);
                    }

                    player.Inventory.Remove(playerInv[i]);
                }
            }
            else
            {
                if (item == null)
                {
                    return;
                }

                player.Inventory.Remove(item);
                item.location = Item.ItemLocation.Room;

                if (container == null)
                {
                    room.items.Add(item);

                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You drop  a " + item.name, player.Name + " drops  a " + item.name);
                }
                else
                {
                    if (container.locked == true)
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "Container is locked", player.Name + " container is locked");

                        return;
                    }

                    if (container.open == false)
                    {
                        HubContext.SendToClient("You have to open the " + container.name + " before you can put somthing inside", player.HubGuid);
                        return;
                    }

                    container.containerItems.Add(item);

                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You put a " + item.name + " inside the " + container.name, player.Name + " puts a " + item.name + " inside the " + container.name);
                }

                //save to cache
                Cache.updateRoom(room, currentRoom);
                Cache.updatePlayer(player, currentPlayer);
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// Finds Objects in room, inventory, containers or mobs and players
        /// </summary>
        /// <param name="room">the room the player is in</param>
        /// <param name="player">the player calling the method</param>
        /// <param name="command">command used</param>
        /// <param name="thingToFind">Object to find</param>
        /// <param name="objectTypeToFind">can only be item, inventory or all</param>
        /// <returns></returns>
        public static object FindObject(Room room, Player player, string command, string thingToFind, string objectTypeToFind = "")
        {
            string item          = thingToFind;
            var    itemContainer = string.Empty;

            //checks for spaces

            //get sword bag - text after the 1st space is the container
            item          = FindFirstAndLast.FindFirstAndLastIndex(thingToFind).Key;
            itemContainer = FindFirstAndLast.FindFirstAndLastIndex(thingToFind).Value;

            //get Item
            var    findObject = Events.FindNth.Findnth(item);
            int    nth        = findObject.Key;
            string itemToFind = findObject.Value;


            //get container
            var    findContainer    = new KeyValuePair <int, string>();
            int    nthContainer     = 0;
            string comntainerToFind = string.Empty;

            if (!string.IsNullOrEmpty(itemContainer))
            {
                findContainer    = Events.FindNth.Findnth(itemContainer);
                nthContainer     = findContainer.Key;
                comntainerToFind = findContainer.Value;
            }

            Item   foundItem      = null;
            Item   foundContainer = null;
            Player foundMob       = null;
            Player foundPlayer    = null;

            List <Item>   roomItems  = room.items;
            List <Item>   playerInv  = player.Inventory;
            List <Player> mobList    = room.mobs;
            List <Player> playerList = room.players;

            #region find Item searching Room and Player Inventory
            if (objectTypeToFind == lookItem && itemToFind != "all")
            {
                // if its not a container
                if (string.IsNullOrEmpty(itemContainer))
                {
                    //search room items 1st
                    foundItem = FindItem.Item(room.items, nth, itemToFind);

                    if (foundItem != null)
                    {
                        return(new KeyValuePair <Item, Item>(null, foundItem));
                    }


                    string msgToPlayer = "You don't see " + AvsAnLib.AvsAn.Query(itemToFind) + " " + itemToFind + " here and you are not carrying " + AvsAnLib.AvsAn.Query(itemToFind) + " " + itemToFind;
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, msgToPlayer, player.Name + " rummages around for an item but finds nothing");
                    return(new KeyValuePair <Item, Item>(null, null));
                }
                else
                {
                    //look in room
                    foundContainer = (nthContainer == -1) ? roomItems.Find(x => x.name.ToLower().Contains(comntainerToFind) && x.container == true)
                                          : roomItems.FindAll(x => x.name.ToLower().Contains(comntainerToFind) && x.container == true).Skip(nthContainer - 1).FirstOrDefault();


                    if (foundContainer != null)
                    {
                        foundItem = FindItem.Item(foundContainer.containerItems, nth, itemToFind);
                    }

                    //return item found in container
                    if (foundItem != null || itemToFind.Equals("all", StringComparison.OrdinalIgnoreCase))
                    {
                        return(new KeyValuePair <Item, Item>(foundContainer, foundItem));
                    }
                    else
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You don't see that inside the container", player.Name + " searches around inside the container but finds nothing");
                    }
                }
            }
            else if (itemToFind == "all" && roomItems.Count == 0 && command == "get")
            {
                HubContext.SendToClient("There is nothing here to get", player.HubGuid);
            }
            else if (itemToFind == "all" && playerInv.Count == 0 && command == "drop" || itemToFind == "all" && playerInv.Count == 0 && command == "put")
            {
                HubContext.SendToClient("You have nothing to drop", player.HubGuid);
            }

            #endregion
            #region find item in player inventory for commands such as drop, equip, wield etc
            else if (objectTypeToFind == FindInventory)
            {
                if (string.IsNullOrEmpty(itemContainer))
                {
                    foundItem = FindItem.Item(player.Inventory, nth, itemToFind);



                    if (foundItem != null || itemToFind.Equals("all", StringComparison.OrdinalIgnoreCase))
                    {
                        return(new KeyValuePair <Item, Item>(foundContainer, foundItem));
                    }
                    else
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "you are not carrying such an item", player.Name + " tries to get an item but can't find it.");
                    }
                }
                else
                {
                    //look in inv
                    if (itemToFind != "all")
                    {
                        foundItem = FindItem.Item(player.Inventory, nth, itemToFind);
                    }

                    if (foundItem != null || itemContainer != null && itemToFind == "all")
                    {
                        //find container
                        foundContainer = (nth == -1)
                                       ? roomItems.Find(x => x.name.ToLower().Contains(itemContainer))
                                       : roomItems.FindAll(x => x.name.ToLower().Contains(itemContainer))
                                         .Skip(nth - 1)
                                         .FirstOrDefault();
                    }
                    else
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "you are not carrying such an item", player.Name + " tries to get an item but can't find it.");
                    }

                    //return item found in container
                    if (foundItem != null || foundContainer != null)
                    {
                        return(new KeyValuePair <Item, Item>(foundContainer, foundItem));
                    }
                    else
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You don't see that item inside the container", player.Name + " tries to get an item from a container but can't find it.");
                    }
                }
            }
            #endregion
            #region find killable mob or player
            else if (objectTypeToFind == Findkillable)
            {
                //search mob
                foundMob = FindItem.Player(room.mobs, nth, itemToFind);

                if (foundMob != null)
                {
                    return(foundMob);
                }
                //search player
                foundPlayer = FindItem.Player(room.players, nth, itemToFind);

                if (foundPlayer != null)
                {
                    return(foundPlayer);
                }
                else
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "you don't see " + itemToFind + " here", player.Name + " tries to kill x but can't find them.");
                }
            }
            #endregion
            else if (objectTypeToFind == FindAll)
            {
                if (comntainerToFind == null)
                {
                    FindWhere.find(room, player, nth, itemToFind);
                }
                else
                {
                    //look in room
                    foundContainer = (nthContainer == -1) ? roomItems.Find(x => x.name.ToLower().Contains(comntainerToFind) && x.container == true)
                                          : roomItems.FindAll(x => x.name.ToLower().Contains(comntainerToFind) && x
                                                              .container == true).Skip(nthContainer - 1).FirstOrDefault();



                    if (foundContainer != null)
                    {
                        //inside found container
                        if (foundContainer.containerItems != null)
                        {
                            var containerItemsCount = foundContainer.containerItems.Count;

                            if (containerItemsCount == 0)
                            {
                                BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "The " + foundContainer.name + " is empty", player.Name + " looks in " + foundContainer.name + " but finds nothing");

                                return(new KeyValuePair <Item, Item>(foundContainer, foundItem));
                            }

                            for (int i = containerItemsCount - 1; i >= 0; i--)
                            {
                                if (foundContainer.containerItems[i].type != Item.ItemType.Gold || foundContainer.containerItems[i].type != Item.ItemType.Silver ||
                                    foundContainer.containerItems[i].type != Item.ItemType.Copper)
                                {
                                    foundContainer.containerItems[i].location = Item.ItemLocation.Inventory;
                                    player.Inventory.Add(foundContainer.containerItems[i]);
                                }
                                else
                                {
                                    if (foundContainer.containerItems[i].type == Item.ItemType.Gold)
                                    {
                                        player.Gold += foundContainer.containerItems[i].count;
                                    }

                                    if (foundContainer.containerItems[i].type == Item.ItemType.Silver)
                                    {
                                        player.Silver += foundContainer.containerItems[i].count;
                                    }

                                    if (foundContainer.containerItems[i].type == Item.ItemType.Copper)
                                    {
                                        player.Copper += foundContainer.containerItems[i].count;
                                    }
                                }


                                BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You pick up a " + foundContainer.containerItems[i].name, player.Name + " picks up a " + foundContainer.containerItems[i].name);

                                foundContainer.containerItems.Remove(foundContainer.containerItems[i]);
                            }
                        }
                        else
                        {
                            BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You don't see that inside the container", player.Name + " searches around inside the container but finds nothing");
                            return(new KeyValuePair <Item, Item>(foundContainer, foundItem));
                        }
                    }
                }
            }



            return(new KeyValuePair <Item, Item>(foundContainer, foundItem));
        }
Exemplo n.º 6
0
        /// <summary>
        /// Adds item from room to player inventory
        /// </summary>
        /// <param name="room">Room Object</param>
        /// <param name="player">Player Object</param>
        /// <param name="userInput">Text user entered</param>
        public static void GetItem(Room room, Player player, string userInput, string commandKey, string type)
        {
            //TODO handle container
            var currentRoom   = room;
            var currentPlayer = player;

            string[] all = userInput.Split();

            if (all[0] == "all")
            {
                type = "all";
            }

            var returnedItem = (KeyValuePair <Item, Item>)FindObject(room, player, commandKey, userInput, type);
            var container    = returnedItem.Key;
            var item         = returnedItem.Value;


            if (all[0].Equals("all", StringComparison.InvariantCultureIgnoreCase) && all.Length == 1)
            {
                var roomItems      = room.items;
                var roomItemsCount = roomItems.Count;

                for (int i = roomItemsCount - 1; i >= 0; i--)
                {
                    //Get all Items from the room
                    roomItems[i].location = Item.ItemLocation.Inventory;
                    player.Inventory.Add(roomItems[i]);

                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You pick up a " + roomItems[i].name, player.Name + " picks up a " + roomItems[i].name);
                    room.items.Remove(roomItems[i]);
                }
            }
            else if (all[0].Equals("all", StringComparison.InvariantCultureIgnoreCase) && container != null)
            {
                if (container.locked == true)
                {
                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "Container is locked", player.Name + " container is locked");

                    return;
                }
                //get all from container
                var containerItems = container.containerItems;
                var containerCount = containerItems.Count;

                for (int i = containerCount - 1; i >= 0; i--)
                {
                    containerItems[i].location = Item.ItemLocation.Inventory;
                    player.Inventory.Add(containerItems[i]);

                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You get a " + containerItems[i].name + " from a " + container.name, player.Name + " get a " + containerItems[i].name + " from a " + container.name);

                    containerItems.Remove(containerItems[i]);
                }
            }

            else if (item != null)
            {
                //get single Item

                if (container == null)
                {
                    room.items.Remove(item);
                    item.location = Item.ItemLocation.Inventory;
                    player.Inventory.Add(item);


                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You pick up a " + item.name, player.Name + " picks up a " + item.name);
                }
                else
                {
                    if (container.locked == true)
                    {
                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "Container is locked", player.Name + " container is locked");

                        return;
                    }

                    //Get item from container
                    container.containerItems.Remove(item);
                    container.location = Item.ItemLocation.Inventory;
                    player.Inventory.Add(item);


                    BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You get a " + item.name + " from a " + container.name, player.Name + " gets a " + item.name + " from a " + container.name);
                }
            }
            else
            {
                BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "There is nothing here to pick up", player.Name + " searches for something to pick up");
                return;
            }

            //save to cache
            Cache.updateRoom(room, currentRoom);
            Cache.updatePlayer(player, currentPlayer);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Drops item from player inventory
        /// </summary>
        /// <param name="room">room object</param>
        /// <param name="player">player object</param>
        /// <param name="userInput">text entered by user</param>
        /// <param name="commandKey">command entered</param>
        public static void GiveItem(Room room, Player player, string userInput, string commandKey, string type)
        {
            var currentRoom   = room;
            var currentPlayer = player;

            string[] all        = userInput.Split();
            var      itemToGive = all[0];
            var      thing      = all.Last();
            var      item       = itemToGive;

            var foundItem  = player.Inventory.FirstOrDefault(x => item != null && x.name.StartsWith(item, StringComparison.CurrentCultureIgnoreCase));
            var foundThing = room.players.FirstOrDefault(x => thing != null && x.Name.StartsWith(thing, StringComparison.CurrentCultureIgnoreCase)) ??
                             room.mobs.FirstOrDefault(x => thing != null && x.Name.StartsWith(thing, StringComparison.CurrentCultureIgnoreCase));

            if (all[0].Equals("all", StringComparison.InvariantCultureIgnoreCase))
            {
                var playerInv      = player.Inventory;
                var playerInvCount = player.Inventory.Count;

                for (int i = playerInvCount - 1; i >= 0; i--)
                {
                    if (foundThing != null)
                    {
                        foundThing.Inventory.Add(playerInv[i]);


                        BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players,
                                                                     "You give a " + playerInv[i].name + " to " + foundThing.Name,
                                                                     player.Name + " gives a " + playerInv[i].name + " to " + foundThing.Name);

                        player.Inventory.Remove(playerInv[i]);
                    }
                }
            }
            else
            {
                if (foundThing == null)
                {
                    HubContext.SendToClient("You don't see " + thing + " here.", player.HubGuid);
                    return;
                }

                if (foundItem == null)
                {
                    HubContext.SendToClient("You are not carrying a " + item, player.HubGuid);
                    return;
                }

                player.Inventory.Remove(foundItem);
                foundThing.Inventory.Add(foundItem);


                BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players,
                                                             "You give a " + foundItem.name + " to " + foundThing.Name,
                                                             player.Name + " gives a " + foundItem.name + " to " + foundThing.Name);

                //check quest

                foreach (var quest in player.QuestLog)
                {
                    if (!quest.Completed && quest.Type == Quest.QuestType.FindMob)
                    {
                        //Find quest requires player to give item to the mob.

                        if (quest.QuestGiver == foundThing.Name && quest.QuestItem.name == foundItem.name)
                        {
                            // player completed quest

                            var mobQuest = foundThing.Quest.FirstOrDefault(x => x.Id.Equals(quest.Id));
                            if (mobQuest != null)
                            {
                                HubContext.SendToClient(
                                    foundThing.Name + " says to you " + mobQuest.RewardDialog.Message.Replace("$playerName", player.Name), player.HubGuid,
                                    null, true);
                            }

                            //award player
                        }
                    }
                }
            }

            //save to cache
            Cache.updateRoom(room, currentRoom);
            Cache.updatePlayer(player, currentPlayer);
            Score.UpdateUiInventory(player);
            var roomdata = LoadRoom.DisplayRoom(room, player.Name);

            Score.UpdateUiRoom(player, roomdata);
        }