Demon Teleporters & Bouncepads (Legacy)
See the Following Page Before Proceeding
Information
Not all single player maps contain Invasion entities, you may need to pull resources from a map that does via AssetsInfo.
- Demon Players are not as nimble as the Slayer, but have greater jump heights. They cannot grab onto climbable walls, use idTrigger_GorillaBar monkey bars, or use idTrigger_Bounce jump pads by default.
- Demon Players are also considerably larger than the Slayer. Their clipmodel determines their hitbox radius. Some single player maps have narrow corridors that Demon Players may struggle to fit through, if at all.
- Demon teleporters or bouncepads may be needed to help the Demon Player traverse through the map.
Teleporters
Timeline
This applies the cooldown for two-way teleporters so they cannot be abused.
- There must be 1 idTarget_Timeline entity for each two-way teleporter.
- There must be 2 entities for the remaining entity types on each side of the teleporter.
(idDynamicEntity, idEntityFx (for both teams), idTrigger_Teleporter, idInfo_TeleportDestination)
entity {
layers {
"game/pvp/demon_team" // Applies only to Demon Players
}
entityDef invasion_portal_timeline_1 {
inherit = "target/timeline";
class = "idTarget_Timeline";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false; // Must be false so cooldown is not shared globally
disableAIPooling = false;
edit = {
flags = {
noFlood = true;
}
networkSerializeTransforms = false;
spawnPosition = {
x = 1;
y = 1;
z = 1;
}
componentTimeLine = {
entityEvents = {
num = 2;
item[0] = {
entity = "invasion_portal_fx_demon_1";
events = {
num = 2;
item[0] = {
eventCall = {
eventDef = "hide"; // Hide 1st effect upon activation
args = {
num = 0;
}
}
}
item[1] = {
eventTime = 5000;
eventCall = {
eventDef = "show"; // Show 1st effect after 5 seconds
args = {
num = 0;
}
}
}
}
}
item[1] = {
entity = "invasion_portal_fx_demon_2";
events = {
num = 2;
item[0] = {
eventCall = {
eventDef = "hide"; // Hide 2nd effect upon activation
args = {
num = 0;
}
}
}
item[1] = {
eventTime = 5000;
eventCall = {
eventDef = "show"; // Show 2nd effect after 5 seconds
args = {
num = 0;
}
}
}
}
}
}
}
allowClientsToStart = true; // Must be true
shouldForceTimelineFinish = true; // Must be true
}
}
}
Dynamic Entity (Backer)
This entity adds collision for the teleporter and reveals the position of the teleporter even when on cooldown.
entity {
entityDef invasion_portal_back_1 {
inherit = "func/dynamic";
class = "idDynamicEntity";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
spawnPosition = { // Set the spawn position roughly -0.2 (on the x or y axis) behind the portal FX
x = -11.11;
y = -11.11;
z = -11.11;
}
spawnOrientation = { // Backer should be standing upright
mat = {
mat[0] = {
x = 0;
y = 0;
z = -1;
}
mat[1] = {
x = -1;
y = 0;
z = 0;
}
mat[2] = {
x = 0;
y = 1;
z = 0;
}
}
}
renderModelInfo = {
model = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo";
scale = { // Do not change the scale, it will break collision
x = 0.66;
y = 0.66;
z = 0.5;
}
}
clipModelInfo = {
clipModelName = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo"; // Adds collision
}
}
}
}
Portal FX (Slayer Team)
entity {
layers {
"game/pvp/slayer_team" // Only the Slayer can see this FX
}
entityDef invasion_portal_fx_slayer_1 {
inherit = "func/fx";
class = "idEntityFx";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
canBecomeDormant = true;
}
dormancy = {
delay = 5;
distance = 78.029007;
}
spawnPosition = { // Position should be identical to the FX on the demon team
x = -11.11;
y = -11.11;
z = -11.11;
}
spawnOrientation = { // Orientation should be identical to the FX on the demon team
mat = {
mat[0] = {
x = 0;
y = 1;
z = 0;
}
mat[1] = {
x = -1;
y = 0;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
renderModelInfo = {
scale = {
x = 1;
y = 1;
z = 1;
}
}
flags = {
hide = false;
}
fxEffect = "gameplay/invasion/teleporter_flat_demon"; // FX is red
}
}
}
Portal FX (Demon Team)
entity {
layers {
"game/pvp/demon_team" // Only Demon Players can see this FX
}
entityDef invasion_portal_fx_demon_1 {
inherit = "func/fx";
class = "idEntityFx";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
canBecomeDormant = true;
}
dormancy = {
delay = 5;
distance = 78.029007;
}
spawnPosition = { // Position should be identical to the FX on the slayer team
x = -11.11;
y = -11.11;
z = -11.11;
}
spawnOrientation = { // Orientation should be identical to the FX on the slayer team
mat = {
mat[0] = {
x = 0;
y = 1;
z = 0;
}
mat[1] = {
x = -1;
y = 0;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
renderModelInfo = {
scale = {
x = 1;
y = 1;
z = 1;
}
}
flags = {
hide = false;
}
fxEffect = "gameplay/invasion/teleporter_flat_slayer"; // FX is blue
}
}
}
Teleporter
entity {
layers {
"game/pvp/demon_team" // Only demon players can use the teleporter
}
entityDef invasion_portal_from_1 {
inherit = "trigger/teleporter";
class = "idTrigger_Teleporter";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false; // Must be false so cooldown is not shared globally
disableAIPooling = false;
edit = {
clientCanActivate = true; // Must be true
fxExtraCondition = "FX_EXTRA_COND_MAX";
sounds = {
activated = "play_arena_teleporter_use";
}
spawnPosition = { // Position should be close to the idDynamicEntity backer
x = -11.11;
y = -11.11;
z = -11.11;
}
renderModelInfo = {
model = NULL;
}
clipModelInfo = {
type = "CLIPMODEL_CYLINDER";
size = { // Scale based on portal size
x = 1;
y = 3;
z = 2;
}
clipModelName = NULL;
}
targets = {
num = 1;
item[0] = "invasion_portal_timeline_1"; // Activate the timeline to show and hide FX
}
dormancy = {
playerDistance = 6;
playerRearwardDistance = 6;
}
flags = {
hide = false;
}
wait = 5; // Deactivate both teleporters for 5 seconds
playerCanActivate = false; // Slayer cannot activate
demonPlayerCanActivate = true; // Demon players can activate
otherTeleporter = "invasion_portal_from_2"; // Deactivate this teleporter
destination = "invasion_portal_dest_1"; // Go to this destination when activated
}
}
}
Destination
entity {
entityDef invasion_portal_dest_1 {
inherit = "info/teleport_destination";
class = "idInfo_TeleportDestination";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
spawnPosition = { // Position should be just foward of the opposing idTrigger_Teleporter
x = -11.11;
y = -11.11;
z = -11.11;
}
spawnOrientation = { // Orientation should be identical to the opposing idEntityFx
mat = {
mat[0] = {
x = 0;
y = 1;
z = 0;
}
mat[1] = {
x = -1;
y = 0;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
}
}
}
Bouncepads
Due to local hosting issues, added bouncepad entities may not work for clients, regardless if their resources exist in the map.
Dynamic Entity (Backer)
This entity better communicates the location of the bouncepad.
entity {
entityDef invasion_bouncepad_back_1 {
inherit = "func/dynamic";
class = "idDynamicEntity";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
spawnPosition = { // Set the position roughly -0.2 (on the z axis) behind the emitter FX
x = -11.11;
y = -11.11;
z = -11.11;
}
spawnOrientation = { // Backer should be laying on the ground
mat = {
mat[0] = {
x = 0.707107;
y = -0.707107;
z = 0;
}
mat[1] = {
x = 0.707107;
y = 0.707107;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
renderModelInfo = {
model = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo";
scale = { // Do not change the scale, it will break collision
x = 0.66;
y = 0.66;
z = 0.5;
}
}
clipModelInfo = {
clipModelName = "art/kit/hell/bridge/bridge_archPillar_a_divider.lwo"; // Adds collision
}
}
}
}
Emitter FX (Slayer Team)
entity {
layers {
"game/pvp/slayer_team" // Only the Slayer can see this FX
}
entityDef invasion_bouncepad_fx_slayer_1 {
inherit = "func/fx";
class = "idEntityFx";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
canBecomeDormant = true;
}
dormancy = {
delay = 5;
distance = 78.029007;
}
spawnPosition = { // Position should be identical to the FX on the demon team
x = -11.11;
y = -11.11;
z = -11.11;
}
fxEffect = "gameplay/invasion/bounce_pad_slayer"; // Emitter is red
spawnOrientation = { // Orientation should not be changed
mat = {
mat[0] = {
x = 1;
y = 0;
z = 0;
}
mat[1] = {
x = 0;
y = 1;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
renderModelInfo = {
scale = {
x = 1;
y = 1;
z = 1;
}
}
}
}
}
Emitter FX (Demon Team)
entity {
layers {
"game/pvp/demon_team" // Only Demon Players can see this FX
}
entityDef invasion_bouncepad_fx_slayer_1 {
inherit = "func/fx";
class = "idEntityFx";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
canBecomeDormant = true;
}
dormancy = {
delay = 5;
distance = 78.029007;
}
spawnPosition = { // Position should be identical to the FX on the slayer team
x = -11.11;
y = -11.11;
z = -11.11;
}
automapPropertiesDecl = "invasion_bounce_demon";
fxEffect = "gameplay/invasion/bounce_pad_demon"; // Emitter is purple
spawnOrientation = { // Orientation should not be changed
mat = {
mat[0] = {
x = 1;
y = 0;
z = 0;
}
mat[1] = {
x = 0;
y = 1;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
renderModelInfo = {
scale = {
x = 1;
y = 1;
z = 1;
}
}
}
}
}
Bouncepad
entity {
entityDef invasion_bouncepad_from_1 {
inherit = "trigger/bounce_pad";
class = "idTrigger_BouncePad";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
flags = {
canBecomeDormant = true;
}
launchFX = "fx/bounce_pad/basic";
spawnPosition = { // Position should be roughtly +1 (z axis) above the FX
x = -11.11;
y = -11.11;
z = -11.11;
}
renderModelInfo = {
model = NULL;
scale = {
x = 1;
y = 1;
z = 1;
}
}
clipModelInfo = {
clipModelName = "maps/game/sp/e1m3_cult/e1m3_cult/invasion_x_bouncepad_from_1";
size = {
x = 1.5;
y = 1.5;
z = 1;
}
}
playerCanActivate = false; // Slayer cannot activate
demonPlayerCanActivate = true; // Demon players can activate
destination = "invasion_bouncepad_dest_1"; // Fly to this destination when activated
launchSpeed = 32; // Speed demons will fly upwards
}
}
}
Destination
entity {
layers {
"game/pvp/demon_team" // Only demon players can be launched
}
entityDef invasion_bouncepad_dest_1 {
inherit = "info/bounce_destination";
class = "idInfo_BounceDestination";
expandInheritance = false;
poolCount = 0;
poolGranularity = 2;
networkReplicated = false;
disableAIPooling = false;
edit = {
spawnPosition = { // Increase z axis position close to the destination
x = -11.11;
y = -11.11;
z = -11.11;
}
spawnOrientation = { // Orientation does not matter
mat = {
mat[0] = {
x = 1;
y = 0;
z = 0;
}
mat[1] = {
x = 0;
y = 1;
z = 0;
}
mat[2] = {
x = 0;
y = 0;
z = 1;
}
}
}
renderModelInfo = {
scale = {
x = 1;
y = 1;
z = 1;
}
}
}
}
}
No Comments