}
}
-void nb_delayedinit()
+void nb_delayedinit(entity this)
{
if(find(world, classname, "nexball_team") == world)
nb_spawnteams();
self.nextthink = time;
}
-void ons_DelayedLinkSetup()
-{SELFPARAM();
+void ons_DelayedLinkSetup(entity this)
+{
self.goalentity = find(world, targetname, self.target);
self.enemy = find(world, targetname, self.target2);
if(!self.goalentity) { objerror("can not find target\n"); }
CSQCMODEL_AUTOUPDATE(this);
}
-void ons_DelayedControlPoint_Setup()
-{SELFPARAM();
+void ons_DelayedControlPoint_Setup(entity this)
+{
onslaught_updatelinks();
// captureshield setup
onslaught_updatelinks();
}
-void ons_DelayedGeneratorSetup()
-{SELFPARAM();
+void ons_DelayedGeneratorSetup(entity this)
+{
// bot waypoints
waypoint_spawnforitem_force(self, self.origin);
self.nearestwaypointtimeout = 0; // activate waypointing again
return false;
}
-void ons_MonsterSpawn_Delayed()
-{SELFPARAM();
+void ons_MonsterSpawn_Delayed(entity this)
+{
entity e, own = self.owner;
if(!own) { remove(self); return; }
return false;
}
-void ons_TurretSpawn_Delayed()
-{SELFPARAM();
+void ons_TurretSpawn_Delayed(entity this)
+{
entity e, own = self.owner;
if(!own) { remove(self); return; }
ScoreRules_basics_end();
}
-void ons_DelayedInit() // Do this check with a delay so we can wait for teams to be set up
+void ons_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up
{
ons_ScoreRules();
#include <common/gamemodes/all.qh>
.float buff_time = _STAT(BUFF_TIME);
-void buffs_DelayedInit();
+void buffs_DelayedInit(entity this);
REGISTER_MUTATOR(buffs, cvar("g_buffs"))
{
return false;
}
-void buffs_DelayedInit()
+void buffs_DelayedInit(entity this)
{
if(autocvar_g_buffs_spawn_count > 0)
if(find(world, classname, "item_buff") == world)
REGISTER_NET_TEMP(TE_CSQC_SVNOTICE)
#ifdef SVQC
-void sv_notice_join_think()
+void sv_notice_join_think(entity this)
{
- SELFPARAM();
int argc = tokenizebyseparator(autocvar_sv_join_notices, "|");
if (argc <= 0) return;
for (int i = 0; i < argc; ++i)
}
void Item_Reset_self() { SELFPARAM(); Item_Reset(this); }
-void Item_FindTeam()
-{SELFPARAM();
+void Item_FindTeam(entity this)
+{
entity e;
if(self.effects & EF_NODRAW)
void Item_Reset(entity this);
-void Item_FindTeam();
+void Item_FindTeam(entity this);
// Savage: used for item garbage-collection
bool ItemSend(entity this, entity to, int sf);
#ifdef SVQC
void door_link();
#endif
-void LinkDoors()
-{SELFPARAM();
+void LinkDoors(entity this)
+{
entity t;
vector cmins, cmaxs;
}
#endif
-void door_init_startopen()
-{SELFPARAM();
+void door_init_startopen(entity this)
+{
SUB_SETORIGIN(self, self.pos2);
self.pos2 = self.pos1;
self.pos1 = self.origin;
this.drawmask = MASK_NORMAL;
this.use = door_use;
- LinkDoors();
+ LinkDoors(this);
if(this.spawnflags & DOOR_START_OPEN)
- door_init_startopen();
+ door_init_startopen(this);
this.move_time = time;
this.move_origin = this.origin;
this.nextthink = 0;
}
-void door_rotating_init_startopen()
-{SELFPARAM();
+void door_rotating_init_startopen(entity this)
+{
self.angles = self.movedir;
self.pos2 = '0 0 0';
self.pos1 = self.movedir;
#ifdef SVQC
void plat_link();
-void plat_delayedinit()
+void plat_delayedinit(entity this)
{
plat_link();
plat_spawn_inside_trigger(); // the "start moving" trigger
self.use = func_null; // not again
}
-void func_train_find()
-{SELFPARAM();
+void func_train_find(entity this)
+{
entity targ;
targ = find(world, targetname, self.target);
self.target = targ.target;
self.owner.velocity = (self.owner.destvec + func_vectormamamam_origin(self.owner, 0.1) - self.owner.origin) * 10;
}
-void func_vectormamamam_findtarget()
-{SELFPARAM();
+void func_vectormamamam_findtarget(entity this)
+{
if(self.target != "")
self.wp00 = find(world, targetname, self.target);
// the way this entity works makes it no use to CSQC, as it removes itself instantly
#ifdef SVQC
-void follow_init()
-{SELFPARAM();
+void follow_init(entity this)
+{
entity src, dst;
src = world;
dst = world;
}
}
-void misc_laser_init()
-{SELFPARAM();
+void misc_laser_init(entity this)
+{
if(self.target != "")
self.enemy = find(world, targetname, self.target);
}
}
}
-void target_spawn_spawnfirst()
-{SELFPARAM();
+void target_spawn_spawnfirst(entity this)
+{
activator = self.target_spawn_activator;
if(self.spawnflags & 2)
target_spawn_use();
return e;
}
-void teleport_findtarget()
+void teleport_findtarget(entity this)
{
- SELFPARAM();
int n = 0;
entity e;
for(e = world; (e = find(e, targetname, self.target)); )
void Teleport_Touch ();
-void teleport_findtarget();
+void teleport_findtarget(entity this);
entity Teleport_Find(vector mi, vector ma);
#ifdef SVQC
-void gamestart_use()
-{SELFPARAM();
+void gamestart_use(entity this)
+{
activator = self;
SUB_UseTargets();
remove(self);
void self_spawnfunc_trigger_gamestart();
spawnfunc(trigger_gamestart)
{
- this.use = gamestart_use;
+ setuse(this, gamestart_use);
this.reset2 = self_spawnfunc_trigger_gamestart;
if(this.wait)
#ifdef SVQC
void trigger_push_link();
-void trigger_push_updatelink();
+void trigger_push_updatelink(entity this);
#endif
-void trigger_push_findtarget()
-{SELFPARAM();
+void trigger_push_findtarget(entity this)
+{
entity t;
vector org;
return true;
}
-void trigger_push_updatelink()
-{SELFPARAM();
+void trigger_push_updatelink(entity this)
+{
this.SendFlags |= 1;
}
void trigger_push_touch();
.vector dest;
-void trigger_push_findtarget();
+void trigger_push_findtarget(entity this);
/*
* ENTITY PARAMETERS:
return true;
}
-void viewloc_init()
-{SELFPARAM();
+void viewloc_init(entity this)
+{
entity e;
for(e = world; (e = find(e, targetname, self.target)); )
if(e.classname == "target_viewlocation_start")
return turret_firecheck();
}
-void walker_melee_do_dmg()
-{SELFPARAM();
+void walker_melee_do_dmg(entity this)
+{
vector where;
entity e;
}
}
-void walker_setnoanim()
-{SELFPARAM();
+void walker_setnoanim(entity this)
+{
turrets_setframe(ANIM_NO, false);
self.animflag = self.frame;
}
SELFPARAM();
this.think = SUB_Remove_self;
this.nextthink = time;
- WITHSELF(this.owner, this.use());
+ WITHSELF(this.owner, this.selfthink(this));
}
-/*
- Execute func() after time + fdelay.
- self when func is executed = self when defer is called
-*/
- void defer(entity this, float fdelay, void() func)
+ /**
+ * Execute func() after time + fdelay.
+ * self when func is executed = self when defer is called
+ */
+ void defer(entity this, float fdelay, void(entity this) func)
{
entity e = new_pure(deferred);
e.owner = this;
- e.use = func;
+ setthink(e, func);
e.think = defer_think;
e.nextthink = time + fdelay;
}
#endif
// Step 6: Remove SELFPARAM in favor of a parameter
+
+.void(entity this) selftouch;
+void touch_self() { SELFPARAM(); this.selftouch(this); }
+#define settouch(e, f) (e.use = touch_self, e.selftouch = f)
+
+.void(entity this) selfuse;
+void use_self() { SELFPARAM(); this.selfuse(this); }
+#define setuse(e, f) (e.use = use_self, e.selfuse = f)
+
+.void(entity this) selfthink;
+void think_self() { SELFPARAM(); this.selfthink(this); }
+#define setthink(e, f) (e.think = think_self, e.selfthink = f)
break
float num_autoscreenshot;
-void info_autoscreenshot_findtarget()
-{SELFPARAM();
+void info_autoscreenshot_findtarget(entity this)
+{
entity e;
e = find(world, targetname, self.target);
if(!e)
setself(new(cheattriggerteleport));
setorigin(self, self.origin);
self.target = argv(1);
- teleport_findtarget();
+ teleport_findtarget(self);
if(!wasfreed(self))
{
Simple_TeleportPlayer(self, this);
self.nextthink = time + 0.1;
}
-void dynlight_find_aiment()
+void dynlight_find_aiment(entity this)
{
- SELFPARAM();
entity targ;
if (!self.target)
objerror ("dynlight: no target to follow");
self.think = dynlight_think;
self.nextthink = time + 0.1;
}
-void dynlight_find_path()
+void dynlight_find_path(entity this)
{
- SELFPARAM();
entity targ;
if (!self.target)
objerror ("dynlight: no target to follow");
self.think = train_next;
self.nextthink = time + 0.1;
}
-void dynlight_find_target()
+void dynlight_find_target(entity this)
{
- SELFPARAM();
entity targ;
if (!self.target)
objerror ("dynlight: no target to follow");
g_clientmodel_setcolormaptoactivator();
}
-void g_model_dropbyspawnflags()
-{SELFPARAM();
+void g_model_dropbyspawnflags(entity this)
+{
if((self.spawnflags & 3) == 1) // ALIGN_ORIGIN
{
traceline(self.origin, self.origin - '0 0 4096', MOVE_NOMONSTERS, self);
}
}
-void g_clientmodel_dropbyspawnflags()
-{SELFPARAM();
+void g_clientmodel_dropbyspawnflags(entity this)
+{
vector o0;
o0 = self.origin;
- g_model_dropbyspawnflags();
+ g_model_dropbyspawnflags(self);
if(self.origin != o0)
self.SendFlags |= 2;
}
this.modelindex = this.lodmodelindex0;
}
-void LODmodel_attach()
-{SELFPARAM();
+void LODmodel_attach(entity this)
+{
entity e;
if(!this.loddistance1)
void LOD_uncustomize();
-void LODmodel_attach();
+void LODmodel_attach(entity this);
void ApplyMinMaxScaleAngles(entity e);
builtin_remove(e);
}
-void InitializeEntity(entity e, void() func, float order)
+void InitializeEntity(entity e, void(entity this) func, float order)
{
entity prev, cur;
}
}
void InitializeEntitiesRun()
-{SELFPARAM();
+{
entity startoflist = initialize_entity_first;
initialize_entity_first = NULL;
remove = remove_except_protected;
e.initialize_entity_order = 0;
entity next = e.initialize_entity_next;
e.initialize_entity_next = NULL;
- var void() func = e.initialize_entity;
+ var void(entity this) func = e.initialize_entity;
e.initialize_entity = func_null;
if (e.classname == "initialize_entity")
{
//dprint("Delayed initialization: ", e.classname, "\n");
if (func)
{
- WITHSELF(e, func());
+ WITHSELF(e, func(e));
}
else
{
}
// deferred dropping
-void DropToFloor_Handler()
-{SELFPARAM();
+void DropToFloor_Handler(entity this)
+{
builtin_droptofloor();
self.dropped_origin = self.origin;
}
const float INITPRIO_LINKDOORS = 91;
const float INITPRIO_LAST = 99;
-.void() initialize_entity;
+.void(entity this) initialize_entity;
.float initialize_entity_order;
.entity initialize_entity_next;
entity initialize_entity_first;
float sound_allowed(float dest, entity e);
-void InitializeEntity(entity e, void() func, float order);
+void InitializeEntity(entity e, void(entity this) func, float order);
void SetCustomizer(entity e, float() customizer, void() uncustomizer);
}
}
-void assault_setenemytoobjective()
-{SELFPARAM();
+void assault_setenemytoobjective(entity this)
+{
entity objective;
for(objective = world; (objective = find(objective, targetname, self.target)); )
{
}
}
-void target_objective_decrease_findtarget()
+void target_objective_decrease_findtarget(entity this)
{
- assault_setenemytoobjective();
+ assault_setenemytoobjective(this);
}
void target_assault_roundend_reset(entity this)
self.winning = 1; // round has been won by attackers
}
-void assault_roundstart_use()
-{SELFPARAM();
+void assault_roundstart_use(entity this)
+{
activator = self;
SUB_UseTargets();
WITHSELF(it, turret_respawn());
));
}
+void assault_roundstart_use_self()
+{
+ SELFPARAM();
+ assault_roundstart_use(this);
+}
void assault_wall_think()
{SELFPARAM();
assault_attacker_team = NUM_TEAM_1;
self.classname = "target_assault_roundstart";
- self.use = assault_roundstart_use;
- self.reset2 = assault_roundstart_use;
+ self.use = assault_roundstart_use_self;
+ self.reset2 = assault_roundstart_use_self;
InitializeEntity(self, assault_roundstart_use, INITPRIO_FINDTARGET);
}
ctf_RespawnFlag(this);
}
-void ctf_DelayedFlagSetup() // called after a flag is placed on a map by ctf_FlagSetup()
-{SELFPARAM();
+void ctf_DelayedFlagSetup(entity this) // called after a flag is placed on a map by ctf_FlagSetup()
+{
// bot waypoints
waypoint_spawnforitem_force(self, self.origin);
self.nearestwaypointtimeout = 0; // activate waypointing again
WITHSELF(this, spawnfunc_ctf_team(this));
}
-void ctf_DelayedInit() // Do this check with a delay so we can wait for teams to be set up.
+void ctf_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up.
{
ctf_teams = 2;
dom_spawnteam("", 0, "models/domination/dom_unclaimed.md3", 0, SND_Null, "", "");
}
-void dom_DelayedInit() // Do this check with a delay so we can wait for teams to be set up.
+void dom_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up.
{
// if no teams are found, spawn defaults
if(find(world, classname, "dom_team") == world || autocvar_g_domination_teams_override >= 2)
ScoreRules_basics_end();
}
-void invasion_DelayedInit() // Do this check with a delay so we can wait for teams to be set up.
+void invasion_DelayedInit(entity this) // Do this check with a delay so we can wait for teams to be set up.
{
if(autocvar_g_invasion_teams)
invasion_teams = bound(2, autocvar_g_invasion_teams, 4);
}
void ka_TouchEvent();
-void ka_RespawnBall() // runs whenever the ball needs to be relocated
-{SELFPARAM();
+void ka_RespawnBall(entity this) // runs whenever the ball needs to be relocated
+{
if(gameover) { return; }
vector oldballorigin = self.origin;
self.angles = '0 0 0';
self.effects = autocvar_g_keepawayball_effects;
self.touch = ka_TouchEvent;
- self.think = ka_RespawnBall;
+ setthink(self, ka_RespawnBall);
self.nextthink = time + autocvar_g_keepawayball_respawntime;
Send_Effect(EFFECT_ELECTRO_COMBO, oldballorigin, '0 0 0', 1);
if(!self) { return; }
if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
{ // The ball fell off the map, respawn it since players can't get to it
- ka_RespawnBall();
+ ka_RespawnBall(self);
return;
}
if(IS_DEAD(other)) { return; }
ball.movetype = MOVETYPE_BOUNCE;
ball.wait = time + 1;
ball.touch = ka_TouchEvent;
- ball.think = ka_RespawnBall;
+ setthink(ball, ka_RespawnBall);
ball.nextthink = time + autocvar_g_keepawayball_respawntime;
ball.takedamage = DAMAGE_YES;
ball.effects &= ~EF_NODRAW;
if(time < game_starttime)
{
- this.think = ka_RespawnBall;
+ setthink(this, ka_RespawnBall);
this.touch = func_null;
this.nextthink = game_starttime;
}
else
- ka_RespawnBall();
+ ka_RespawnBall(this);
}
int autocvar_g_tdm_point_limit;
int autocvar_g_tdm_point_leadlimit;
bool autocvar_g_tdm_team_spawns;
-void tdm_DelayedInit();
+void tdm_DelayedInit(entity this);
REGISTER_MUTATOR(tdm, false)
{
WITHSELF(this, spawnfunc_tdm_team(this));
}
-void tdm_DelayedInit()
+void tdm_DelayedInit(entity this)
{
// if no teams are found, spawn defaults
if(find(world, classname, "tdm_team") == world)
}
float have_verified;
-void trigger_race_checkpoint_verify()
-{SELFPARAM();
+void trigger_race_checkpoint_verify(entity this)
+{
entity cp;
float i, p;
float qual;
.float delay;
// weapon remove ent from df
-void target_init_verify()
+void target_init_verify(entity this)
{
entity trigger, targ;
for(trigger = world; (trigger = find(trigger, classname, "trigger_multiple")); )
}
// weapon give ent from defrag
-void target_give_init()
-{SELFPARAM();
+void target_give_init(entity this)
+{
entity targ;
for (targ = world; (targ = find(targ, targetname, self.target)); ) {
if (targ.classname == "weapon_rocketlauncher" || targ.classname == "weapon_devastator") {
GameLogEcho(strcat(":team:", ftos(player_id), ":", ftos(team_number), ":", ftos(type)));
}
-void default_delayedinit()
+void default_delayedinit(entity this)
{
if(!scores_initialized)
ScoreRules_generic();
void LogTeamchange(float player_id, float team_number, float type);
-void default_delayedinit();
+void default_delayedinit(entity this);
void ActivateTeamplay();
#include "tests.qh"
-void test_weapons_hurt() {
- SELFPARAM();
+void test_weapons_hurt(entity this)
+{
EXPECT_NE(100, this.health);
remove(this.enemy);
remove(this);