/// Add classes to a skill feat instead of working with the NWNX_SkillRanks_SkillFeat::sClasses string. /// /// Manipulating the sClasses string in the NWNX_SkillRanks_SkillFeat struct can be difficult. This /// function allows the builder to enter one class at a time. /// <param name="skillFeat">The NWNX_SkillRanks_SkillFeat for which the sClasses field will be modifier.</param> /// <param name="iClass">The class to add to the Skill Feat.</param> /// <returns>The updated NWNX_SkillRanks_SkillFeat.</returns> public static SkillFeat AddSkillFeatClass(SkillFeat skillFeat, int iClass) { VM.NWNX.SetFunction(NWNX_SkillRanks, "AddSkillFeatClass"); VM.NWNX.StackPush(iClass); VM.NWNX.StackPush(skillFeat.iSkill); VM.NWNX.StackPush(skillFeat.iFeat); VM.NWNX.StackPush(skillFeat.iModifier); VM.NWNX.StackPush(skillFeat.iFocusFeat); VM.NWNX.StackPush(skillFeat.sClasses); VM.NWNX.StackPush(skillFeat.fClassLevelMod); VM.NWNX.StackPush(skillFeat.iAreaFlagsRequired); VM.NWNX.StackPush(skillFeat.iAreaFlagsForbidden); VM.NWNX.StackPush(skillFeat.iDayOrNight); VM.NWNX.StackPush(skillFeat.bBypassArmorCheckPenalty); VM.NWNX.StackPush(skillFeat.iKeyAbilityMask); VM.NWNX.Call(); SkillFeat retVal; retVal.iKeyAbilityMask = VM.NWNX.StackPopInt(); retVal.bBypassArmorCheckPenalty = VM.NWNX.StackPopInt(); retVal.iDayOrNight = VM.NWNX.StackPopInt(); retVal.iAreaFlagsForbidden = VM.NWNX.StackPopInt(); retVal.iAreaFlagsRequired = VM.NWNX.StackPopInt(); retVal.fClassLevelMod = VM.NWNX.StackPopFloat(); retVal.sClasses = VM.NWNX.StackPopString(); retVal.iFocusFeat = VM.NWNX.StackPopInt(); retVal.iModifier = VM.NWNX.StackPopInt(); retVal.iFeat = VM.NWNX.StackPopInt(); retVal.iSkill = VM.NWNX.StackPopInt(); return(retVal); }
/// Modifies or creates a skill feat. /// <param name="skillFeat">The defined NWNX_SkillRanks_SkillFeat.</param> /// <param name="createIfNonExistent">TRUE to create if the feat does not exist.</param> public static void SetSkillFeat(SkillFeat skillFeat, int createIfNonExistent = NWScript.FALSE) { VM.NWNX.SetFunction(NWNX_SkillRanks, "SetSkillFeat"); VM.NWNX.StackPush(createIfNonExistent); VM.NWNX.StackPush(skillFeat.iSkill); VM.NWNX.StackPush(skillFeat.iFeat); VM.NWNX.StackPush(skillFeat.iModifier); VM.NWNX.StackPush(skillFeat.iFocusFeat); VM.NWNX.StackPush(skillFeat.sClasses); VM.NWNX.StackPush(skillFeat.fClassLevelMod); VM.NWNX.StackPush(skillFeat.iAreaFlagsRequired); VM.NWNX.StackPush(skillFeat.iAreaFlagsForbidden); VM.NWNX.StackPush(skillFeat.iDayOrNight); VM.NWNX.StackPush(skillFeat.bBypassArmorCheckPenalty); VM.NWNX.StackPush(skillFeat.iKeyAbilityMask); VM.NWNX.Call(); }
public static void SetSkillFeat(SkillFeat skillFeat, bool createIfNonExistent = false) { Internal.NativeFunctions.nwnxSetFunction(PLUGIN_NAME, "SetSkillFeat"); Internal.NativeFunctions.nwnxPushInt(createIfNonExistent ? 1 : 0); Internal.NativeFunctions.nwnxPushInt(skillFeat.keyAbilityMask); Internal.NativeFunctions.nwnxPushInt(skillFeat.bypassArmorCheckPenalty); Internal.NativeFunctions.nwnxPushInt(skillFeat.dayOrNight); Internal.NativeFunctions.nwnxPushInt(skillFeat.areaFlagsForbidden); Internal.NativeFunctions.nwnxPushInt(skillFeat.areaFlagsRequired); Internal.NativeFunctions.nwnxPushFloat(skillFeat.classLevelMod); // We only need to send the string from the point of the first set bit Internal.NativeFunctions.nwnxPushString( skillFeat.classes !.Substring(skillFeat.classes !.Length - skillFeat.classes !.IndexOf("1"), skillFeat.classes.Length)); Internal.NativeFunctions.nwnxPushInt(skillFeat.focusFeat); Internal.NativeFunctions.nwnxPushInt(skillFeat.modifier); Internal.NativeFunctions.nwnxPushInt(skillFeat.feat); Internal.NativeFunctions.nwnxPushInt(skillFeat.skill); Internal.NativeFunctions.nwnxCallFunction(); }