/// <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); }
/// <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; playerInv[i].isHiddenInRoom = false; 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); player.Inventory.Remove(playerInv[i]); } 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 something 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; } if (container == null) { player.Inventory.Remove(item); item.location = Item.ItemLocation.Room; 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 something inside", player.HubGuid); return; } player.Inventory.Remove(item); item.location = Item.ItemLocation.Room; 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); Score.UpdateUiInventory(player); var roomdata = LoadRoom.DisplayRoom(room, player.Name); Score.UpdateUiRoom(player, roomdata); }
public static void IsDead(Player attacker, Player defender, Room room) { if (defender.HitPoints <= 0) { HubContext.SendToAllExcept(defender.Name + " dies ", room.fighting, room.players); HubContext.SendToClient("You die", defender.HubGuid); HubContext.SendToClient(defender.Name + " dies", attacker.HubGuid); defender.Target = null; //Turn corpse into room item var defenderCorpse = new Item { name = "The corpse of " + defender.Name, container = true, containerItems = new List <Item>(), description = new Description { look = "The slain corpse of " + defender.Name + " is here.", room = "The slain corpse of " + defender.Name } }; foreach (var invItem in defender.Inventory) { invItem.location = Item.ItemLocation.Room; defenderCorpse.containerItems.Add(invItem); } var oldRoom = room; room.items.Add(defenderCorpse); room.corpses.Add(defender); if (defender.Type == Player.PlayerTypes.Mob) { room.mobs.Remove(defender); } else { //room.players.Remove(defender); //Add slain player to recall } defender.Target = null; attacker.Target = null; attacker.Status = PlayerSetup.Player.PlayerStatus.Standing; defender.Status = defender.Type == Player.PlayerTypes.Player ? PlayerSetup.Player.PlayerStatus.Ghost : PlayerSetup.Player.PlayerStatus.Dead; Cache.updateRoom(room, oldRoom); var xp = new Experience(); int xpGain = xp.GainXp(attacker, defender); attacker.Experience += xpGain; attacker.TotalExperience += xpGain; HubContext.SendToClient(xpGain + "XP", attacker.HubGuid); xp.GainLevel(attacker); //calc xp //create corpse foreach (var player in room.players) { var roomdata = LoadRoom.DisplayRoom(room, player.Name); Score.UpdateUiRoom(player, roomdata); } } }
/// <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--) { if (!roomItems[i].stuck) { //Get all Items from the room if (roomItems[i].type != Item.ItemType.Gold) { 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 { player.Gold += roomItems[i].count; BroadcastPlayerAction.BroadcastPlayerActions( player.HubGuid, player.Name, room.players, "You pick up " + roomItems[i].count + " " + roomItems[i].name, player.Name + " picks up a " + roomItems[i].name); room.items.Remove(roomItems[i]); } } else { HubContext.SendToClient("You can't take that", player.HubGuid); } } } 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--) { if (containerItems[i].type != Item.ItemType.Gold) { 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 { player.Gold += containerItems[i].count; BroadcastPlayerAction.BroadcastPlayerActions( player.HubGuid, player.Name, room.players, "You pick up " + item.count + " " + item.name + " from a " + container.name, player.Name + " picks up a " + item.name + containerItems[i].name + " from a " + container.name); containerItems.Remove(containerItems[i]); } } } else if (item != null) { //get single Item if (container == null) { if (!item.stuck) { if (item.type != Item.ItemType.Gold) { 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 { room.items.Remove(item); player.Gold += item.count; BroadcastPlayerAction.BroadcastPlayerActions( player.HubGuid, player.Name, room.players, "You pick up " + item.count + " " + item.name, player.Name + " picks up a " + item.name); } } else { HubContext.SendToClient("You can't take that", player.HubGuid); } } 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 if (item.type != Item.ItemType.Gold) { 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 " + container.name, player.Name + " gets a " + item.name + " from " + container.name); } else { container.containerItems.Remove(item); player.Gold += item.count; BroadcastPlayerAction.BroadcastPlayerActions(player.HubGuid, player.Name, room.players, "You get " + item.count + " " + item.name + "coin 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); Score.UpdateUiInventory(player); var roomdata = LoadRoom.DisplayRoom(room, player.Name); Score.UpdateUiRoom(player, roomdata); }
private static async Task HitTarget(Player attacker, Player defender, Room room, int delay) { try { while (attacker.HitPoints > 0 && defender.HitPoints > 0) { //check still here Player target = FindValidTarget(room, defender.Name, attacker); if (target == null) { HubContext.SendToClient("No one here by that name", attacker.HubGuid); return; } bool canAttack = CanAttack(attacker, defender); if (canAttack) { bool alive = IsAlive(attacker, defender); if (alive && attacker.Status != Player.PlayerStatus.Busy) { await Task.Delay(delay); double offense = Offense(attacker); double evasion = Evasion(defender); double toHit = (offense / evasion) * 100; int chance = D100(); Player checkAttackerAgainAfterDelay = FindValidTarget(room, defender.Name, attacker); Player checkDefenderAgainAfterDelay = FindValidTarget(room, attacker.Name, defender); if (checkAttackerAgainAfterDelay == null || checkDefenderAgainAfterDelay == null) { //Fixes bug where fleeing you would still get hit and hit back while in another room. return; } ShowAttack(attacker, defender, room, toHit, chance, null); if (attacker.Type == Player.PlayerTypes.Player) { Score.UpdateUiPrompt(attacker); } if (defender.Type == Player.PlayerTypes.Player) { Score.UpdateUiPrompt(defender); } } } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }