Here is a Gersh Grenades Function feel free to improve it as i wont be changing anything on it anymore was just a daft function i wanted to make for my menu. It currently teleports zombies within radius and kills them, also if players are within a certain distance they now get pulled and teleported to a random spawn location.

GershGrenadesToggle()
{
if (!isDefined(self.gershGrenadesToggle))
{
self.gershGrenadesToggle = true;
self thread mzGershGrenades();
self iprintln("Gersh Grenades: ^2Enabled");
}
else
{
self.gershGrenadesToggle = undefined;
self notify("stop_gershgrenades");
self iprintln("Gersh Grenades: ^1Disabled");
}
}
mzGershGrenades()
{
self endon("stop_gershgrenades");
self endon("disconnect");
level endon("game_ended");
for(;;)
{
self waittill("grenade_fire", grenade, weapon_name);
if (!isDefined(grenade))
continue;
origin = undefined;
while (isDefined(grenade))
{
origin = grenade.origin;
wait 0.1;
}
if (!isDefined(origin))
continue;
self thread mzGershBlackHole(origin, self);
}
}
mzGershBlackHole(center, attacker)
{
self endon("disconnect");
level endon("game_ended");
self thread mzGershFX(center);
foreach(player in level.players)
player thread mzGershPlayerPull(center);
killTeleportRadius = 350;
for (tick = 0; tick < 14; tick++)
{
foreach(zombie in getAiArray(level.zombie_team))
{
if (!isDefined(zombie) || !isDefined(zombie.health) || zombie.health <= 0)
continue;
if (isDefined(zombie.mz_gersh_dead))
continue;
if (distance(zombie getOrigin(), center) <= killTeleportRadius)
{
zombie.mz_gersh_dead = 1;
zombie forceteleport(center, self.angles + vectorScale((0, 1, 0), 180));
wait 0.05;
if (isDefined(zombie) && isDefined(zombie.health) && zombie.health > 0)
zombie doDamage(zombie.health * 2, center, attacker);
if (isDefined(zombie))
zombie thread mzGershSafeDelete();
playfx(level._effect["zombie_guts_explosion"], center + (0, 0, 30));
}
}
wait 0.25;
}
foreach(player in level.players)
if (isDefined(player))
player notify("stop_gersh_pull");
playfx(loadfx("explosions/fx_default_explosion"), center);
}
mzGershSafeDelete()
{
self endon("disconnect");
level endon("game_ended");
wait 0.15;
if (!isDefined(self))
return;
if (isDefined(self.health) && self.health > 0)
return;
self delete();
}
mzGershPlayerPull(origin)
{
self endon("disconnect");
self endon("stop_gersh_pull");
level endon("game_ended");
for (tick = 0; tick < 14; tick++)
{
if (distance(origin, self getOrigin()) < 250)
{
self setOrigin(self.origin);
self setVelocity((origin - self getOrigin()));
if (distance(origin, self getOrigin()) < 60)
{
self thread mzGershTeleportPlayer();
}
}
wait 0.25;
}
wait 0.5;
self setVelocity((0, 0, 0));
}
mzGershTeleportPlayer()
{
self endon("disconnect");
spawn_points = maps\mp\gametypes_zm\_zm_gametype::get_player_spawns_for_gametype();
if (spawn_points.size == 0)
return;
valid_groups = [];
for (i = 0; i < spawn_points.size; i++)
{
if (spawn_points[i].locked == 0)
{
valid_groups[valid_groups.size] = spawn_points[i];
}
}
if (valid_groups.size == 0)
return;
random_group = valid_groups[randomint(valid_groups.size)];
spawn_array = getstructarray(random_group.target, "targetname");
if (!isDefined(spawn_array) || spawn_array.size == 0)
return;
spawn_array = array_randomize(spawn_array);
chosen_spawn = undefined;
for (k = 0; k < spawn_array.size; k++)
{
if (!positionwouldtelefrag(spawn_array[k].origin))
{
chosen_spawn = spawn_array[k];
break;
}
}
if (!isDefined(chosen_spawn))
chosen_spawn = spawn_array[0];
self setOrigin(chosen_spawn.origin);
if (isDefined(chosen_spawn.angles))
self setPlayerAngles(chosen_spawn.angles);
playfx(level._effect["powerup_grabbed_solo"], self.origin);
}
mzGershFX(origin)
{
self endon("disconnect");
for (i = 0; i < 14; i++)
{
playfx(level._effect["grenade_samantha_steal"], origin);
wait 0.25;
}
}
Video clip link