public static void ProcessVersion6_DeflateItemStats(NWItem item) { // Start by pulling the custom AC off the item and halving it. // Durability is +1 for every 2 AC on the item. int amount = item.CustomAC / 2; if (amount > 0) { float newMax = DurabilityService.GetMaxDurability(item) + amount; float newCurrent = DurabilityService.GetDurability(item) + amount; DurabilityService.SetMaxDurability(item, newMax); DurabilityService.SetDurability(item, newCurrent); } // All AC gets zeroed out. item.CustomAC = 0; // Check all item properties. Use the following rule: // Component Armor Class Bonus: Remove it and replace with an increase to durability. foreach (var ip in item.ItemProperties) { ProcessVersion6_ComponentBonuses(item, ip); ProcessVersion6_DeprecatedStats(item, ip); } // Deflate all stat bonuses. ProcessVersion6_StatBonuses(item); }
public static void ProcessVersion6RemoveACFromItem(NWItem item) { // Start by pulling the custom AC off the item and halving it. // Durability is +1 for every 2 AC on the item. int amount = item.CustomAC / 2; if (amount > 0) { float newMax = DurabilityService.GetMaxDurability(item) + amount; float newCurrent = DurabilityService.GetDurability(item) + amount; DurabilityService.SetMaxDurability(item, newMax); DurabilityService.SetDurability(item, newCurrent); } item.CustomAC = 0; // Check all item properties. If the IP is a component Armor Class Bonus, remove it and replace with an increase to durability. foreach (var ip in item.ItemProperties) { if (_.GetItemPropertyType(ip) == (int)CustomItemPropertyType.ComponentBonus) { // Check the sub-type. If it's AC, then do the replacement. if (GetItemPropertySubType(ip) == (int)ComponentBonusType.ACUp) { amount = GetItemPropertyCostTableValue(ip) / 2; // Grant the durability up property if amount > 0 if (amount > 0) { // Unpack the IP we're working with. Adjust its type and value, then reapply it. var unpacked = NWNXItemProperty.UnpackIP(ip); unpacked.SubType = (int)ComponentBonusType.DurabilityUp; unpacked.CostTableValue = amount; var packed = NWNXItemProperty.PackIP(unpacked); BiowareXP2.IPSafeAddItemProperty(item, packed, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); } _.RemoveItemProperty(item, ip); } } } }
public static void ApplyComponentBonus(NWItem product, ItemProperty sourceIP) { ComponentBonusType bonusType = (ComponentBonusType)_.GetItemPropertySubType(sourceIP); int amount = _.GetItemPropertyCostTableValue(sourceIP); ItemProperty prop = null; string sourceTag = string.Empty; int attackBonus = 0; // A note about the sourceTags: // It's not currently possible to create custom item properties on items. To get around this, // we look in an inaccessible container which holds the custom item properties. Then, we get the // item that has the item property we want. From there we take that item property and copy it to // the crafted item. // This is a really roundabout way to do it, but it's the only option for now. Hopefully a feature to // directly add the item properties comes in to NWNX in the future. // 2019-06-12: Directly modifying item properties is possible now but I'm not going to do a refactor until later. // Anyone interested in working on this let me know and I can point you in the right direction. - Z for (int x = 1; x <= amount; x++) { switch (bonusType) { case ComponentBonusType.ModSocketRed: sourceTag = "rslot_red"; break; case ComponentBonusType.ModSocketBlue: sourceTag = "rslot_blue"; break; case ComponentBonusType.ModSocketGreen: sourceTag = "rslot_green"; break; case ComponentBonusType.ModSocketYellow: sourceTag = "rslot_yellow"; break; case ComponentBonusType.ModSocketPrismatic: sourceTag = "rslot_prismatic"; break; case ComponentBonusType.DurabilityUp: var maxDur = DurabilityService.GetMaxDurability(product) + amount; DurabilityService.SetMaxDurability(product, maxDur); DurabilityService.SetDurability(product, maxDur); break; case ComponentBonusType.ChargesUp: product.Charges += amount; break; case ComponentBonusType.ACUp: product.CustomAC += amount; break; case ComponentBonusType.HarvestingUp: product.HarvestingBonus += amount; break; case ComponentBonusType.CooldownRecoveryUp: product.CooldownRecovery += amount; break; case ComponentBonusType.ArmorsmithUp: product.CraftBonusArmorsmith += amount; break; case ComponentBonusType.WeaponsmithUp: product.CraftBonusWeaponsmith += amount; break; case ComponentBonusType.CookingUp: product.CraftBonusCooking += amount; break; case ComponentBonusType.EngineeringUp: product.CraftBonusEngineering += amount; break; case ComponentBonusType.FabricationUp: product.CraftBonusFabrication += amount; break; case ComponentBonusType.HPUp: product.HPBonus += amount; break; case ComponentBonusType.FPUp: product.FPBonus += amount; break; case ComponentBonusType.EnmityUp: product.EnmityRate += amount; break; case ComponentBonusType.EnmityDown: product.EnmityRate -= amount; break; case ComponentBonusType.LuckUp: product.LuckBonus += amount; break; case ComponentBonusType.MeditateUp: product.MeditateBonus += amount; break; case ComponentBonusType.RestUp: product.RestBonus += amount; break; case ComponentBonusType.MedicineUp: product.MedicineBonus += amount; break; case ComponentBonusType.HPRegenUp: product.HPRegenBonus += amount; break; case ComponentBonusType.FPRegenUp: product.FPRegenBonus += amount; break; case ComponentBonusType.BaseAttackBonusUp: product.BaseAttackBonus += amount; break; case ComponentBonusType.SneakAttackUp: product.SneakAttackBonus += amount; break; case ComponentBonusType.DamageUp: product.DamageBonus += amount; break; case ComponentBonusType.StructureBonusUp: product.StructureBonus += amount; break; case ComponentBonusType.StrengthUp: product.StrengthBonus += amount; break; case ComponentBonusType.DexterityUp: product.DexterityBonus += amount; break; case ComponentBonusType.ConstitutionUp: product.ConstitutionBonus += amount; break; case ComponentBonusType.WisdomUp: product.WisdomBonus += amount; break; case ComponentBonusType.IntelligenceUp: product.IntelligenceBonus += amount; break; case ComponentBonusType.CharismaUp: product.CharismaBonus += amount; break; case ComponentBonusType.AttackBonusUp: attackBonus += amount; break; case ComponentBonusType.DurationUp: product.DurationBonus += amount; break; case ComponentBonusType.ScanningUp: product.ScanningBonus += amount; break; case ComponentBonusType.ScavengingUp: product.ScavengingBonus += amount; break; case ComponentBonusType.PilotingUp: product.PilotingBonus += amount; break; default: throw new ArgumentOutOfRangeException(); } if (!string.IsNullOrWhiteSpace(sourceTag)) { prop = ItemService.GetCustomItemPropertyByItemTag(sourceTag); } if (prop == null) { return; } BiowareXP2.IPSafeAddItemProperty(product, prop, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); } // Attack bonus is aggregated into one item property, ensuring that the amount doesn't go over 20. if (attackBonus > 0) { // Look for existing properties, get the value and add it. Then remove that item property. foreach (var ip in product.ItemProperties) { if (_.GetItemPropertyType(ip) == _.ITEM_PROPERTY_ATTACK_BONUS) { amount = _.GetItemPropertyCostTableValue(ip); attackBonus += amount; _.RemoveItemProperty(product, ip); } } // Clamp bonus to 20. if (attackBonus > 20) { attackBonus = 20; } // Time to add the new item property. prop = _.ItemPropertyAttackBonus(attackBonus); BiowareXP2.IPSafeAddItemProperty(product, prop, 0.0f, AddItemPropertyPolicy.ReplaceExisting, false, false); } }
public static void ApplyComponentBonus(NWItem product, ItemProperty sourceIP) { ComponentBonusType bonusType = (ComponentBonusType)_.GetItemPropertySubType(sourceIP); int amount = _.GetItemPropertyCostTableValue(sourceIP); ItemProperty prop = null; string sourceTag = string.Empty; // A note about the sourceTags: // It's not currently possible to create custom item properties on items. To get around this, // we look in an inaccessible container which holds the custom item properties. Then, we get the // item that has the item property we want. From there we take that item property and copy it to // the crafted item. // This is a really roundabout way to do it, but it's the only option for now. Hopefully a feature to // directly add the item properties comes in to NWNX in the future. for (int x = 1; x <= amount; x++) { switch (bonusType) { case ComponentBonusType.ModSocketRed: sourceTag = "rslot_red"; break; case ComponentBonusType.ModSocketBlue: sourceTag = "rslot_blue"; break; case ComponentBonusType.ModSocketGreen: sourceTag = "rslot_green"; break; case ComponentBonusType.ModSocketYellow: sourceTag = "rslot_yellow"; break; case ComponentBonusType.ModSocketPrismatic: sourceTag = "rslot_prismatic"; break; case ComponentBonusType.DurabilityUp: var maxDur = DurabilityService.GetMaxDurability(product) + amount; DurabilityService.SetMaxDurability(product, maxDur); DurabilityService.SetDurability(product, maxDur); break; case ComponentBonusType.ChargesUp: product.Charges += amount; break; case ComponentBonusType.ACUp: product.CustomAC += amount; break; case ComponentBonusType.HarvestingUp: product.HarvestingBonus += amount; break; case ComponentBonusType.CastingSpeedUp: product.CastingSpeed += amount; break; case ComponentBonusType.ArmorsmithUp: product.CraftBonusArmorsmith += amount; break; case ComponentBonusType.WeaponsmithUp: product.CraftBonusWeaponsmith += amount; break; case ComponentBonusType.CookingUp: product.CraftBonusCooking += amount; break; case ComponentBonusType.EngineeringUp: product.CraftBonusEngineering += amount; break; case ComponentBonusType.FabricationUp: product.CraftBonusFabrication += amount; break; case ComponentBonusType.HPUp: product.HPBonus += amount; break; case ComponentBonusType.FPUp: product.FPBonus += amount; break; case ComponentBonusType.EnmityUp: product.EnmityRate += amount; break; case ComponentBonusType.EnmityDown: product.EnmityRate -= amount; break; case ComponentBonusType.DarkPotencyUp: product.DarkPotencyBonus += amount; break; case ComponentBonusType.LightPotencyUp: product.LightPotencyBonus += amount; break; case ComponentBonusType.MindPotencyUp: product.MindPotencyBonus += amount; break; case ComponentBonusType.LuckUp: product.LuckBonus += amount; break; case ComponentBonusType.MeditateUp: product.MeditateBonus += amount; break; case ComponentBonusType.RestUp: product.RestBonus += amount; break; case ComponentBonusType.MedicineUp: product.MedicineBonus += amount; break; case ComponentBonusType.HPRegenUp: product.HPRegenBonus += amount; break; case ComponentBonusType.FPRegenUp: product.FPRegenBonus += amount; break; case ComponentBonusType.BaseAttackBonusUp: product.BaseAttackBonus += amount; break; case ComponentBonusType.SneakAttackUp: product.SneakAttackBonus += amount; break; case ComponentBonusType.DamageUp: product.DamageBonus += amount; break; case ComponentBonusType.DarkPotencyDown: product.DarkPotencyBonus -= amount; break; case ComponentBonusType.LightPotencyDown: product.LightPotencyBonus -= amount; break; case ComponentBonusType.StructureBonusUp: product.StructureBonus += amount; break; case ComponentBonusType.StrengthUp: product.StrengthBonus += amount; break; case ComponentBonusType.DexterityUp: product.DexterityBonus += amount; break; case ComponentBonusType.ConstitutionUp: product.ConstitutionBonus += amount; break; case ComponentBonusType.WisdomUp: product.WisdomBonus += amount; break; case ComponentBonusType.IntelligenceUp: product.IntelligenceBonus += amount; break; case ComponentBonusType.CharismaUp: product.CharismaBonus += amount; break; case ComponentBonusType.AttackBonusUp: prop = _.ItemPropertyAttackBonus(amount); break; case ComponentBonusType.DurationUp: product.DurationBonus += amount; break; case ComponentBonusType.ScanningUp: product.ScanningBonus += amount; break; case ComponentBonusType.ScavengingUp: product.ScavengingBonus += amount; break; case ComponentBonusType.MindPotencyDown: product.MindPotencyBonus -= amount; break; case ComponentBonusType.ElectricalPotencyUp: product.ElectricalPotencyBonus += amount; break; case ComponentBonusType.ElectricalPotencyDown: product.ElectricalPotencyBonus -= amount; break; case ComponentBonusType.ForcePotencyUp: product.ForcePotencyBonus += amount; break; case ComponentBonusType.ForcePotencyDown: product.ForcePotencyBonus -= amount; break; case ComponentBonusType.ForceAccuracyUp: product.ForceAccuracyBonus += amount; break; case ComponentBonusType.ForceAccuracyDown: product.ForceAccuracyBonus -= amount; break; case ComponentBonusType.ForceDefenseUp: product.ForceDefenseBonus += amount; break; case ComponentBonusType.ForceDefenseDown: product.ForceDefenseBonus -= amount; break; case ComponentBonusType.ElectricalDefenseUp: product.ElectricalDefenseBonus += amount; break; case ComponentBonusType.ElectricalDefenseDown: product.ElectricalDefenseBonus -= amount; break; case ComponentBonusType.MindDefenseUp: product.MindDefenseBonus += amount; break; case ComponentBonusType.MindDefenseDown: product.MindDefenseBonus -= amount; break; case ComponentBonusType.LightDefenseUp: product.LightDefenseBonus += amount; break; case ComponentBonusType.LightDefenseDown: product.LightDefenseBonus -= amount; break; case ComponentBonusType.DarkDefenseUp: product.DarkDefenseBonus += amount; break; case ComponentBonusType.DarkDefenseDown: product.DarkDefenseBonus -= amount; break; case ComponentBonusType.PilotingUp: product.PilotingBonus += amount; break; default: throw new ArgumentOutOfRangeException(); } if (!string.IsNullOrWhiteSpace(sourceTag)) { prop = ItemService.GetCustomItemPropertyByItemTag(sourceTag); } if (prop == null) { return; } BiowareXP2.IPSafeAddItemProperty(product, prop, 0.0f, AddItemPropertyPolicy.IgnoreExisting, true, true); } }
public static void InitializePlayer(NWPlayer player) { if (player == null) { throw new ArgumentNullException(nameof(player)); } 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 (!DataService.Player.ExistsByID(player.GlobalID)) { SetTag(player, string.Empty); } } if (!player.IsInitializedAsPlayer) { player.DestroyAllInventoryItems(); player.InitializePlayer(); AssignCommand(player, () => _.TakeGoldFromCreature(GetGold(player), player, true)); DelayCommand(0.5f, () => { GiveGoldToCreature(player, 100); }); // Capture original stats before we level up the player. int str = NWNXCreature.GetRawAbilityScore(player, AbilityType.Strength); int con = NWNXCreature.GetRawAbilityScore(player, AbilityType.Constitution); int dex = NWNXCreature.GetRawAbilityScore(player, AbilityType.Dexterity); int @int = NWNXCreature.GetRawAbilityScore(player, AbilityType.Intelligence); int wis = NWNXCreature.GetRawAbilityScore(player, AbilityType.Wisdom); int cha = NWNXCreature.GetRawAbilityScore(player, AbilityType.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, AbilityType.Strength, str); NWNXCreature.SetRawAbilityScore(player, AbilityType.Constitution, con); NWNXCreature.SetRawAbilityScore(player, AbilityType.Dexterity, dex); NWNXCreature.SetRawAbilityScore(player, AbilityType.Intelligence, @int); NWNXCreature.SetRawAbilityScore(player, AbilityType.Wisdom, wis); NWNXCreature.SetRawAbilityScore(player, AbilityType.Charisma, cha); NWItem knife = (CreateItemOnObject("survival_knife", player)); knife.Name = player.Name + "'s Survival Knife"; knife.IsCursed = true; DurabilityService.SetMaxDurability(knife, 5); DurabilityService.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.ArmorProficiencyLight, 1); NWNXCreature.AddFeatByLevel(player, Feat.ArmorProficiencyMedium, 1); NWNXCreature.AddFeatByLevel(player, Feat.ArmorProficiencyHeavy, 1); NWNXCreature.AddFeatByLevel(player, Feat.ShieldProficiency, 1); NWNXCreature.AddFeatByLevel(player, Feat.WeaponProficiencyExotic, 1); NWNXCreature.AddFeatByLevel(player, Feat.WeaponProficiencyMartial, 1); NWNXCreature.AddFeatByLevel(player, Feat.WeaponProficiencySimple, 1); NWNXCreature.AddFeatByLevel(player, Feat.UncannyDodge1, 1); NWNXCreature.AddFeatByLevel(player, Feat.StructureManagementTool, 1); NWNXCreature.AddFeatByLevel(player, Feat.OpenRestMenu, 1); NWNXCreature.AddFeatByLevel(player, Feat.RenameCraftedItem, 1); NWNXCreature.AddFeatByLevel(player, Feat.ChatCommandTargeter, 1); foreach (var skillType in Enum.GetValues(typeof(Skill))) { var skill = (Skill)skillType; if (skill == Skill.Invalid || skill == Skill.AllSkills) { continue; } NWNXCreature.SetSkillRank(player, skill, 0); } SetFortitudeSavingThrow(player, 0); SetReflexSavingThrow(player, 0); SetWillSavingThrow(player, 0); var classType = GetClassByPosition(1, player); for (int index = 0; index <= 255; index++) { NWNXCreature.RemoveKnownSpell(player, classType, 0, index); } Player entity = CreateDBPCEntity(player); DataService.SubmitDataChange(entity, DatabaseActionType.Insert); var skills = DataService.Skill.GetAll(); foreach (var skill in skills) { var pcSkill = new PCSkill { IsLocked = false, SkillID = skill.ID, PlayerID = entity.ID, Rank = 0, XP = 0 }; DataService.SubmitDataChange(pcSkill, DatabaseActionType.Insert); } RaceService.ApplyDefaultAppearance(player); NWNXCreature.SetAlignmentLawChaos(player, 50); NWNXCreature.SetAlignmentGoodEvil(player, 50); BackgroundService.ApplyBackgroundBonuses(player); PlayerStatService.ApplyStatChanges(player, null, true); LanguageService.InitializePlayerLanguages(player); DelayCommand(1.0f, () => ApplyEffectToObject(DurationType.Instant, EffectHeal(999), player)); InitializeHotBar(player); } }
public static 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 (DataService.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; DurabilityService.SetMaxDurability(knife, 5); DurabilityService.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, FEAT_UNCANNY_DODGE_1, 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); DataService.SubmitDataChange(entity, DatabaseActionType.Insert); var skills = DataService.GetAll <Skill>(); foreach (var skill in skills) { var pcSkill = new PCSkill { IsLocked = false, SkillID = skill.ID, PlayerID = entity.ID, Rank = 0, XP = 0 }; DataService.SubmitDataChange(pcSkill, DatabaseActionType.Insert); } RaceService.ApplyDefaultAppearance(player); NWNXCreature.SetAlignmentLawChaos(player, 50); NWNXCreature.SetAlignmentGoodEvil(player, 50); BackgroundService.ApplyBackgroundBonuses(player); PlayerStatService.ApplyStatChanges(player, null, true); LanguageService.InitializePlayerLanguages(player); _.DelayCommand(1.0f, () => _.ApplyEffectToObject(DURATION_TYPE_INSTANT, _.EffectHeal(999), player)); InitializeHotBar(player); } }