101 lines
3.3 KiB
Plaintext
101 lines
3.3 KiB
Plaintext
#include "events_inc"
|
|
void main()
|
|
{
|
|
|
|
object oPC = GetEnteringObject();
|
|
|
|
//A workaround to enable selecting this area in the OnClientLeave event, since GetArea returns OBJECT_INVALID there
|
|
SetLocalObject(oPC, "StoredArea", OBJECT_SELF);
|
|
|
|
if (!GetIsPC(oPC)) return;
|
|
|
|
if (GetLocalInt(oPC, "FromInnToVil") == TRUE)
|
|
{
|
|
DeleteLocalInt(oPC, "FromInnToVil");
|
|
return;
|
|
}
|
|
|
|
//Add to the counter of PCs in the area
|
|
SetLocalInt(OBJECT_SELF, "Players", GetLocalInt(OBJECT_SELF, "Players")+1);
|
|
|
|
//TEST
|
|
//FloatingTextStringOnCreature(IntToString(GetLocalInt(OBJECT_SELF, "Players")), oPC);
|
|
|
|
//First things first
|
|
EndEscortEvent(oPC);
|
|
ExploreAreaForPlayer(GetArea(oPC), oPC);
|
|
|
|
//A workaround to prevent the OnEnter event body from firing after loading a saved game
|
|
if (GetLocalInt(GetModule(), "LoadCooldown") == TRUE) return;
|
|
|
|
//Get the area we're in from the area variable
|
|
string sAreaString = GetLocalString(OBJECT_SELF, "AreaString");
|
|
|
|
//Let's set this area's pseudo OnExit event (as a workaround for players quitting the game), as well as the related inn's OnExit event
|
|
SetLocalString(OBJECT_SELF, "OnExit", "pseudo_vilonexit");
|
|
object oInnArea = GetArea(GetWaypointByTag("event_wp_"+sAreaString+"_1"));
|
|
SetLocalString(oInnArea, "OnExit", "pseudo_innonexit");
|
|
|
|
//Do nothing if there is already another PC in the area (and the area integer is TRUE)
|
|
if (GetLocalInt(OBJECT_SELF, "IsPopulated") == TRUE) return;
|
|
|
|
//Otherwise flag this area as populated, so that no event is generated for next players entering it
|
|
SetLocalInt(OBJECT_SELF, "IsPopulated", TRUE);
|
|
|
|
//Populate the area(s) with villagers
|
|
int nWpNumber;
|
|
string sWpTag;
|
|
string sRace = GetLocalString(OBJECT_SELF, "Race");
|
|
string sResRef;
|
|
location lWp;
|
|
int nMaxWp;
|
|
if (GetLocalInt(OBJECT_SELF, "Village") == TRUE) nMaxWp = 8;
|
|
else nMaxWp = 2;
|
|
{
|
|
for (nWpNumber = 1; nWpNumber <= nMaxWp; nWpNumber++)
|
|
{
|
|
sWpTag = "rand_wp_"+sAreaString+"_"+IntToString(nWpNumber);
|
|
if (Random(2) == 0) sResRef = "anc_npc_"+sRace+"_m";
|
|
else sResRef = "anc_npc_"+sRace+"_f";
|
|
lWp = GetLocation(GetWaypointByTag(sWpTag));
|
|
object oNPC = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lWp);
|
|
SetLocalInt(oNPC, "Commoner", TRUE);
|
|
SetLocalInt(oNPC, "Rumor", Random(3)+1);
|
|
}
|
|
}
|
|
|
|
//Spawn the innkeeper
|
|
sResRef = "anc_npc_"+sRace+"_inn";
|
|
if (Random(2) == 0) sResRef = sResRef + "m";
|
|
else sResRef = sResRef + "f";
|
|
sWpTag = "event_wp_"+sAreaString+"_1";
|
|
lWp = GetLocation(GetWaypointByTag(sWpTag));
|
|
CreateObject(OBJECT_TYPE_CREATURE, sResRef, lWp);
|
|
|
|
//50% chances of spawning a travelling merchant in the inn
|
|
object oMerchant;
|
|
sResRef = GetLocalString(OBJECT_SELF, "MerchantResRef");
|
|
sWpTag = "event_wp_"+sAreaString+"_2";
|
|
lWp = GetLocation(GetWaypointByTag(sWpTag));
|
|
if (Random(2) == 0) oMerchant = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lWp);
|
|
SetLocalInt(oMerchant, "Inn", TRUE);
|
|
|
|
//Spawn domesticated animals if appropriate
|
|
if (GetLocalInt(OBJECT_SELF, "Animals") == TRUE)
|
|
{
|
|
switch (Random(3))
|
|
{
|
|
case 0: sResRef = "anc_pig"; break;
|
|
case 1: sResRef = "anc_cow"; break;
|
|
case 2: sResRef = "anc_chicken"; break;
|
|
}
|
|
for (nWpNumber = 9; nWpNumber <= 12; nWpNumber++)
|
|
{
|
|
sWpTag = "rand_wp_"+sAreaString+"_"+IntToString(nWpNumber);
|
|
lWp = GetLocation(GetWaypointByTag(sWpTag));
|
|
CreateObject(OBJECT_TYPE_CREATURE, sResRef, lWp);
|
|
}
|
|
}
|
|
|
|
}
|