Post by davidb on Oct 14, 2008 16:20:53 GMT -5
Here is what I have been working in.
Around 50% is mine, the rest is shameless Ctrl+C/Ctrl+V.
It can still be expanded, trap size can be randomized, and not limiting traps to floor, but on objects too.
--------------------------------------------------------
//TRAP RESET SCRIPT
//Script derivated from many others in the web, then modified by DavidB.
//The basic idea here is, you place WPs in the zone
//with the requirements below, then play with the constants to gauge difficulty,
//and call the function ResetAllTrapsinZone() from heartbeat or from
//user defined event.
const string TRAPPED_AREA_TAG = "AREA1";
//the object reference is any object (preferably non-trigger) which will
//be used to obtain the waypoits where the traps will be spawned. The
//reference object should be WITHIN the area with the trap waypoints but
//should NOT be a trap waypoint itself.
const string AREA_OBJECT_REFERENCE = "ITEM1";
//the trap suffix must be consistent with the actual waypoints being
//used in the specified area. The trap waypoint tags should be as follows:
//"wp_(area tag)_(TRAP_SUFFIX)"
const string TRAP_SUFFIX = "TRAP";
//these constants set the DEFAULT settings of all the floor traps. Trap
//parameters can be overriden, however with the following local variables
//being set on specific trap waypoints:
//Integer "TrapType" = TRAP_TYPE
//Float "TrapSize" = TRAP_SIZE
//String "DisarmScript" = TRAP_DISARM_SCRIPT
//String "TriggeredScript" = TRAP_TRIGGER_SCRIPT
const float TRAP_SIZE = 2.0;
const string TRAP_DISARM_SCRIPT = "";
const string TRAP_TRIGGER_SCRIPT = "";
const int TRAP_CHANCE =50;
//Chance of each trap actually being generated. If you want every trap to be always placed on each WP,
//set to 100. If you want more random location traps, place more WPs in the area, and reduce the chance
//of traps respawned by lowering TRAP_CHANCE.
const int MINIMUM_DC_DISARM = 32;
const int MINIMUM_DC_DETECT = 14;
//The traps will have a disarm DC equal to MINIMUM_DC_DISARM + 1d10
//The traps will have a detect DC equal to MINIMUM_DC_DETECT + 1d6
const int INCLUDE_MINOR_TRAPS = FALSE;
const int INCLUDE_AVERAGE_TRAPS = TRUE;
const int INCLUDE_STRONG_TRAPS = TRUE;
const int INCLUDE_DEADLY_TRAPS = TRUE;
const int INCLUDE_EPIC_TRAPS = FALSE;
//Set to true or false to gauge the potency of your randomly generated traps in the area
int RandomTrapType()
{
//First let's determine the trap potency
int iTrapPotency = 0;
int iTrap;
int iRandom;
while (iTrapPotency == 0)
{
iRandom = Random(5)+1;
if ((iRandom == 1)&&(INCLUDE_MINOR_TRAPS)) iTrapPotency = 1;
if ((iRandom == 2)&&(INCLUDE_AVERAGE_TRAPS)) iTrapPotency = 2;
if ((iRandom == 3)&&(INCLUDE_STRONG_TRAPS)) iTrapPotency = 3;
if ((iRandom == 4)&&(INCLUDE_DEADLY_TRAPS)) iTrapPotency = 4;
if ((iRandom == 5)&&(INCLUDE_EPIC_TRAPS)) iTrapPotency = 5;
}
// Now that iTrapPotency is decided, let's find the actual trap Type.
if (iTrapPotency == 1)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_MINOR_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_MINOR_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_MINOR_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_MINOR_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_MINOR_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_MINOR_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_MINOR_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_MINOR_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_MINOR_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_MINOR_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_MINOR_TANGLE; break;
}
}
if (iTrapPotency == 2)
{iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_AVERAGE_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_AVERAGE_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_AVERAGE_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_AVERAGE_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_AVERAGE_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_AVERAGE_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_AVERAGE_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_AVERAGE_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_AVERAGE_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_AVERAGE_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_AVERAGE_TANGLE; break;
}
}
if (iTrapPotency == 3)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_STRONG_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_STRONG_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_STRONG_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_STRONG_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_STRONG_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_STRONG_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_STRONG_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_STRONG_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_STRONG_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_STRONG_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_STRONG_TANGLE; break;
}
}
if (iTrapPotency == 4)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_DEADLY_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_DEADLY_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_DEADLY_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_DEADLY_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_DEADLY_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_DEADLY_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_DEADLY_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_DEADLY_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_DEADLY_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_DEADLY_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_DEADLY_TANGLE; break;
}
}
if (iTrapPotency == 5)
{
iRandom = Random (4);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_EPIC_ELECTRICAL; break;
case 1 : iTrap = TRAP_BASE_TYPE_EPIC_FIRE; break;
case 2 : iTrap = TRAP_BASE_TYPE_EPIC_FROST; break;
case 3 : iTrap = TRAP_BASE_TYPE_EPIC_SONIC; break;
}
}
return iTrap;
return iTrap;
}
void CreateTrapAtWaypoint(int nTrapType, object oWaypoint, float fSize=2.0f, string sTag="", string sOnDisarmScript="", string sOnTrapTriggeredScript="")
{
//checking if the WP has been given specific trap details. If so, they are set.
if ( GetLocalInt(oWaypoint, "TrapType") > 0 ) nTrapType = GetLocalInt(oWaypoint, "TrapType");
if ( GetLocalFloat(oWaypoint, "TrapSize") > 0.0 ) fSize = GetLocalFloat(oWaypoint, "TrapSize");
if ( GetLocalString(oWaypoint, "DisarmScript") != "" ) sOnDisarmScript = GetLocalString(oWaypoint, "DisarmScript");
if ( GetLocalString(oWaypoint, "TriggeredScript") != "" ) sOnTrapTriggeredScript = GetLocalString(oWaypoint, "TriggeredScript");
object oCreatedTrap = CreateTrapAtLocation(nTrapType, GetLocation(oWaypoint), fSize, sTag, STANDARD_FACTION_HOSTILE, sOnDisarmScript, sOnTrapTriggeredScript);
SetTrapOneShot(oCreatedTrap,FALSE); //This makes traps stay after they fire... feel free to modify.
SetTrapDisarmDC(oCreatedTrap, MINIMUM_DC_DISARM+Random(10)+1);
SetTrapDetectDC(oCreatedTrap, MINIMUM_DC_DETECT+Random(6)+1);
}
void ResetAllTrapsinZone()
{
object oReference = GetObjectByTag(AREA_OBJECT_REFERENCE);
int iCounter;
//All existing traps are destroyed
object oTrap = GetNearestObjectByTag(TRAPPED_AREA_TAG + "_" +TRAP_SUFFIX, oReference, ++iCounter);
while ( GetIsObjectValid(oTrap) )
{
DestroyObject(oTrap);
oTrap = GetNearestObjectByTag(TRAPPED_AREA_TAG + "_" + TRAP_SUFFIX, oReference, ++iCounter);
}
//Now we respawn them
iCounter = 0;
object oWPTrap = GetNearestObjectByTag("WP_" + TRAPPED_AREA_TAG + "_" + TRAP_SUFFIX, oReference, ++iCounter);
while ( GetIsObjectValid(oWPTrap) )
{
if (Random(100)<TRAP_CHANCE) //Checking the chance of trap being there
CreateTrapAtWaypoint(RandomTrapType(), oWPTrap, TRAP_SIZE, TRAPPED_AREA_TAG + "_" +TRAP_SUFFIX, TRAP_DISARM_SCRIPT, TRAP_TRIGGER_SCRIPT);
oWPTrap = GetNearestObjectByTag("WP_" +TRAPPED_AREA_TAG+ "_" + TRAP_SUFFIX, oReference, ++iCounter);
}
}
Around 50% is mine, the rest is shameless Ctrl+C/Ctrl+V.
It can still be expanded, trap size can be randomized, and not limiting traps to floor, but on objects too.
--------------------------------------------------------
//TRAP RESET SCRIPT
//Script derivated from many others in the web, then modified by DavidB.
//The basic idea here is, you place WPs in the zone
//with the requirements below, then play with the constants to gauge difficulty,
//and call the function ResetAllTrapsinZone() from heartbeat or from
//user defined event.
const string TRAPPED_AREA_TAG = "AREA1";
//the object reference is any object (preferably non-trigger) which will
//be used to obtain the waypoits where the traps will be spawned. The
//reference object should be WITHIN the area with the trap waypoints but
//should NOT be a trap waypoint itself.
const string AREA_OBJECT_REFERENCE = "ITEM1";
//the trap suffix must be consistent with the actual waypoints being
//used in the specified area. The trap waypoint tags should be as follows:
//"wp_(area tag)_(TRAP_SUFFIX)"
const string TRAP_SUFFIX = "TRAP";
//these constants set the DEFAULT settings of all the floor traps. Trap
//parameters can be overriden, however with the following local variables
//being set on specific trap waypoints:
//Integer "TrapType" = TRAP_TYPE
//Float "TrapSize" = TRAP_SIZE
//String "DisarmScript" = TRAP_DISARM_SCRIPT
//String "TriggeredScript" = TRAP_TRIGGER_SCRIPT
const float TRAP_SIZE = 2.0;
const string TRAP_DISARM_SCRIPT = "";
const string TRAP_TRIGGER_SCRIPT = "";
const int TRAP_CHANCE =50;
//Chance of each trap actually being generated. If you want every trap to be always placed on each WP,
//set to 100. If you want more random location traps, place more WPs in the area, and reduce the chance
//of traps respawned by lowering TRAP_CHANCE.
const int MINIMUM_DC_DISARM = 32;
const int MINIMUM_DC_DETECT = 14;
//The traps will have a disarm DC equal to MINIMUM_DC_DISARM + 1d10
//The traps will have a detect DC equal to MINIMUM_DC_DETECT + 1d6
const int INCLUDE_MINOR_TRAPS = FALSE;
const int INCLUDE_AVERAGE_TRAPS = TRUE;
const int INCLUDE_STRONG_TRAPS = TRUE;
const int INCLUDE_DEADLY_TRAPS = TRUE;
const int INCLUDE_EPIC_TRAPS = FALSE;
//Set to true or false to gauge the potency of your randomly generated traps in the area
int RandomTrapType()
{
//First let's determine the trap potency
int iTrapPotency = 0;
int iTrap;
int iRandom;
while (iTrapPotency == 0)
{
iRandom = Random(5)+1;
if ((iRandom == 1)&&(INCLUDE_MINOR_TRAPS)) iTrapPotency = 1;
if ((iRandom == 2)&&(INCLUDE_AVERAGE_TRAPS)) iTrapPotency = 2;
if ((iRandom == 3)&&(INCLUDE_STRONG_TRAPS)) iTrapPotency = 3;
if ((iRandom == 4)&&(INCLUDE_DEADLY_TRAPS)) iTrapPotency = 4;
if ((iRandom == 5)&&(INCLUDE_EPIC_TRAPS)) iTrapPotency = 5;
}
// Now that iTrapPotency is decided, let's find the actual trap Type.
if (iTrapPotency == 1)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_MINOR_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_MINOR_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_MINOR_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_MINOR_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_MINOR_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_MINOR_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_MINOR_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_MINOR_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_MINOR_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_MINOR_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_MINOR_TANGLE; break;
}
}
if (iTrapPotency == 2)
{iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_AVERAGE_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_AVERAGE_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_AVERAGE_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_AVERAGE_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_AVERAGE_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_AVERAGE_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_AVERAGE_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_AVERAGE_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_AVERAGE_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_AVERAGE_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_AVERAGE_TANGLE; break;
}
}
if (iTrapPotency == 3)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_STRONG_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_STRONG_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_STRONG_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_STRONG_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_STRONG_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_STRONG_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_STRONG_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_STRONG_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_STRONG_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_STRONG_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_STRONG_TANGLE; break;
}
}
if (iTrapPotency == 4)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_DEADLY_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_DEADLY_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_DEADLY_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_DEADLY_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_DEADLY_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_DEADLY_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_DEADLY_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_DEADLY_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_DEADLY_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_DEADLY_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_DEADLY_TANGLE; break;
}
}
if (iTrapPotency == 5)
{
iRandom = Random (4);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_EPIC_ELECTRICAL; break;
case 1 : iTrap = TRAP_BASE_TYPE_EPIC_FIRE; break;
case 2 : iTrap = TRAP_BASE_TYPE_EPIC_FROST; break;
case 3 : iTrap = TRAP_BASE_TYPE_EPIC_SONIC; break;
}
}
return iTrap;
return iTrap;
}
void CreateTrapAtWaypoint(int nTrapType, object oWaypoint, float fSize=2.0f, string sTag="", string sOnDisarmScript="", string sOnTrapTriggeredScript="")
{
//checking if the WP has been given specific trap details. If so, they are set.
if ( GetLocalInt(oWaypoint, "TrapType") > 0 ) nTrapType = GetLocalInt(oWaypoint, "TrapType");
if ( GetLocalFloat(oWaypoint, "TrapSize") > 0.0 ) fSize = GetLocalFloat(oWaypoint, "TrapSize");
if ( GetLocalString(oWaypoint, "DisarmScript") != "" ) sOnDisarmScript = GetLocalString(oWaypoint, "DisarmScript");
if ( GetLocalString(oWaypoint, "TriggeredScript") != "" ) sOnTrapTriggeredScript = GetLocalString(oWaypoint, "TriggeredScript");
object oCreatedTrap = CreateTrapAtLocation(nTrapType, GetLocation(oWaypoint), fSize, sTag, STANDARD_FACTION_HOSTILE, sOnDisarmScript, sOnTrapTriggeredScript);
SetTrapOneShot(oCreatedTrap,FALSE); //This makes traps stay after they fire... feel free to modify.
SetTrapDisarmDC(oCreatedTrap, MINIMUM_DC_DISARM+Random(10)+1);
SetTrapDetectDC(oCreatedTrap, MINIMUM_DC_DETECT+Random(6)+1);
}
void ResetAllTrapsinZone()
{
object oReference = GetObjectByTag(AREA_OBJECT_REFERENCE);
int iCounter;
//All existing traps are destroyed
object oTrap = GetNearestObjectByTag(TRAPPED_AREA_TAG + "_" +TRAP_SUFFIX, oReference, ++iCounter);
while ( GetIsObjectValid(oTrap) )
{
DestroyObject(oTrap);
oTrap = GetNearestObjectByTag(TRAPPED_AREA_TAG + "_" + TRAP_SUFFIX, oReference, ++iCounter);
}
//Now we respawn them
iCounter = 0;
object oWPTrap = GetNearestObjectByTag("WP_" + TRAPPED_AREA_TAG + "_" + TRAP_SUFFIX, oReference, ++iCounter);
while ( GetIsObjectValid(oWPTrap) )
{
if (Random(100)<TRAP_CHANCE) //Checking the chance of trap being there
CreateTrapAtWaypoint(RandomTrapType(), oWPTrap, TRAP_SIZE, TRAPPED_AREA_TAG + "_" +TRAP_SUFFIX, TRAP_DISARM_SCRIPT, TRAP_TRIGGER_SCRIPT);
oWPTrap = GetNearestObjectByTag("WP_" +TRAPPED_AREA_TAG+ "_" + TRAP_SUFFIX, oReference, ++iCounter);
}
}