EN4_PRC8/_module/nss/mod_heartbeat.nss
Jaysyn904 b464d8da05 Initial Commit
Initial Commit [v1.32PRC8]
2025-04-03 13:38:45 -04:00

1051 lines
28 KiB
Plaintext

#include "rd_spawnzones"
#include "prc_inc_racial"
#include "utl_i_sqluuid"
#include "utl_i_sqlocals"
void CheckQuest();
void CheckRandomEncounter();
void SummonRace(object oPC,location lLoc,int iLevel);
void CheckPCAttackers();
void RemoveLoot();
void RemoveAreaLoot(object oArea);
void RemoveLootFromRemains(object oContainer);
void ForceCameraMode();
void SummonGood(object oPC);
void SummonRndCreature(int iLevel,location lLoc);
void GetCurse(object oPC);
void PCCursed();
void PCHunted();
void GetEnemy(object oPC);
void CampRandom();
void CampRandomAction(object oBoss,object oPC,string sCampType,string sZone);
void WorldEvent();
string GetRandomRaceType();
void main()
{
int iHeartbeat;
int iHeartbeatCheck;
iHeartbeat = SQLocals_GetInt(GetModule(),"Heartbeat");
iHeartbeat++;
SQLocals_SetInt(GetModule(),"Heartbeat",iHeartbeat);
iHeartbeatCheck = iHeartbeat % 150;
if (iHeartbeatCheck == 149)
{
RespawnCamps();
}
iHeartbeatCheck = iHeartbeat % 60;
if (iHeartbeatCheck == 59)
{
DelayCommand(0.0f, RemoveLoot());
}
iHeartbeatCheck = iHeartbeat % 20;
if (iHeartbeatCheck == 19)
{
ZoneRandom();
}
iHeartbeatCheck = iHeartbeat % 60;
if (iHeartbeatCheck == 59)
{
DelayCommand(0.0f, PCCursed());
}
iHeartbeatCheck = iHeartbeat % 30;
if (iHeartbeatCheck == 29)
{
DelayCommand(0.0f, PCHunted() );
}
iHeartbeatCheck = iHeartbeat % 25;
if (iHeartbeatCheck == 12)
{
DelayCommand(0.0f, CampRandom() );
}
iHeartbeatCheck = iHeartbeat % 50;
if (iHeartbeatCheck == 49)
{
DelayCommand(0.0f, WorldEvent());
}
DelayCommand(0.0f, CheckRandomEncounter());
DelayCommand(0.0f, CheckPCAttackers());
DelayCommand(0.0f, CheckQuest());
//ForceCameraMode();
}
void CheckQuest()
{
int iQuestType;
int iFlag;
string sQuestTargetMob;
object oPC;
object oLastPC;
object oTarget;
oPC=GetFirstPC();
iFlag = 0;
while (iFlag == 0)
{
iQuestType = SQLocalsUUID_GetInt(oPC,"QuestType");
if (iQuestType == 1 && SQLocalsUUID_GetInt(oPC,"QuestTargetMobDead") == 0)
{
sQuestTargetMob = GetLocalString(oPC,"QuestTargetMob");
oTarget = GetObjectByTag(sQuestTargetMob);
if (!GetIsObjectValid(oTarget))
{
SetCustomToken(105,GetLocalString(oPC,"Token105"));
SetCustomToken(101,GetLocalString(oPC,"Token101"));
SetCustomToken(104,GetLocalString(oPC,"Token104"));
SetCustomToken(106,GetLocalString(oPC,"Token106"));
if (GetLocalString(oPC,"QuestItemTag") == "")
{
AddJournalQuestEntry("jCamp",10,oPC);
} else {
if (SQLocalsUUID_GetInt(oPC,"OverallQuest") == 100)
{
AddJournalQuestEntry("jOverall",2,oPC);
}
else if (SQLocalsUUID_GetInt(oPC,"OverallQuest") == 110)
{
AddJournalQuestEntry("jOverall",5,oPC);
}
else if (SQLocalsUUID_GetInt(oPC,"OverallQuest") == 120)
{
AddJournalQuestEntry("jOverall",8,oPC);
}
else if (SQLocalsUUID_GetInt(oPC,"OverallQuest") == 130)
{
AddJournalQuestEntry("jOverall",11,oPC);
}
else if (SQLocalsUUID_GetInt(oPC,"OverallQuest") == 131)
{
AddJournalQuestEntry("jOverall",13,oPC);
}
else if (SQLocalsUUID_GetInt(oPC,"QuestItemUnknown") == 0)
{
AddJournalQuestEntry("jCamp",11,oPC);
}
else
{
SetCustomToken(104,"item");
AddJournalQuestEntry("jCamp",11,oPC);
}
}
SetLocalInt(oPC,"QuestTargetMobDead",1);
}
}
//Make sure no one is kos to the dark agents
if (GetIsEnemy(GetObjectByTag("rp1_evilquest")))
AdjustReputation(oPC,GetObjectByTag("rp1_evilquest"),50);
oLastPC = oPC;
oPC = GetNextPC();
if (GetName(oLastPC) == GetName(oPC))
iFlag = 1;
}
}
void CheckRandomEncounter()
{
object oPC;
object oArea;
vector vPC;
vector vNew;
location lLoc;
string sCreature;
int iArea;
int iEncounter;
int iPCEncounter;
int iRandom;
int iRandom2;
int iRndX;
int iRndY;
int iLevel;
int iSpot;
int iPCCount;
int iDeathAllowed;
int iDeathAdjust;
int iAdjustedLevel;
int iChance;
oPC = GetRandomPC();
oArea = GetArea(oPC);
iEncounter = GetLocalInt(oArea,"RandomEncounter");
iPCEncounter = SQLocalsUUID_GetInt(oPC,"NoRandomEncounter");
if (iEncounter == 1 && iPCEncounter == 0)
{
iChance = 50;
if (SQLocalsUUID_GetInt(oPC,"Unlucky")==1 || SQLocalsUUID_GetInt(oPC,"Cursed")==1)
iChance = 30;
if (GetLocalInt(GetModule(),"MonsterStorm") == 1)
iChance = 20;
iRandom = Random(iChance);
//iRandom = 0;
if (iRandom == 0)
{
iSpot=Random(25)+1;
if (iSpot<=GetAbilityScore(oPC,ABILITY_WISDOM))
{
SendMessageToPC(oPC,"You hear a strange rustling nearby...");
}
vPC = GetPosition(oPC);
iRndX = Random(8) + 4;
iRndY = Random(8) + 4;
if (Random(2) == 1) iRndX=iRndX * -1;
if (Random(2) == 1) iRndY=iRndY * -1;
vNew = vPC + Vector( iRndX/1.0, iRndY/1.0, 0.0 );
lLoc = Location(GetArea(oPC), vNew, VectorToAngle( -1.0 * vNew ) );
iLevel = GetHitDice(oPC);
iAdjustedLevel = AdjustLevel(iLevel);
iAdjustedLevel = ZoneLevel(GetArea(oPC),iAdjustedLevel);
iRandom = Random(10)+1;
switch (iRandom)
{
case 1: case 2: SummonAnimal(lLoc,iAdjustedLevel); break;
case 3: case 4: SummonAnything(oPC,lLoc,iAdjustedLevel); break;
case 5: case 9: DelayCommand(0.0f, SummonRace(oPC,lLoc,iAdjustedLevel)); break;
case 6: if (iAdjustedLevel < 15)
{
GetRaceCreatures("bandit",lLoc,iAdjustedLevel);
} else {
GetRaceCreatures("merc",lLoc,iAdjustedLevel);
}
break;
case 7: if (GetIsNight())
{
if (iLevel < 10)
{
iRandom2 = Random(2) + 1;
switch (iRandom2)
{
case 1: GetRaceCreatures("duergar",lLoc,iAdjustedLevel); break;
case 2: GetRaceCreatures("skeleton",lLoc,iAdjustedLevel); break;
}
} else {
iRandom2 = Random(3) + 1;
switch (iRandom2)
{
case 1: GetRaceCreatures("drow",lLoc,iAdjustedLevel); break;
case 2: GetRaceCreatures("vampire",lLoc,iAdjustedLevel); break;
case 3: GetRaceCreatures("duergar",lLoc,iAdjustedLevel); break;
}
}
} else {
SummonInsect(lLoc,iAdjustedLevel); break;
}
break;
case 8: DelayCommand(0.0f, SummonGood(oPC)); break;
case 10: DelayCommand(0.0f, SummonRndCreature(iAdjustedLevel,lLoc)); break;
/*case 3: case 4: SummonAnimal(oLoc,iLevel); break;
case 5: case 6: SummonCreature(oLoc,iLevel); break;
case 7: case 8: SummonBandits(oLoc,iLevel); break;
case 9: case 10: SummonInsect(oLoc,iLevel); break;*/
}
}
}
}
void SummonRace(object oPC,location lLoc,int iLevel)
{
object oArea;
int iArea;
int iRandom;
int iIndex;
string sCampType;
if ((SQLocalsUUID_GetInt(oPC,"EvilPath") > 0 || SQLocalsUUID_GetInt(oPC,"Monstrous") == 1) && Random(3) == 0)
{
iRandom=Random(3)+1;
switch (iRandom)
{
case 1: sCampType="elf"; break;
case 2: sCampType="dwarf"; break;
case 3: sCampType="halfling"; break;
}
} else {
oArea=GetArea(oPC);
iArea=GetIsAreaInterior(oArea);
if (iArea == FALSE)
SetupCampTypes(iLevel, 1, 0, 1, 1);
else
SetupCampTypes(iLevel, 1, 1, 1, 1);
sCampType = GetCampType();
}
iIndex = 0;
iRandom = Random(4)+1;
if (iRandom > 2 && iLevel < 3)
iRandom = 2;
if (iRandom == 4 && iLevel < 7)
iRandom = 3;
while (iIndex < iRandom)
{
GetRaceCreature(sCampType,lLoc,iLevel);
iIndex++;
}
}
void CheckPCAttackers()
{
int iFlag;
object oPC;
object oLastPC;
string sCampType;
vector vPC;
vector vNew;
location lLoc;
int iSpot;
int iRndX;
int iRndY;
int iLevel;
int iChance;
object oArea;
int iEncounter;
int iPCEncounter;
int iAttacked;
int iPCCount;
oPC=GetFirstPC();
iFlag = 0;
//object GetRaceCreature(string sCampType,location lLoc, int iLevel)
while (iFlag == 0)
{
sCampType=GetLocalString(oPC,"QuestAttackers");
if (!(sCampType == ""))
{
oArea = GetArea(oPC);
iEncounter = GetLocalInt(oArea,"RandomEncounter");
iPCEncounter = SQLocalsUUID_GetInt(oPC,"NoRandomEncounter");
if (iEncounter == 1 && iPCEncounter == 0)
{
iAttacked = SQLocalsUUID_GetInt(oPC,"QuestAttacked");
iPCCount = GetPCCount(oPC);
iChance = 10 + iAttacked * 2 + ((iPCCount-1 + iAttacked) * 2);
if (Random(iChance) == 0)
{
iAttacked++;
SetLocalInt(oPC,"QuestAttacked",iAttacked);
iSpot=Random(25)+1;
if (iSpot<=GetAbilityScore(oPC,ABILITY_WISDOM))
{
SendMessageToPC(oPC,"You hear something nearby...");
}
vPC = GetPosition(oPC);
iRndX = Random(8) + 4;
iRndY = Random(8) + 4;
if (Random(2) == 1) iRndX=iRndX * -1;
if (Random(2) == 1) iRndY=iRndY * -1;
vNew = vPC + Vector( iRndX/1.0, iRndY/1.0, 0.0 );
lLoc = Location(GetArea(oPC), vNew, VectorToAngle( -1.0 * vNew ) );
iLevel = GetHitDice(oPC);
iLevel = ZoneLevel(GetArea(oPC),iLevel);
GetRaceCreature(sCampType,lLoc,iLevel);
}
}
}
oLastPC = oPC;
oPC = GetNextPC();
if (GetName(oLastPC) == GetName(oPC))
iFlag = 1;
}
}
void RemoveLoot()
{
object oPC;
object oLastPC;
object oArea;
string sLastArea;
int iFlag;
int iLevel;
oPC=GetFirstPC();
iFlag = 0;
while (iFlag == 0)
{
oArea = GetArea(oPC);
if (!(GetTag(oArea) == sLastArea))
DelayCommand(0.0f, RemoveAreaLoot(oArea));
oLastPC = oPC;
sLastArea = GetTag(oArea);
oPC = GetNextPC();
if (GetName(oLastPC) == GetName(oPC))
{
iFlag = 1;
}
}
}
void RemoveAreaLoot(object oArea)
{
object oItem;
object oLastItem;
int iFlag;
int iDeleteFlag;
iFlag = 0;
oItem = GetFirstObjectInArea(oArea);
while (iFlag == 0)
{
if (GetName(oItem) == "Remains")
{
iDeleteFlag = GetLocalInt(oItem,"DeleteRemains");
if (iDeleteFlag == 1)
{
DelayCommand(0.0f, RemoveLootFromRemains(oItem));
DestroyObject(oItem);
} else {
SetLocalInt(oItem,"DeleteRemains",1);
}
}
oLastItem = oItem;
oItem = GetNextObjectInArea(oArea);
if (oLastItem == oItem)
iFlag = 1;
}
}
void RemoveLootFromRemains(object oContainer)
{
object oItem;
object oLastItem;
int iFlag;
int iDeleteFlag;
iFlag = 0;
oItem = GetFirstItemInInventory(oContainer);
while (iFlag == 0)
{
DestroyObject(oItem);
oLastItem = oItem;
oItem = GetNextItemInInventory(oContainer);
if (oLastItem == oItem)
iFlag = 1;
}
}
void ForceCameraMode()
{
int iFlag;
int iRacialType;
object oPC;
object oLastPC;
int iFP;
iFP = GetCampaignInt("EndlessNightsIII","E3FirstPerson");
oPC=GetFirstPC();
iFlag = 0;
while (iFlag == 0)
{
if (SQLocalsUUID_GetInt(oPC,"FirstPerson") == 1 || iFP == 1)
{
iRacialType = MyPRCGetRacialType(oPC);
SetCameraMode(oPC,CAMERA_MODE_STIFF_CHASE_CAMERA);
if (iRacialType == RACIAL_TYPE_HALFLING || iRacialType == RACIAL_TYPE_GNOME || iRacialType == RACIAL_TYPE_DWARF)
SetCameraHeight(oPC,2.0);
else
SetCameraHeight(oPC,2.5);
AssignCommand(oPC,SetCameraFacing(-1.0,4.0,80.0));
AssignCommand(oPC,SetCameraFacing(GetFacing(oPC),4.0,80.0));
}
oLastPC = oPC;
oPC = GetNextPC();
if (GetName(oLastPC) == GetName(oPC))
{
iFlag = 1;
}
}
}
void SummonGood(object oPC)
{
vector vPC;
vector vNew;
location lLoc;
int iRndX;
int iRndY;
int iLevel;
int iRandom;
string sArea;
string sRace;
string sEvilRace;
vPC = GetPosition(oPC);
iRndX = Random(4) + 8;
iRndY = Random(4) + 8;
if (Random(2) == 1) iRndX=iRndX * -1;
if (Random(2) == 1) iRndY=iRndY * -1;
vNew = vPC + Vector( iRndX/1.0, iRndY/1.0, 0.0 );
lLoc = Location(GetArea(oPC), vNew, VectorToAngle( -1.0 * vNew ) );
iLevel = GetHitDice(oPC);
sArea = GetZone(oPC);
iLevel = ZoneLevel(GetArea(oPC),iLevel);
sRace = "human";
iRandom = Random(3)+1;
switch (iRandom)
{
case 1: sRace == "elf"; break;
case 2: sRace == "dwarf"; break;
case 3: sRace == "human"; break;
}
if (iLevel < 5)
if (Random(3)==0)
sRace = "halfling";
if (iLevel>24)
if (Random(4)==0)
sRace = "angelic";
GetRaceCreatures(sRace,lLoc,iLevel);
iRandom=Random(2)+1;
if (iRandom == 1)
{
if (Random(2) == 0)
{
SummonAnything(oPC,lLoc,iLevel);
} else {
sEvilRace = "bandit";
if (iLevel > 9 && iLevel < 20)
sEvilRace = "mercenary";
if (iLevel>19)
sEvilRace = "shade";
if (sRace == "elf")
sEvilRace = "drow";
if (sRace == "dwarf")
sEvilRace = "duergar";
if (sRace == "angelic")
sEvilRace = "fiend";
GetRaceCreatures(sEvilRace,lLoc,iLevel);
}
}
}
void SummonRndCreature(int iLevel,location lLoc)
{
int iIndex;
int iRandom;
string sTag;
sTag = GetRndCreature(iLevel);
iIndex = 0;
iRandom = Random(3)+2;
if (iRandom > 2 && iLevel < 3)
iRandom = 2;
if (iRandom == 4 && iLevel < 7)
iRandom = 3;
while (iIndex < iRandom)
{
CreateObject(OBJECT_TYPE_CREATURE,sTag,lLoc);
iIndex++;
}
}
void PCCursed()
{
object oPC = GetFirstPC();
object oLastPC;
int iFlag = 0;
while (iFlag == 0)
{
if (SQLocalsUUID_GetInt(oPC,"Cursed")==1)
DelayCommand(0.0f, GetCurse(oPC));
oLastPC = oPC;
oPC = GetNextPC();
if (GetIsObjectValid(oPC) == FALSE)
iFlag = 1;
if (GetName(oPC) == GetName(oLastPC))
iFlag = 1;
}
}
void GetCurse(object oPC)
{
int iRandom;
int iRandom2;
int iRandom3;
int iX;
string sMessage;
string sType;
effect eEffect;
iRandom = Random(3);
if (iRandom == 0 )
{
iRandom2 = Random(7)+1;
switch (iRandom2)
{
case 1: eEffect = EffectDamage(1,DAMAGE_TYPE_BLUDGEONING);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eEffect,oPC);
sMessage = "You stump your toe.";
break;
case 2: iRandom3 = Random(6)+1;
switch (iRandom3)
{
case 1: iX = DISEASE_BLINDING_SICKNESS; sType = "Blinding Sickness"; break;
case 2: iX = DISEASE_BURROW_MAGGOTS; sType = "Burrow Maggots"; break;
case 3: iX = DISEASE_DEMON_FEVER; sType = "Demon Fever"; break;
case 4: iX = DISEASE_DREAD_BLISTERS; sType = "Dread Blisters"; break;
case 5: iX = DISEASE_RED_ACHE; sType = "the Red Ache"; break;
case 6: iX = DISEASE_SHAKES; sType = "the Shakes"; break;
}
eEffect = EffectDisease(iX);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eEffect,oPC);
sMessage = "You develop " + sType + ".";
break;
case 3: eEffect = EffectCurse(Random(3),Random(3),Random(3),Random(3),Random(3),Random(3));
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,120.0f);
sMessage = "You feel the curse coming over you.";
break;
case 4: eEffect = EffectConfused();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,10.0f);
sMessage = "You feel confused.";
break;
case 5: eEffect = EffectBlindness();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,30.0f);
sMessage = "You lose your vision.";
break;
case 6: eEffect = EffectFrightened();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,30.0f);
sMessage = "You are suddenly very scared.";
break;
case 7: eEffect = EffectKnockdown();
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eEffect,oPC,3.0f);
sMessage = "You trip.";
break;
}
SendMessageToPC(oPC,sMessage);
}
}
void PCHunted()
{
object oPC = GetFirstPC();
object oLastPC;
int iFlag = 0;
while (iFlag == 0)
{
if (SQLocalsUUID_GetInt(oPC,"Enemy")>0)
DelayCommand(0.0f, GetEnemy(oPC) );
oLastPC = oPC;
oPC = GetNextPC();
if (GetIsObjectValid(oPC) == FALSE)
iFlag = 1;
if (GetName(oPC) == GetName(oLastPC))
iFlag = 1;
}
}
void GetEnemy(object oPC)
{
int iRandom;
int iEnemy;
int iEncounter;
string sTag;
vector vPC;
vector vNew;
location lLoc;
int iRndX;
int iRndY;
int iLevel;
int iLevels;
object oCreature;
iEncounter = GetLocalInt(GetArea(oPC),"RandomEncounter");
iRandom = Random(4);
if (iRandom == 0 && iEncounter == 1)
{
iEnemy = SQLocalsUUID_GetInt(oPC,"Enemy");
switch (iEnemy)
{
case 1: sTag = "en3_redwizard"; break;
case 2: sTag = "en3_theives"; break;
case 3: sTag = "en3_merchant"; break;
case 4: sTag = "en4_adventurer" + IntToString(Random(4)+1); break;
}
sTag = sTag + IntToString(Random(3)+1);
vPC = GetPosition(oPC);
iRndX = Random(4) + 8;
iRndY = Random(4) + 8;
if (Random(2) == 1) iRndX=iRndX * -1;
if (Random(2) == 1) iRndY=iRndY * -1;
vNew = vPC + Vector( iRndX/1.0, iRndY/1.0, 0.0 );
lLoc = Location(GetArea(oPC), vNew, VectorToAngle( -1.0 * vNew ) );
if (sTag == "en3_redwizard")
{
effect eVFX = EffectVisualEffect(VFX_FNF_SUMMON_MONSTER_3);
AssignCommand(OBJECT_SELF, DelayCommand(0.1f, ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVFX, lLoc)));
}
oCreature=CreateObject(OBJECT_TYPE_CREATURE,sTag,lLoc);
iLevel = GetHitDice(oPC);
iLevel = ZoneLevel(GetArea(oPC),iLevel);
iLevels = iLevel - 2 + Random(3);
if (iLevels>0)
iLevel = LevelMob(oCreature,iLevels);
AssignCommand(oCreature,ActionRest());
if (iLevel > 1)
EquipMob(oCreature);
}
}
void CampRandom()
{
object oPC;
object oBoss;
string sZone;
string sTag;
string sCampType;
int iCount;
int iCamps;
int iCampType;
int iChance;
oPC = GetRandomPC();
sZone = GetZone(oPC);
iCamps = GetMaxCampSpots(sZone);
iCount = 0;
while (iCount < iCamps)
{
iCount++;
sTag = sZone + "_C" + IntToString(iCount) + "_Boss_S";
oBoss = GetObjectByTag(sTag);
iChance = 20 - CampPoints(sZone, iCount);
if (iChance < 5)
iChance == 5;
if (GetIsObjectValid(oBoss))
{
iCampType= GetLocalInt(oBoss,"iCampType");
if (Random(iChance) < 1 && iCampType == 1)
{
sCampType = GetLocalString(oBoss,"CampType");
WriteTimestampedLogEntry("Camp " + sZone + "_C" + IntToString(iCount) + " led by a " + GetName(oBoss) + " doing random action.");
DelayCommand(0.0f, CampRandomAction(oBoss,oPC,sCampType,sZone));
}
}
}
}
void CampRandomAction(object oBoss,object oPC,string sCampType,string sZone)
{
int iRandom;
int iLevel;
int iMobLevel;
int iNumber;
int iCount;
int iSpot;
int iX;
int iCamps;
int iFlag;
location lLoc;
location lLoc2;
object oCreature;
object oWP;
string sTag;
iRandom = Random(3)+1;
//If last attacked a camp then keep at it
if (GetLocalInt(oBoss,"EN4CampAttack") == 1)
iRandom = 3;
//If last camp attack check led to no camps then attack pc or move to x-spot
if (GetLocalInt(oBoss,"EN4CampAttack") == 2)
{
iRandom = Random(2)+1;
SetLocalInt(oBoss,"EN4CampAttack",0);
}
//iRandom=1;
//SetLocalInt(oBoss,"EN4CampAttack",2);
iLevel = GetHitDice(oPC);
iLevel = ZoneLevel(GetArea(oPC),iLevel);
if (iLevel<5)
iNumber = Random(2)+1;
else if (iLevel < 10)
iNumber = Random(3)+1;
else
iNumber = Random(4)+1;
if (iRandom == 1) //Assassinate PC
{
if (GetIsEnemy(oPC,oBoss))
{
lLoc = GetLocation(oBoss);
iCount = 0;
while (iCount < iNumber)
{
iCount++;
sTag = "en3_" + sCampType + "_" + "r_1";
oCreature = CreateObject(OBJECT_TYPE_CREATURE,sTag,lLoc);
if (!GetIsObjectValid(oCreature))
WriteTimestampedLogEntry("ERROR: Failed to Create " + sTag + " in CampRandom code.");
iMobLevel = Random(5) - 2 + iLevel;
if (iMobLevel>1)
{
LevelMob(oCreature,iMobLevel-1);
EquipMob(oCreature);
}
DelayCommand(1.0f,AssignCommand(oCreature,ActionMoveToObject(oPC,TRUE)));
DelayCommand(10.0f,AssignCommand(oCreature,ActionMoveToObject(oPC,TRUE)));
}
}
}
else if (iRandom == 2) //Populate X Spot
{
lLoc = GetLocation(oBoss);
iX = GetXSpot(sZone);
iSpot = Random(iX)+1;
sTag = sZone + "_X_" + IntToString(iSpot);
lLoc2 = GetLocation(GetObjectByTag(sTag));
iCount = 0;
while (iCount < iNumber)
{
iCount++;
sTag = "en3_" + sCampType + "_" + GetRandomRaceType() + "_1";
oCreature = CreateObject(OBJECT_TYPE_CREATURE,sTag,lLoc);
if (!GetIsObjectValid(oCreature))
WriteTimestampedLogEntry("ERROR: Failed to Create " + sTag + " in CampRandom code.");
iMobLevel = Random(5) - 2 + iLevel;
if (iMobLevel>1)
{
LevelMob(oCreature,iMobLevel-1);
EquipMob(oCreature);
}
DelayCommand(1.0f,AssignCommand(oCreature,ActionMoveToLocation(lLoc2,TRUE)));
DelayCommand(10.0f,AssignCommand(oCreature,ActionMoveToLocation(lLoc2,TRUE)));
}
}
else if (iRandom == 3) //Raid other Camp or Town
{
lLoc = GetLocation(oBoss);
iCamps = GetMaxCampSpots(sZone);
iCount = 0;
iFlag=0;
while (iCount < iCamps && iFlag == 0)
{
iCount++;
sTag = sZone + "_C" + IntToString(iCount) + "_Boss_S";
oCreature = GetObjectByTag(sTag);
if (GetIsEnemy(oBoss,oCreature))
iFlag=1;
}
if (iFlag == 0)
{
sTag = sZone + "_Town";
SetLocalInt(oBoss,"EN4CampAttack",2);
}
else
{
sTag = sZone + "_C" + IntToString(iCount) + "_Boss";
SetLocalInt(oBoss,"EN4CampAttack",1);
}
if (GetIsObjectValid(GetObjectByTag(sTag)))
{
if (sTag == sZone + "_C" + IntToString(iCount) + "_Boss")
{
oWP = GetObjectByTag(sTag);
SetLocalString(oWP,"EN4AttackedBy",GetTag(oBoss));
SetLocalString(oWP,"EN4AttackedByCampType",sCampType);
}
lLoc2 = GetLocation(GetObjectByTag(sTag));
iCount = 0;
while (iCount < iNumber)
{
iCount++;
sTag = "en3_" + sCampType + "_" + GetRandomRaceType() + "_1";
oCreature = CreateObject(OBJECT_TYPE_CREATURE,sTag,lLoc);
iMobLevel = Random(5) - 2 + iLevel;
if (iMobLevel>1)
{
LevelMob(oCreature,iMobLevel-1);
EquipMob(oCreature);
}
DelayCommand(1.0f,AssignCommand(oCreature,ActionMoveToLocation(lLoc2,TRUE)));
DelayCommand(10.0f,AssignCommand(oCreature,ActionMoveToLocation(lLoc2,TRUE)));
}
}
}
}
string GetRandomRaceType()
{
int iRandom;
string sType;
iRandom = Random(10) + 1;
sType = "f";
switch (iRandom)
{
case 1: case 2: case 3: sType = "f"; break; //fighter
case 4: case 5: sType = "r"; break; //rogue
case 6: sType = "m"; break; //mage
case 7: case 8: sType = "c"; break; //cleric
case 9: sType = "s"; break; //special class
case 10: sType = "x"; break; //special creature
}
return sType;
}
void WorldEvent()
{
object oPC;
object oItem;
int iRandom;
string sMessage;
effect eDur;
effect eAttack;
effect eSave;
effect eLink;
effect eShake;
itemproperty ip;
if (GetLocalInt(GetModule(),"MonsterStorm") > 0)
{
oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
SendMessageToPC(oPC,"The chaos in the land subsides and the chill leaves your bones.");
oPC = GetNextPC();
}
}
if (GetLocalInt(GetModule(),"BonusXP") > 0)
{
oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
SendMessageToPC(oPC,"Your head clears and you can no longer think as clearly.");
oPC = GetNextPC();
}
}
if (GetLocalInt(GetModule(),"WildMagic") > 0)
{
oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
SendMessageToPC(oPC,"The current of magic shifts again and becomes calm.");
oPC = GetNextPC();
}
}
SQLocals_SetInt(GetModule(),"MonsterStorm",0);
SQLocals_SetInt(GetModule(),"BonusXP",0);
SQLocals_SetInt(GetModule(),"WildMagic",0);
if (Random(50)==0)
{
iRandom = Random(5)+1;
switch (iRandom)
{
case 1: SQLocals_SetInt(GetModule(),"MonsterStorm",1);
sMessage = "The earth beneath you tremors momentarily and a chill passes through you.";
oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
eShake = EffectVisualEffect(356);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eShake, oPC, RoundsToSeconds(6));
oPC = GetNextPC();
}
break;
case 2: SQLocals_SetInt(GetModule(),"BonusXP",(Random(4)+1) * 25);
sMessage = "A strange wind brushes past you and as you breath in your feel a tingling in your head.";
break;
case 3: oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
eAttack = EffectAttackIncrease(2);
eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, 1, SAVING_THROW_TYPE_FEAR);
eLink = EffectLinkEffects(eAttack, eSave);
eLink = EffectLinkEffects(eLink, eDur);
DelayCommand(1.0f, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 300.0f));
oPC = GetNextPC();
}
sMessage = "A blessing from the heavens fills your being.";
break;
case 4: oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
ip=ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_FIRE,IP_CONST_DAMAGEBONUS_1d6);
oItem = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND,oPC);
IPSafeAddItemProperty(oItem,ip,300.0f);
oPC = GetNextPC();
}
sMessage = "The fires of heaven come alive in your hands.";
break;
case 5: SQLocals_SetInt(GetModule(),"WildMagic",1);
sMessage = "The current of magic shifts and becomes chaotic.";
break;
}
oPC = GetFirstPC();
while (GetIsObjectValid(oPC))
{
SendMessageToPC(oPC,sMessage);
oPC = GetNextPC();
}
}
}