From 996bb618198837cab36c7da79b0d543a0ae4e120 Mon Sep 17 00:00:00 2001 From: Mario Date: Sat, 19 Jun 2021 15:14:36 +1000 Subject: [PATCH] Make the Keepaway ball respawn when it comes in contact with lava and slime, fixes #2599 --- .../gamemodes/gamemode/keepaway/sv_keepaway.qc | 16 +++++++++++++++- .../gamemodes/gamemode/keepaway/sv_keepaway.qh | 4 ++++ qcsrc/server/items/items.qc | 3 +++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qc b/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qc index 013123bb0d..27a69d19ad 100644 --- a/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qc +++ b/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qc @@ -46,7 +46,6 @@ void ka_EventLog(string mode, entity actor) // use an alias for easy changing an GameLogEcho(strcat(":ka:", mode, ((actor != NULL) ? (strcat(":", ftos(actor.playerid))) : ""))); } -void ka_TouchEvent(entity this, entity toucher); void ka_RespawnBall(entity this) // runs whenever the ball needs to be relocated { if(game_stopped) return; @@ -90,6 +89,12 @@ void ka_TimeScoring(entity this) } } +void ka_DamageEvent(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force) +{ + if(ITEM_DAMAGE_NEEDKILL(deathtype)) + ka_RespawnBall(this); +} + void ka_TouchEvent(entity this, entity toucher) // runs any time that the ball comes in contact with something { if (!this || game_stopped) @@ -126,6 +131,9 @@ void ka_TouchEvent(entity this, entity toucher) // runs any time that the ball c setthink(this, ka_TimeScoring); this.nextthink = time + autocvar_g_keepaway_score_timeinterval; this.takedamage = DAMAGE_NO; + this.event_damage = func_null; + this.damagedbycontents = false; + IL_REMOVE(g_damagedbycontents, this); navigation_dynamicgoal_unset(this); // apply effects to player @@ -176,6 +184,9 @@ void ka_DropEvent(entity player) // runs any time that a player is supposed to l setthink(ball, ka_RespawnBall); ball.nextthink = time + autocvar_g_keepawayball_respawntime; ball.takedamage = DAMAGE_YES; + ball.event_damage = ka_DamageEvent; + ball.damagedbycontents = true; + IL_PUSH(g_damagedbycontents, ball); ball.effects &= ~EF_NODRAW; setorigin(ball, player.origin + '0 0 10'); ball.velocity = '0 0 200' + '0 100 0'*crandom() + '100 0 0'*crandom(); @@ -225,6 +236,9 @@ void ka_SpawnBall() setsize(e, '-16 -16 -20', '16 16 20'); // 20 20 20 was too big, player is only 16 16 24... gotta cheat with the Z (20) axis so that the particle isn't cut off e.damageforcescale = autocvar_g_keepawayball_damageforcescale; e.takedamage = DAMAGE_YES; + e.event_damage = ka_DamageEvent; + e.damagedbycontents = true; + IL_PUSH(g_damagedbycontents, e); e.solid = SOLID_TRIGGER; set_movetype(e, MOVETYPE_BOUNCE); e.glow_color = autocvar_g_keepawayball_trail_color; diff --git a/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qh b/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qh index a06960078e..2f1f076439 100644 --- a/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qh +++ b/qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qh @@ -28,4 +28,8 @@ entity ka_Handler; void(entity this) havocbot_role_ka_carrier; void(entity this) havocbot_role_ka_collector; +void ka_DamageEvent(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force); + +void ka_TouchEvent(entity this, entity toucher); + void ka_DropEvent(entity plyr); diff --git a/qcsrc/server/items/items.qc b/qcsrc/server/items/items.qc index 1a5cfdda5e..a87214072e 100644 --- a/qcsrc/server/items/items.qc +++ b/qcsrc/server/items/items.qc @@ -950,6 +950,9 @@ void _StartItem(entity this, entity def, float defaultrespawntime, float default this.takedamage = DAMAGE_YES; this.event_damage = Item_Damage; + // enable this to have thrown items burn in lava + //this.damagedbycontents = true; + //IL_PUSH(g_damagedbycontents, this); if (Item_IsExpiring(this)) { -- 2.39.2