Added nwnds_scripts hakfile
Added nwnds_scripts hakfile for PRC scripts that need to be overridden.
This commit is contained in:
342
nwnds_scripts/prc_onaquire.nss
Normal file
342
nwnds_scripts/prc_onaquire.nss
Normal file
@@ -0,0 +1,342 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: OnAcquireItem eventscript
|
||||
//:: prc_onaquire
|
||||
//:://////////////////////////////////////////////
|
||||
#include "prc_alterations"
|
||||
#include "prc_craft_inc"
|
||||
//#include "psi_inc_manifest"
|
||||
|
||||
void AntiMagicFieldCheck(object oItem, object oCreature)
|
||||
{
|
||||
int nIP = array_get_size(oItem, "PRC_NPF_ItemList");
|
||||
if(GetHasSpellEffect(SPELL_ANTIMAGIC_FIELD, oCreature)
|
||||
|| GetHasSpellEffect(POWER_NULL_PSIONICS_FIELD, oCreature))
|
||||
{
|
||||
if(nIP)
|
||||
// itemproperty list already exists - do nothing
|
||||
return;
|
||||
|
||||
//remove ips
|
||||
string sIP;
|
||||
int nIpCount;
|
||||
persistant_array_create(oCreature, "PRC_NPF_ItemList"); //stores object strings
|
||||
itemproperty ip = GetFirstItemProperty(oItem);
|
||||
while(GetIsItemPropertyValid(ip))
|
||||
{
|
||||
if(GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
|
||||
{ //only store the permanent ones as underscore delimited strings
|
||||
sIP = IntToString(GetItemPropertyType(ip)) + "_" +
|
||||
IntToString(GetItemPropertySubType(ip)) + "_" +
|
||||
IntToString(GetItemPropertyCostTableValue(ip)) + "_" +
|
||||
IntToString(GetItemPropertyParam1Value(ip));
|
||||
if(DEBUG) DoDebug("StoreItemprops: " + GetName(oCreature) + ", " + ObjectToString(oItem) + ", " + sIP);
|
||||
array_set_string(oCreature, "PRC_NPF_ItemList", nIpCount++, sIP);
|
||||
}
|
||||
RemoveItemProperty(oItem, ip);
|
||||
ip = GetNextItemProperty(oItem);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!nIP)
|
||||
// itemproperty list not found!
|
||||
return;
|
||||
|
||||
//restore ips
|
||||
struct ipstruct iptemp;
|
||||
itemproperty ip;
|
||||
string sIP;
|
||||
int i;
|
||||
|
||||
for(i = 0; i < nIP; i++)
|
||||
{
|
||||
sIP = array_get_string(oItem, "PRC_NPF_ItemList", i);
|
||||
iptemp = GetIpStructFromString(sIP);
|
||||
ip = ConstructIP(iptemp.type, iptemp.subtype, iptemp.costtablevalue, iptemp.param1value);
|
||||
IPSafeAddItemProperty(oItem, ip, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING);
|
||||
if(DEBUG) DoDebug("RetoreItemprops: " + GetName(GetItemPossessor(oItem)) + ", " + ObjectToString(oItem) + ", " + sIP);
|
||||
}
|
||||
array_delete(oItem, "PRC_NPF_ItemList");
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateIPs(object oItem)
|
||||
{
|
||||
// Has lookup finished yet?
|
||||
if(GetXP(GetObjectByTag("Bioware2DACache")) & 0x01)
|
||||
{
|
||||
int bAddRestrictions = FALSE;
|
||||
int nSpellID;
|
||||
|
||||
//Set the AMS version of last update
|
||||
SetLocalString(oItem, "sb_ver", AMS_VERSION);
|
||||
|
||||
//remove all class restrictions and mark the spell
|
||||
itemproperty ipTest = GetFirstItemProperty(oItem);
|
||||
while(GetIsItemPropertyValid(ipTest))
|
||||
{
|
||||
if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_USE_LIMITATION_CLASS)
|
||||
{
|
||||
//the scroll/wand had a use limitation
|
||||
RemoveItemProperty(oItem, ipTest);
|
||||
bAddRestrictions = TRUE;
|
||||
}
|
||||
else if(GetItemPropertyType(ipTest) == ITEM_PROPERTY_CAST_SPELL)
|
||||
{
|
||||
nSpellID = StringToInt(Get2DACache("iprp_spells", "SpellIndex", GetItemPropertySubType(ipTest)));
|
||||
}
|
||||
ipTest = GetNextItemProperty(oItem);
|
||||
}
|
||||
if(bAddRestrictions)
|
||||
{
|
||||
int i, nClass, bAdd;
|
||||
for(i = 0; i < 36; i++)
|
||||
{
|
||||
bAdd = FALSE;
|
||||
switch(i)
|
||||
{
|
||||
case 0: nClass = CLASS_TYPE_BARD; break;
|
||||
case 1: nClass = CLASS_TYPE_CLERIC; break;
|
||||
case 2: nClass = CLASS_TYPE_DRUID; break;
|
||||
case 3: nClass = CLASS_TYPE_PALADIN; break;
|
||||
case 4: nClass = CLASS_TYPE_RANGER; break;
|
||||
case 5: nClass = CLASS_TYPE_SORCERER; break;
|
||||
case 6: nClass = CLASS_TYPE_WIZARD; break;
|
||||
case 7: nClass = CLASS_TYPE_HARPER; break;
|
||||
case 8: nClass = CLASS_TYPE_ASSASSIN; break;
|
||||
case 9: nClass = CLASS_TYPE_BLACKGUARD; break;
|
||||
case 10: nClass = CLASS_TYPE_OCULAR; break;
|
||||
case 11: nClass = CLASS_TYPE_HEXBLADE; break;
|
||||
case 12: nClass = CLASS_TYPE_DUSKBLADE; break;
|
||||
case 13: nClass = CLASS_TYPE_HEALER; break;
|
||||
case 14: nClass = CLASS_TYPE_BEGUILER; break;
|
||||
case 15: nClass = CLASS_TYPE_KNIGHT_CHALICE; break;
|
||||
case 16: nClass = CLASS_TYPE_VIGILANT; break;
|
||||
case 17: nClass = CLASS_TYPE_VASSAL; break;
|
||||
case 18: nClass = CLASS_TYPE_SUBLIME_CHORD; break;
|
||||
case 19: nClass = CLASS_TYPE_ANTI_PALADIN; break;
|
||||
case 20: nClass = CLASS_TYPE_SOLDIER_OF_LIGHT; break;
|
||||
case 21: nClass = CLASS_TYPE_SHADOWLORD; break;
|
||||
case 22: nClass = CLASS_TYPE_JUSTICEWW; break;
|
||||
case 23: nClass = CLASS_TYPE_KNIGHT_MIDDLECIRCLE; break;
|
||||
case 24: nClass = CLASS_TYPE_DREAD_NECROMANCER; break;
|
||||
case 25: nClass = CLASS_TYPE_MYSTIC; break;
|
||||
case 26: nClass = CLASS_TYPE_ARCHIVIST; break;
|
||||
case 27: nClass = CLASS_TYPE_WITCH; break;
|
||||
case 28: nClass = CLASS_TYPE_SHAMAN; break;
|
||||
case 29: nClass = CLASS_TYPE_SLAYER_OF_DOMIEL; break;
|
||||
case 30: nClass = CLASS_TYPE_SUEL_ARCHANAMACH; break;
|
||||
case 31: nClass = CLASS_TYPE_FAVOURED_SOUL; break;
|
||||
case 32: nClass = CLASS_TYPE_SHUGENJA; break;
|
||||
case 33: nClass = CLASS_TYPE_SOHEI; break;
|
||||
case 34: nClass = CLASS_TYPE_WARMAGE; break;
|
||||
case 35: nClass = CLASS_TYPE_TEMPLAR; break;
|
||||
case 36: nClass = CLASS_TYPE_DEFILER; break;
|
||||
}
|
||||
|
||||
if(nClass == CLASS_TYPE_DRUID)
|
||||
bAdd = Get2DACache("Spells", "Druid", nSpellID) == "" ? FALSE : TRUE;
|
||||
else if(nClass == CLASS_TYPE_PALADIN)
|
||||
bAdd = Get2DACache("Spells", "Paladin", nSpellID) == "" ? FALSE : TRUE;
|
||||
else if(nClass == CLASS_TYPE_RANGER)
|
||||
bAdd = Get2DACache("Spells", "Ranger", nSpellID) == "" ? FALSE : TRUE;
|
||||
else if(nClass == CLASS_TYPE_WIZARD || nClass == CLASS_TYPE_SORCERER || nClass == CLASS_TYPE_DEFILER)
|
||||
bAdd = RealSpellToSpellbookID(CLASS_TYPE_SORCERER, nSpellID) == -1 ? FALSE : TRUE;
|
||||
else if(nClass == CLASS_TYPE_CLERIC)
|
||||
bAdd = RealSpellToSpellbookID(CLASS_TYPE_MYSTIC, nSpellID) == -1 ? FALSE : TRUE;
|
||||
else
|
||||
bAdd = RealSpellToSpellbookID(nClass, nSpellID) == -1 ? FALSE : TRUE;
|
||||
|
||||
if(bAdd)
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyLimitUseByClass(nClass), oItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
else // Nope, try again later
|
||||
{
|
||||
DelayCommand(0.2f, UpdateIPs(oItem));
|
||||
}
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
// Find out the relevant objects
|
||||
object oCreature = GetModuleItemAcquiredBy();
|
||||
object oItem = GetModuleItemAcquired();
|
||||
string sTag = GetTag(oItem);
|
||||
|
||||
// Do not run for some of the PRC special items
|
||||
if(sTag == "PRC_MANIFTOKEN"
|
||||
|| sTag == "HideToken"
|
||||
|| GetResRef(oItem) == "base_prc_skin")
|
||||
return;
|
||||
|
||||
//if(DEBUG) DoDebug("Running OnAcquireItem, creature = '" + GetName(oCreature) + "' is PC: " + DebugBool2String(GetIsPC(oCreature)) + "; Item = '" + GetName(oItem) + "' - '" + GetTag(oItem) + "'");
|
||||
|
||||
AntiMagicFieldCheck(oItem, oCreature);
|
||||
|
||||
int nItemType = GetBaseItemType(oItem);
|
||||
|
||||
//fix for all-beige 1.67 -> 1.68 cloaks
|
||||
//gives them a random color
|
||||
if(nItemType == BASE_ITEM_CLOAK)
|
||||
{
|
||||
if(!GetPRCSwitch(PRC_DYNAMIC_CLOAK_AUTOCOLOUR_DISABLE) && !GetLocalInt(oItem, "CloakDone"))
|
||||
{
|
||||
//&& GetItemAppearance(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0) == 1
|
||||
if(GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1) == 0
|
||||
&& GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2) == 0
|
||||
&& GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1) == 0
|
||||
&& GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2) == 0
|
||||
&& GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1) == 0
|
||||
&& GetItemAppearance(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2) == 0)
|
||||
{
|
||||
//pre-1.68 boring bland cloak, colorise it :)
|
||||
//move it to temporary storage first
|
||||
object oChest = GetObjectByTag("HEARTOFCHAOS");
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItem(oItem, oChest, TRUE);
|
||||
//set appearance
|
||||
//doesnt work yet should do for 1.69
|
||||
//DestroyObject(oItem);
|
||||
//oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, Random(14)+1, TRUE);
|
||||
//set colors
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1, Random(176), TRUE);
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2, Random(176), TRUE);
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1, Random(176), TRUE);
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2, Random(176), TRUE);
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1, Random(176), TRUE);
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2, Random(176), TRUE);
|
||||
//move it back
|
||||
DestroyObject(oItem);
|
||||
oItem = CopyItem(oItem, oCreature, TRUE);
|
||||
//mark it as set just to be sure
|
||||
SetLocalInt(oItem, "CloakDone", TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// This is a resource hog. To work around, we assume that it's not going to cause noticeable issues if
|
||||
// racial restrictions are only ever expanded when a PC is involved
|
||||
if(GetIsPC(oCreature) || GetIsPC(GetMaster(oCreature)) || GetPRCSwitch(PRC_NPC_FORCE_RACE_ACQUIRE))
|
||||
ExecuteScript("race_ev_aquire", OBJECT_SELF);
|
||||
|
||||
// Creatures not related to PCs skip this block, contents are irrelevant for them
|
||||
if(GetIsPC(oCreature) || GetIsPC(GetMaster(oCreature)))
|
||||
{
|
||||
if(GetPRCSwitch(PRC_AUTO_IDENTIFY_ON_ACQUIRE))
|
||||
{
|
||||
if(!GetIdentified(oItem))
|
||||
{
|
||||
int nLore = GetSkillRank(SKILL_LORE, oCreature);
|
||||
int nMax = StringToInt(Get2DACache("SkillVsItemCost", "DeviceCostMax", nLore));
|
||||
if(nMax == 0)
|
||||
nMax = 120000000;
|
||||
// Check for the value of the item first.
|
||||
SetIdentified(oItem, TRUE);
|
||||
int nGP = GetGoldPieceValue(oItem);
|
||||
// If oPC has enough Lore skill to ID the item, then do so.
|
||||
if(nMax >= nGP)
|
||||
{
|
||||
string sName = GetName(oItem);
|
||||
if(sName != "")
|
||||
SendMessageToPC(oCreature, GetStringByStrRef(16826224) + " " + sName + " " + GetStringByStrRef(16826225));
|
||||
}
|
||||
else
|
||||
SetIdentified(oItem, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
if(nItemType == BASE_ITEM_MAGICWAND
|
||||
|| nItemType == BASE_ITEM_ENCHANTED_WAND
|
||||
|| nItemType == BASE_ITEM_SCROLL
|
||||
|| nItemType == BASE_ITEM_SPELLSCROLL
|
||||
|| nItemType == BASE_ITEM_ENCHANTED_SCROLL)
|
||||
{
|
||||
if(!GetPRCSwitch(PRC_SCROLL_AUTOUPDATE_RESTR_DISABLE)
|
||||
&& GetLocalString(oItem, "sb_ver") != AMS_VERSION //different Alternate Magic System versions - update IPs
|
||||
&& !GetLocalInt(oItem, "ip_lock")) //IPs of wand/scroll were locked in toolset or by script
|
||||
{
|
||||
DelayCommand(1.0f, UpdateIPs(oItem));//delayed to reduce lag and prevent TMIs
|
||||
}
|
||||
}
|
||||
|
||||
//rest kits
|
||||
if(GetPRCSwitch(PRC_SUPPLY_BASED_REST))
|
||||
ExecuteScript("sbr_onaquire", OBJECT_SELF);
|
||||
|
||||
//PRC Companion
|
||||
//DOA visible dyepot items
|
||||
/*if(GetPRCSwitch(MARKER_PRC_COMPANION))
|
||||
{
|
||||
if(GetBaseItemType(oItem) == BASE_ITEM_MISCSMALL)
|
||||
{
|
||||
//x2_it_dyec23
|
||||
string sTag = GetTag(oItem);
|
||||
if(GetStringLeft(sTag, 9) == "x2_it_dye")
|
||||
{
|
||||
//get the color
|
||||
//taken from x2_s3_dyearmour
|
||||
// GZ@2006/03/26: Added new color palette support. Note: Will only work
|
||||
// if craig updates the in engine functions as well.
|
||||
int nColor = 0;
|
||||
// See if we find a valid int between 0 and 127 in the last three letters
|
||||
// of the tag, use it as color
|
||||
int nTest = StringToInt(GetStringRight(sTag,3));
|
||||
if (nTest > 0 &&
|
||||
nTest < 175 )//magic number, bad!
|
||||
nColor = nTest;
|
||||
else //otherwise, use last two letters, as per legacy HotU
|
||||
nColor = StringToInt(GetStringRight(sTag,2));
|
||||
|
||||
//use limbo for crafting in
|
||||
object oLimbo = GetObjectByTag("HEARTOFCHAOS");
|
||||
//create the new one with the same tag as the old
|
||||
object oDye = CreateItemOnObject("prccompdye", oLimbo, 1, sTag);
|
||||
//ensure old one is cleaned up
|
||||
DestroyObject(oItem);
|
||||
//if its a metalic dye, modify it to use model 2
|
||||
if(GetStringRight(GetStringLeft(sTag, 10), 1) == "m")
|
||||
{
|
||||
DestroyObject(oDye);
|
||||
oDye = CopyItemAndModify(oDye, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, 2);
|
||||
//metal dye color
|
||||
DestroyObject(oDye);
|
||||
oDye = CopyItemAndModify(oDye, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1, nColor);
|
||||
}
|
||||
else
|
||||
{
|
||||
//standard dye
|
||||
DestroyObject(oDye);
|
||||
//cloth and leather use same palettee
|
||||
oDye = CopyItemAndModify(oDye, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1, nColor);
|
||||
}
|
||||
//copy the itemprops to cast the dye "spell"
|
||||
itemproperty ipTest = GetFirstItemProperty(oItem);
|
||||
while(GetIsItemPropertyValid(ipTest))
|
||||
{
|
||||
AddItemProperty(DURATION_TYPE_PERMANENT, ipTest, oDye);
|
||||
ipTest = GetNextItemProperty(oItem);
|
||||
}
|
||||
//move it back to the player
|
||||
CopyItem(oDye, oCreature);
|
||||
DestroyObject(oDye);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}// end if - PC or associate of PC
|
||||
|
||||
// Execute scripts hooked to this event for the creature and item triggering it
|
||||
ExecuteAllScriptsHookedToEvent(oCreature, EVENT_ONACQUIREITEM);
|
||||
ExecuteAllScriptsHookedToEvent(oItem, EVENT_ITEM_ONACQUIREITEM);
|
||||
|
||||
// Tag-based scripting hook for PRC items
|
||||
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_ACQUIRE);
|
||||
ExecuteScript("is_"+sTag, OBJECT_SELF);
|
||||
}
|
Reference in New Issue
Block a user