public static void Apply(NWGameObject player) { var playerID = _.GetGlobalID(player); var jobType = _.GetClassByPosition(ClassPosition.First, player); var jobDefinition = JobRegistry.Get(jobType); var job = JobRepo.Get(playerID, jobType); var abilityList = jobDefinition.GetAbilityListByLevel(job.Level); var allFeats = new List <Feat>(DefaultFeats); allFeats.AddRange(abilityList); // Remove any feats the player shouldn't have. var featCount = NWNXCreature.GetFeatCount(player); for (int x = featCount; x >= 0; x--) { var feat = NWNXCreature.GetFeatByIndex(player, x - 1); if (!allFeats.Contains(feat)) { NWNXCreature.RemoveFeat(player, feat); } } // Add any feats the player needs. foreach (var feat in allFeats) { if (_.GetHasFeat(feat, player)) { continue; } NWNXCreature.AddFeatByLevel(player, feat, 1); } }
private static void OnModuleNWNXChat() { NWPlayer sender = Object.OBJECT_SELF; string originalMessage = NWNXChat.GetMessage().Trim(); if (!CanHandleChat(sender, originalMessage)) { return; } var split = originalMessage.Split(' ').ToList(); // Commands with no arguments won't be split, so if we didn't split anything then add the command to the split list manually. if (split.Count <= 0) { split.Add(originalMessage); } split[0] = split[0].ToLower(); string command = split[0].Substring(1, split[0].Length - 1); split.RemoveAt(0); NWNXChat.SkipMessage(); if (!IsChatCommandRegistered(command)) { sender.SendMessage(ColorTokenService.Red("Invalid chat command. Use '/help' to get a list of available commands.")); return; } IChatCommand chatCommand = GetChatCommandHandler(command); string args = string.Join(" ", split); if (!chatCommand.RequiresTarget) { ProcessChatCommand(chatCommand, sender, null, null, args); } else { string error = chatCommand.ValidateArguments(sender, split.ToArray()); if (!string.IsNullOrWhiteSpace(error)) { sender.SendMessage(error); return; } sender.SetLocalString("CHAT_COMMAND", command); sender.SetLocalString("CHAT_COMMAND_ARGS", args); sender.SendMessage("Please use your 'Chat Command Targeter' feat to select the target of this chat command."); if (_.GetHasFeat((int)CustomFeatType.ChatCommandTargeter, sender) == FALSE || sender.IsDM) { NWNXCreature.AddFeatByLevel(sender, (int)CustomFeatType.ChatCommandTargeter, 1); if (sender.IsDM) { var qbs = NWNXPlayer.GetQuickBarSlot(sender, 11); if (qbs.ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(sender, 11, NWNXPlayerQuickBarSlot.UseFeat((int)CustomFeatType.ChatCommandTargeter)); } } } } }
private static void OnModuleEnter() { NWPlayer player = _.GetEnteringObject(); if (!player.IsPlayer) { return; } var dbPlayer = DataService.Player.GetByID(player.GlobalID); // VERSION 2: Background items are no longer plot because item level no longer dictates your skill XP gain. if (dbPlayer.VersionNumber < 2) { string[] resrefs = { "blaster_s", "rifle_s", "powerglove_t", "baton_s", "doubleaxe_z", "kukri_d", "greatsword_s", "scanner_r_h", "harvest_r_h", "man_armor" }; foreach (var resref in resrefs) { NWItem item = _.GetItemPossessedBy(player, resref); if (item.IsValid) { item.IsPlot = false; } } dbPlayer.VersionNumber = 2; } // VERSION 3: Force feats need to be removed since force powers were reworked. if (dbPlayer.VersionNumber < 3) { // These IDs come from the Feat.2da file. NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceBreach); // Force Breach NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceLightning); // Force Lightning NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceHeal1); // Force Heal NWNXCreature.RemoveFeat(player, Feat.DeprecatedDarkHeal); // Dark Heal NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceSpread); // Force Spread NWNXCreature.RemoveFeat(player, Feat.DeprecatedDarkSpread); // Dark Spread NWNXCreature.RemoveFeat(player, Feat.DeprecatedForcePush); // Force Push NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceAura); // Force Aura NWNXCreature.RemoveFeat(player, Feat.DeprecatedDrainLife); // Drain Life NWNXCreature.RemoveFeat(player, Feat.DeprecatedChainspell); // Chainspell dbPlayer.VersionNumber = 3; } // VERSION 4: Give the Uncanny Dodge 1 feat to all characters. if (dbPlayer.VersionNumber < 4) { NWNXCreature.AddFeatByLevel(player, Feat.UncannyDodge1, 1); dbPlayer.VersionNumber = 4; } // VERSION 5: We're doing another Force rework, so remove any force feats the player may have acquired. if (dbPlayer.VersionNumber < 5) { NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceBreach); // Force Breach NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceLightning); // Force Lightning NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceHeal1); // Force Heal I NWNXCreature.RemoveFeat(player, Feat.DeprecatedAbsorptionField); // Absorption Field NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceSpread); // Force Spread NWNXCreature.RemoveFeat(player, Feat.DeprecatedForcePush); // Force Push NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceAura); // Force Aura NWNXCreature.RemoveFeat(player, Feat.DeprecatedDrainLife); // Drain Life NWNXCreature.RemoveFeat(player, Feat.DeprecatedChainspell); // Chainspell NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceHeal2); // Force Heal II NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceHeal3); // Force Heal III NWNXCreature.RemoveFeat(player, Feat.DeprecatedForceHeal4); // Force Heal IV dbPlayer.VersionNumber = 5; } // VERSION 6: Remove AC from all items the player is carrying. If possible, // grant +1 durability and +1 max durability for every 2 AC the item has. if (dbPlayer.VersionNumber < 6) { ProcessVersion6ItemChanges(player); dbPlayer.VersionNumber = 6; } // VERSION 7: Give 40 language ranks to players, for their distribution. if (dbPlayer.VersionNumber < 7) { var ranks = new PCSkillPool { PlayerID = dbPlayer.ID, SkillCategoryID = 8, // 8 = Languages Levels = 40 }; DataService.SubmitDataChange(ranks, DatabaseActionType.Insert); dbPlayer.VersionNumber = 7; } // VERSION 8: Remove armor restrictions for a number of perks. Ensure player has the feat if they have the perk purchased. if (dbPlayer.VersionNumber < 8) { // Point Blank Shot if (PerkService.GetPCPerkByID(player.GlobalID, (int)PerkType.PointBlankShot) != null) { NWNXCreature.AddFeat(player, Feat.PointBlankShot); } // Rapid Reload if (PerkService.GetPCPerkByID(player.GlobalID, (int)PerkType.RapidReload) != null) { NWNXCreature.AddFeat(player, Feat.RapidReload); } dbPlayer.VersionNumber = 8; } // VERSION 9: Remove Weapon Finesse if player currently has it. if (dbPlayer.VersionNumber < 9) { if (GetHasFeat(Feat.WeaponFinesse, player)) { NWNXCreature.RemoveFeat(player, Feat.WeaponFinesse); } dbPlayer.VersionNumber = 9; } DataService.SubmitDataChange(dbPlayer, DatabaseActionType.Update); }
private static void OnModuleEnter() { NWPlayer player = _.GetEnteringObject(); if (!player.IsPlayer) { return; } var dbPlayer = DataService.Get <Player>(player.GlobalID); // VERSION 2: Background items are no longer plot because item level no longer dictates your skill XP gain. if (dbPlayer.VersionNumber < 2) { string[] resrefs = { "blaster_s", "rifle_s", "powerglove_t", "baton_s", "doubleaxe_z", "kukri_d", "greatsword_s", "scanner_r_h", "harvest_r_h", "man_armor" }; foreach (var resref in resrefs) { NWItem item = _.GetItemPossessedBy(player, resref); if (item.IsValid) { item.IsPlot = false; } } dbPlayer.VersionNumber = 2; } // VERSION 3: Force feats need to be removed since force powers were reworked. if (dbPlayer.VersionNumber < 3) { // These IDs come from the Feat.2da file. NWNXCreature.RemoveFeat(player, 1135); // Force Breach NWNXCreature.RemoveFeat(player, 1136); // Force Lightning NWNXCreature.RemoveFeat(player, 1137); // Force Heal NWNXCreature.RemoveFeat(player, 1138); // Dark Heal NWNXCreature.RemoveFeat(player, 1143); // Force Spread NWNXCreature.RemoveFeat(player, 1144); // Dark Spread NWNXCreature.RemoveFeat(player, 1145); // Force Push NWNXCreature.RemoveFeat(player, 1125); // Force Aura NWNXCreature.RemoveFeat(player, 1152); // Drain Life NWNXCreature.RemoveFeat(player, 1134); // Chainspell dbPlayer.VersionNumber = 3; } // VERSION 4: Give the Uncanny Dodge 1 feat to all characters. if (dbPlayer.VersionNumber < 4) { NWNXCreature.AddFeatByLevel(player, FEAT_UNCANNY_DODGE_1, 1); dbPlayer.VersionNumber = 4; } // VERSION 5: We're doing another Force rework, so remove any force feats the player may have acquired. if (dbPlayer.VersionNumber < 5) { NWNXCreature.RemoveFeat(player, 1135); // Force Breach NWNXCreature.RemoveFeat(player, 1136); // Force Lightning NWNXCreature.RemoveFeat(player, 1137); // Force Heal I NWNXCreature.RemoveFeat(player, 1140); // Absorption Field NWNXCreature.RemoveFeat(player, 1143); // Force Spread NWNXCreature.RemoveFeat(player, 1145); // Force Push NWNXCreature.RemoveFeat(player, 1125); // Force Aura NWNXCreature.RemoveFeat(player, 1152); // Drain Life NWNXCreature.RemoveFeat(player, 1134); // Chainspell NWNXCreature.RemoveFeat(player, 1162); // Force Heal II NWNXCreature.RemoveFeat(player, 1163); // Force Heal III NWNXCreature.RemoveFeat(player, 1164); // Force Heal IV dbPlayer.VersionNumber = 5; } // VERSION 6: Remove AC from all items the player is carrying. If possible, // grant +1 durability and +1 max durability for every 2 AC the item has. if (dbPlayer.VersionNumber < 6) { ProcessVersion6ItemChanges(player); dbPlayer.VersionNumber = 6; } // VERSION 7: Give 40 language ranks to players, for their distribution. if (dbPlayer.VersionNumber < 7) { var ranks = new PCSkillPool { PlayerID = dbPlayer.ID, SkillCategoryID = 8, // 8 = Languages Levels = 40 }; DataService.SubmitDataChange(ranks, DatabaseActionType.Insert); dbPlayer.VersionNumber = 7; } DataService.SubmitDataChange(dbPlayer, DatabaseActionType.Update); }
public static void DoPerkUpgrade(NWPlayer oPC, int perkID, bool freeUpgrade = false) { var perk = DataService.Single <Data.Entity.Perk>(x => x.ID == perkID); var perkLevels = DataService.Where <PerkLevel>(x => x.PerkID == perkID); var pcPerk = DataService.SingleOrDefault <PCPerk>(x => x.PlayerID == oPC.GlobalID && x.PerkID == perkID); var player = DataService.Single <Player>(x => x.ID == oPC.GlobalID); if (freeUpgrade || CanPerkBeUpgraded(oPC, perkID)) { DatabaseActionType action = DatabaseActionType.Update; if (pcPerk == null) { pcPerk = new PCPerk(); DateTime dt = DateTime.UtcNow; pcPerk.AcquiredDate = dt; pcPerk.PerkID = perk.ID; pcPerk.PlayerID = oPC.GlobalID; pcPerk.PerkLevel = 0; action = DatabaseActionType.Insert; } PerkLevel nextPerkLevel = FindPerkLevel(perkLevels, pcPerk.PerkLevel + 1); if (nextPerkLevel == null) { return; } pcPerk.PerkLevel++; DataService.SubmitDataChange(pcPerk, action); if (!freeUpgrade) { player.UnallocatedSP -= nextPerkLevel.Price; DataService.SubmitDataChange(player, DatabaseActionType.Update); } // Look for any perk levels to grant. var perkFeatsToGrant = DataService.Where <PerkFeat>(x => x.PerkID == perkID && x.PerkLevelUnlocked == pcPerk.PerkLevel); // If at least one feat ID is assigned, add the feat(s) to the player if it doesn't exist yet. if (perkFeatsToGrant.Count > 0) { foreach (var perkFeat in perkFeatsToGrant) { if (_.GetHasFeat(perkFeat.FeatID, oPC.Object) == TRUE) { continue; } NWNXCreature.AddFeatByLevel(oPC, perkFeat.FeatID, 1); var qbs = NWNXPlayerQuickBarSlot.UseFeat(perkFeat.FeatID); // Try to add the new feat to the player's hotbar. if (NWNXPlayer.GetQuickBarSlot(oPC, 0).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 0, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 1).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 1, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 2).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 2, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 3).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 3, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 4).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 4, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 5).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 5, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 6).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 6, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 7).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 7, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 8).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 8, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 9).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 9, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 10).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 10, qbs); } } } oPC.SendMessage(ColorTokenService.Green("Perk Purchased: " + perk.Name + " (Lvl. " + pcPerk.PerkLevel + ")")); var handler = GetPerkHandler(perkID); handler.OnPurchased(oPC, pcPerk.PerkLevel); MessageHub.Instance.Publish(new PerkUpgradedMessage(oPC, perkID)); } else { oPC.FloatingText(ColorTokenService.Red("You cannot purchase the perk at this time.")); } }
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); } }
private static void OnModuleEnter() { NWPlayer player = _.GetEnteringObject(); if (!player.IsPlayer) { return; } var dbPlayer = DataService.Get <Player>(player.GlobalID); // VERSION 2: Background items are no longer plot because item level no longer dictates your skill XP gain. if (dbPlayer.VersionNumber < 2) { string[] resrefs = { "blaster_s", "rifle_s", "powerglove_t", "baton_s", "doubleaxe_z", "kukri_d", "greatsword_s", "scanner_r_h", "harvest_r_h", "man_armor" }; foreach (var resref in resrefs) { NWItem item = _.GetItemPossessedBy(player, resref); if (item.IsValid) { item.IsPlot = false; } } dbPlayer.VersionNumber = 2; } // VERSION 3: Force feats need to be removed since force powers were reworked. if (dbPlayer.VersionNumber < 3) { // These IDs come from the Feat.2da file. NWNXCreature.RemoveFeat(player, 1135); // Force Breach NWNXCreature.RemoveFeat(player, 1136); // Force Lightning NWNXCreature.RemoveFeat(player, 1137); // Force Heal NWNXCreature.RemoveFeat(player, 1138); // Dark Heal NWNXCreature.RemoveFeat(player, 1143); // Force Spread NWNXCreature.RemoveFeat(player, 1144); // Dark Spread NWNXCreature.RemoveFeat(player, 1145); // Force Push NWNXCreature.RemoveFeat(player, 1125); // Force Aura NWNXCreature.RemoveFeat(player, 1152); // Drain Life NWNXCreature.RemoveFeat(player, 1134); // Chainspell dbPlayer.VersionNumber = 3; } // VERSION 4: Give the Uncanny Dodge 1 feat to all characters. if (dbPlayer.VersionNumber < 4) { NWNXCreature.AddFeatByLevel(player, FEAT_UNCANNY_DODGE_1, 1); dbPlayer.VersionNumber = 4; } DataService.SubmitDataChange(dbPlayer, DatabaseActionType.Update); }
/// <summary> /// Performs a perk purchase for a player. This handles deducting SP, inserting perk records, /// and adjusting hotbar slots as necessary. /// </summary> /// <param name="oPC">The player receiving the perk upgrade.</param> /// <param name="perkID">The ID number of the perk.</param> /// <param name="freeUpgrade">If true, no SP will be deducted. Otherwise, SP will be deducted from player.</param> public static void DoPerkUpgrade(NWPlayer oPC, int perkID, bool freeUpgrade = false) { var perk = DataService.Perk.GetByID(perkID); var perkLevels = DataService.PerkLevel.GetAllByPerkID(perkID); var pcPerk = DataService.PCPerk.GetByPlayerAndPerkIDOrDefault(oPC.GlobalID, perkID); var player = DataService.Player.GetByID(oPC.GlobalID); if (freeUpgrade || CanPerkBeUpgraded(oPC, perkID)) { DatabaseActionType action = DatabaseActionType.Update; if (pcPerk == null) { pcPerk = new PCPerk(); DateTime dt = DateTime.UtcNow; pcPerk.AcquiredDate = dt; pcPerk.PerkID = perk.ID; pcPerk.PlayerID = oPC.GlobalID; pcPerk.PerkLevel = 0; action = DatabaseActionType.Insert; } PerkLevel nextPerkLevel = FindPerkLevel(perkLevels, pcPerk.PerkLevel + 1); if (nextPerkLevel == null) { return; } pcPerk.PerkLevel++; DataService.SubmitDataChange(pcPerk, action); if (!freeUpgrade) { player.UnallocatedSP -= nextPerkLevel.Price; DataService.SubmitDataChange(player, DatabaseActionType.Update); } // Look for a perk feat to grant. var perkFeatToGrant = DataService.PerkFeat.GetByPerkIDAndLevelUnlockedOrDefault(perkID, pcPerk.PerkLevel); // Add the feat(s) to the player if it doesn't exist yet. if (perkFeatToGrant != null && _.GetHasFeat((Feat)perkFeatToGrant.FeatID, oPC.Object) == false) { NWNXCreature.AddFeatByLevel(oPC, (Feat)perkFeatToGrant.FeatID, 1); var qbs = NWNXPlayerQuickBarSlot.UseFeat((Feat)perkFeatToGrant.FeatID); // Try to add the new feat to the player's hotbar. if (NWNXPlayer.GetQuickBarSlot(oPC, 0).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 0, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 1).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 1, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 2).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 2, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 3).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 3, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 4).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 4, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 5).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 5, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 6).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 6, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 7).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 7, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 8).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 8, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 9).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 9, qbs); } else if (NWNXPlayer.GetQuickBarSlot(oPC, 10).ObjectType == QuickBarSlotType.Empty) { NWNXPlayer.SetQuickBarSlot(oPC, 10, qbs); } } oPC.SendMessage(ColorTokenService.Green("Perk Purchased: " + perk.Name + " (Lvl. " + pcPerk.PerkLevel + ")")); MessageHub.Instance.Publish(new OnPerkUpgraded(oPC, perkID)); var handler = GetPerkHandler(perkID); handler.OnPurchased(oPC, pcPerk.PerkLevel); } else { oPC.FloatingText(ColorTokenService.Red("You cannot purchase the perk at this time.")); } }