2026/01/14 Late update
Updated PEPS. Tweaked geomorph code to prevent broken transitions. East/west & north/south are now randomized & tacked separately. Dungeon will reset areas when empty & no more options are available. Fixed issue with spell effect NUI. Full compile.
This commit is contained in:
@@ -11173,7 +11173,7 @@
|
|||||||
},
|
},
|
||||||
"Version": {
|
"Version": {
|
||||||
"type": "dword",
|
"type": "dword",
|
||||||
"value": 89
|
"value": 91
|
||||||
},
|
},
|
||||||
"Width": {
|
"Width": {
|
||||||
"type": "int",
|
"type": "int",
|
||||||
|
|||||||
@@ -1713,7 +1713,7 @@
|
|||||||
},
|
},
|
||||||
"Version": {
|
"Version": {
|
||||||
"type": "dword",
|
"type": "dword",
|
||||||
"value": 17
|
"value": 19
|
||||||
},
|
},
|
||||||
"Width": {
|
"Width": {
|
||||||
"type": "int",
|
"type": "int",
|
||||||
|
|||||||
@@ -90136,7 +90136,7 @@
|
|||||||
},
|
},
|
||||||
"XPosition": {
|
"XPosition": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 145.43106079101562
|
"value": 145.7196044921875
|
||||||
},
|
},
|
||||||
"YOrientation": {
|
"YOrientation": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
@@ -90144,7 +90144,7 @@
|
|||||||
},
|
},
|
||||||
"YPosition": {
|
"YPosition": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 108.6772689819336
|
"value": 107.3787612915039
|
||||||
},
|
},
|
||||||
"ZPosition": {
|
"ZPosition": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
@@ -92058,7 +92058,7 @@
|
|||||||
},
|
},
|
||||||
"XPosition": {
|
"XPosition": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 142.741943359375
|
"value": 139.95135498046875
|
||||||
},
|
},
|
||||||
"YOrientation": {
|
"YOrientation": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
@@ -92066,11 +92066,11 @@
|
|||||||
},
|
},
|
||||||
"YPosition": {
|
"YPosition": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 111.9538345336914
|
"value": 111.28477478027344
|
||||||
},
|
},
|
||||||
"ZPosition": {
|
"ZPosition": {
|
||||||
"type": "float",
|
"type": "float",
|
||||||
"value": 0.7951282262802124
|
"value": 0.19976425170898438
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1264,6 +1264,36 @@
|
|||||||
"type": "int",
|
"type": "int",
|
||||||
"value": 0
|
"value": 0
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__struct_id": 0,
|
||||||
|
"Name": {
|
||||||
|
"type": "cexostring",
|
||||||
|
"value": "PRC_WEREWOLF_HYBRID_USE_SHIFTER_SHAPECHANGE"
|
||||||
|
},
|
||||||
|
"Type": {
|
||||||
|
"type": "dword",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"Value": {
|
||||||
|
"type": "int",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"__struct_id": 0,
|
||||||
|
"Name": {
|
||||||
|
"type": "cexostring",
|
||||||
|
"value": "PRC_WILDSHAPE_ALLOWS_ARMS_SLOT"
|
||||||
|
},
|
||||||
|
"Type": {
|
||||||
|
"type": "dword",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"Value": {
|
||||||
|
"type": "int",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
_module/ncs/hif_modongui.ncs
Normal file
BIN
_module/ncs/hif_modongui.ncs
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
_module/ncs/nw_c2_default9.ncs
Normal file
BIN
_module/ncs/nw_c2_default9.ncs
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -16,7 +16,7 @@ void main()
|
|||||||
//object oEventObject = GetLastGuiEventObject();
|
//object oEventObject = GetLastGuiEventObject();
|
||||||
switch(nEventType)
|
switch(nEventType)
|
||||||
{
|
{
|
||||||
case GUIEVENT_EFFECTICON_CLICK:
|
case GUIEVENT_EFFECTICON_CLICK:
|
||||||
{
|
{
|
||||||
if(ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT))
|
if(ai_GetMagicMode(oPC, AI_MAGIC_EFFECT_ICON_REPORT))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
#include "0i_nui"
|
#include "0i_nui"
|
||||||
void ai_SetupModuleGUIEvents()
|
void ai_SetupModuleGUIEvents()
|
||||||
{
|
{
|
||||||
|
return; //:: Disabled
|
||||||
|
|
||||||
object oModule = GetModule();
|
object oModule = GetModule();
|
||||||
string sModuleGUIEvents = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT);
|
string sModuleGUIEvents = GetEventScript(oModule, EVENT_SCRIPT_MODULE_ON_PLAYER_GUIEVENT);
|
||||||
if(sModuleGUIEvents != "" || sModuleGUIEvents != "0e_gui_events")
|
if(sModuleGUIEvents != "" || sModuleGUIEvents != "0e_gui_events")
|
||||||
|
|||||||
@@ -1,97 +1,151 @@
|
|||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
object oPC = GetEnteringObject();
|
//object oPC = GetEnteringObject();
|
||||||
|
object oPC = GetClickingObject();
|
||||||
if (GetIsPC(oPC) != TRUE) return;
|
if (GetIsPC(oPC) != TRUE) return;
|
||||||
|
|
||||||
//:: Get own ID number
|
//:: Get own ID number
|
||||||
string sSelf = GetTag(OBJECT_SELF);
|
string sSelf = GetTag(OBJECT_SELF);
|
||||||
int iLength = GetStringLength(sSelf);
|
int iLength = GetStringLength(sSelf);
|
||||||
string sID;
|
string sID;
|
||||||
int iChosen = 0;
|
int iChosen = 0;
|
||||||
|
|
||||||
switch (iLength)
|
switch (iLength)
|
||||||
{
|
{
|
||||||
case 6:
|
case 6:
|
||||||
sID = GetStringRight(sSelf,1);
|
sID = GetStringRight(sSelf,1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7:
|
case 7:
|
||||||
sID = GetStringRight(sSelf,2);
|
sID = GetStringRight(sSelf,2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8:
|
case 8:
|
||||||
sID = GetStringRight(sSelf,3);
|
sID = GetStringRight(sSelf,3);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
default:
|
||||||
//SendMessageToPC(oPC,"my area ID is "+sID);
|
SendMessageToPC(oPC, "Valid door tag not found.");
|
||||||
|
sID = ""; // Initialize to empty string for unexpected lengths
|
||||||
int iMatch = GetLocalInt(OBJECT_SELF,"match"); //:: Current door's match
|
break;
|
||||||
string sEntryDir = GetStringLeft(GetTag(OBJECT_SELF),1); //:: Current door's direction
|
}
|
||||||
string sExitDir;
|
|
||||||
|
//SendMessageToPC(oPC,"my area ID is "+sID);
|
||||||
//:: This inverts the directions
|
|
||||||
if (sEntryDir == "n")
|
int iMatch = GetLocalInt(OBJECT_SELF,"match"); //:: Current door's match
|
||||||
sExitDir="s";
|
string sEntryDir = GetStringLeft(GetTag(OBJECT_SELF),1); //:: Current door's direction
|
||||||
|
string sExitDir;
|
||||||
else if (sEntryDir == "s")
|
|
||||||
sExitDir="n";
|
//:: This inverts the directions
|
||||||
|
if (sEntryDir == "n")
|
||||||
else if (sEntryDir == "w")
|
sExitDir="s";
|
||||||
sExitDir="e";
|
|
||||||
|
else if (sEntryDir == "s")
|
||||||
else if (sEntryDir == "e")
|
sExitDir="n";
|
||||||
sExitDir="w";
|
|
||||||
|
else if (sEntryDir == "w")
|
||||||
//SendMessageToPC(oPC,"i should be on the "+sExitDir+" side of the map");
|
sExitDir="e";
|
||||||
|
|
||||||
//:: Now determine if there is already a match
|
else if (sEntryDir == "e")
|
||||||
if (iMatch != 0) //:: Door already has a match, teleport PC
|
sExitDir="w";
|
||||||
{
|
|
||||||
//SendMessageToPC(oPC,"door has a match");
|
//SendMessageToPC(oPC,"i should be on the "+sExitDir+" side of the map");
|
||||||
string sTag = "area4_"+IntToString(iMatch);
|
|
||||||
object oArea = GetObjectByTag(sTag);
|
//:: Now determine if there is already a match
|
||||||
object oTarget = GetObjectByTag("wp4_"+IntToString(iMatch)+sExitDir);
|
if (iMatch != 0) //:: Door already has a match, teleport PC
|
||||||
location lTarget = GetLocation(oTarget);
|
{
|
||||||
float fFace = GetFacing(oPC);
|
//SendMessageToPC(oPC,"door has a match");
|
||||||
AssignCommand(oPC,ActionJumpToLocation(lTarget));
|
string sTag = "area4_"+IntToString(iMatch);
|
||||||
AssignCommand(oPC,SetFacing(fFace));
|
object oArea = GetObjectByTag(sTag);
|
||||||
iChosen = 1;
|
object oTarget = GetObjectByTag("wp4_"+IntToString(iMatch)+sExitDir);
|
||||||
return;
|
location lTarget = GetLocation(oTarget);
|
||||||
}
|
float fFace = GetFacing(oPC);
|
||||||
|
AssignCommand(oPC,ActionJumpToLocation(lTarget));
|
||||||
int iRand = Random(41)+1; //:: Random # for area selection
|
AssignCommand(oPC,SetFacing(fFace));
|
||||||
string sTag = "area4_"+IntToString(iRand);
|
iChosen = 1;
|
||||||
object oArea = GetObjectByTag(sTag);
|
return;
|
||||||
int iUsed = GetLocalInt(oArea,"ispop");
|
}
|
||||||
float fFace = GetFacing(oPC);
|
|
||||||
|
int iRand = Random(41)+1; //:: Random # for area selection
|
||||||
|
string sTag = "area4_"+IntToString(iRand);
|
||||||
|
object oArea = GetObjectByTag(sTag);
|
||||||
while (iChosen == 0)//selecting new areas
|
int iUsed = GetLocalInt(oArea,"ispop_"+sExitDir);
|
||||||
{
|
float fFace = GetFacing(oPC);
|
||||||
iRand = Random(41)+1;
|
|
||||||
sTag = "area4_"+IntToString(iRand);
|
int iRetryCount = 0;
|
||||||
oArea = GetObjectByTag(sTag);
|
// Extract current area ID before the while loop
|
||||||
iUsed = GetLocalInt(oArea,"ispop");
|
string sCurrentAreaTag = GetTag(GetArea(OBJECT_SELF));
|
||||||
|
int iCurrentAreaID = StringToInt(GetStringRight(sCurrentAreaTag, GetStringLength(sCurrentAreaTag) - 6));
|
||||||
if (iUsed == 0)
|
|
||||||
{
|
while (iChosen == 0)//selecting new areas
|
||||||
// SendMessageToPC(oPC,"unused area chosen");
|
{
|
||||||
object oTarget = GetObjectByTag("wp4_"+IntToString(iRand)+sExitDir);
|
iRand = Random(41)+1;
|
||||||
location lTarget = GetLocation(oTarget);
|
|
||||||
AssignCommand(oPC,ActionJumpToLocation(lTarget));
|
// Skip if this is the current area
|
||||||
AssignCommand(oPC,SetFacing(fFace));
|
if (iRand == iCurrentAreaID) continue;
|
||||||
SetLocalInt(oArea,"ispop",1);
|
|
||||||
object oDoor = GetObjectByTag(sExitDir+"door"+IntToString(iRand));
|
sTag = "area4_"+IntToString(iRand);
|
||||||
SetLocalInt(OBJECT_SELF,"match",iRand);
|
oArea = GetObjectByTag(sTag);
|
||||||
SetLocalInt(oDoor,"match",StringToInt(sID));
|
iUsed = GetLocalInt(oArea,"ispop_"+sExitDir);
|
||||||
iChosen = 1;
|
|
||||||
break;
|
if (iUsed == 0)
|
||||||
}
|
{
|
||||||
|
// SendMessageToPC(oPC,"unused area chosen");
|
||||||
//choose new area and try again until successful or TMI error
|
object oTarget = GetObjectByTag("wp4_"+IntToString(iRand)+sExitDir);
|
||||||
}
|
location lTarget = GetLocation(oTarget);
|
||||||
|
AssignCommand(oPC,ActionJumpToLocation(lTarget));
|
||||||
|
AssignCommand(oPC,SetFacing(fFace));
|
||||||
|
SetLocalInt(oArea,"ispop_"+sExitDir,1);
|
||||||
|
object oDoor = GetObjectByTag(sExitDir+"door"+IntToString(iRand));
|
||||||
|
SetLocalInt(OBJECT_SELF,"match",iRand);
|
||||||
|
SetLocalInt(oDoor,"match",StringToInt(sID));
|
||||||
|
iChosen = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback: reset empty areas if we've tried too many times
|
||||||
|
iRetryCount++;
|
||||||
|
if (iRetryCount > 50)
|
||||||
|
{
|
||||||
|
int iResetCount = 0;
|
||||||
|
// Check each area before resetting
|
||||||
|
int i;
|
||||||
|
for (i = 1; i <= 41; i++) {
|
||||||
|
object oCheckArea = GetObjectByTag("area4_"+IntToString(i));
|
||||||
|
if (GetIsObjectValid(oCheckArea)) {
|
||||||
|
// Check if all four directions are used
|
||||||
|
int bNorthUsed = GetLocalInt(oCheckArea, "ispop_n");
|
||||||
|
int bSouthUsed = GetLocalInt(oCheckArea, "ispop_s");
|
||||||
|
int bEastUsed = GetLocalInt(oCheckArea, "ispop_e");
|
||||||
|
int bWestUsed = GetLocalInt(oCheckArea, "ispop_w");
|
||||||
|
|
||||||
|
// Only reset if all directions are used AND no players present
|
||||||
|
if (bNorthUsed && bSouthUsed && bEastUsed && bWestUsed) {
|
||||||
|
// Check if area has players (using same logic as area_onexit.nss)
|
||||||
|
object oCheck = GetFirstObjectInArea(oCheckArea);
|
||||||
|
int bHasPlayers = FALSE;
|
||||||
|
while (oCheck != OBJECT_INVALID) {
|
||||||
|
if (GetIsPC(oCheck)) {
|
||||||
|
bHasPlayers = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
oCheck = GetNextObjectInArea(oCheckArea);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only reset if no players present
|
||||||
|
if (!bHasPlayers) {
|
||||||
|
// Reset all four direction flags
|
||||||
|
SetLocalInt(oCheckArea, "ispop_n", 0);
|
||||||
|
SetLocalInt(oCheckArea, "ispop_s", 0);
|
||||||
|
SetLocalInt(oCheckArea, "ispop_e", 0);
|
||||||
|
SetLocalInt(oCheckArea, "ispop_w", 0);
|
||||||
|
iResetCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WriteTimestampedLogEntry("door_click: Reset " + IntToString(iResetCount) + " fully exhausted areas");
|
||||||
|
iRetryCount = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
5
_module/nss/hif_modongui.nss
Normal file
5
_module/nss/hif_modongui.nss
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
void main()
|
||||||
|
{
|
||||||
|
ExecuteScript("prc_onplayergui", OBJECT_SELF);
|
||||||
|
ExecuteScript("mod_gui", OBJECT_SELF);
|
||||||
|
}
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
#include "inc_examine"
|
#include "inc_examine"
|
||||||
|
#include "nw_inc_nui"
|
||||||
|
#include "prc_nui_consts"
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
@@ -6,9 +8,17 @@ void main()
|
|||||||
int nType = GetLastGuiEventType();
|
int nType = GetLastGuiEventType();
|
||||||
object oTarget = GetLastGuiEventObject();
|
object oTarget = GetLastGuiEventObject();
|
||||||
int nValue = GetLastGuiEventInteger();
|
int nValue = GetLastGuiEventInteger();
|
||||||
|
|
||||||
ExecuteScript("prc_onplayergui", oPlayer);
|
|
||||||
|
|
||||||
|
if (nType == GUIEVENT_EFFECTICON_CLICK)
|
||||||
|
{
|
||||||
|
int windowId = NuiFindWindow(oPlayer, DURATION_NUI_WINDOW_ID);
|
||||||
|
if (!windowId)
|
||||||
|
{
|
||||||
|
SetScriptParam(NUI_DURATION_MANUALLY_OPENED_PARAM, "1");
|
||||||
|
ExecuteScript("prc_nui_dur_view", oPlayer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (nType == GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN)
|
if (nType == GUIEVENT_DISABLED_PANEL_ATTEMPT_OPEN)
|
||||||
{
|
{
|
||||||
if (nValue == GUI_PANEL_EXAMINE_CREATURE || nValue == GUI_PANEL_EXAMINE_ITEM ||
|
if (nValue == GUI_PANEL_EXAMINE_CREATURE || nValue == GUI_PANEL_EXAMINE_ITEM ||
|
||||||
|
|||||||
327
_module/nss/nw_c2_default9.nss
Normal file
327
_module/nss/nw_c2_default9.nss
Normal file
@@ -0,0 +1,327 @@
|
|||||||
|
//:://////////////////////////////////////////////////
|
||||||
|
//:: NW_C2_DEFAULT9
|
||||||
|
/*
|
||||||
|
* Default OnSpawn handler with XP1 revisions.
|
||||||
|
* This corresponds to and produces the same results
|
||||||
|
* as the default OnSpawn handler in the OC.
|
||||||
|
*
|
||||||
|
* This can be used to customize creature behavior in three main ways:
|
||||||
|
*
|
||||||
|
* - Uncomment the existing lines of code to activate certain
|
||||||
|
* common desired behaviors from the moment when the creature
|
||||||
|
* spawns in.
|
||||||
|
*
|
||||||
|
* - Uncomment the user-defined event signals to cause the
|
||||||
|
* creature to fire events that you can then handle with
|
||||||
|
* a custom OnUserDefined event handler script.
|
||||||
|
*
|
||||||
|
* - Add new code _at the end_ to alter the initial
|
||||||
|
* behavior in a more customized way.
|
||||||
|
*/
|
||||||
|
//:://////////////////////////////////////////////////
|
||||||
|
//:: Copyright (c) 2002 Floodgate Entertainment
|
||||||
|
//:: Created By: Naomi Novik
|
||||||
|
//:: Created On: 12/11/2002
|
||||||
|
//:://////////////////////////////////////////////////
|
||||||
|
//:: Updated 2003-08-20 Georg Zoeller: Added check for variables to active spawn in conditions without changing the spawnscript
|
||||||
|
|
||||||
|
|
||||||
|
#include "x0_i0_anims"
|
||||||
|
// #include "x0_i0_walkway" - in x0_i0_anims
|
||||||
|
#include "x0_i0_treasure"
|
||||||
|
|
||||||
|
#include "x2_inc_switches"
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
// ***** Spawn-In Conditions ***** //
|
||||||
|
|
||||||
|
// * REMOVE COMMENTS (// ) before the "Set..." functions to activate
|
||||||
|
// * them. Do NOT touch lines commented out with // *, those are
|
||||||
|
// * real comments for information.
|
||||||
|
|
||||||
|
// * This causes the creature to say a one-line greeting in their
|
||||||
|
// * conversation file upon perceiving the player. Put [NW_D2_GenCheck]
|
||||||
|
// * in the "Text Seen When" field of the greeting in the conversation
|
||||||
|
// * file. Don't attach any player responses.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SPECIAL_CONVERSATION);
|
||||||
|
|
||||||
|
// * Same as above, but for hostile creatures to make them say
|
||||||
|
// * a line before attacking.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SPECIAL_COMBAT_CONVERSATION);
|
||||||
|
|
||||||
|
// * This NPC will attack when its allies call for help
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SHOUT_ATTACK_MY_TARGET);
|
||||||
|
|
||||||
|
// * If the NPC has the Hide skill they will go into stealth mode
|
||||||
|
// * while doing WalkWayPoints().
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_STEALTH);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Enable stealth mode by setting a variable on the creature
|
||||||
|
// Great for ambushes
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_STEALTH) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_STEALTH);
|
||||||
|
}
|
||||||
|
// * Same, but for Search mode
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SEARCH);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Make creature enter search mode after spawning by setting a variable
|
||||||
|
// Great for guards, etc
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_SEARCH) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_SEARCH);
|
||||||
|
}
|
||||||
|
// * This will set the NPC to give a warning to non-enemies
|
||||||
|
// * before attacking.
|
||||||
|
// * NN -- no clue what this really does yet
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_SET_WARNINGS);
|
||||||
|
|
||||||
|
// * Separate the NPC's waypoints into day & night.
|
||||||
|
// * See comment on WalkWayPoints() for use.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_DAY_NIGHT_POSTING);
|
||||||
|
|
||||||
|
// * If this is set, the NPC will appear using the "EffectAppear"
|
||||||
|
// * animation instead of fading in, *IF* SetListeningPatterns()
|
||||||
|
// * is called below.
|
||||||
|
// *
|
||||||
|
//SetSpawnInCondition(NW_FLAG_APPEAR_SPAWN_IN_ANIMATION);
|
||||||
|
|
||||||
|
// * This will cause an NPC to use common animations it possesses,
|
||||||
|
// * and use social ones to any other nearby friendly NPCs.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Enable immobile ambient animations by setting a variable
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT_IMMOBILE) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_IMMOBILE_AMBIENT_ANIMATIONS);
|
||||||
|
}
|
||||||
|
// * Same as above, except NPC will wander randomly around the
|
||||||
|
// * area.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
// Enable mobile ambient animations by setting a variable
|
||||||
|
// See x2_inc_switches for more information about this
|
||||||
|
//--------------------------------------------------------------------------
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_USE_SPAWN_AMBIENT) == TRUE)
|
||||||
|
{
|
||||||
|
SetSpawnInCondition(NW_FLAG_AMBIENT_ANIMATIONS);
|
||||||
|
}
|
||||||
|
// **** Animation Conditions **** //
|
||||||
|
// * These are extra conditions you can put on creatures with ambient
|
||||||
|
// * animations.
|
||||||
|
|
||||||
|
// * Civilized creatures interact with placeables in
|
||||||
|
// * their area that have the tag "NW_INTERACTIVE"
|
||||||
|
// * and "talk" to each other.
|
||||||
|
// *
|
||||||
|
// * Humanoid races are civilized by default, so only
|
||||||
|
// * set this flag for monster races that you want to
|
||||||
|
// * behave the same way.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_IS_CIVILIZED);
|
||||||
|
|
||||||
|
// * If this flag is set, this creature will constantly
|
||||||
|
// * be acting. Otherwise, creatures will only start
|
||||||
|
// * performing their ambient animations when they
|
||||||
|
// * first perceive a player, and they will stop when
|
||||||
|
// * the player moves away.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_CONSTANT);
|
||||||
|
|
||||||
|
// * Civilized creatures with this flag set will
|
||||||
|
// * randomly use a few voicechats. It's a good
|
||||||
|
// * idea to avoid putting this on multiple
|
||||||
|
// * creatures using the same voiceset.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_CHATTER);
|
||||||
|
|
||||||
|
// * Creatures with _immobile_ ambient animations
|
||||||
|
// * can have this flag set to make them mobile in a
|
||||||
|
// * close range. They will never leave their immediate
|
||||||
|
// * area, but will move around in it, frequently
|
||||||
|
// * returning to their starting point.
|
||||||
|
// *
|
||||||
|
// * Note that creatures spawned inside interior areas
|
||||||
|
// * that contain a waypoint with one of the tags
|
||||||
|
// * "NW_HOME", "NW_TAVERN", "NW_SHOP" will automatically
|
||||||
|
// * have this condition set.
|
||||||
|
// SetAnimationCondition(NW_ANIM_FLAG_IS_MOBILE_CLOSE_RANGE);
|
||||||
|
|
||||||
|
|
||||||
|
// **** Special Combat Tactics *****//
|
||||||
|
// * These are special flags that can be set on creatures to
|
||||||
|
// * make them follow certain specialized combat tactics.
|
||||||
|
// * NOTE: ONLY ONE OF THESE SHOULD BE SET ON A SINGLE CREATURE.
|
||||||
|
|
||||||
|
// * Ranged attacker
|
||||||
|
// * Will attempt to stay at ranged distance from their
|
||||||
|
// * target.
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_RANGED);
|
||||||
|
|
||||||
|
// * Defensive attacker
|
||||||
|
// * Will use defensive combat feats and parry
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_DEFENSIVE);
|
||||||
|
|
||||||
|
// * Ambusher
|
||||||
|
// * Will go stealthy/invisible and attack, then
|
||||||
|
// * run away and try to go stealthy again before
|
||||||
|
// * attacking anew.
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_AMBUSHER);
|
||||||
|
|
||||||
|
// * Cowardly
|
||||||
|
// * Cowardly creatures will attempt to flee
|
||||||
|
// * attackers.
|
||||||
|
// SetCombatCondition(X0_COMBAT_FLAG_COWARDLY);
|
||||||
|
|
||||||
|
|
||||||
|
// **** Escape Commands ***** //
|
||||||
|
// * NOTE: ONLY ONE OF THE FOLLOWING SHOULD EVER BE SET AT ONE TIME.
|
||||||
|
// * NOTE2: Not clear that these actually work. -- NN
|
||||||
|
|
||||||
|
// * Flee to a way point and return a short time later.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ESCAPE_RETURN);
|
||||||
|
|
||||||
|
// * Flee to a way point and do not return.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ESCAPE_LEAVE);
|
||||||
|
|
||||||
|
// * Teleport to safety and do not return.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_TELEPORT_LEAVE);
|
||||||
|
|
||||||
|
// * Teleport to safety and return a short time later.
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_TELEPORT_RETURN);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***** CUSTOM USER DEFINED EVENTS ***** /
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
If you uncomment any of these conditions, the creature will fire
|
||||||
|
a specific user-defined event number on each event. That will then
|
||||||
|
allow you to write custom code in the "OnUserDefinedEvent" handler
|
||||||
|
script to go on top of the default NPC behaviors for that event.
|
||||||
|
|
||||||
|
Example: I want to add some custom behavior to my NPC when they
|
||||||
|
are damaged. I uncomment the "NW_FLAG_DAMAGED_EVENT", then create
|
||||||
|
a new user-defined script that has something like this in it:
|
||||||
|
|
||||||
|
if (GetUserDefinedEventNumber() == 1006) {
|
||||||
|
// Custom code for my NPC to execute when it's damaged
|
||||||
|
}
|
||||||
|
|
||||||
|
These user-defined events are in the range 1001-1007.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1001 in the OnHeartbeat
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_HEARTBEAT_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1002
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_PERCIEVE_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1005
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ATTACK_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1006
|
||||||
|
// *
|
||||||
|
SetSpawnInCondition(NW_FLAG_DAMAGED_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1008
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_DISTURBED_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1003
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT);
|
||||||
|
|
||||||
|
// * Fire User Defined Event 1004
|
||||||
|
// *
|
||||||
|
// SetSpawnInCondition(NW_FLAG_ON_DIALOGUE_EVENT);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***** DEFAULT GENERIC BEHAVIOR (DO NOT TOUCH) ***** //
|
||||||
|
|
||||||
|
// * Goes through and sets up which shouts the NPC will listen to.
|
||||||
|
// *
|
||||||
|
SetListeningPatterns();
|
||||||
|
|
||||||
|
// * Walk among a set of waypoints.
|
||||||
|
// * 1. Find waypoints with the tag "WP_" + NPC TAG + "_##" and walk
|
||||||
|
// * among them in order.
|
||||||
|
// * 2. If the tag of the Way Point is "POST_" + NPC TAG, stay there
|
||||||
|
// * and return to it after combat.
|
||||||
|
//
|
||||||
|
// * Optional Parameters:
|
||||||
|
// * void WalkWayPoints(int nRun = FALSE, float fPause = 1.0)
|
||||||
|
//
|
||||||
|
// * If "NW_FLAG_DAY_NIGHT_POSTING" is set above, you can also
|
||||||
|
// * create waypoints with the tags "WN_" + NPC Tag + "_##"
|
||||||
|
// * and those will be walked at night. (The standard waypoints
|
||||||
|
// * will be walked during the day.)
|
||||||
|
// * The night "posting" waypoint tag is simply "NIGHT_" + NPC tag.
|
||||||
|
WalkWayPoints();
|
||||||
|
|
||||||
|
//* Create a small amount of treasure on the creature
|
||||||
|
if ((GetLocalInt(GetModule(), "X2_L_NOTREASURE") == FALSE) &&
|
||||||
|
(GetLocalInt(OBJECT_SELF, "X2_L_NOTREASURE") == FALSE) )
|
||||||
|
{
|
||||||
|
CTG_GenerateNPCTreasure(TREASURE_TYPE_MONSTER, OBJECT_SELF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
|
||||||
|
|
||||||
|
// * If Incorporeal, apply changes
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_IS_INCORPOREAL) == TRUE)
|
||||||
|
{
|
||||||
|
effect eConceal = EffectConcealment(50, MISS_CHANCE_TYPE_NORMAL);
|
||||||
|
eConceal = ExtraordinaryEffect(eConceal);
|
||||||
|
effect eGhost = EffectCutsceneGhost();
|
||||||
|
eGhost = ExtraordinaryEffect(eGhost);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eConceal, OBJECT_SELF);
|
||||||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGhost, OBJECT_SELF);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// * Give the create a random name.
|
||||||
|
// * If you create a script named x3_name_gen in your module, you can
|
||||||
|
// * set the value of the variable X3_S_RANDOM_NAME on OBJECT_SELF inside
|
||||||
|
// * the script to override the creature's default name.
|
||||||
|
if (GetCreatureFlag(OBJECT_SELF, CREATURE_VAR_RANDOMIZE_NAME) == TRUE)
|
||||||
|
{
|
||||||
|
ExecuteScript("x3_name_gen",OBJECT_SELF);
|
||||||
|
string sName = GetLocalString(OBJECT_SELF,"X3_S_RANDOM_NAME");
|
||||||
|
if ( sName == "" )
|
||||||
|
{
|
||||||
|
sName = RandomName();
|
||||||
|
}
|
||||||
|
SetName(OBJECT_SELF,sName);
|
||||||
|
}
|
||||||
|
|
||||||
|
ExecuteScript("prc_pwonspawn", OBJECT_SELF);
|
||||||
|
}
|
||||||
@@ -2,9 +2,10 @@
|
|||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
|
ms_Nomenclature(OBJECT_SELF);
|
||||||
|
|
||||||
ExecuteScript("ss_treasure",OBJECT_SELF);
|
ExecuteScript("ss_treasure",OBJECT_SELF);
|
||||||
|
|
||||||
DelayCommand(0.3,ExecuteScript("ss_treas_auto_on",OBJECT_SELF));
|
DelayCommand(0.5,ExecuteScript("ss_treas_auto_on",OBJECT_SELF));
|
||||||
|
|
||||||
ms_Nomenclature(OBJECT_SELF);
|
|
||||||
}
|
}
|
||||||
@@ -299,7 +299,7 @@ void main()
|
|||||||
|
|
||||||
ExecuteScript("ss_treasure",OBJECT_SELF);
|
ExecuteScript("ss_treasure",OBJECT_SELF);
|
||||||
|
|
||||||
DelayCommand(0.3,ExecuteScript("ss_treas_auto_on",OBJECT_SELF));
|
DelayCommand(0.5,ExecuteScript("ss_treas_auto_on",OBJECT_SELF));
|
||||||
|
|
||||||
// ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
|
// ***** ADD ANY SPECIAL ON-SPAWN CODE HERE ***** //
|
||||||
|
|
||||||
|
|||||||
@@ -669,7 +669,7 @@
|
|||||||
"__struct_id": 0,
|
"__struct_id": 0,
|
||||||
"Name": {
|
"Name": {
|
||||||
"type": "cexostring",
|
"type": "cexostring",
|
||||||
"value": "SET_NAMEs"
|
"value": "SET_NAME"
|
||||||
},
|
},
|
||||||
"Type": {
|
"Type": {
|
||||||
"type": "dword",
|
"type": "dword",
|
||||||
|
|||||||
Reference in New Issue
Block a user