public virtual ActionResult RemoveCurseSend(int curseEffectSourceId, int id) { var myMembershipId = User.Identity.GetUserId(); var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); // assert player is animate if (me.Mobility != PvPStatics.MobilityFull) { TempData["Error"] = "You must be animate in order to use this."; return(RedirectToAction(MVC.PvP.Play())); } // assert player has not already used an item this turn if (me.ItemsUsedThisTurn >= PvPStatics.MaxItemUsesPerUpdate) { TempData["Error"] = "You've already used an item this turn."; TempData["SubError"] = "You will be able to use another consumable next turn."; return(RedirectToAction(MVC.Item.MyInventory())); } // assert player owns this item var itemToUse = ItemProcedures.GetItemViewModel(id); if (itemToUse == null || itemToUse.dbItem.OwnerId != me.Id) { TempData["Error"] = "You do not own the item needed to do this."; return(RedirectToAction(MVC.PvP.Play())); } // assert that the item can remove curses and is not any old item if (itemToUse.dbItem.ItemSourceId != ItemStatics.CurseLifterItemSourceId && itemToUse.dbItem.ItemSourceId != ItemStatics.ButtPlugItemSourceId) { TempData["Error"] = "This item cannot remove curses."; return(RedirectToAction(MVC.PvP.Play())); } var curseToRemove = EffectStatics.GetDbStaticEffect(curseEffectSourceId); // assert this curse is removable if (!curseToRemove.IsRemovable) { TempData["Error"] = "This curse is too strong to be lifted."; return(RedirectToAction(MVC.PvP.Play())); } // back on your feet curse/buff -- just delete outright if (curseToRemove.Id == PvPStatics.Effect_BackOnYourFeetSourceId) { EffectProcedures.RemovePerkFromPlayer(curseToRemove.Id, me); } // regular curse; set duration to 0 but keep cooldown else { EffectProcedures.SetPerkDurationToZero(curseToRemove.Id, me); } // if the item is a consumable type, delete it. Otherwise reset its cooldown if (itemToUse.Item.ItemType == PvPStatics.ItemType_Consumable) { ItemProcedures.DeleteItem(itemToUse.dbItem.Id); } // else if (itemToUse.Item.ItemType == PvPStatics.ItemType_Consumable_Reuseable) else { ItemProcedures.ResetUseCooldown(itemToUse); } PlayerProcedures.AddItemUses(me.Id, 1); var result = $"You have successfully removed the curse <b>{curseToRemove.FriendlyName}</b> from your body!"; TempData["Result"] = result; var playerMessage = itemToUse.Item.UsageMessage_Player; if (string.IsNullOrEmpty(playerMessage)) { PlayerLogProcedures.AddPlayerLog(me.Id, result, false); } else { PlayerLogProcedures.AddPlayerLog(me.Id, $"{playerMessage}<br />{result}", itemToUse.dbItem.FormerPlayerId != null); } if (itemToUse.dbItem.ItemSourceId == ItemStatics.ButtPlugItemSourceId && itemToUse.dbItem.FormerPlayerId != null) { var itemMessage = itemToUse.Item.UsageMessage_Item; var context = $"Your owner just used you to remove the curse <b>{curseToRemove.FriendlyName}</b>! Doesn't that make you feel all warm and tingly?"; itemMessage = string.IsNullOrEmpty(itemMessage) ? context : $"{itemMessage}<br />{context}"; PlayerLogProcedures.AddPlayerLog((int)itemToUse.dbItem.FormerPlayerId, itemMessage, true); } return(RedirectToAction(MVC.PvP.Play())); }
public static void ClaimReward(Player attacker, Player victim, DbStaticForm victimNewForm) { if (attacker == null || victim == null || victimNewForm == null) { return; } // Ensure victim is still in PvP, or not a player (in case we want to support bounties on NPCs) if (victim.BotId == AIStatics.ActivePlayerBotId && victim.GameMode != (int)GameModeStatics.GameModes.PvP) { return; } // NPCs are not eligible to claim bounties if (attacker.BotId != AIStatics.ActivePlayerBotId) { return; } // Only reward PvP players to avoid friend list/alt abuse if (attacker.GameMode != (int)GameModeStatics.GameModes.PvP) { return; } var bountyStaticEffectIds = MAPPINGS.Select(se => se.EffectSourceId); var victimEffects = EffectProcedures.GetPlayerEffects2(victim.Id).Where(e => bountyStaticEffectIds.Contains(e.dbEffect.EffectSourceId)); var award = 0; foreach (var victimEffect in victimEffects) { var bounty = BountyDetails(victim, victimEffect.dbEffect.EffectSourceId); if (bounty == null) { continue; } if (victimNewForm.Id == bounty.Form?.Id) { // Victim has been turned into the requested form - full reward award = bounty.CurrentReward; } else if (victimNewForm.ItemSourceId.HasValue) { // Award half bounty for a different inanimate form of the same type IDbStaticItemRepository itemsRepo = new EFDbStaticItemRepository(); var itemForm = itemsRepo.DbStaticItems.FirstOrDefault(i => i.Id == victimNewForm.ItemSourceId.Value); if (itemForm?.ItemType == bounty.Category) { award = bounty.CurrentReward / 2; } } if (award > 0) { // Release the victim from the claimed bounty EffectProcedures.SetPerkDurationToZero(victimEffect.dbEffect.EffectSourceId, victim); // Award bounty funds to attacker PlayerLogProcedures.AddPlayerLog(attacker.Id, $"For turning {victim.GetFullName()} into a {victimNewForm.FriendlyName} you claim a bounty of {award} arpeyjis.", true); PlayerProcedures.GiveMoneyToPlayer(attacker, award); StatsProcedures.AddStat(attacker.MembershipId, StatsProcedures.Stat__BountiesClaimed, award); break; } } }