generated from Jaysyn/ModuleTemplate
633 lines
25 KiB
Plaintext
633 lines
25 KiB
Plaintext
//Event based spawn system: if no event preselected fire random event
|
|
|
|
|
|
//configs
|
|
const int AISS_DEBUG_MESSAGES = 0;
|
|
|
|
const int AISS_ENABLE_RANDOM_AREA_EVENTS = 0;//uncompleted feature, do not enable
|
|
|
|
const float fAISS_DELAYED_CLEAN = 60.0;
|
|
//configure loot deletion
|
|
const string LOOT_TAG = "Bodybag";
|
|
//if the loot doesn't destroy automagically, this can handle for you
|
|
const int DESTROY_LOOT_OBJECT = FALSE;
|
|
|
|
//Area events
|
|
//fill area with wandering mobs
|
|
const int AISS_WANDERING_MOB_EVENT = 3001;
|
|
const int AISS_FIXED_MOB_EVENT = 3002;
|
|
const int AISS_RANDOM_PLACED_TRAPS = 3003;
|
|
const int AISS_FIXED_PLACED_TRAPS = 3004;
|
|
const int AISS_RANDOM_PLACEABLES_EVENT = 3005;
|
|
const int AISS_FIXED_PLACEABLES_EVENT = 3006;
|
|
|
|
|
|
|
|
|
|
/*thanks to kesda for writing these two*/
|
|
|
|
void DebugMessage(string message)
|
|
{
|
|
if(AISS_DEBUG_MESSAGES)
|
|
SendMessageToPC(GetFirstPC(),message);
|
|
}
|
|
|
|
int AISS_TranslateEvent(string sEvent)
|
|
{
|
|
if(sEvent=="wandering")
|
|
return AISS_WANDERING_MOB_EVENT;
|
|
else if(sEvent=="fixed")
|
|
return AISS_FIXED_MOB_EVENT;
|
|
else if(sEvent=="rp_traps")
|
|
return AISS_RANDOM_PLACED_TRAPS;
|
|
else if(sEvent=="fp_traps")
|
|
return AISS_FIXED_PLACED_TRAPS;
|
|
else if(sEvent=="rp_plac")
|
|
return AISS_RANDOM_PLACEABLES_EVENT;
|
|
else if(sEvent=="fp_plac")
|
|
return AISS_FIXED_PLACEABLES_EVENT;
|
|
else
|
|
return AISS_WANDERING_MOB_EVENT;
|
|
}
|
|
|
|
int AISS_GetRandomEvent()
|
|
{
|
|
return AISS_WANDERING_MOB_EVENT;
|
|
}
|
|
|
|
location RandomLoc(object oArea=OBJECT_SELF, int bFeedback=FALSE)
|
|
{
|
|
// First, let's get area size
|
|
float fAreaH = IntToFloat(GetAreaSize(AREA_HEIGHT, oArea));
|
|
float fAreaW = IntToFloat(GetAreaSize(AREA_WIDTH, oArea));
|
|
|
|
// Then let's get the maximum allowed area size
|
|
// which we'll be using to calculate the random location
|
|
// using a dice instead of the Random function
|
|
float fMaxAreaSizeH = 32.0;
|
|
float fMaxAreaSizeW = 32.0;
|
|
|
|
// Then let's get the scale of the current area for both dimensions,
|
|
// compared to the max allowed size
|
|
float fScaleAreaH = fMaxAreaSizeH/fAreaH;
|
|
float fScaleAreaW = fMaxAreaSizeW/fAreaW;
|
|
|
|
// Now let's calculate a random location on a virtual 32*32 area.
|
|
// The calculation might seem complex, but it is necessary to ensure that
|
|
// all values between 1 and 320 have the same chance to be returned
|
|
float fXLoc32 = IntToFloat( ((d8()-1)*4 + (d4()-1))*10 + d10() );
|
|
float fYLoc32 = IntToFloat( ((d8()-1)*4 + (d4()-1))*10 + d10() );
|
|
|
|
// Now let's convert the location from the virtual 32*32 area into values that fit
|
|
// inside the current area
|
|
float fXLoc = fXLoc32/fScaleAreaW;
|
|
float fYLoc = fYLoc32/fScaleAreaH;
|
|
|
|
// alright good so far, let's make it a vector..
|
|
vector vPosition = Vector(fXLoc, fYLoc, 0.0f);
|
|
|
|
// Let's get a random orientation between 0 and 359 degrees
|
|
float fOrientation = IntToFloat( ((d6()-1)*6 +(d6()-1))*10 + (d10()-1) );
|
|
|
|
// some feedback for testing purposes. GetFirstPC() will need to be replaced
|
|
// if used in a multiplayer environment
|
|
if (bFeedback)
|
|
{
|
|
DelayCommand(0.1, FloatingTextStringOnCreature("X axis position in the 32*32 virtual area = " + FloatToString(fXLoc32, 5, 2), GetFirstPC()));
|
|
DelayCommand(0.1, FloatingTextStringOnCreature("Y axis position in the 32*32 virtual area = " + FloatToString(fYLoc32, 5, 2), GetFirstPC()));
|
|
DelayCommand(0.3, FloatingTextStringOnCreature("X axis scale compared to the 32*32 virtual area = " + FloatToString(fScaleAreaW, 5, 2), GetFirstPC()));
|
|
DelayCommand(0.3, FloatingTextStringOnCreature("Y axis scale compared to the 32*32 virtual area = " + FloatToString(fScaleAreaH, 5, 2), GetFirstPC()));
|
|
DelayCommand(0.5, FloatingTextStringOnCreature("X axis position in the current area = " + FloatToString(fXLoc, 5, 2), GetFirstPC()));
|
|
DelayCommand(0.5, FloatingTextStringOnCreature("Y axis position in the current area = " + FloatToString(fYLoc, 5, 2), GetFirstPC()));
|
|
DelayCommand(0.7, FloatingTextStringOnCreature("Orientation = " + FloatToString(fOrientation, 5, 2), GetFirstPC()));
|
|
}
|
|
|
|
return Location(oArea, vPosition , fOrientation);
|
|
|
|
}
|
|
|
|
|
|
|
|
//type: acid, acid_splash, electrical, fire, frost, gas, holy,
|
|
// negative, sonic, spike, tangle
|
|
//level: minor,avarage,strong,deadly,epic
|
|
|
|
int AISS_TranslateTraps(string trap_type,string trap_level)
|
|
{
|
|
if(trap_type == "acid")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_ACID;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_ACID;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_ACID;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_ACID;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_ACID;
|
|
}
|
|
else if(trap_type == "acid_splash")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_ACID_SPLASH;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_ACID_SPLASH;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_ACID_SPLASH;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_ACID_SPLASH;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_ACID_SPLASH;
|
|
}
|
|
else if(trap_type == "electrical")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_ELECTRICAL;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_ELECTRICAL;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_ELECTRICAL;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_ELECTRICAL;
|
|
else if (trap_level=="epic")
|
|
return TRAP_BASE_TYPE_EPIC_ELECTRICAL;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_ELECTRICAL;
|
|
}
|
|
else if(trap_type == "fire")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_FIRE;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_FIRE;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_FIRE;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_FIRE;
|
|
else if (trap_level=="epic")
|
|
return TRAP_BASE_TYPE_EPIC_FIRE;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_FIRE;
|
|
}
|
|
else if(trap_type == "frost")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_FROST;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_FROST;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_FROST;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_FROST;
|
|
else if (trap_level=="epic")
|
|
return TRAP_BASE_TYPE_EPIC_FROST;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_FROST;
|
|
}
|
|
else if(trap_type == "gas")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_GAS;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_GAS;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_GAS;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_GAS;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_GAS;
|
|
}
|
|
else if(trap_type == "holy")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_HOLY;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_HOLY;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_HOLY;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_HOLY;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_HOLY;
|
|
}
|
|
else if(trap_type == "negative")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_NEGATIVE;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_NEGATIVE;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_NEGATIVE;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_NEGATIVE;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_NEGATIVE;
|
|
}
|
|
else if(trap_type == "sonic")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_SONIC;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_SONIC;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_SONIC;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_SONIC;
|
|
else if (trap_level=="epic")
|
|
return TRAP_BASE_TYPE_EPIC_SONIC;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_SONIC;
|
|
}
|
|
else if(trap_type == "spike")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_SPIKE;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_SPIKE;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_SPIKE;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_SPIKE;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_SPIKE;
|
|
}
|
|
else if(trap_type == "tangle")
|
|
{
|
|
if(trap_level=="minor")
|
|
return TRAP_BASE_TYPE_MINOR_TANGLE;
|
|
else if (trap_level=="avarage")
|
|
return TRAP_BASE_TYPE_AVERAGE_TANGLE;
|
|
else if (trap_level=="strong")
|
|
return TRAP_BASE_TYPE_STRONG_TANGLE;
|
|
else if (trap_level=="deadly")
|
|
return TRAP_BASE_TYPE_DEADLY_TANGLE;
|
|
else
|
|
return TRAP_BASE_TYPE_MINOR_TANGLE;
|
|
}
|
|
else return TRAP_BASE_TYPE_MINOR_FIRE;
|
|
}
|
|
|
|
|
|
|
|
//sAISS_resref_group_i = blueprint of i-th spawn group
|
|
//iAISS_size_group_i = number of monsters of the i-th blueprint
|
|
//bAISS_randomize = randomize monsters group size, from 1 to ais_number_group_i
|
|
void AISS_WanderingMonsters(object oArea = OBJECT_SELF)
|
|
{
|
|
int i = 1, j = 0;
|
|
int bRandomize = GetLocalInt(oArea,"bAISS_randomize");
|
|
while (GetLocalString(oArea,"sAISS_resref_group_"+IntToString(i))!="")
|
|
i++;
|
|
int iMobGroups = i-1;
|
|
|
|
DebugMessage("AISS_WanderingMonsters: found "+IntToString(iMobGroups)+" mob groups");
|
|
for(i=1;i<=iMobGroups;i++)
|
|
DebugMessage("AISS_WanderingMonsters: Group "+IntToString(i)+" resref: "+
|
|
GetLocalString(oArea,"sAISS_resref_group_"+IntToString(i)) + " size: " +
|
|
IntToString(GetLocalInt(oArea,"iAISS_size_group_"+IntToString(i))));
|
|
|
|
object oSpawn;
|
|
for(i=1;i<=iMobGroups;i++)
|
|
for(j=0;j<(bRandomize>0?Random(GetLocalInt(oArea,"iAISS_size_group_"+IntToString(i)))+1:GetLocalInt(oArea,"iAISS_size_group_"+IntToString(i)));j++)
|
|
{
|
|
oSpawn = CreateObject(OBJECT_TYPE_CREATURE,GetLocalString(oArea,"sAISS_resref_group_"+IntToString(i)),RandomLoc(oArea));
|
|
SetLocalInt(oSpawn,"bAISS_spawned_mob",1);
|
|
AssignCommand(oSpawn,ActionRandomWalk());
|
|
}
|
|
}
|
|
|
|
//sAISS_plac_resref_group_i
|
|
//iAISS_plac_size_group_i
|
|
|
|
void AISS_RandomPlaceables(object oArea = OBJECT_SELF)
|
|
{
|
|
int i = 1, j = 0;
|
|
int bRandomize = GetLocalInt(oArea,"bAISS_randomize");
|
|
while (GetLocalString(oArea,"sAISS_plac_resref_group_"+IntToString(i))!="")
|
|
i++;
|
|
int iPlacGroups = i-1;
|
|
|
|
DebugMessage("AISS_RandomPlaceables: found "+IntToString(iPlacGroups)+" placeables groups");
|
|
for(i=1;i<=iPlacGroups;i++)
|
|
DebugMessage("AISS_RandomPlaceables: Group "+IntToString(i)+" resref: "+
|
|
GetLocalString(oArea,"sAISS_plac_resref_group_"+IntToString(i)) + " size: " +
|
|
IntToString(GetLocalInt(oArea,"iAISS_plac_size_group_"+IntToString(i))));
|
|
|
|
object oPlac;
|
|
for(i=1;i<=iPlacGroups;i++)
|
|
for(j=0;j<(bRandomize>0?Random(GetLocalInt(oArea,"iAISS_plac_size_group_"+IntToString(i)))+1:GetLocalInt(oArea,"iAISS_plac_size_group_"+IntToString(i)));j++)
|
|
{
|
|
oPlac = CreateObject(OBJECT_TYPE_PLACEABLE,GetLocalString(oArea,"sAISS_plac_resref_group_"+IntToString(i)),RandomLoc(oArea));
|
|
SetLocalInt(oPlac,"bAISS_spawned_plac",1);
|
|
}
|
|
}
|
|
|
|
|
|
void AISS_FixedMonsters(object oArea = OBJECT_SELF)
|
|
{
|
|
int i = 1, j = 0;
|
|
int spawns = 0;
|
|
int iMobGroups;
|
|
int bRandomize=0;
|
|
//let's find area waypoints and populate them
|
|
object obj = GetObjectByTag("aiss_spawn_"+GetTag(oArea));
|
|
while (GetIsObjectValid(obj))
|
|
{
|
|
|
|
//iAISS_resref_group_i = i-th blueprint
|
|
//iAISS_size_group_i = i-th blueprint spawns
|
|
|
|
//find spawn composition
|
|
while (GetLocalString(obj,"sAISS_resref_group_"+IntToString(i))!="")
|
|
i++;
|
|
iMobGroups = i-1;
|
|
|
|
|
|
|
|
object oSpawn;
|
|
for(i=1;i<=iMobGroups;i++)
|
|
for(j=0;j<(bRandomize>0?Random(GetLocalInt(obj,"iAISS_size_group_"+IntToString(i)))+1:GetLocalInt(obj,"iAISS_size_group_"+IntToString(i)));j++)
|
|
{
|
|
oSpawn = CreateObject(OBJECT_TYPE_CREATURE,GetLocalString(obj,"sAISS_resref_group_"+IntToString(i)),GetLocation(obj));
|
|
SetLocalInt(oSpawn,"bAISS_spawned_mob",1);
|
|
AssignCommand(oSpawn,ActionRandomWalk());
|
|
}
|
|
//reset conunters
|
|
iMobGroups = 0;
|
|
i=1;
|
|
j=0;
|
|
|
|
obj = GetObjectByTag("aiss_spawn_"+GetTag(oArea),++spawns);
|
|
}
|
|
}
|
|
|
|
//iAISS_plac_resref_group_i = i-th blueprint
|
|
//iAISS_plac_size_group_i = i-th blueprint spawns
|
|
|
|
void AISS_FixedPlaceablesGroup(object oArea = OBJECT_SELF)
|
|
{
|
|
int i = 1, j = 0;
|
|
int plac = 0;
|
|
int iPlacGroups;
|
|
int bRandomize=0;
|
|
//let's find area waypoints and populate them
|
|
object obj = GetObjectByTag("aiss_plac_spawn_"+GetTag(oArea));
|
|
while (GetIsObjectValid(obj))
|
|
{
|
|
DebugMessage("AISS_FixedPlaceablesGroup: found placeable waypoint");
|
|
//find spawn composition
|
|
while (GetLocalString(obj,"sAISS_plac_resref_group_"+IntToString(i))!="")
|
|
i++;
|
|
iPlacGroups = i-1;
|
|
|
|
DebugMessage("AISS_RandomPlaceables: found "+IntToString(iPlacGroups)+" placeables in waypoint");
|
|
|
|
object oSpawn;
|
|
for(i=1;i<=iPlacGroups;i++)
|
|
for(j=0;j<(bRandomize>0?Random(GetLocalInt(obj,"iAISS_plac_size_group_"+IntToString(i)))+1:GetLocalInt(obj,"iAISS_plac_size_group_"+IntToString(i)));j++)
|
|
{
|
|
oSpawn = CreateObject(OBJECT_TYPE_PLACEABLE,GetLocalString(obj,"sAISS_plac_resref_group_"+IntToString(i)),GetLocation(obj));
|
|
SetLocalInt(oSpawn,"bAISS_spawned_plac",1);
|
|
}
|
|
//reset conunters
|
|
iPlacGroups = 0;
|
|
i=1;
|
|
j=0;
|
|
|
|
obj = GetObjectByTag("aiss_plac_spawn_"+GetTag(oArea),++plac);
|
|
}
|
|
}
|
|
|
|
|
|
//sAISS_trap_group_type_i: i-th trap type, and type is one of those specified by TranslateTraps
|
|
//sAISS_trap_group_level_i: i-th trap level, and level is one of those specified by TranslateTraps
|
|
//iAISS_trap_group_size_i: how many traps of i-th resref to place
|
|
//fAISS_trap_group_covered_area_i: how large is trap area of effect
|
|
//bAISS_trap_group_not_detectable_i: 1 if trap group is not detectable, default 0;
|
|
//iAISS_trap_group_detect_dc_i: if detectable, set detect DC, if 0 default trap DC will be used
|
|
//bAISS_trap_group_not_disarmable_i: 1 if trap group is not disarmable, default 0;
|
|
//bAISS_trap_group_disarm_dc_i: if disarmable, set disarm DC, if 0 default trap DC will be used
|
|
//sAISS_trap_group_keytag_i: if set, key with this tag will disarm i-th trap group
|
|
//bAISS_trap_group_not_recoverable_i: if set to 1, i-th group trap will not be recoverable
|
|
//sAISS_trap_group_disarm_i: script to be associated onDisarm to i-th trap group
|
|
//sAISS_trap_group_triggered_i: script to be associated onTrapTriggered to i-th trap group
|
|
|
|
void AISS_RandomPlacedTraps(object oArea = OBJECT_SELF)
|
|
{
|
|
int i = 1, j = 0;
|
|
int bRandomize = GetLocalInt(oArea,"bAISS_randomize");
|
|
while (GetLocalString(oArea,"sAISS_trap_group_type_"+IntToString(i))!="")
|
|
i++;
|
|
int iTrapGroups = i-1;
|
|
|
|
DebugMessage("AISS_RandomPlacedTraps: found "+IntToString(iTrapGroups)+" trap groups");
|
|
|
|
object oTrap;
|
|
int iTrapCostant;
|
|
for(i=1;i<=iTrapGroups;i++)
|
|
{
|
|
iTrapCostant = AISS_TranslateTraps(
|
|
GetLocalString(oArea,"sAISS_trap_group_type_"+IntToString(i)),
|
|
GetLocalString(oArea,"sAISS_trap_group_level_"+IntToString(i)));
|
|
|
|
for(j=0;j<(bRandomize>0?Random(GetLocalInt(oArea,"iAISS_trap_group_size_"+IntToString(i)))+1:GetLocalInt(oArea,"iAISS_trap_group_size_"+IntToString(i)));j++)
|
|
{
|
|
DebugMessage("AISS_RandomPlacedTraps: placing "+
|
|
GetLocalString(oArea,"sAISS_trap_group_type_"+IntToString(i))+" "+
|
|
GetLocalString(oArea,"sAISS_trap_group_level_"+IntToString(i))+"trap.");
|
|
oTrap = CreateTrapAtLocation(iTrapCostant,
|
|
RandomLoc(oArea), //where
|
|
IntToFloat(Random(5)+1), //physical_size
|
|
"ais_rp_trap"+IntToString(i), //tag
|
|
STANDARD_FACTION_HOSTILE, //faction
|
|
GetLocalString(oArea,"sAISS_trap_group_disarm_"+IntToString(i)),
|
|
GetLocalString(oArea,"sAISS_trap_group_triggered_"+IntToString(i)));
|
|
SetTrapActive(oTrap);
|
|
if(GetLocalInt(oArea,"bAISS_trap_group_not_detectable_"+IntToString(i))>0)
|
|
SetTrapDetectable(oTrap,FALSE);
|
|
if(GetTrapDetectable(oTrap)&&GetLocalInt(oArea,"iAISS_trap_group_detect_dc_"+IntToString(i))>0)
|
|
SetTrapDetectDC(oTrap,GetLocalInt(oArea,"iAISS_trap_group_detect_dc_"+IntToString(i)));
|
|
if(GetLocalInt(oArea,"bAISS_trap_group_not_disarmable_"+IntToString(i))>0)
|
|
SetTrapDisarmable(oTrap,FALSE);
|
|
if(GetTrapDisarmable(oTrap)&&GetLocalInt(oArea,"iAISS_trap_group_disarm_dc_"+IntToString(i))>0)
|
|
SetTrapDisarmDC(oTrap,GetLocalInt(oArea,"iAISS_trap_group_disarm_dc_"+IntToString(i)));
|
|
if(GetLocalString(oArea,"sAISS_trap_group_keytag_"+IntToString(i))!="")
|
|
SetTrapKeyTag(oTrap,GetLocalString(oArea,"sAISS_trap_group_keytag_"+IntToString(i)));
|
|
if(GetLocalInt(oArea,"bAISS_trap_group_not_recoverable_"+IntToString(i))>0)
|
|
SetTrapRecoverable(oTrap,FALSE);
|
|
SetLocalInt(oTrap,"bAISS_spawned_trap",1);
|
|
}
|
|
}
|
|
}
|
|
|
|
//sAISS_trap_type: i-th trap type, and type is one of those specified by TranslateTraps
|
|
//sAISS_trap_level: i-th trap level, and level is one of those specified by TranslateTraps
|
|
//fAISS_trap_covered_area: how large is trap area of effect, min 1.0
|
|
//bAISS_trap_not_detectable: 1 if trap is not detectable, default 0;
|
|
//iAISS_trap_detect_dc: if detectable, set detect DC, if 0 default trap DC will be used
|
|
//bAISS_trap_not_disarmable: 1 if trap is not disarmable, default 0;
|
|
//bAISS_trap_disarm_dc: if disarmable, set disarm DC, if 0 default trap DC will be used
|
|
//sAISS_trap_keytag: if set, key with this tag will disarm i-th trap
|
|
//bAISS_trap_not_recoverable: if set to 1, i-th group trap will not be recoverable
|
|
//sAISS_trap_disarm: script to be associated onDisarm to i-th trap
|
|
//sAISS_trap_triggered: script to be associated onTrapTriggered to i-th trap group
|
|
|
|
void AISS_FixedPlacedTraps(object oArea = OBJECT_SELF)
|
|
{
|
|
int i = 1;
|
|
int traps = 0;
|
|
int bRandomize=0;
|
|
//let's find area waypoints and populate them
|
|
|
|
object oTrap;
|
|
int iTrapCostant;
|
|
|
|
object obj = GetObjectByTag("aiss_trap_spawn_"+GetTag(oArea));
|
|
while (GetIsObjectValid(obj))
|
|
{
|
|
iTrapCostant = AISS_TranslateTraps(
|
|
GetLocalString(obj,"sAISS_trap_type"),
|
|
GetLocalString(obj,"sAISS_trap_level"));
|
|
|
|
oTrap = CreateTrapAtLocation(iTrapCostant,
|
|
GetLocation(obj), //where
|
|
GetLocalFloat(obj,"fAISS_trap_covered_area")>1.0?GetLocalFloat(obj,"fAISS_trap_covered_area"):1.0, //physical_size
|
|
"ais_fp_trap"+IntToString(traps), //tag
|
|
STANDARD_FACTION_HOSTILE, //faction
|
|
GetLocalString(oArea,"sAISS_trap_disarm_"+IntToString(i)),
|
|
GetLocalString(oArea,"sAISS_trap_triggered"));
|
|
SetTrapActive(oTrap);
|
|
if(GetLocalInt(obj,"bAISS_trap_not_detectable")>0)
|
|
SetTrapDetectable(oTrap,FALSE);
|
|
if(GetTrapDetectable(oTrap)&&GetLocalInt(obj,"iAISS_trap_detect_dc_"+IntToString(i))>0)
|
|
SetTrapDetectDC(oTrap,GetLocalInt(obj,"iAISS_trap_detect_dc_"+IntToString(i)));
|
|
if(GetLocalInt(obj,"bAISS_trap_not_disarmable_"+IntToString(i))>0)
|
|
SetTrapDisarmable(oTrap,FALSE);
|
|
if(GetTrapDisarmable(oTrap)&&GetLocalInt(obj,"iAISS_trap_disarm_dc")>0)
|
|
SetTrapDisarmDC(oTrap,GetLocalInt(obj,"iAISS_trap_disarm_dc"));
|
|
if(GetLocalString(obj,"sAISS_trap_keytag")!="")
|
|
SetTrapKeyTag(oTrap,GetLocalString(obj,"sAISS_trap_keytag"));
|
|
if(GetLocalInt(obj,"bAISS_trap_not_recoverable")>0)
|
|
SetTrapRecoverable(oTrap,FALSE);
|
|
SetLocalInt(oTrap,"bAISS_spawned_trap",1);
|
|
|
|
obj = GetObjectByTag("aiss_trap_spawn_"+GetTag(oArea),++traps);
|
|
}
|
|
}
|
|
|
|
void AISS_HandleAreaEvents(object oArea = OBJECT_SELF)
|
|
{
|
|
switch (GetUserDefinedEventNumber())
|
|
{
|
|
case AISS_WANDERING_MOB_EVENT:
|
|
AISS_WanderingMonsters(oArea);
|
|
break;
|
|
case AISS_FIXED_MOB_EVENT:
|
|
AISS_FixedMonsters(oArea);
|
|
break;
|
|
case AISS_RANDOM_PLACED_TRAPS:
|
|
AISS_RandomPlacedTraps(oArea);
|
|
break;
|
|
case AISS_FIXED_PLACED_TRAPS:
|
|
AISS_FixedPlacedTraps(oArea);
|
|
break;
|
|
case AISS_RANDOM_PLACEABLES_EVENT:
|
|
AISS_RandomPlaceables(oArea);
|
|
break;
|
|
case AISS_FIXED_PLACEABLES_EVENT:
|
|
AISS_FixedPlaceablesGroup(oArea);
|
|
break;
|
|
}
|
|
}
|
|
|
|
int AISSS_GetAreaCurrentPlayersNumber(object oArea)
|
|
{
|
|
return GetLocalInt(oArea,"iAISS_PCs_onarea");
|
|
}
|
|
|
|
void AISSS_ClearArea(object oArea = OBJECT_SELF)
|
|
{
|
|
//how to clean up everything ;-)
|
|
DebugMessage("AISSS_ClearArea launched!");
|
|
int i = 1, j = 0;
|
|
|
|
//no clean way to avoid, must cycle through all area objects
|
|
object oObj = GetFirstObjectInArea(oArea);
|
|
object oLootItem;
|
|
while (GetIsObjectValid(oObj))
|
|
{
|
|
if(GetLocalInt(oObj,"bAISS_spawned_mob") ||
|
|
GetLocalInt(oObj,"bAISS_spawned_trap") ||
|
|
GetLocalInt(oObj,"bAISS_spawned_plac"))
|
|
DestroyObject(oObj);
|
|
//NOTE: the loot tag should be different from creature tag!
|
|
else if(GetTag(oObj)== LOOT_TAG)
|
|
{
|
|
oLootItem = GetFirstItemInInventory(oObj);
|
|
while (GetIsObjectValid(oLootItem))
|
|
{
|
|
//safedestroy
|
|
DestroyObject(oLootItem);
|
|
oLootItem = GetNextItemInInventory();
|
|
}
|
|
|
|
//all inventory destroyed, destroy oLoot if required
|
|
if(DESTROY_LOOT_OBJECT)
|
|
DestroyObject(oObj);
|
|
}
|
|
//Here can be added nice things, like deleting items dropped on ground
|
|
//by PGs
|
|
|
|
oObj = GetNextObjectInArea(oArea);
|
|
}
|
|
SetLocalInt(OBJECT_SELF,"iAISS_area_inited",0);
|
|
DebugMessage("AISSS_ClearArea: area reset successfully!");
|
|
}
|
|
|
|
void AISSS_CheckClearArea(object oArea = OBJECT_SELF)
|
|
{
|
|
if(GetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea")==0 && GetLocalInt(OBJECT_SELF,"bAISS_delayed_clean") && GetLocalInt(OBJECT_SELF,"iAISS_area_inited"))
|
|
AISSS_ClearArea();
|
|
}
|
|
|
|
void AISSS_OnAreaEnter(){
|
|
object oPC=GetEnteringObject();
|
|
if(GetIsPC(oPC)){
|
|
SetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea",1 + GetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea"));
|
|
SetLocalInt(OBJECT_SELF,"bAISS_delayed_clean",0);
|
|
if(GetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea")==1 && GetLocalInt(OBJECT_SELF,"iAISS_area_inited")==0){
|
|
SetLocalInt(OBJECT_SELF,"iAISS_area_inited",1);
|
|
if(GetLocalInt(OBJECT_SELF,"iAISS_selectedEvent")>0)
|
|
{
|
|
int i=1;
|
|
for(i;i<=GetLocalInt(OBJECT_SELF,"iAISS_selectedEvent");i++)
|
|
SignalEvent(OBJECT_SELF, EventUserDefined(AISS_TranslateEvent(GetLocalString(OBJECT_SELF,"sAISS_selectedEvent_"+IntToString(i)))));
|
|
}
|
|
else if(AISS_ENABLE_RANDOM_AREA_EVENTS)
|
|
SignalEvent(OBJECT_SELF, EventUserDefined(AISS_GetRandomEvent()));
|
|
else
|
|
SignalEvent(OBJECT_SELF, EventUserDefined(AISS_WANDERING_MOB_EVENT));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void AISSS_OnAreaExit(){
|
|
object oPC=GetExitingObject();
|
|
if(GetIsPC(oPC)){
|
|
SetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea",-1+GetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea"));
|
|
}
|
|
if(GetLocalInt(OBJECT_SELF,"iAISS_PCs_onarea")==0)
|
|
{
|
|
if(!GetLocalInt(OBJECT_SELF,"bAISS_delayed_clean"))
|
|
{
|
|
SetLocalInt(OBJECT_SELF,"bAISS_delayed_clean",1);
|
|
DelayCommand(fAISS_DELAYED_CLEAN,AISSS_CheckClearArea());
|
|
}
|
|
}
|
|
}
|
|
|
|
//void main() {}
|
|
|