From cec94612fafdf8360a086bc604ccb2d39b0820c6 Mon Sep 17 00:00:00 2001 From: Samual Date: Mon, 2 Apr 2012 13:50:58 -0400 Subject: [PATCH] New entity property: "teleportable" -- also use it to enable CTF flags to teleport --- qcsrc/server/attic/monsters/m_monsters.qc | 3 +++ qcsrc/server/cl_client.qc | 2 ++ qcsrc/server/cl_player.qc | 1 + qcsrc/server/defs.qh | 1 + qcsrc/server/mutators/gamemode_ctf.qc | 1 + qcsrc/server/t_teleporters.qc | 26 ++++++++++++---------- qcsrc/server/tturrets/units/unit_ewheel.qc | 1 + qcsrc/server/tturrets/units/unit_walker.qc | 1 + qcsrc/server/vehicles/vehicles.qc | 2 ++ 9 files changed, 26 insertions(+), 12 deletions(-) diff --git a/qcsrc/server/attic/monsters/m_monsters.qc b/qcsrc/server/attic/monsters/m_monsters.qc index 3e160d97b..b450f761e 100644 --- a/qcsrc/server/attic/monsters/m_monsters.qc +++ b/qcsrc/server/attic/monsters/m_monsters.qc @@ -259,6 +259,7 @@ void() walkmonster_start_go = // spread think times so they don't all happen at same time self.nextthink = self.nextthink + random()*0.5 + 0.1; self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; force_retouch = 2; // mainly to detect teleports @@ -353,6 +354,7 @@ void() flymonster_start_go = } } self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; force_retouch = 2; // mainly to detect teleports @@ -442,6 +444,7 @@ void() swimmonster_start_go = } } self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; force_retouch = 2; // mainly to detect teleports diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 10e4c1379..7b06576dd 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -445,6 +445,7 @@ void PutObserverInServer (void) self.classname = "observer"; self.iscreature = FALSE; + self.teleportable = TELEPORT_SIMPLE; self.damagedbycontents = FALSE; self.health = -666; self.takedamage = DAMAGE_NO; @@ -693,6 +694,7 @@ void PutClientInServer (void) self.classname = "player"; self.wasplayer = TRUE; self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; self.movetype = MOVETYPE_WALK; self.solid = SOLID_SLIDEBOX; diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 80f818e1f..258d1874b 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -151,6 +151,7 @@ void CopyBody(float keepvelocity) self.lip = oldself.lip; self.colormap = oldself.colormap; self.iscreature = oldself.iscreature; + self.teleportable = oldself.teleportable; self.damagedbycontents = oldself.damagedbycontents; self.angles = oldself.angles; self.avelocity = oldself.avelocity; diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 56e704303..3bf874341 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -198,6 +198,7 @@ void setanim(entity e, vector anim, float looping, float override, float restart .float damagedbycontents; .float damagedbytriggers; .float pushable; +.float teleportable; .vector oldvelocity; .float pauseregen_finished; diff --git a/qcsrc/server/mutators/gamemode_ctf.qc b/qcsrc/server/mutators/gamemode_ctf.qc index e63a84fe5..95be2622f 100644 --- a/qcsrc/server/mutators/gamemode_ctf.qc +++ b/qcsrc/server/mutators/gamemode_ctf.qc @@ -837,6 +837,7 @@ void ctf_FlagSetup(float teamnumber, entity flag) // called when spawning a flag flag.health = flag.max_flag_health; flag.event_damage = ctf_FlagDamage; flag.pushable = TRUE; + flag.teleportable = TELEPORT_NORMAL; flag.damagedbytriggers = autocvar_g_ctf_flag_return_when_unreachable; flag.damagedbycontents = autocvar_g_ctf_flag_return_when_unreachable; flag.velocity = '0 0 0'; diff --git a/qcsrc/server/t_teleporters.qc b/qcsrc/server/t_teleporters.qc index 1705d8f8e..788edeabf 100644 --- a/qcsrc/server/t_teleporters.qc +++ b/qcsrc/server/t_teleporters.qc @@ -75,6 +75,11 @@ void spawn_tdeath(vector v0, entity e, vector v) #define TELEPORT_FLAGS_WARPZONE 0 #define TELEPORT_FLAGS_PORTAL (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH | TELEPORT_FLAG_FORCE_TDEATH) #define TELEPORT_FLAGS_TELEPORTER (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH) + +// types for .teleportable entity setting +#define TELEPORT_NORMAL 1 // play sounds/effects etc +#define TELEPORT_SIMPLE 2 // only do teleport, nothing special + void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity, vector telefragmin, vector telefragmax, float tflags) { entity telefragger; @@ -87,7 +92,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle makevectors (to_angles); - if(player.classname == "player") // don't play sounds or show particles for anything that isn't a player, maybe change later to block only observers + if(player.teleportable == TELEPORT_NORMAL) // don't play sounds or show particles for anything that isn't a player, maybe change later to block only observers { if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps { @@ -195,20 +200,17 @@ void Teleport_Touch (void) if (self.active != ACTIVE_ACTIVE) return; - if not(other.iscreature) - return; - - // for gameplay: vehicles can't teleport - if (other.vehicle_flags & VHF_ISVEHICLE) + if not(other.teleportable) return; - if(other.vehicle) - return; - - if(other.turrcaps_flags & TFL_TURRCAPS_ISTURRET) - return; + if(other.vehicle) + if(!other.vehicle.teleportable) + return; + + if(other.turrcaps_flags & TFL_TURRCAPS_ISTURRET) + return; - if (other.deadflag != DEAD_NO) + if(other.deadflag != DEAD_NO) return; if(self.team) diff --git a/qcsrc/server/tturrets/units/unit_ewheel.qc b/qcsrc/server/tturrets/units/unit_ewheel.qc index 6b8f8e7d4..8cb52ea77 100644 --- a/qcsrc/server/tturrets/units/unit_ewheel.qc +++ b/qcsrc/server/tturrets/units/unit_ewheel.qc @@ -252,6 +252,7 @@ void turret_ewheel_dinit() self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS; self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS; self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; self.movetype = MOVETYPE_WALK; self.solid = SOLID_SLIDEBOX; diff --git a/qcsrc/server/tturrets/units/unit_walker.qc b/qcsrc/server/tturrets/units/unit_walker.qc index 646fccccb..98381276c 100644 --- a/qcsrc/server/tturrets/units/unit_walker.qc +++ b/qcsrc/server/tturrets/units/unit_walker.qc @@ -592,6 +592,7 @@ void turret_walker_dinit() self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS; self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS; self.iscreature = TRUE; + self.teleportable = TELEPORT_NORMAL; self.damagedbycontents = TRUE; self.movetype = MOVETYPE_WALK; self.solid = SOLID_SLIDEBOX; diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index f35602a68..963f1875c 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -338,6 +338,7 @@ void vehicles_spawn() self.touch = vehicles_touch; self.event_damage = vehicles_damage; self.iscreature = TRUE; + self.teleportable = FALSE; // no teleporting for vehicles, too buggy self.damagedbycontents = TRUE; self.movetype = MOVETYPE_WALK; self.solid = SOLID_SLIDEBOX; @@ -980,6 +981,7 @@ float vehicle_initialize(string net_name, self.takedamage = DAMAGE_AIM; self.bot_attack = TRUE; self.iscreature = TRUE; + self.teleportable = FALSE; // no teleporting for vehicles, too buggy self.damagedbycontents = TRUE; self.hud = vhud; -- 2.39.2