private void DoPerkRemoval() { if (!CanRefundPerk()) { return; } var model = GetDialogCustomData <Model>(); var player = GetPC(); var pcPerk = DataService.PCPerk.GetByID(model.PCPerkID); var perk = DataService.Perk.GetByID(pcPerk.PerkID); var minimumLevel = 1; if (IsGrantedByBackground((PerkType)perk.ID)) { minimumLevel = 2; } var refundAmount = DataService.PerkLevel.GetAllByPerkID(perk.ID) .Where(x => x.Level <= pcPerk.PerkLevel && x.Level >= minimumLevel).Sum(x => x.Price); var dbPlayer = DataService.Player.GetByID(player.GlobalID); dbPlayer.DatePerkRefundAvailable = DateTime.UtcNow.AddHours(24); RemovePerkItem(perk); RemovePerkFeat(perk); CustomEffectService.RemoveStance(GetPC()); PlayerStatService.ApplyStatChanges(GetPC(), null); dbPlayer.UnallocatedSP += refundAmount; var refundAudit = new PCPerkRefund { PlayerID = player.GlobalID, DateAcquired = pcPerk.AcquiredDate, DateRefunded = DateTime.UtcNow, Level = pcPerk.PerkLevel, PerkID = pcPerk.PerkID }; // Bypass caching for perk refunds. DataService.DataQueue.Enqueue(new DatabaseAction(refundAudit, DatabaseActionType.Insert)); DataService.SubmitDataChange(pcPerk, DatabaseActionType.Delete); DataService.SubmitDataChange(dbPlayer, DatabaseActionType.Update); // If perk refunded was one granted by a background bonus, we need to reapply it. ReapplyBackgroundBonus((PerkType)pcPerk.PerkID); GetPC().FloatingText("Perk refunded! You reclaimed " + refundAmount + " SP."); model.TomeItem.Destroy(); var handler = PerkService.GetPerkHandler(perk.ID); handler.OnRemoved(player); MessageHub.Instance.Publish(new OnPerkRefunded(player, pcPerk.PerkID)); }
private void DoPerkRemoval() { if (!CanRefundPerk()) { return; } var model = GetDialogCustomData <Model>(); var player = GetPC(); var pcPerk = _data.Single <PCPerk>(x => x.ID == model.PCPerkID); var perk = _data.Get <Data.Entity.Perk>(pcPerk.PerkID); var minimumLevel = 1; if (IsGrantedByBackground((PerkType)perk.ID)) { minimumLevel = 2; } var refundAmount = _data.Where <PerkLevel>(x => x.PerkID == perk.ID && x.Level <= pcPerk.PerkLevel && x.Level >= minimumLevel).Sum(x => x.Price); var dbPlayer = _data.Single <Player>(x => x.ID == player.GlobalID); var scriptName = perk.ScriptName; dbPlayer.DatePerkRefundAvailable = DateTime.UtcNow.AddHours(24); RemovePerkItem(perk); RemovePerkFeat(perk); _customEffect.RemoveStance(GetPC()); _stat.ApplyStatChanges(GetPC(), null); dbPlayer.UnallocatedSP += refundAmount; var refundAudit = new PCPerkRefund { PlayerID = player.GlobalID, DateAcquired = pcPerk.AcquiredDate, DateRefunded = DateTime.UtcNow, Level = pcPerk.PerkLevel, PerkID = pcPerk.PerkID }; // Bypass caching for perk refunds. _data.DataQueue.Enqueue(new DatabaseAction(refundAudit, DatabaseActionType.Insert)); _data.SubmitDataChange(pcPerk, DatabaseActionType.Delete); _data.SubmitDataChange(dbPlayer, DatabaseActionType.Update); // If perk refunded was one granted by a background bonus, we need to reapply it. ReapplyBackgroundBonus((PerkType)pcPerk.PerkID); GetPC().FloatingText("Perk refunded! You reclaimed " + refundAmount + " SP."); model.TomeItem.Destroy(); App.ResolveByInterface <IPerk>("Perk." + scriptName, perkAction => { perkAction?.OnRemoved(player); }); }
public void GetByID_OneItem_ReturnsPCPerkRefund() { // Arrange var id = Guid.NewGuid(); PCPerkRefund entity = new PCPerkRefund { ID = id }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCPerkRefund>(entity)); // Assert Assert.AreNotSame(entity, _cache.GetByID(id)); }
public void GetByID_TwoItems_ReturnsCorrectObject() { // Arrange var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); PCPerkRefund entity1 = new PCPerkRefund { ID = id1 }; PCPerkRefund entity2 = new PCPerkRefund { ID = id2 }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCPerkRefund>(entity1)); MessageHub.Instance.Publish(new OnCacheObjectSet <PCPerkRefund>(entity2)); // Assert Assert.AreNotSame(entity1, _cache.GetByID(id1)); Assert.AreNotSame(entity2, _cache.GetByID(id2)); }
public void GetByID_RemovedItem_ReturnsCorrectObject() { // Arrange var id1 = Guid.NewGuid(); var id2 = Guid.NewGuid(); PCPerkRefund entity1 = new PCPerkRefund { ID = id1 }; PCPerkRefund entity2 = new PCPerkRefund { ID = id2 }; // Act MessageHub.Instance.Publish(new OnCacheObjectSet <PCPerkRefund>(entity1)); MessageHub.Instance.Publish(new OnCacheObjectSet <PCPerkRefund>(entity2)); MessageHub.Instance.Publish(new OnCacheObjectDeleted <PCPerkRefund>(entity1)); // Assert Assert.Throws <KeyNotFoundException>(() => { _cache.GetByID(id1); }); Assert.AreNotSame(entity2, _cache.GetByID(id2)); }