return vs + '0 0 1' * vz;
}
+#ifdef SVQC
+void trigger_push_velocity_think(entity this)
+{
+ bool found = false;
+ IL_EACH(g_moveables, it.last_pushed == this,
+ {
+ if(!WarpZoneLib_ExactTrigger_Touch(this, it, false))
+ it.last_pushed = NULL;
+ else
+ found = true;
+ });
+
+ if(found)
+ this.nextthink = time;
+ else
+ setthink(this, func_null);
+}
+#endif
+
bool jumppad_push(entity this, entity targ, bool is_velocity_pad)
{
if (!isPushable(targ))
else
{
targ.last_pushed = this; // may be briefly out of sync between client and server if client prediction is toggled
+
+ #ifdef SVQC
+ setthink(this, trigger_push_velocity_think);
+ this.nextthink = time;
+ #endif
}
}
void sys_phys_update(entity this, float dt);
void StartFrame()
{
- IL_EACH(g_moveables, it.last_pushed,
- {
- if(!WarpZoneLib_ExactTrigger_Touch(it.last_pushed, it, false))
- it.last_pushed = NULL;
- });
-
// TODO: if move is more than 50ms, split it into two moves (this matches QWSV behavior and the client prediction)
IL_EACH(g_players, IS_FAKE_CLIENT(it), sys_phys_update(it, frametime));
IL_EACH(g_players, IS_FAKE_CLIENT(it), PlayerPreThink(it));