PWE_PRC8/_module/nss/ats_inc_common.nss
Jaysyn904 ee1dc35889 Initial Commit
Initial Commit
2025-04-03 10:29:41 -04:00

409 lines
14 KiB
Plaintext

/****************************************************
Common #include Script
ats_inc_common
Last Updated: August 2, 2002
***Ambrosia Tradeskill System***
Created by Mojo(Allen Sun)
This script contains basic functions needed by
most other script files.
**************************************************/
#include "ats_inc_debug"
#include "ats_inc_persist"
#include "ats_inc_allowed"
/////////////////////////////////////////////////////
// ATS_GetResRefFromTag //
// Converts a tag into a resref assuming tag //
// has the same name as resref. //
// Returns: string - ResRef //
/////////////////////////////////////////////////////
string ATS_GetResRefFromTag(string sTag)
{
return GetStringLowerCase(GetStringLeft(sTag, 16));
}
/////////////////////////////////////////////////////
// ATS_CreateItemOnPlayer //
// Wrapper for CreateItemOnObject() so it can //
// be used with DelayCommand() //
// Returns: None //
// Check local object variable: //
// "ats_returnvalue_created_item" for the //
// created object //
///////////////////////////////////////////////////
void ATS_CreateItemOnPlayer
(
string sItemTag, // Tag of the item
object oPlayer, // Player to create item on
int iStackSize = 1, // Size of the item stack
int iDropToFloor = TRUE, // Creates the item on the floor if inventory is full
)
{
string sItemResRef = ATS_GetResRefFromTag(sItemTag);
if ((GetStringRight(sItemTag,3)== "ARR") || (GetStringRight(sItemTag,3)== "arr"))
iStackSize = 20;
// Following lines by GilronS for stacking issues with the craftable Throwing Axes
// if (GetSubString(sItemTag, 6, 4) == "XXXX")
// iStackSize = 50;
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W036")
iStackSize = 50;
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W037")
iStackSize = 50;
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W038")
iStackSize = 50;
if (GetStringUpperCase(GetSubString(sItemTag, 6, 4)) == "W039")
iStackSize = 50;
// End Stacking Code for Throwing Axes
object oCreatedItem = CreateItemOnObject(sItemResRef, oPlayer, iStackSize);
// if(GetItemPossessor(oCreatedItem) == OBJECT_INVALID && iDropToFloor == TRUE)
// {
// oCreatedItem = CreateObject(OBJECT_TYPE_ITEM, sItemResRef, GetLocation(oPlayer));
// }
SetLocalObject(oPlayer, "ats_returnvalue_created_item", oCreatedItem);
SetLocalObject(oCreatedItem, "ats_obj_possessor", GetItemPossessor(oCreatedItem));
if(GetItemHasItemProperty(oCreatedItem, ITEM_PROPERTY_CAST_SPELL) == TRUE)
SetLocalInt(oCreatedItem, "ats_charges_fix", TRUE);
}
/////////////////////////////////////////////////////
// ATS_CreateItemInContainer //
// Wrapper for CreateItemOnObject() so it can //
// be used with DelayCommand() //
// Returns: None //
// Check local object variable: //
// "ats_returnvalue_created_item" for the //
// created object //
/////////////////////////////////////////////////////
void ATS_CreateItemInContainer
(
string sItemTag, // Tag of the item
object oContainer, // Container to create the item in
int iStackSize = 1, // Size of the item stack
int iForceCreation = TRUE, // If container is full, the object is created on the owner
)
{
string sItemResRef = ATS_GetResRefFromTag(sItemTag);
object oCreatedItem = CreateItemOnObject(sItemResRef, oContainer, iStackSize);
if(GetItemPossessor(oCreatedItem) == OBJECT_INVALID && iForceCreation == TRUE)
{
oCreatedItem = CreateItemOnObject(sItemResRef, GetItemPossessor(oContainer),
iStackSize);
}
SetLocalObject(oContainer, "ats_returnvalue_created_item", oCreatedItem);
SetLocalObject(oCreatedItem, "ats_obj_possessor", GetItemPossessor(oCreatedItem));
if(GetItemHasItemProperty(oCreatedItem, ITEM_PROPERTY_CAST_SPELL) == TRUE)
SetLocalInt(oCreatedItem, "ats_charges_fix", TRUE);
}
/////////////////////////////////////////////////////
// ATS_CreateObject //
// Wrapper for CreateObject() so it can //
// be used with DelayCommand() //
// Returns: None //
/////////////////////////////////////////////////////
void ATS_CreateObject
(
int iObjectType, // object type constant
string sTemplate, // object resref
location lLocation, // location of new object
int bUseAppearAnimation = FALSE // use animation
)
{
object oObjectCreated = CreateObject(iObjectType, sTemplate, lLocation, bUseAppearAnimation);
if(GetItemHasItemProperty(oObjectCreated, ITEM_PROPERTY_CAST_SPELL) == TRUE)
SetLocalInt(oObjectCreated, "ats_charges_fix", TRUE);
SetLocalObject(oObjectCreated, "ats_obj_possessor", GetItemPossessor(oObjectCreated));
}
string ATS_GetUniquePlayerID(object oPlayer)
{
return ("ATS_PID_" + GetPCPlayerName(oPlayer) + GetName(oPlayer));
}
/////////////////////////////////////////////////////
// ATS_GetTradeskill //
// Returns the skill value of a particular //
// tradeskill of a player //
// Returns: int - current skill value //
/////////////////////////////////////////////////////
int ATS_GetTradeskill
(
object oPlayer, // player to get tradeskill value from
string sTradeSkillType // name of the tradeskill
)
{
string sVarName = "ats_skillvalue_" + sTradeSkillType;
return ATS_GetPersistentInt(oPlayer, sVarName);
}
/////////////////////////////////////////////////////
// ATS_GetTagBaseType //
// Gets an item's base tag which consists of //
// four characters within the tag. //
// Returns: String - Base Tag //
/////////////////////////////////////////////////////
string ATS_GetTagBaseType(object oTargetObject)
{
string sObjectTag = GetTag(oTargetObject);
// Return the 4 character substring 6 characters into the tag
return GetSubString(sObjectTag, 6, 4);
}
/////////////////////////////////////////////////////
// ATS_GetCraftTag //
// Gets an item's craft tag from an object //
// Returns: String - Craft Tag //
/////////////////////////////////////////////////////
string ATS_GetCraftTag(object oTargetObject)
{
string sObjectTag = GetTag(oTargetObject);
return GetStringLeft(sObjectTag, 10);
}
object ATS_FindItemInInventoryByTag(object oTarget, string sTag, int iNth = 0)
{
int iCount = 0;
object oCurrentObject = OBJECT_INVALID;
if(GetHasInventory(oTarget) == FALSE)
return oCurrentObject;
oCurrentObject = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oCurrentObject) == TRUE)
{
if(GetTag(oCurrentObject) == sTag)
{
if(iCount == iNth)
return oCurrentObject;
else
++iCount;
}
oCurrentObject = GetNextItemInInventory(oTarget);
}
return oCurrentObject;
}
object ATS_FindItemInInventoryByBaseTag(object oTarget, string sBaseTag, int iNth = 0)
{
int iCount = 0;
object oCurrentObject = OBJECT_INVALID;
if(GetHasInventory(oTarget) == FALSE)
return oCurrentObject;
oCurrentObject = GetFirstItemInInventory(oTarget);
while(GetIsObjectValid(oCurrentObject) == TRUE)
{
if(ATS_GetTagBaseType(oCurrentObject) == sBaseTag)
{
if(iCount == iNth)
return oCurrentObject;
else
++iCount;
}
oCurrentObject = GetNextItemInInventory(oTarget);
}
return oCurrentObject;
}
/////////////////////////////////////////////////////
// ATS_CapitalizeString //
// Capitalizes the first letter of a string //
// Returns: string - capitalized string //
/////////////////////////////////////////////////////
string ATS_CapitalizeString(string sStringToCap)
{
string sTempString = GetStringLeft(sStringToCap, 1);
sTempString = GetStringUpperCase(sTempString);
sTempString = sTempString + GetStringRight(sStringToCap, GetStringLength(sStringToCap) - 1);
return sTempString;
}
void ATS_RemoveAllInstances(string sTag)
{
int iNum = 0;
object oObjectToDestroy = GetObjectByTag(sTag, iNum++);
while(oObjectToDestroy != OBJECT_INVALID)
{
DestroyObject(oObjectToDestroy);
oObjectToDestroy = GetObjectByTag(sTag, iNum++);
}
}
void ATS_RemoveAllInstancesOnPlayer(object oPlayer, string sTag)
{
int iNum = 0;
object oObjectToDestroy = GetObjectByTag(sTag, iNum++);
while(oObjectToDestroy != OBJECT_INVALID)
{
if(GetItemPossessor(oObjectToDestroy) == oPlayer)
DestroyObject(oObjectToDestroy);
oObjectToDestroy = GetObjectByTag(sTag, iNum++);
}
}
string ATS_CraftToItemTag(string sCraftTag, string sQuality, string sMaterialType)
{
return (GetStringLeft(sCraftTag, 10) + "_" + sQuality + "_" + sMaterialType);
}
int ATS_IsItemNoDrop(object oItem)
{
string sUpperTag = GetStringUpperCase(GetTag(oItem));
if(FindSubString(sUpperTag, "_NOD") > 0 || FindSubString(sUpperTag, "NODROP") > 0)
return TRUE;
else if (GetLocalInt(oItem,"ats_nodrop")) // added by richterm to try and fix
return TRUE; // bags with NODROP items in them
else // the flag was set in ats_inc_nodrop but
return FALSE; // wass never checked
}
int ATS_IsItemResource(object oItem)
{
if(GetStringLeft(GetTag(oItem), 5) == "ATS_R")
return TRUE;
else
return FALSE;
}
int ATS_GetItemDurability(object oItem)
{
return GetLocalInt(oItem, "ats_durability");
}
void ATS_SetItemDurability(object oItem, int iDurability)
{
SetLocalInt(oItem, "ats_durability", iDurability);
}
void ATS_DecreaseItemDurability(object oItem, int iAmount)
{
ATS_SetItemDurability(oItem, ATS_GetItemDurability(oItem) - iAmount);
}
int ATS_GetItemMaxDurability(object oItem)
{
string sItemTag = GetTag(oItem);
int iStringIndex = FindSubString(sItemTag, "_DUR");
if(iStringIndex == -1)
return 0;
string sParsedString = GetSubString(sItemTag, iStringIndex + 4,
GetStringLength(sItemTag) - iStringIndex - 4);
iStringIndex = FindSubString(sParsedString, "_");
if(iStringIndex <= 0)
{
return StringToInt(sParsedString);
}
else
{
return StringToInt(GetStringLeft(sParsedString, iStringIndex));
}
}
/////////////////////////////////////////////////////
// ATS_BreakItem //
// Wrapper function to destroy an item and //
// display text that it was broken //
// Returns: none //
/////////////////////////////////////////////////////
void ATS_BreakItem
(
object oItemToBreak, // item to destroy
float fDelay = 0.5 // delay in seconds to destroy
)
{
string sArrayName = "durability_" + GetTag(oItemToBreak);
object oItemPossessor = GetItemPossessor(oItemToBreak);
string sItemName = GetName(oItemToBreak);
DestroyObject(oItemToBreak, fDelay);
AssignCommand(GetModule(), DelayCommand(fDelay, FloatingTextStringOnCreature("Your " + sItemName +
" has broken.", oItemPossessor, FALSE)));
}
/////////////////////////////////////////////////////
// ATS_StrTok //
// Mimics the C string function strtok() //
// Returns: string - string token //
// returns "" if end of string //
/////////////////////////////////////////////////////
string ATS_StrTok
(
string sString, // String to tokenize(send in "" to continue with previous
// string)
string sDelimeter // Delimiter string
)
{
string sStringToTok;
if(sString == "")
sStringToTok = GetLocalString(GetModule(), "ats_strtok_string");
else
sStringToTok = sString;
int iTokenEndPos = FindSubString(sStringToTok, sDelimeter);
if(iTokenEndPos == -1 || sDelimeter == "")
{
SetLocalString(GetModule(), "ats_strtok_string", "");
return sStringToTok;
}
else
{
int iStringLength = GetStringLength(sStringToTok);
int iDelimeterLength = GetStringLength(sDelimeter);
SetLocalString(GetModule(), "ats_strtok_string",
GetStringRight(sStringToTok, iStringLength - iTokenEndPos - iDelimeterLength));
return GetStringLeft(sStringToTok, iTokenEndPos);
}
}
int ATS_GetIsVowel(string sChar)
{
string sLowerChar = GetStringLowerCase(sChar);
if(sLowerChar == "a" || sLowerChar == "e" || sLowerChar == "i" || sLowerChar == "o" || sLowerChar == "u")
return TRUE;
else
return FALSE;
}
// Function borrowed from NWN Spawn System by Palor
location ATS_GetRandomLocationNearObject(object oNearObject, int iMaxDistance)
{
vector vNewPos = GetPosition(oNearObject);
object oArea = GetArea(oNearObject);
float fX, fY;
float fMaxY;
float fRadius = IntToFloat(iMaxDistance);
fX = (Random(200)/100.0 - 1.0) * fRadius;
fMaxY = sqrt(fRadius*fRadius-fX*fX);
fY = (Random(200)/100.0 - 1.0) * fMaxY;
vNewPos += Vector(fX, fY, 0.0);
location lNewLoc = Location(oArea, vNewPos, VectorToAngle(-1.0 * vNewPos));
return lNewLoc;
}