#ifdef IMPLEMENTATION float autocvar_g_touchexplode_radius; float autocvar_g_touchexplode_damage; float autocvar_g_touchexplode_edgedamage; float autocvar_g_touchexplode_force; REGISTER_MUTATOR(touchexplode, cvar("g_touchexplode")); .float touchexplode_time; void PlayerTouchExplode(entity p1, entity p2) { vector org = (p1.origin + p2.origin) * 0.5; org.z += (p1.mins.z + p2.mins.z) * 0.5; sound(p1, CH_TRIGGER, SND_GRENADE_IMPACT, VOL_BASE, ATTEN_NORM); Send_Effect(EFFECT_EXPLOSION_SMALL, org, '0 0 0', 1); entity e = spawn(); setorigin(e, org); RadiusDamage(e, NULL, autocvar_g_touchexplode_damage, autocvar_g_touchexplode_edgedamage, autocvar_g_touchexplode_radius, NULL, NULL, autocvar_g_touchexplode_force, DEATH_TOUCHEXPLODE.m_id, NULL); delete(e); } MUTATOR_HOOKFUNCTION(touchexplode, PlayerPreThink) { entity player = M_ARGV(0, entity); if(time > player.touchexplode_time) if(!gameover) if(!STAT(FROZEN, player)) if(IS_PLAYER(player)) if(!IS_DEAD(player)) if(!IS_INDEPENDENT_PLAYER(player)) FOREACH_CLIENT(IS_PLAYER(it) && it != player, LAMBDA( if(time > it.touchexplode_time) if(!STAT(FROZEN, it)) if(!IS_DEAD(it)) if (!IS_INDEPENDENT_PLAYER(it)) if(boxesoverlap(player.absmin, player.absmax, it.absmin, it.absmax)) { PlayerTouchExplode(player, it); player.touchexplode_time = it.touchexplode_time = time + 0.2; } )); } #endif