public string Apply(NWCreature oCaster, NWObject oTarget, int effectiveLevel) { _stat.ApplyStatChanges(oTarget.Object, null); int healAmount = (int)(_customEffect.CalculateEffectHPBonusPercent(oTarget.Object) * oTarget.MaxHP); if (healAmount > 0) { _.ApplyEffectToObject(DURATION_TYPE_INSTANT, _.EffectHeal(healAmount), oTarget); } return(null); }
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 string Apply(NWCreature oCaster, NWObject oTarget, int effectiveLevel) { _stat.ApplyStatChanges(oTarget.Object, null); return(null); }
public void GiveSkillXP(NWPlayer oPC, int skillID, int xp, bool enableResidencyBonus = true) { if (skillID <= 0 || xp <= 0 || !oPC.IsPlayer) { return; } if (enableResidencyBonus) { xp = (int)(xp + xp * _playerStat.EffectiveResidencyBonus(oPC)); } Player player = _data.Get <Player>(oPC.GlobalID); Skill skill = GetSkill(skillID); PCSkill pcSkill = GetPCSkill(oPC, skillID); SkillXPRequirement req = _data.Single <SkillXPRequirement>(x => x.SkillID == skillID && x.Rank == pcSkill.Rank); int maxRank = skill.MaxRank; int originalRank = pcSkill.Rank; float xpBonusModifier = player.XPBonus * 0.01f; // Guard against XP bonuses being too high. if (xpBonusModifier > 0.25) { xpBonusModifier = 0.25f; } xp = CalculateTotalSkillPointsPenalty(player.TotalSPAcquired, xp); xp = xp + (int)(xp * xpBonusModifier); // Run the skill decay rules. // If the method returns false, that means all skills are locked. // So we can't give the player any XP. if (!ApplySkillDecay(oPC, pcSkill, xp)) { return; } pcSkill.XP = pcSkill.XP + xp; oPC.SendMessage("You earned " + skill.Name + " skill experience. (" + xp + ")"); // Skill is at cap and player would level up. // Reduce XP to required amount minus 1 XP if (pcSkill.Rank >= maxRank && pcSkill.XP > req.XP) { pcSkill.XP = pcSkill.XP - 1; } while (pcSkill.XP >= req.XP) { pcSkill.XP = pcSkill.XP - req.XP; if (player.TotalSPAcquired < SkillCap && skill.ContributesToSkillCap) { player.UnallocatedSP++; player.TotalSPAcquired++; } pcSkill.Rank++; oPC.FloatingText("Your " + skill.Name + " skill level increased to rank " + pcSkill.Rank + "!"); req = _data.Single <SkillXPRequirement>(x => x.SkillID == skillID && x.Rank == pcSkill.Rank); // Reapply skill penalties on a skill level up. for (int slot = 0; slot < NUM_INVENTORY_SLOTS; slot++) { NWItem item = _.GetItemInSlot(slot, oPC.Object); RemoveWeaponPenalties(item); ApplyWeaponPenalties(oPC, new Object()); RemoveEquipmentPenalties(item); ApplyEquipmentPenalties(oPC, new Object()); } } _data.SubmitDataChange(pcSkill, DatabaseActionType.Update); // Update player and apply stat changes only if a level up occurred. if (originalRank != pcSkill.Rank) { _playerStat.ApplyStatChanges(oPC, null); } }
public void OnPurchased(NWPlayer oPC, int newLevel) { _stat.ApplyStatChanges(oPC, null); }
public void InitializePlayer(NWPlayer player) { if (player == null) { throw new ArgumentNullException(nameof(player)); } if (player.Object == null) { throw new ArgumentNullException(nameof(player.Object)); } if (!player.IsPlayer) { return; } // Player is initialized but not in the DB. Wipe the tag and rerun them through initialization - something went wrong before. if (player.IsInitializedAsPlayer) { if (_data.GetAll <Player>().SingleOrDefault(x => x.ID == player.GlobalID) == null) { _.SetTag(player, string.Empty); } } if (!player.IsInitializedAsPlayer) { player.DestroyAllInventoryItems(); player.InitializePlayer(); _.AssignCommand(player, () => _.TakeGoldFromCreature(_.GetGold(player), player, 1)); _.DelayCommand(0.5f, () => { _.GiveGoldToCreature(player, 100); }); // Capture original stats before we level up the player. int str = _nwnxCreature.GetRawAbilityScore(player, ABILITY_STRENGTH); int con = _nwnxCreature.GetRawAbilityScore(player, ABILITY_CONSTITUTION); int dex = _nwnxCreature.GetRawAbilityScore(player, ABILITY_DEXTERITY); int @int = _nwnxCreature.GetRawAbilityScore(player, ABILITY_INTELLIGENCE); int wis = _nwnxCreature.GetRawAbilityScore(player, ABILITY_WISDOM); int cha = _nwnxCreature.GetRawAbilityScore(player, ABILITY_CHARISMA); // Take player to level 5 in NWN levels so that we have access to more HP slots _.GiveXPToCreature(player, 10000); for (int level = 1; level <= 5; level++) { _.LevelUpHenchman(player, player.Class1); } // Set stats back to how they were on entry. _nwnxCreature.SetRawAbilityScore(player, ABILITY_STRENGTH, str); _nwnxCreature.SetRawAbilityScore(player, ABILITY_CONSTITUTION, con); _nwnxCreature.SetRawAbilityScore(player, ABILITY_DEXTERITY, dex); _nwnxCreature.SetRawAbilityScore(player, ABILITY_INTELLIGENCE, @int); _nwnxCreature.SetRawAbilityScore(player, ABILITY_WISDOM, wis); _nwnxCreature.SetRawAbilityScore(player, ABILITY_CHARISMA, cha); NWItem knife = (_.CreateItemOnObject("survival_knife", player)); knife.Name = player.Name + "'s Survival Knife"; knife.IsCursed = true; _durability.SetMaxDurability(knife, 5); _durability.SetDurability(knife, 5); NWItem book = (_.CreateItemOnObject("player_guide", player)); book.Name = player.Name + "'s Player Guide"; book.IsCursed = true; NWItem dyeKit = (_.CreateItemOnObject("tk_omnidye", player)); dyeKit.IsCursed = true; int numberOfFeats = _nwnxCreature.GetFeatCount(player); for (int currentFeat = numberOfFeats; currentFeat >= 0; currentFeat--) { _nwnxCreature.RemoveFeat(player, _nwnxCreature.GetFeatByIndex(player, currentFeat - 1)); } _nwnxCreature.AddFeatByLevel(player, FEAT_ARMOR_PROFICIENCY_LIGHT, 1); _nwnxCreature.AddFeatByLevel(player, FEAT_ARMOR_PROFICIENCY_MEDIUM, 1); _nwnxCreature.AddFeatByLevel(player, FEAT_ARMOR_PROFICIENCY_HEAVY, 1); _nwnxCreature.AddFeatByLevel(player, FEAT_SHIELD_PROFICIENCY, 1); _nwnxCreature.AddFeatByLevel(player, FEAT_WEAPON_PROFICIENCY_EXOTIC, 1); _nwnxCreature.AddFeatByLevel(player, FEAT_WEAPON_PROFICIENCY_MARTIAL, 1); _nwnxCreature.AddFeatByLevel(player, FEAT_WEAPON_PROFICIENCY_SIMPLE, 1); _nwnxCreature.AddFeatByLevel(player, (int)CustomFeatType.StructureManagementTool, 1); _nwnxCreature.AddFeatByLevel(player, (int)CustomFeatType.OpenRestMenu, 1); _nwnxCreature.AddFeatByLevel(player, (int)CustomFeatType.RenameCraftedItem, 1); _nwnxCreature.AddFeatByLevel(player, (int)CustomFeatType.ChatCommandTargeter, 1); for (int iCurSkill = 1; iCurSkill <= 27; iCurSkill++) { _nwnxCreature.SetSkillRank(player, iCurSkill - 1, 0); } _.SetFortitudeSavingThrow(player, 0); _.SetReflexSavingThrow(player, 0); _.SetWillSavingThrow(player, 0); int classID = _.GetClassByPosition(1, player); for (int index = 0; index <= 255; index++) { _nwnxCreature.RemoveKnownSpell(player, classID, 0, index); } Player entity = CreateDBPCEntity(player); _data.SubmitDataChange(entity, DatabaseActionType.Insert); var skills = _data.GetAll <Skill>(); foreach (var skill in skills) { var pcSkill = new PCSkill { IsLocked = false, SkillID = skill.ID, PlayerID = entity.ID, Rank = 0, XP = 0 }; _data.SubmitDataChange(pcSkill, DatabaseActionType.Insert); } _race.ApplyDefaultAppearance(player); _nwnxCreature.SetAlignmentLawChaos(player, 50); _nwnxCreature.SetAlignmentGoodEvil(player, 50); _background.ApplyBackgroundBonuses(player); _stat.ApplyStatChanges(player, null, true); _language.InitializePlayerLanguages(player); _.DelayCommand(1.0f, () => _.ApplyEffectToObject(DURATION_TYPE_INSTANT, _.EffectHeal(999), player)); InitializeHotBar(player); } }