public static void MountHorse(CLRScriptBase script, uint Character, uint Horse) { if (!isWarhorse.ContainsKey(Character)) { isWarhorse.Add(Character, true); } string cloakResRef; switch (script.GetTag(Horse)) { case "abr_cr_an_horse01": cloakResRef = "acr_ooc_horse01"; isWarhorse[Character] = true; break; case "abr_cr_an_horse02": cloakResRef = "acr_ooc_horse02"; isWarhorse[Character] = true; break; case "abr_cr_an_horse03": cloakResRef = "acr_ooc_horse03"; isWarhorse[Character] = true; break; default: cloakResRef = "acr_ooc_horse03"; isWarhorse[Character] = true; break; } uint horseCloak = script.CreateItemOnObject(cloakResRef, Character, 1, "", CLRScriptBase.FALSE); if (script.GetLocalInt(Horse, ACR_IS_WARHORSE) == 1) { script.RemoveHenchman(Character, Horse); script.SetLocalInt(horseCloak, ACR_IS_WARHORSE, 1); } script.SetLocalInt(horseCloak, ACR_HORSE_ID, script.GetLocalInt(Horse, ACR_HORSE_ID)); script.SetLocalInt(horseCloak, ACR_HORSE_HP, script.GetCurrentHitPoints(Horse)); uint equippedCloak = script.GetItemInSlot(CLRScriptBase.INVENTORY_SLOT_CLOAK, Character); if (script.GetIsObjectValid(equippedCloak) == CLRScriptBase.TRUE) { foreach (NWItemProperty prop in script.GetItemPropertiesOnItem(equippedCloak)) { // copying property duration type prevents us from turning temporary properties into // permanent ones. But because we don't know how long the non-permanent ones have left, // we pretty much have to assign them with the expectation that they immediately expire. script.AddItemProperty(script.GetItemPropertyDurationType(prop), prop, horseCloak, 0.0f); } script.SetFirstName(horseCloak, script.GetName(equippedCloak) + "(( Horse Appearance ))"); script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyWeightReduction(CLRScriptBase.IP_CONST_REDUCEDWEIGHT_80_PERCENT), horseCloak, 0.0f); } script.SetPlotFlag(horseCloak, CLRScriptBase.TRUE); script.SetPlotFlag(Horse, CLRScriptBase.FALSE); script.AssignCommand(Horse, delegate { script.SetIsDestroyable(CLRScriptBase.TRUE, CLRScriptBase.FALSE, CLRScriptBase.FALSE); }); script.AssignCommand(Horse, delegate { script.DestroyObject(Horse, 0.0f, CLRScriptBase.FALSE); }); script.AssignCommand(Character, delegate { script.ActionEquipItem(horseCloak, CLRScriptBase.INVENTORY_SLOT_CLOAK); }); if (!isWarhorse[Character]) { script.DelayCommand(6.0f, delegate { RidingHeartbeat(script, Character); }); } }
public bool recalculate(CLRScriptBase script) { // Ensure that both our hide and our creature are still valid. if (script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE || script.GetIsObjectValid(m_oCreature) == CLRScriptBase.FALSE) { return(false); } // Recreate the hide. script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); }); uint oOldHide = getHide(script); m_oHide = script.CreateItemOnObject("acr_pchide", m_oCreature, 1, "acr_pchide", CLRScriptBase.FALSE); // Temp variables to store bonuses, to allow stacking from different sources. Dictionary <int, int> saveBonuses = new Dictionary <int, int>(); Dictionary <int, int> skillBonuses = new Dictionary <int, int>(); Dictionary <string, int> otherBonuses = new Dictionary <string, int>(); // Initialize dictionaries. for (int i = 0; i < 68; i++) { skillBonuses.Add(i, 0); } for (int i = 0; i < 4; i++) { saveBonuses.Add(i, 0); } #region Skill Focus feats // Handle all new shiny skill focus feats. if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_BALANCE, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_BALANCE] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CLIMB, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_CLIMB] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ALCH, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_CRAFT_ALCHEMY] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_ARM, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_CRAFT_ARMORSMITHING] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_BOW, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_CRAFT_BOWMAKING] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_CRFT_WPN, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_CRAFT_WEAPONSMITHING] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DECIPHER, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_DECIPHER_SCRIPT] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_DISGUISE, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_DISGUISE] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_ESC_ART, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_ESCAPE_ARTIST] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_HAND_ANIM, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_HANDLE_ANIMAL] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_JUMP, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_JUMP] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ARC, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ARCANA] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_DUNG, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_DUNGEONEERING] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_ENG, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_ENGINEERING] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_GEO, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_GEOGRAPHY] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_HIST, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_HISTORY] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_LOC, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NATR, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NATURE] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_NOBL, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_NOBILITY] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_PLAN, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_THE_PLANES] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_KNOW_RELG, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_RELIGION] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ACT, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_COMD, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_DANC, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_KEYB, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_ORAT, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_PERC, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_SING, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_STRG, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PERF_WIND, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_PROF, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_PROFESSION] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_RIDE, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_RIDE] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SENS_MOTV, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_SPEAK_LANGUAGE] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SPK_LANG, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_KNOWLEDGE_LOCAL] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_SWIM, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_SWIM] += 3; } if (script.GetHasFeat((int)FEATS.FEAT_SKILL_FOCUS_USE_ROPE, m_oCreature, 1) == CLRScriptBase.TRUE) { skillBonuses[(int)SKILLS.SKILL_USE_ROPE] += 3; } #endregion // Artist is one bad-ass feat. if (script.GetHasFeat(CLRScriptBase.FEAT_ARTIST, m_oCreature, 1) == CLRScriptBase.TRUE) { // Previously: +2 perform, +2 diplomacy // Currently: +2 perform (all), 3 extra bardic music uses per day skillBonuses[CLRScriptBase.SKILL_DIPLOMACY] -= 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_ACT] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_COMEDY] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_DANCE] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_KEYBOARD] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_ORATORY] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_PERCUSSION] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_SING] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_STRING_INSTRUMENTS] += 2; skillBonuses[(int)SKILLS.SKILL_PERFORM_WIND_INSTRUMENTS] += 2; } // Add skill bonuses to item. foreach (int skill in skillBonuses.Keys) { if (skillBonuses[skill] == 0) { continue; } else if (skillBonuses[skill] > 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertySkillBonus(skill, skillBonuses[skill]), m_oHide, 0.0f); } else if (skillBonuses[skill] < 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyDecreaseSkill(skill, Math.Abs(skillBonuses[skill])), m_oHide, 0.0f); } } // Add save bonuses to item. foreach (int save in saveBonuses.Keys) { if (saveBonuses[save] == 0) { continue; } else if (saveBonuses[save] > 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyBonusSavingThrow(save, saveBonuses[save]), m_oHide, 0.0f); } else if (saveBonuses[save] < 0) { script.AddItemProperty(CLRScriptBase.DURATION_TYPE_PERMANENT, script.ItemPropertyReducedSavingThrow(save, Math.Abs(saveBonuses[save])), m_oHide, 0.0f); } } // Make the person equip the new item. script.AssignCommand(m_oCreature, delegate { script.ClearAllActions(CLRScriptBase.FALSE); }); script.AssignCommand(m_oCreature, delegate { script.ActionEquipItem(m_oHide, CLRScriptBase.INVENTORY_SLOT_CARMOUR); }); script.DestroyObject(oOldHide, 0.0f, CLRScriptBase.FALSE); script.SendMessageToPC(m_oCreature, "PC Hide refreshed."); // Everything looks fine, return our success. return(true); }