Files
PRC8/nwn/nwnprc/trunk/scripts/prc_onleave.nss
Jaysyn904 0f1c10c279 2026/01/26 Update
Added Wispling race.
Wispling qualifies for Shifter (PnP).
Bioware poisons now work with "new" PRC8 weapons.
Updated PRC8 Tester mod store to have Bioware venoms.
Updated PRC8 version.
Added Alchemy expansion notes.
Updated Starting package TLK notes.
2026-01-20 09:11:57 -05:00

86 lines
3.5 KiB
Plaintext

//::///////////////////////////////////////////////
//:: OnClientLeave eventscript
//:: prc_onleave
//:://////////////////////////////////////////////
#include "prc_class_const"
#include "inc_utility"
#include "inc_persistsql"
// Save logout time when actually logging out
void SaveCraftingLogoutTime(object oPC)
{
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | Called for " + GetName(oPC));
// Check database first, then local int
int bCrafting = SQLocalsPlayer_GetInt(oPC, "crafting_active");
if(!bCrafting)
{
bCrafting = GetLocalInt(oPC, "PRC_CRAFT_HB");
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | DB crafting_active = " + IntToString(bCrafting) +
", Local PRC_CRAFT_HB = " + IntToString(GetLocalInt(oPC, "PRC_CRAFT_HB")));
}
if(bCrafting)
{
// Save the logout timestamp with fallback
int nLogoutTimestamp = GetCurrentUnixTimestamp();
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | nLogoutTimestamp is: " + IntToString(nLogoutTimestamp));
if(nLogoutTimestamp == 0)
{
// Fallback: use a simple counter
int nLastLogout = SQLocalsPlayer_GetInt(oPC, "crafting_last_timestamp");
nLogoutTimestamp = nLastLogout + 1;
SQLocalsPlayer_SetInt(oPC, "crafting_last_timestamp", nLogoutTimestamp);
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | Using fallback counter: " + IntToString(nLogoutTimestamp));
}
// Save the timestamp
SQLocalsPlayer_SetInt(oPC, "crafting_last_timestamp", nLogoutTimestamp);
// Save current rounds remaining
int nRounds = GetLocalInt(oPC, "PRC_CRAFT_TIME");
SQLocalsPlayer_SetInt(oPC, "crafting_rounds", nRounds);
// Save the crafting costs
SQLocalsPlayer_SetInt(oPC, "crafting_cost", GetLocalInt(oPC, "PRC_CRAFT_COST"));
SQLocalsPlayer_SetInt(oPC, "crafting_xp", GetLocalInt(oPC, "PRC_CRAFT_XP"));
if(nRounds > 0)
{
SQLocalsPlayer_SetInt(oPC, "crafting_rounds", nRounds);
}
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | Saved logout timestamp " + IntToString(nLogoutTimestamp) + ", rounds remaining: " + IntToString(nRounds));
SQLocalsPlayer_SetString(oPC, "crafting_file", GetLocalString(oPC, "PRC_CRAFT_FILE"));
SQLocalsPlayer_SetInt(oPC, "crafting_line", GetLocalInt(oPC, "PRC_CRAFT_LINE"));
// Remove concentration monitoring and clear heartbeat
RemoveEventScript(oPC, EVENT_VIRTUAL_ONDAMAGED, "prc_od_conc");
DeleteLocalInt(oPC, "PRC_CRAFT_HB");
}
else
{
if(DEBUG) DoDebug("prc_onleave >> SaveCraftingLogoutTime | Player not crafting, skipping");
}
}
void main()
{
//:: Execute scripts hooked to this event for the player triggering it
object oPC = GetExitingObject();
string sPCName = GetName(oPC);
if (oPC == OBJECT_INVALID)
{
DoDebug("prc_onleave: oPC "+sPCName+" is invalid");
return;
}
if(DEBUG) DoDebug("prc_onleave: Player " +sPCName+ " leaving");
AssignCommand(GetModule(), DelayCommand(0.1, RecalculateTime()));
//SaveCraftingLogoutTime(oPC);
ExecuteAllScriptsHookedToEvent(oPC, EVENT_ONCLIENTLEAVE);
}