コード例 #1
0
        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));
        }
コード例 #2
0
ファイル: PerkRefund.cs プロジェクト: YellowKingThe/SWLOR_NWN
        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);
            });
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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));
        }
コード例 #5
0
        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));
        }