// TODO: split target_push and put it in the target folder
-
#ifdef SVQC
+#include "../../../server/_all.qh"
+#include "jumppads.qh"
+#include "../../movetypes/movetypes.qh"
void trigger_push_use()
-{
+{SELFPARAM();
if(teamplay)
{
self.team = activator.team;
}
#endif
-float trigger_push_calculatevelocity_flighttime;
-
/*
trigger_push_calculatevelocity
if(PHYS_ENTGRAVITY(other))
grav *= PHYS_ENTGRAVITY(other);
- zdist = torg_z - org_z;
+ zdist = torg.z - org.z;
sdist = vlen(torg - org - zdist * '0 0 1');
sdir = normalize(torg - org - zdist * '0 0 1');
vector solution;
solution = solve_quadratic(0.5 * grav, -vz, zdist); // equation "z(ti) = zdist"
// ALWAYS solvable because jumpheight >= zdist
- if(!solution_z)
- solution_y = solution_x; // just in case it is not solvable due to roundoff errors, assume two equal solutions at their center (this is mainly for the usual case with ht == 0)
+ if(!solution.z)
+ solution_y = solution.x; // just in case it is not solvable due to roundoff errors, assume two equal solutions at their center (this is mainly for the usual case with ht == 0)
if(zdist == 0)
- solution_x = solution_y; // solution_x is 0 in this case, so don't use it, but rather use solution_y (which will be sqrt(0.5 * jumpheight / grav), actually)
+ solution_x = solution.y; // solution_x is 0 in this case, so don't use it, but rather use solution_y (which will be sqrt(0.5 * jumpheight / grav), actually)
if(zdist < 0)
{
// almost straight line type
// jump apex is before the jump
// we must take the larger one
- trigger_push_calculatevelocity_flighttime = solution_y;
+ trigger_push_calculatevelocity_flighttime = solution.y;
}
else
{
// regular jump
// jump apex is during the jump
// we must take the larger one too
- trigger_push_calculatevelocity_flighttime = solution_y;
+ trigger_push_calculatevelocity_flighttime = solution.y;
}
}
else
// almost straight line type
// jump apex is after the jump
// we must take the smaller one
- trigger_push_calculatevelocity_flighttime = solution_x;
+ trigger_push_calculatevelocity_flighttime = solution.x;
}
else
{
// regular jump
// jump apex is during the jump
// we must take the larger one
- trigger_push_calculatevelocity_flighttime = solution_y;
+ trigger_push_calculatevelocity_flighttime = solution.y;
}
}
vs = sdist / trigger_push_calculatevelocity_flighttime;
}
void trigger_push_touch()
-{
+{SELFPARAM();
if (self.active == ACTIVE_NOT)
return;
if(self.enemy)
{
other.velocity = trigger_push_calculatevelocity(other.origin, self.enemy, self.height);
+ other.move_velocity = other.velocity;
}
else if(self.target)
{
RandomSelection_Add(e, 0, string_null, 1, 1);
}
other.velocity = trigger_push_calculatevelocity(other.origin, RandomSelection_chosen_ent, self.height);
+ other.move_velocity = other.velocity;
}
else
{
other.velocity = self.movedir;
+ other.move_velocity = other.velocity;
}
UNSET_ONGROUND(other);
+ other.move_flags &= ~FL_ONGROUND;
+
#ifdef SVQC
if (IS_PLAYER(other))
{
if(self.pushltime < time) // prevent "snorring" sound when a player hits the jumppad more than once
{
// flash when activated
- pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1);
+ Send_Effect(EFFECT_JUMPPAD, other.origin, other.velocity, 1);
sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM);
self.pushltime = time + 0.2;
}
-
if(IS_REAL_CLIENT(other) || IS_BOT_CLIENT(other))
{
- float i;
- float found;
- found = FALSE;
- for(i = 0; i < other.jumppadcount && i < NUM_JUMPPADSUSED; ++i)
+ bool found = false;
+ for(int i = 0; i < other.jumppadcount && i < NUM_JUMPPADSUSED; ++i)
if(other.(jumppadsused[i]) == self)
- found = TRUE;
+ found = true;
if(!found)
{
other.(jumppadsused[other.jumppadcount % NUM_JUMPPADSUSED]) = self;
other.lastteleporttime = time;
if (other.deadflag == DEAD_NO)
- animdecide_setaction(other, ANIMACTION_JUMP, TRUE);
+ animdecide_setaction(other, ANIMACTION_JUMP, true);
}
else
- other.jumppadcount = TRUE;
+ other.jumppadcount = true;
// reset tracking of who pushed you into a hazard (for kill credit)
other.pushltime = 0;
if(self.enemy.target)
{
- entity oldself;
- oldself = self;
activator = other;
- self = self.enemy;
- SUB_UseTargets();
- self = oldself;
+ WITH(entity, self, self.enemy, SUB_UseTargets());
}
if (other.flags & FL_PROJECTILE)
void trigger_push_updatelink();
#endif
void trigger_push_findtarget()
-{
+{SELFPARAM();
entity t;
vector org;
// first calculate a typical start point for the jump
org = (self.absmin + self.absmax) * 0.5;
- org_z = self.absmax_z - PL_MIN_z;
+ org_z = self.absmax.z - PL_MIN.z;
if (self.target)
{
#ifdef SVQC
float trigger_push_send(entity to, float sf)
-{
+{SELFPARAM();
WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_PUSH);
WriteByte(MSG_ENTITY, sf);
if(sf & 1)
{
- WriteString(MSG_ENTITY, self.target);
WriteByte(MSG_ENTITY, self.team);
WriteInt24_t(MSG_ENTITY, self.spawnflags);
WriteByte(MSG_ENTITY, self.active);
- WriteByte(MSG_ENTITY, self.warpzone_isboxy);
WriteByte(MSG_ENTITY, self.height);
- WriteByte(MSG_ENTITY, self.scale);
- WriteCoord(MSG_ENTITY, self.origin_x);
- WriteCoord(MSG_ENTITY, self.origin_y);
- WriteCoord(MSG_ENTITY, self.origin_z);
-
- WriteCoord(MSG_ENTITY, self.mins_x);
- WriteCoord(MSG_ENTITY, self.mins_y);
- WriteCoord(MSG_ENTITY, self.mins_z);
- WriteCoord(MSG_ENTITY, self.maxs_x);
- WriteCoord(MSG_ENTITY, self.maxs_y);
- WriteCoord(MSG_ENTITY, self.maxs_z);
-
- WriteCoord(MSG_ENTITY, self.movedir_x);
- WriteCoord(MSG_ENTITY, self.movedir_y);
- WriteCoord(MSG_ENTITY, self.movedir_z);
-
- WriteCoord(MSG_ENTITY, self.angles_x);
- WriteCoord(MSG_ENTITY, self.angles_y);
- WriteCoord(MSG_ENTITY, self.angles_z);
+
+ trigger_common_write(true);
}
if(sf & 2)
WriteByte(MSG_ENTITY, self.active);
}
- return TRUE;
+ return true;
}
void trigger_push_updatelink()
-{
+{SELFPARAM();
self.SendFlags |= 1;
}
void trigger_push_link()
{
- Net_LinkEntity(self, FALSE, 0, trigger_push_send);
+ //Net_LinkEntity(self, false, 0, trigger_push_send);
}
#endif
#ifdef SVQC
* movedir: if target is not set, this * speed * 10 is the velocity to be reached.
*/
void spawnfunc_trigger_push()
-{
+{SELFPARAM();
SetMovedir ();
EXACTTRIGGER_INIT;
float target_push_send(entity to, float sf)
-{
+{SELFPARAM();
WriteByte(MSG_ENTITY, ENT_CLIENT_TARGET_PUSH);
WriteByte(MSG_ENTITY, self.cnt);
WriteCoord(MSG_ENTITY, self.origin_y);
WriteCoord(MSG_ENTITY, self.origin_z);
- return TRUE;
+ return true;
}
void target_push_link()
-{
- Net_LinkEntity(self, FALSE, 0, target_push_send);
+{SELFPARAM();
+ Net_LinkEntity(self, false, 0, target_push_send);
self.SendFlags |= 1; // update
}
#endif
#ifdef CSQC
+
void ent_trigger_push()
-{
+{SELFPARAM();
float sf = ReadByte();
if(sf & 1)
{
self.classname = "jumppad";
- self.target = strzone(ReadString());
- float mytm = ReadByte(); if(mytm) { self.team = mytm - 1; }
+ int mytm = ReadByte(); if(mytm) { self.team = mytm - 1; }
self.spawnflags = ReadInt24_t();
self.active = ReadByte();
- self.warpzone_isboxy = ReadByte();
self.height = ReadByte();
- self.scale = ReadByte();
- self.origin_x = ReadCoord();
- self.origin_y = ReadCoord();
- self.origin_z = ReadCoord();
- setorigin(self, self.origin);
- self.mins_x = ReadCoord();
- self.mins_y = ReadCoord();
- self.mins_z = ReadCoord();
- self.maxs_x = ReadCoord();
- self.maxs_y = ReadCoord();
- self.maxs_z = ReadCoord();
- setsize(self, self.mins, self.maxs);
- self.movedir_x = ReadCoord();
- self.movedir_y = ReadCoord();
- self.movedir_z = ReadCoord();
- self.angles_x = ReadCoord();
- self.angles_y = ReadCoord();
- self.angles_z = ReadCoord();
+ trigger_common_read(true);
+
+ self.entremove = trigger_remove_generic;
self.solid = SOLID_TRIGGER;
self.draw = trigger_draw_generic;
self.trigger_touch = trigger_push_touch;
- self.drawmask = MASK_ENGINE;
+ self.drawmask = MASK_NORMAL;
self.move_time = time;
trigger_push_findtarget();
}
}
}
+void target_push_remove()
+{SELFPARAM();
+ if(self.classname)
+ strunzone(self.classname);
+ self.classname = string_null;
+
+ if(self.targetname)
+ strunzone(self.targetname);
+ self.targetname = string_null;
+}
+
void ent_target_push()
-{
+{SELFPARAM();
self.classname = "push_target";
self.cnt = ReadByte();
self.targetname = strzone(ReadString());
self.origin_z = ReadCoord();
setorigin(self, self.origin);
- self.drawmask = MASK_ENGINE;
+ self.drawmask = MASK_NORMAL;
+ self.entremove = target_push_remove;
}
#endif