From 2ec345cd646d5c13cf25cae223c9ace4f85860bc Mon Sep 17 00:00:00 2001 From: TimePath Date: Fri, 24 Jun 2016 09:30:27 +1000 Subject: [PATCH] Move PM_walk landing event to ecs --- qcsrc/common/physics/player.qc | 15 ----------- qcsrc/ecs/README.md | 3 +-- qcsrc/ecs/_lib.inc | 3 ++- qcsrc/ecs/events/_mod.inc | 1 + qcsrc/ecs/events/_mod.qh | 1 + qcsrc/ecs/events/physics.qc | 1 + qcsrc/ecs/events/physics.qh | 3 +++ qcsrc/ecs/systems/physics.qc | 6 +++++ qcsrc/ecs/systems/sv_physics.qc | 46 +++++++++++++++++++++++---------- 9 files changed, 48 insertions(+), 31 deletions(-) create mode 100644 qcsrc/ecs/events/physics.qc create mode 100644 qcsrc/ecs/events/physics.qh diff --git a/qcsrc/common/physics/player.qc b/qcsrc/common/physics/player.qc index f5ff4c4fa5..13a4bcd7a0 100644 --- a/qcsrc/common/physics/player.qc +++ b/qcsrc/common/physics/player.qc @@ -1042,21 +1042,6 @@ void PM_jetpack(entity this, float maxspd_mod) void PM_walk(entity this, float maxspd_mod) { - if (!WAS_ONGROUND(this)) - { -#ifdef SVQC - if (autocvar_speedmeter) - LOG_TRACE(strcat("landing velocity: ", vtos(this.velocity), " (abs: ", ftos(vlen(this.velocity)), ")\n")); -#endif - if (this.lastground < time - 0.3) - this.velocity *= (1 - PHYS_FRICTION_ONLAND(this)); -#ifdef SVQC - if (this.jumppadcount > 1) - LOG_TRACE(strcat(ftos(this.jumppadcount), "x jumppad combo\n")); - this.jumppadcount = 0; -#endif - } - // walking makevectors(this.v_angle.y * '0 1 0'); const vector wishvel = v_forward * this.movement.x diff --git a/qcsrc/ecs/README.md b/qcsrc/ecs/README.md index 9fd6ad6948..d49094f7b4 100644 --- a/qcsrc/ecs/README.md +++ b/qcsrc/ecs/README.md @@ -44,5 +44,4 @@ ### listening entity listener = new_pure(someListener); - listener.evt_$event = void(entity this) { code; }; - subscribe(listener, $event); + subscribe(listener, $event, void(entity this) { code; }); diff --git a/qcsrc/ecs/_lib.inc b/qcsrc/ecs/_lib.inc index 32db1f3d3e..ef8e67c58a 100644 --- a/qcsrc/ecs/_lib.inc +++ b/qcsrc/ecs/_lib.inc @@ -13,8 +13,9 @@ FOREACH_ENTITY_FLOAT_ORDERED(evt_##T##_listener, true, it.evt_##T(__VA_ARGS__)); \ MACRO_END -#define subscribe(listener, T) \ +#define subscribe(listener, T, fn) \ MACRO_BEGIN \ + listener.evt_##T = (fn); \ listener.evt_##T##_listener = true; \ MACRO_END diff --git a/qcsrc/ecs/events/_mod.inc b/qcsrc/ecs/events/_mod.inc index 98fb4815c1..c139d72b51 100644 --- a/qcsrc/ecs/events/_mod.inc +++ b/qcsrc/ecs/events/_mod.inc @@ -1 +1,2 @@ // generated file; do not modify +#include diff --git a/qcsrc/ecs/events/_mod.qh b/qcsrc/ecs/events/_mod.qh index 98fb4815c1..1e8c791ce9 100644 --- a/qcsrc/ecs/events/_mod.qh +++ b/qcsrc/ecs/events/_mod.qh @@ -1 +1,2 @@ // generated file; do not modify +#include diff --git a/qcsrc/ecs/events/physics.qc b/qcsrc/ecs/events/physics.qc new file mode 100644 index 0000000000..909f45c1db --- /dev/null +++ b/qcsrc/ecs/events/physics.qc @@ -0,0 +1 @@ +#include "physics.qh" diff --git a/qcsrc/ecs/events/physics.qh b/qcsrc/ecs/events/physics.qh new file mode 100644 index 0000000000..df32c557d1 --- /dev/null +++ b/qcsrc/ecs/events/physics.qh @@ -0,0 +1,3 @@ +#pragma once + +EVENT(phys_land, (entity this)); diff --git a/qcsrc/ecs/systems/physics.qc b/qcsrc/ecs/systems/physics.qc index c38e891ccd..c299079ef6 100644 --- a/qcsrc/ecs/systems/physics.qc +++ b/qcsrc/ecs/systems/physics.qc @@ -105,6 +105,12 @@ void sys_phys_update(entity this, float dt) } else if (ITEMS_STAT(this) & IT_USING_JETPACK) { PM_jetpack(this, maxspeed_mod); } else if (IS_ONGROUND(this)) { + if (!WAS_ONGROUND(this)) { + emit(phys_land, this); + if (this.lastground < time - 0.3) { + this.velocity *= (1 - PHYS_FRICTION_ONLAND(this)); + } + } PM_walk(this, maxspeed_mod); } else { PM_air(this, buttons_prev, maxspeed_mod); diff --git a/qcsrc/ecs/systems/sv_physics.qc b/qcsrc/ecs/systems/sv_physics.qc index 5c480fe784..0df3411c1d 100644 --- a/qcsrc/ecs/systems/sv_physics.qc +++ b/qcsrc/ecs/systems/sv_physics.qc @@ -9,8 +9,8 @@ void sys_phys_fix(entity this, float dt) bool sys_phys_override(entity this) { int buttons = PHYS_INPUT_BUTTON_MASK(this); - if (PM_check_specialcommand(this, buttons)) return true; - if (this.PlayerPhysplug && this.PlayerPhysplug(this)) return true; + if (PM_check_specialcommand(this, buttons)) { return true; } + if (this.PlayerPhysplug && this.PlayerPhysplug(this)) { return true; } return false; } @@ -21,7 +21,7 @@ void sys_phys_monitor(entity this) if (sv_maxidle > 0) { if (buttons != this.buttons_old || this.movement != this.movement_old - || this.v_angle != this.v_angle_old) this.parm_idlesince = time; + || this.v_angle != this.v_angle_old) { this.parm_idlesince = time; } } PM_check_nickspam(this); PM_check_punch(this); @@ -29,21 +29,21 @@ void sys_phys_monitor(entity this) void sys_phys_ai(entity this) { - if (!IS_BOT_CLIENT(this)) return; - if (playerdemo_read(this)) return; + if (!IS_BOT_CLIENT(this)) { return; } + if (playerdemo_read(this)) { return; } bot_think(this); } void sys_phys_pregame_hold(entity this) { - if (!IS_PLAYER(this)) return; + if (!IS_PLAYER(this)) { return; } const bool allowed_to_move = (time >= game_starttime); if (!allowed_to_move) { this.velocity = '0 0 0'; this.movetype = MOVETYPE_NONE; this.disableclientprediction = 2; } else if (this.disableclientprediction == 2) { - if (this.movetype == MOVETYPE_NONE) this.movetype = MOVETYPE_WALK; + if (this.movetype == MOVETYPE_NONE) { this.movetype = MOVETYPE_WALK; } this.disableclientprediction = 0; } } @@ -51,7 +51,7 @@ void sys_phys_pregame_hold(entity this) void sys_phys_spectator_control(entity this) { float maxspeed_mod = autocvar_sv_spectator_speed_multiplier; - if (!this.spectatorspeed) this.spectatorspeed = maxspeed_mod; + if (!this.spectatorspeed) { this.spectatorspeed = maxspeed_mod; } if ((this.impulse >= 1 && this.impulse <= 19) || (this.impulse >= 200 && this.impulse <= 209) || (this.impulse >= 220 && this.impulse <= 229) @@ -61,14 +61,17 @@ void sys_phys_spectator_control(entity this) || this.impulse == 15 || this.impulse == 18 || (this.impulse >= 200 && this.impulse <= 209) - ) this.spectatorspeed = bound(1, this.spectatorspeed + 0.5, 5); - else if (this.impulse == 11) this.spectatorspeed = maxspeed_mod; - else if (this.impulse == 12 + ) { this.spectatorspeed = bound(1, this.spectatorspeed + 0.5, 5); } else if (this.impulse == 11) { + this.spectatorspeed = maxspeed_mod; + } else if (this.impulse == 12 || this.impulse == 16 || this.impulse == 19 || (this.impulse >= 220 && this.impulse <= 229) - ) this.spectatorspeed = bound(1, this.spectatorspeed - 0.5, 5); - else if (this.impulse >= 1 && this.impulse <= 9) this.spectatorspeed = 1 + 0.5 * (this.impulse - 1); + ) { + this.spectatorspeed = bound(1, this.spectatorspeed - 0.5, 5); + } else if (this.impulse >= 1 && this.impulse <= 9) { + this.spectatorspeed = 1 + 0.5 * (this.impulse - 1); + } } // otherwise just clear this.impulse = 0; } @@ -95,3 +98,20 @@ void sys_phys_fixspeed(entity this, float maxspeed_mod) stuffcmd(this, sprintf("\ncl_jumpspeedcap_max \"%s\"\n", autocvar_sv_jumpspeedcap_max)); } } + +void sys_phys_land(entity this) +{ + if (autocvar_speedmeter) { + LOG_TRACEF("landing velocity: %v (abs: %f)", this.velocity, vlen(this.velocity)); + } + if (this.jumppadcount > 1) { + LOG_TRACEF("%dx jumppad combo", this.jumppadcount); + } + this.jumppadcount = 0; +} + +STATIC_INIT(sys_phys) +{ + entity listener = new_pure(sys_phys); + subscribe(listener, phys_land, sys_phys_land); +} -- 2.39.2