From: Mario Date: Sun, 27 Mar 2016 11:07:57 +0000 (+1000) Subject: Fix the use of self, activator and other globals in .use X-Git-Tag: xonotic-v0.8.2~945^2~9 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=a07691e754aa071189c034693af3476777d86720 Fix the use of self, activator and other globals in .use --- diff --git a/qcsrc/client/commands/cl_cmd.qc b/qcsrc/client/commands/cl_cmd.qc index 6dadff2f3c..45444c8791 100644 --- a/qcsrc/client/commands/cl_cmd.qc +++ b/qcsrc/client/commands/cl_cmd.qc @@ -252,7 +252,7 @@ void QuickMenu_Close(); bool QuickMenu_Open(string mode, string submenu); bool HUD_MinigameMenu_IsOpened(); -void HUD_MinigameMenu_Close(); +void HUD_MinigameMenu_Close(entity this, entity actor, entity trigger); void HUD_MinigameMenu_Open(); void HUD_Radar_Show_Maximized(bool doshow, bool clickable); diff --git a/qcsrc/client/main.qc b/qcsrc/client/main.qc index 98b266c6d1..7cbe6e125f 100644 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@ -213,7 +213,7 @@ void Shutdown() } deactivate_minigame(); - HUD_MinigameMenu_Close(); + HUD_MinigameMenu_Close(NULL, NULL, NULL); } .float has_team; diff --git a/qcsrc/common/debug.qh b/qcsrc/common/debug.qh index 40b2b3547e..e20139aacc 100644 --- a/qcsrc/common/debug.qh +++ b/qcsrc/common/debug.qh @@ -116,7 +116,7 @@ bool autocvar_debugdraw; // if (it.maxs) break; // if (it.size) break; // if (it.touch) break; -// if (it.use) break; +// if (it.use1) break; // if (it.think) break; // if (it.blocked) break; // if (it.nextthink) break; diff --git a/qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qc b/qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qc index 4fc4a982cb..212420753d 100644 --- a/qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qc +++ b/qcsrc/common/gamemodes/gamemode/onslaught/onslaught.qc @@ -546,10 +546,7 @@ void ons_ControlPoint_Icon_Damage(entity this, entity inflictor, entity attacker onslaught_updatelinks(); // Use targets now (somebody make sure this is in the right place..) - setself(this.owner); - activator = this; - WITHSELF(this, SUB_UseTargets()); - setself(this); + SUB_UseTargets(this.owner, this, NULL); this.owner.waslinked = this.owner.islinked; if(this.owner.model != "models/onslaught/controlpoint_pad.md3") @@ -611,10 +608,7 @@ void ons_ControlPoint_Icon_Think() if(!self.owner.islinked) self.owner.team = 0; - setself(self.owner); - activator = self; - SUB_UseTargets (); - setself(this); + SUB_UseTargets(self.owner, self, NULL); self.owner.team = t; @@ -676,10 +670,7 @@ void ons_ControlPoint_Icon_BuildThink() onslaught_updatelinks(); // Use targets now (somebody make sure this is in the right place..) - setself(self.owner); - activator = self; - SUB_UseTargets (); - setself(this); + SUB_UseTargets(self.owner, self, NULL); self.SendFlags |= CPSF_SETUP; } @@ -849,8 +840,7 @@ void ons_ControlPoint_Reset(entity this) onslaught_updatelinks(); - activator = this; - SUB_UseTargets(); // to reset the structures, playerspawns etc. + SUB_UseTargets(this, this, NULL); // to reset the structures, playerspawns etc. CSQCMODEL_AUTOUPDATE(this); } @@ -1953,23 +1943,22 @@ MUTATOR_HOOKFUNCTION(ons, MonsterMove) void ons_MonsterSpawn_Delayed() {SELFPARAM(); - entity e, own = self.owner; + entity own = this.owner; - if(!own) { remove(self); return; } + if(!own) { remove(this); return; } if(own.targetname) { - e = find(world, target, own.targetname); + entity e = find(world, target, own.targetname); if(e != world) { own.team = e.team; - activator = e; - own.use(); + own.use1(own, e, NULL); } } - remove(self); + remove(this); } MUTATOR_HOOKFUNCTION(ons, MonsterSpawn) @@ -1983,20 +1972,19 @@ MUTATOR_HOOKFUNCTION(ons, MonsterSpawn) void ons_TurretSpawn_Delayed() {SELFPARAM(); - entity e, own = self.owner; + entity own = self.owner; if(!own) { remove(self); return; } if(own.targetname) { - e = find(world, target, own.targetname); + entity e = find(world, target, own.targetname); if(e != world) { own.team = e.team; own.active = ACTIVE_NOT; - activator = e; - own.use(); + own.use1(own, e, NULL); } } diff --git a/qcsrc/common/minigames/cl_minigames.qc b/qcsrc/common/minigames/cl_minigames.qc index 6f7e7c3ae9..f080e90d06 100644 --- a/qcsrc/common/minigames/cl_minigames.qc +++ b/qcsrc/common/minigames/cl_minigames.qc @@ -98,7 +98,7 @@ void deactivate_minigame() if ( auto_close_minigamemenu ) { - HUD_MinigameMenu_Close(); + HUD_MinigameMenu_Close(NULL, NULL, NULL); auto_close_minigamemenu = 0; } else @@ -393,7 +393,7 @@ MUTATOR_HOOKFUNCTION(minigames, HUD_Command) if(argv(1) == "minigame") { if (HUD_MinigameMenu_IsOpened()) - HUD_MinigameMenu_Close(); + HUD_MinigameMenu_Close(NULL, NULL, NULL); else HUD_MinigameMenu_Open(); return true; diff --git a/qcsrc/common/minigames/cl_minigames.qh b/qcsrc/common/minigames/cl_minigames.qh index e3c7df18f3..4359dba226 100644 --- a/qcsrc/common/minigames/cl_minigames.qh +++ b/qcsrc/common/minigames/cl_minigames.qh @@ -100,7 +100,7 @@ void minigame_cmd_workaround(float dummy, string...cmdargc); void minigame_prompt(); float HUD_MinigameMenu_IsOpened(); -void HUD_MinigameMenu_Close(); +void HUD_MinigameMenu_Close(entity this, entity actor, entity trigger); float HUD_Minigame_Showpanels(); // Adds a game-specific entry to the menu void HUD_MinigameMenu_CustomEntry(entity parent, string message, string event_arg); diff --git a/qcsrc/common/minigames/cl_minigames_hud.qc b/qcsrc/common/minigames/cl_minigames_hud.qc index ca2a0ed17c..23ac4539f4 100644 --- a/qcsrc/common/minigames/cl_minigames_hud.qc +++ b/qcsrc/common/minigames/cl_minigames_hud.qc @@ -112,10 +112,10 @@ entity HUD_MinigameMenu_activeitem; // Click the given item void HUD_MinigameMenu_Click(entity menuitem) -{SELFPARAM(); +{ if ( menuitem ) { - WITHSELF(menuitem, menuitem.use()); + menuitem.use1(menuitem, NULL, NULL); } } @@ -146,7 +146,7 @@ void HUD_MinigameMenu_EraseEntry ( entity e ) } // Minigame menu options: create entry -entity HUD_MinigameMenu_SpawnEntry(string s, vector offset, vector fontsize, vector color,void() click) +entity HUD_MinigameMenu_SpawnEntry(string s, vector offset, vector fontsize, vector color,void(entity, entity, entity) click) { entity entry = spawn(); entry.message = s; @@ -154,13 +154,13 @@ entity HUD_MinigameMenu_SpawnEntry(string s, vector offset, vector fontsize, vec entry.size = fontsize; entry.colormod = color; entry.flags = 0; - entry.use = click; + entry.use1 = click; panel_pos_y += fontsize_y; return entry; } // Spawn a child entry of a collapsable entry -entity HUD_MinigameMenu_SpawnSubEntry(string s, void() click, entity parent) +entity HUD_MinigameMenu_SpawnSubEntry(string s, void(entity, entity, entity) click, entity parent) { vector item_fontsize = hud_fontsize*1.25; vector item_offset = '1 0 0' * item_fontsize_x; @@ -171,43 +171,43 @@ entity HUD_MinigameMenu_SpawnSubEntry(string s, void() click, entity parent) } // Click action for Create sub-entries -void HUD_MinigameMenu_ClickCreate_Entry() -{SELFPARAM(); - minigame_cmd("create ",self.netname); +void HUD_MinigameMenu_ClickCreate_Entry(entity this, entity actor, entity trigger) +{ + minigame_cmd("create ", this.netname); } // Helper click action for collapsible entries // returns true when you have to create the sub-entries -bool HUD_MinigameMenu_Click_ExpandCollapse() -{SELFPARAM(); +bool HUD_MinigameMenu_Click_ExpandCollapse(entity this) +{ entity e; - if ( self.flags & 2 ) + if ( this.flags & 2 ) { if ( HUD_MinigameMenu_activeitem && - HUD_MinigameMenu_activeitem.owner == self ) + HUD_MinigameMenu_activeitem.owner == this ) HUD_MinigameMenu_activeitem = world; - self.flags &= ~2; - for ( e = self.list_next; e != world && e.owner == self; e = self.list_next ) + this.flags &= ~2; + for ( e = this.list_next; e != world && e.owner == this; e = this.list_next ) { if ( e.flags & 2 ) HUD_MinigameMenu_Click(e); - self.list_next = e.list_next; + this.list_next = e.list_next; remove(e); } - if ( self.list_next ) - self.list_next.list_prev = self; + if ( this.list_next ) + this.list_next.list_prev = this; else - HUD_MinigameMenu_last_entry = self; + HUD_MinigameMenu_last_entry = this; } else { for ( e = HUD_MinigameMenu_entries; e != world; e = e.list_next ) { - if ( e.flags & 2 && e.origin_x == self.origin_x) + if ( e.flags & 2 && e.origin_x == this.origin_x) HUD_MinigameMenu_Click(e); } - self.flags |= 2; + this.flags |= 2; return true; } @@ -215,14 +215,14 @@ bool HUD_MinigameMenu_Click_ExpandCollapse() } // Click action for the Create menu -void HUD_MinigameMenu_ClickCreate() -{SELFPARAM(); - if ( HUD_MinigameMenu_Click_ExpandCollapse() ) +void HUD_MinigameMenu_ClickCreate(entity this, entity actor, entity trigger) +{ + if ( HUD_MinigameMenu_Click_ExpandCollapse(this) ) { entity curr; - entity prev = self; + entity prev = this; FOREACH(Minigames, true, { - curr = HUD_MinigameMenu_SpawnSubEntry(it.message, HUD_MinigameMenu_ClickCreate_Entry, self); + curr = HUD_MinigameMenu_SpawnSubEntry(it.message, HUD_MinigameMenu_ClickCreate_Entry, this); curr.netname = it.netname; curr.model = strzone(minigame_texture(strcat(it.netname,"/icon"))); HUD_MinigameMenu_InsertEntry( curr, prev ); @@ -232,26 +232,26 @@ void HUD_MinigameMenu_ClickCreate() } // Click action for Join sub-entries -void HUD_MinigameMenu_ClickJoin_Entry() -{SELFPARAM(); - minigame_cmd("join ",self.netname); - HUD_MinigameMenu_EraseEntry(self); +void HUD_MinigameMenu_ClickJoin_Entry(entity this, entity actor, entity trigger) +{ + minigame_cmd("join ",this.netname); + HUD_MinigameMenu_EraseEntry(this); } // Click action for the Join menu -void HUD_MinigameMenu_ClickJoin() -{SELFPARAM(); - if ( HUD_MinigameMenu_Click_ExpandCollapse() ) +void HUD_MinigameMenu_ClickJoin(entity this, entity actor, entity trigger) +{ + if ( HUD_MinigameMenu_Click_ExpandCollapse(this) ) { entity e = world; entity curr; - entity prev = self; + entity prev = this; while( (e = find(e,classname,"minigame")) ) { if ( e != active_minigame ) { curr = HUD_MinigameMenu_SpawnSubEntry( - e.netname, HUD_MinigameMenu_ClickJoin_Entry, self ); + e.netname, HUD_MinigameMenu_ClickJoin_Entry, this ); curr.netname = e.netname; curr.model = strzone(minigame_texture(strcat(e.descriptor.netname,"/icon"))); HUD_MinigameMenu_InsertEntry( curr, prev ); @@ -268,22 +268,22 @@ void HUD_MinigameMenu_ClickNoop() }*/ // Click action for Quit -void HUD_MinigameMenu_ClickQuit() +void HUD_MinigameMenu_ClickQuit(entity this, entity actor, entity trigger) { deactivate_minigame(); minigame_cmd("end"); } // Click action for Invite sub-entries -void HUD_MinigameMenu_ClickInvite_Entry() -{SELFPARAM(); - minigame_cmd("invite #",self.netname); +void HUD_MinigameMenu_ClickInvite_Entry(entity this, entity actor, entity trigger) +{ + minigame_cmd("invite #",this.netname); } // Click action for the Invite menu -void HUD_MinigameMenu_ClickInvite() -{SELFPARAM(); - if ( HUD_MinigameMenu_Click_ExpandCollapse() ) +void HUD_MinigameMenu_ClickInvite(entity this, entity actor, entity trigger) +{ + if ( HUD_MinigameMenu_Click_ExpandCollapse(this) ) { entity e; entity prev = self; @@ -305,10 +305,10 @@ void HUD_MinigameMenu_ClickInvite() } } -void HUD_MinigameMenu_ClickCustomEntry() -{SELFPARAM(); +void HUD_MinigameMenu_ClickCustomEntry(entity this, entity actor, entity trigger) +{ if ( active_minigame ) - active_minigame.minigame_event(active_minigame,"menu_click",self.netname); + active_minigame.minigame_event(active_minigame,"menu_click",this.netname); } // Adds a game-specific entry to the menu @@ -322,17 +322,17 @@ void HUD_MinigameMenu_CustomEntry(entity parent, string menumessage, string even } // Click action for the Current Game menu -void HUD_MinigameMenu_ClickCurrentGame() -{SELFPARAM(); - if ( HUD_MinigameMenu_Click_ExpandCollapse() ) +void HUD_MinigameMenu_ClickCurrentGame(entity this, entity actor, entity trigger) +{ + if ( HUD_MinigameMenu_Click_ExpandCollapse(this) ) { HUD_MinigameMenu_InsertEntry( HUD_MinigameMenu_SpawnSubEntry( - _("Quit"), HUD_MinigameMenu_ClickQuit, self ), self); + _("Quit"), HUD_MinigameMenu_ClickQuit, this ), this); - active_minigame.minigame_event(active_minigame,"menu_show",self); + active_minigame.minigame_event(active_minigame,"menu_show",this); HUD_MinigameMenu_InsertEntry( HUD_MinigameMenu_SpawnSubEntry( - _("Invite"), HUD_MinigameMenu_ClickInvite, self), self); + _("Invite"), HUD_MinigameMenu_ClickInvite, this), this); } } // Whether the minigame menu panel is open @@ -342,7 +342,7 @@ bool HUD_MinigameMenu_IsOpened() } // Close the minigame menu panel -void HUD_MinigameMenu_Close() +void HUD_MinigameMenu_Close(entity this, entity actor, entity trigger) { if ( HUD_MinigameMenu_IsOpened() ) { @@ -665,7 +665,7 @@ float HUD_Minigame_InputEvent(float bInputType, float nPrimary, float nSecondary } else if ( nPrimary == K_ESCAPE ) { - HUD_MinigameMenu_Close(); + HUD_MinigameMenu_Close(NULL, NULL, NULL); return true; } } diff --git a/qcsrc/common/monsters/monster/shambler.qc b/qcsrc/common/monsters/monster/shambler.qc index 3cfa18cdf4..eb3dfba988 100644 --- a/qcsrc/common/monsters/monster/shambler.qc +++ b/qcsrc/common/monsters/monster/shambler.qc @@ -105,6 +105,11 @@ void M_Shambler_Attack_Lightning_Explode() self.nextthink = time + 0.2; } +void M_Shambler_Attack_Lightning_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, M_Shambler_Attack_Lightning_Explode()); +} + void M_Shambler_Attack_Lightning_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { if (this.health <= 0) @@ -116,14 +121,14 @@ void M_Shambler_Attack_Lightning_Damage(entity this, entity inflictor, entity at this.health = this.health - damage; if (this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, this.use)); + W_PrepareExplosionByDamage(this, attacker, adaptor_think2use); } void M_Shambler_Attack_Lightning_Touch() {SELFPARAM(); PROJECTILE_TOUCH; - self.use (); + self.use1(this, NULL, NULL); } void M_Shambler_Attack_Lightning_Think() @@ -157,7 +162,7 @@ void M_Shambler_Attack_Lightning(entity this) gren.cnt = time + 5; gren.nextthink = time; gren.think = M_Shambler_Attack_Lightning_Think; - gren.use = M_Shambler_Attack_Lightning_Explode; + gren.use1 = M_Shambler_Attack_Lightning_Explode_use; gren.touch = M_Shambler_Attack_Lightning_Touch; gren.takedamage = DAMAGE_YES; diff --git a/qcsrc/common/monsters/monster/spider.qc b/qcsrc/common/monsters/monster/spider.qc index 9b0541c14e..c477d3ea66 100644 --- a/qcsrc/common/monsters/monster/spider.qc +++ b/qcsrc/common/monsters/monster/spider.qc @@ -151,6 +151,11 @@ void M_Spider_Attack_Web_Explode() } } +void M_Spider_Attack_Web_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, M_Spider_Attack_Web_Explode()); +} + void M_Spider_Attack_Web_Touch() { PROJECTILE_TOUCH; @@ -168,7 +173,7 @@ void M_Spider_Attack_Web(entity this) entity proj = new(plasma); proj.owner = proj.realowner = this; - proj.use = M_Spider_Attack_Web_Explode; + proj.use1 = M_Spider_Attack_Web_Explode_use; proj.think = adaptor_think2use_hittype_splash; proj.bot_dodge = true; proj.bot_dodgerating = 0; diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index 9d1022fa36..d1276fa52f 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -548,9 +548,9 @@ void Monster_Dead_Fade(entity this) } } -void Monster_Use() -{SELFPARAM(); - if(Monster_ValidTarget(this, activator)) { this.enemy = activator; } +void Monster_Use(entity this, entity actor, entity trigger) +{ + if(Monster_ValidTarget(this, actor)) { this.enemy = actor; } } vector Monster_Move_Target(entity this, entity targ) @@ -931,9 +931,9 @@ void Monster_Dead_Think() } } -void Monster_Appear() -{SELFPARAM(); - this.enemy = activator; +void Monster_Appear(entity this, entity actor, entity trigger) +{ + this.enemy = actor; this.spawnflags &= ~MONSTERFLAG_APPEAR; // otherwise, we get an endless loop Monster_Spawn(this, this.monsterid); } @@ -946,7 +946,7 @@ bool Monster_Appear_Check(entity this, int monster_id) this.think = func_null; this.monsterid = monster_id; // set so this monster is properly registered (otherwise, normal initialization is used) this.nextthink = 0; - this.use = Monster_Appear; + this.use1 = Monster_Appear; this.flags = FL_MONSTER; // set so this monster can get butchered return true; @@ -1102,9 +1102,7 @@ void Monster_Damage(entity this, entity inflictor, entity attacker, float damage this.candrop = false; // killed by mobkill command // TODO: fix this? - activator = attacker; - other = this.enemy; - WITHSELF(this, SUB_UseTargets()); + SUB_UseTargets(this, attacker, this.enemy); this.target2 = this.oldtarget2; // reset to original target on death, incase we respawn Monster_Dead(this, attacker, (this.health <= -100 || deathtype == DEATH_KILL.m_id)); @@ -1334,7 +1332,7 @@ bool Monster_Spawn(entity this, int mon_id) this.monsterid = mon_id; this.event_damage = Monster_Damage; this.touch = Monster_Touch; - this.use = Monster_Use; + this.use1 = Monster_Use; this.solid = SOLID_BBOX; this.movetype = MOVETYPE_WALK; this.spawnshieldtime = time + autocvar_g_monsters_spawnshieldtime; diff --git a/qcsrc/common/mutators/mutator/nades/nades.qc b/qcsrc/common/mutators/mutator/nades/nades.qc index 8d17edb0b6..a66597d3d7 100644 --- a/qcsrc/common/mutators/mutator/nades/nades.qc +++ b/qcsrc/common/mutators/mutator/nades/nades.qc @@ -804,7 +804,7 @@ void nade_damage(entity this, entity inflictor, entity attacker, float damage, i this.realowner = attacker; if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, nade_boom)); + W_PrepareExplosionByDamage(this, attacker, nade_boom); else nade_burn_spawn(this); } diff --git a/qcsrc/common/mutators/mutator/overkill/rpc.qc b/qcsrc/common/mutators/mutator/overkill/rpc.qc index 5a06302d9f..2d9d423cf5 100644 --- a/qcsrc/common/mutators/mutator/overkill/rpc.qc +++ b/qcsrc/common/mutators/mutator/overkill/rpc.qc @@ -80,7 +80,7 @@ void W_RocketPropelledChainsaw_Damage(entity this, entity inflictor, entity atta this.health = this.health - damage; if (this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, W_RocketPropelledChainsaw_Explode)); + W_PrepareExplosionByDamage(this, attacker, W_RocketPropelledChainsaw_Explode); } void W_RocketPropelledChainsaw_Think() diff --git a/qcsrc/common/t_items.qc b/qcsrc/common/t_items.qc index 75fec0103e..8467576275 100644 --- a/qcsrc/common/t_items.qc +++ b/qcsrc/common/t_items.qc @@ -1421,29 +1421,31 @@ spawnfunc(item_invincible) // compatibility: spawnfunc(item_quad) { this.classname = "item_strength";spawnfunc_item_strength(this);} -void target_items_use() -{SELFPARAM(); - if(activator.classname == "droppedweapon") +void target_items_use(entity this, entity actor, entity trigger) +{ + other = trigger; // TODO + + if(actor.classname == "droppedweapon") { EXACTTRIGGER_TOUCH; - remove(activator); + remove(actor); return; } - if (!IS_PLAYER(activator)) + if (!IS_PLAYER(actor)) return; - if(IS_DEAD(activator)) + if(IS_DEAD(actor)) return; EXACTTRIGGER_TOUCH; - FOREACH_ENTITY_ENT(enemy, activator, + FOREACH_ENTITY_ENT(enemy, actor, { if(it.classname == "droppedweapon") remove(it); }); - if(GiveItems(activator, 0, tokenize_console(self.netname))) - centerprint(activator, self.message); + if(GiveItems(actor, 0, tokenize_console(this.netname))) + centerprint(actor, this.message); } spawnfunc(target_items) @@ -1451,7 +1453,7 @@ spawnfunc(target_items) float n, i; string s; - self.use = target_items_use; + self.use1 = target_items_use; if(!self.strength_finished) self.strength_finished = autocvar_g_balance_powerup_strength_time; if(!self.invincible_finished) diff --git a/qcsrc/common/t_items.qh b/qcsrc/common/t_items.qh index d6c97445f6..2259ead630 100644 --- a/qcsrc/common/t_items.qh +++ b/qcsrc/common/t_items.qh @@ -114,8 +114,6 @@ float commodity_pickupevalfunc(entity player, entity item); void _StartItem(entity this, entity def, float defaultrespawntime, float defaultrespawntimejitter); -void target_items_use (); - float GiveWeapon(entity e, float wpn, float op, float val); float GiveBit(entity e, .float fld, float bit, float op, float val); diff --git a/qcsrc/common/triggers/func/breakable.qc b/qcsrc/common/triggers/func/breakable.qc index feaf878509..112d7ccf17 100644 --- a/qcsrc/common/triggers/func/breakable.qc +++ b/qcsrc/common/triggers/func/breakable.qc @@ -137,7 +137,7 @@ void func_breakable_behave_destroyed() self.event_damage = func_null; self.state = 1; if(self.spawnflags & 4) - self.use = func_null; + self.use1 = func_null; func_breakable_colormod(); if (self.noise1) stopsound (self, CH_TRIGGER_SINGLE); @@ -181,49 +181,59 @@ void func_breakable_destroyed() CSQCMODEL_AUTOUPDATE(self); } -void func_breakable_restore() -{SELFPARAM(); - func_breakable_look_restore(); - func_breakable_behave_restore(); +void func_breakable_restore(entity this, entity actor, entity trigger) +{ + WITHSELF(this, func_breakable_look_restore()); + WITHSELF(this, func_breakable_behave_restore()); - CSQCMODEL_AUTOUPDATE(self); + CSQCMODEL_AUTOUPDATE(this); } -vector debrisforce; // global, set before calling this -void func_breakable_destroy() +void func_breakable_restore_self() {SELFPARAM(); + func_breakable_restore(this, NULL, NULL); +} + +vector debrisforce; // global, set before calling this +void func_breakable_destroy(entity this, entity actor, entity trigger) +{ float n, i; string oldmsg; - activator = self.owner; - self.owner = world; // set by W_PrepareExplosionByDamage + entity act = this.owner; + this.owner = world; // set by W_PrepareExplosionByDamage // now throw around the debris - n = tokenize_console(self.debris); + n = tokenize_console(this.debris); for(i = 0; i < n; ++i) LaunchDebris(argv(i), debrisforce); func_breakable_destroyed(); - if(self.noise) - _sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTEN_NORM); + if(this.noise) + _sound (this, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM); - if(self.dmg) - RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, world, self.dmg_force, DEATH_HURTTRIGGER.m_id, world); + if(this.dmg) + RadiusDamage(this, act, this.dmg, this.dmg_edge, this.dmg_radius, this, world, this.dmg_force, DEATH_HURTTRIGGER.m_id, world); - if(self.cnt) // TODO - __pointparticles(self.cnt, self.absmin * 0.5 + self.absmax * 0.5, '0 0 0', self.count); + if(this.cnt) // TODO + __pointparticles(this.cnt, this.absmin * 0.5 + this.absmax * 0.5, '0 0 0', this.count); - if(self.respawntime) + if(this.respawntime) { - self.think = func_breakable_restore; - self.nextthink = time + self.respawntime + crandom() * self.respawntimejitter; + this.think = func_breakable_restore_self; + this.nextthink = time + this.respawntime + crandom() * this.respawntimejitter; } - oldmsg = self.message; - self.message = ""; - SUB_UseTargets(); - self.message = oldmsg; + oldmsg = this.message; + this.message = ""; + SUB_UseTargets(this, act, trigger); + this.message = oldmsg; +} + +void func_breakable_destroy_self() +{SELFPARAM(); + func_breakable_destroy(this, NULL, NULL); } void func_breakable_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) @@ -261,18 +271,18 @@ void func_breakable_damage(entity this, entity inflictor, entity attacker, float // do not explode NOW but in the NEXT FRAME! // because recursive calls to RadiusDamage are not allowed this.nextthink = time; - this.think = func_breakable_destroy; + this.think = func_breakable_destroy_self; } } void func_breakable_reset(entity this) { this.team = this.team_saved; - func_breakable_look_restore(); + WITHSELF(this, func_breakable_look_restore()); if(this.spawnflags & 1) - func_breakable_behave_destroyed(); + WITHSELF(this, func_breakable_behave_destroyed()); else - func_breakable_behave_restore(); + WITHSELF(this, func_breakable_behave_restore()); CSQCMODEL_AUTOUPDATE(this); } @@ -312,9 +322,9 @@ spawnfunc(func_breakable) SetBrushEntityModel(); if(this.spawnflags & 4) - this.use = func_breakable_destroy; + this.use1 = func_breakable_destroy; else - this.use = func_breakable_restore; + this.use1 = func_breakable_restore; if(this.spawnflags & 4) { diff --git a/qcsrc/common/triggers/func/button.qc b/qcsrc/common/triggers/func/button.qc index e9ae0a5472..ba612713c0 100644 --- a/qcsrc/common/triggers/func/button.qc +++ b/qcsrc/common/triggers/func/button.qc @@ -9,8 +9,7 @@ void button_wait() self.state = STATE_TOP; self.SUB_NEXTTHINK = self.SUB_LTIME + self.wait; self.SUB_THINK = button_return; - activator = self.enemy; - SUB_UseTargets(); + SUB_UseTargets(self, self.enemy, NULL); self.frame = 1; // use alternate textures } @@ -60,13 +59,13 @@ void button_reset() self.takedamage = DAMAGE_YES; // can be shot again } -void button_use() -{SELFPARAM(); - if(self.active != ACTIVE_ACTIVE) +void button_use(entity this, entity actor, entity trigger) +{ + if(this.active != ACTIVE_ACTIVE) return; - self.enemy = activator; - button_fire (); + this.enemy = actor; + WITHSELF(this, button_fire()); } void button_touch() @@ -121,7 +120,7 @@ spawnfunc(func_button) self.effects |= EF_LOWPRECISION; self.blocked = button_blocked; - self.use = button_use; + self.use1 = button_use; // if (self.health == 0) // all buttons are now shootable // self.health = 10; diff --git a/qcsrc/common/triggers/func/conveyor.qc b/qcsrc/common/triggers/func/conveyor.qc index 583c737438..93b6502de5 100644 --- a/qcsrc/common/triggers/func/conveyor.qc +++ b/qcsrc/common/triggers/func/conveyor.qc @@ -58,11 +58,11 @@ void conveyor_think() #ifdef SVQC -void conveyor_use() -{SELFPARAM(); - self.state = !self.state; +void conveyor_use(entity this, entity actor, entity trigger) +{ + this.state = !this.state; - self.SendFlags |= 2; + this.SendFlags |= 2; } void conveyor_reset(entity this) @@ -116,7 +116,7 @@ void conveyor_init() this.nextthink = time; IFTARGETED { - this.use = conveyor_use; + this.use1 = conveyor_use; this.reset = conveyor_reset; this.reset(this); } diff --git a/qcsrc/common/triggers/func/door.qc b/qcsrc/common/triggers/func/door.qc index 0b250ef32e..af7cd8e268 100644 --- a/qcsrc/common/triggers/func/door.qc +++ b/qcsrc/common/triggers/func/door.qc @@ -141,7 +141,7 @@ void door_go_up() string oldmessage; oldmessage = self.message; self.message = ""; - SUB_UseTargets(); + SUB_UseTargets(self, NULL, NULL); self.message = oldmessage; } @@ -206,16 +206,15 @@ bool door_check_keys(entity door, entity player) return false; } -void door_fire() -{SELFPARAM(); - entity starte; - - if (self.owner != self) - objerror ("door_fire: self.owner != self"); +void door_fire(entity this, entity actor, entity trigger) +{ + entity starte; + if (this.owner != this) + objerror ("door_fire: this.owner != this"); - if (self.spawnflags & DOOR_TOGGLE) + if (this.spawnflags & DOOR_TOGGLE) { - if (self.state == STATE_UP || self.state == STATE_TOP) + if (this.state == STATE_UP || this.state == STATE_TOP) { starte = self; do @@ -262,14 +261,12 @@ void door_fire() setself(this); } -void door_use() -{SELFPARAM(); +void door_use(entity this, entity actor, entity trigger) +{ //dprint("door_use (model: ");dprint(self.model);dprint(")\n"); - if (self.owner) - { - WITHSELF(self.owner, door_fire()); - } + if (this.owner) + WITHSELF(this.owner, door_fire(this.owner, actor, trigger)); } void door_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) @@ -289,7 +286,7 @@ void door_damage(entity this, entity inflictor, entity attacker, float damage, i { this.owner.health = this.owner.max_health; this.owner.takedamage = DAMAGE_NO; // wil be reset upon return - WITHSELF(this.owner, door_use()); + door_use(this.owner, NULL, NULL); } } @@ -415,7 +412,7 @@ void door_rotating_go_up() string oldmessage; oldmessage = self.message; self.message = ""; - SUB_UseTargets(); + SUB_UseTargets(self, NULL, other); // TODO: is other needed here? self.message = oldmessage; } @@ -447,10 +444,7 @@ void door_trigger_touch() self.door_finished = time + 1; - activator = other; - - setself(self.owner); - door_use (); + door_use(this.owner, other, NULL); } void door_spawnfield(vector fmins, vector fmaxs) @@ -744,7 +738,7 @@ spawnfunc(func_door) precache_sound(self.noise3); self.blocked = door_blocked; - self.use = door_use; + self.use1 = door_use; if(self.dmg && (self.message == "")) self.message = "was squished"; @@ -848,7 +842,7 @@ NET_HANDLE(ENT_CLIENT_DOOR, bool isnew) this.trigger_touch = door_touch; this.draw = door_draw; this.drawmask = MASK_NORMAL; - this.use = door_use; + this.use1 = door_use; LinkDoors(); diff --git a/qcsrc/common/triggers/func/door_rotating.qc b/qcsrc/common/triggers/func/door_rotating.qc index 4f88e9e9b5..d729c9339a 100644 --- a/qcsrc/common/triggers/func/door_rotating.qc +++ b/qcsrc/common/triggers/func/door_rotating.qc @@ -72,7 +72,7 @@ spawnfunc(func_door_rotating) self.classname = "door_rotating"; self.blocked = door_blocked; - self.use = door_use; + self.use1 = door_use; if(self.spawnflags & 8) self.dmg = 10000; diff --git a/qcsrc/common/triggers/func/door_secret.qc b/qcsrc/common/triggers/func/door_secret.qc index 70b5a0a09e..0091448af0 100644 --- a/qcsrc/common/triggers/func/door_secret.qc +++ b/qcsrc/common/triggers/func/door_secret.qc @@ -13,59 +13,59 @@ const float SECRET_1ST_DOWN = 4; // 1st move is down from arrow const float SECRET_NO_SHOOT = 8; // only opened by trigger const float SECRET_YES_SHOOT = 16; // shootable even if targeted -void fd_secret_use() -{SELFPARAM(); +void fd_secret_use(entity this, entity actor, entity trigger) +{ float temp; string message_save; - self.health = 10000; - self.bot_attack = true; + this.health = 10000; + this.bot_attack = true; // exit if still moving around... - if (self.origin != self.oldorigin) + if (this.origin != this.oldorigin) return; - message_save = self.message; - self.message = ""; // no more message - SUB_UseTargets(); // fire all targets / killtargets - self.message = message_save; + message_save = this.message; + this.message = ""; // no more message + SUB_UseTargets(this, actor, trigger); // fire all targets / killtargets + this.message = message_save; - self.velocity = '0 0 0'; + this.velocity = '0 0 0'; // Make a sound, wait a little... - if (self.noise1 != "") - _sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTEN_NORM); - self.SUB_NEXTTHINK = self.SUB_LTIME + 0.1; + if (this.noise1 != "") + _sound(this, CH_TRIGGER_SINGLE, this.noise1, VOL_BASE, ATTEN_NORM); + this.SUB_NEXTTHINK = this.SUB_LTIME + 0.1; - temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1 - makevectors(self.mangle); + temp = 1 - (this.spawnflags & SECRET_1ST_LEFT); // 1 or -1 + makevectors(this.mangle); - if (!self.t_width) + if (!this.t_width) { - if (self.spawnflags & SECRET_1ST_DOWN) - self.t_width = fabs(v_up * self.size); + if (this.spawnflags & SECRET_1ST_DOWN) + this.t_width = fabs(v_up * this.size); else - self.t_width = fabs(v_right * self.size); + this.t_width = fabs(v_right * this.size); } - if (!self.t_length) - self.t_length = fabs(v_forward * self.size); + if (!this.t_length) + this.t_length = fabs(v_forward * this.size); - if (self.spawnflags & SECRET_1ST_DOWN) - self.dest1 = self.origin - v_up * self.t_width; + if (this.spawnflags & SECRET_1ST_DOWN) + this.dest1 = this.origin - v_up * this.t_width; else - self.dest1 = self.origin + v_right * (self.t_width * temp); + this.dest1 = this.origin + v_right * (this.t_width * temp); - self.dest2 = self.dest1 + v_forward * self.t_length; - SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move1); - if (self.noise2 != "") - _sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTEN_NORM); + this.dest2 = this.dest1 + v_forward * this.t_length; + WITHSELF(this, SUB_CalcMove(this.dest1, TSPEED_LINEAR, this.speed, fd_secret_move1)); + if (this.noise2 != "") + _sound(this, CH_TRIGGER_SINGLE, this.noise2, VOL_BASE, ATTEN_NORM); } void fd_secret_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { - WITHSELF(this, fd_secret_use()); + fd_secret_use(this, NULL, NULL); } // Wait after first movement... @@ -216,7 +216,7 @@ spawnfunc(func_door_secret) this.touch = secret_touch; this.blocked = secret_blocked; this.speed = 50; - this.use = fd_secret_use; + this.use1 = fd_secret_use; IFTARGETED { } diff --git a/qcsrc/common/triggers/func/plat.qc b/qcsrc/common/triggers/func/plat.qc index ea546164ce..fcdc6518b3 100644 --- a/qcsrc/common/triggers/func/plat.qc +++ b/qcsrc/common/triggers/func/plat.qc @@ -171,7 +171,7 @@ NET_HANDLE(ENT_CLIENT_PLAT, bool isnew) this.movetype = MOVETYPE_PUSH; this.drawmask = MASK_NORMAL; this.draw = plat_draw; - this.use = plat_use; + this.use1 = plat_use; this.entremove = trigger_remove_generic; plat_reset(this); // also called here diff --git a/qcsrc/common/triggers/func/pointparticles.qc b/qcsrc/common/triggers/func/pointparticles.qc index 62b4d5a362..6c2bb43cbb 100644 --- a/qcsrc/common/triggers/func/pointparticles.qc +++ b/qcsrc/common/triggers/func/pointparticles.qc @@ -87,10 +87,10 @@ bool pointparticles_SendEntity(entity this, entity to, float fl) return 1; } -void pointparticles_use() -{SELFPARAM(); - self.state = !self.state; - self.SendFlags |= 2; +void pointparticles_use(entity this, entity actor, entity trigger) +{ + this.state = !this.state; + this.SendFlags |= 2; } void pointparticles_think() @@ -137,7 +137,7 @@ spawnfunc(func_pointparticles) IFTARGETED { - this.use = pointparticles_use; + this.use1 = pointparticles_use; this.reset = pointparticles_reset; this.reset(this); } diff --git a/qcsrc/common/triggers/func/rotating.qc b/qcsrc/common/triggers/func/rotating.qc index be2c7ed9c3..3f481ae78f 100644 --- a/qcsrc/common/triggers/func/rotating.qc +++ b/qcsrc/common/triggers/func/rotating.qc @@ -1,21 +1,20 @@ #ifdef SVQC -void func_rotating_setactive(float astate) -{SELFPARAM(); - +void func_rotating_setactive(entity this, int astate) +{ if (astate == ACTIVE_TOGGLE) { - if(self.active == ACTIVE_ACTIVE) - self.active = ACTIVE_NOT; + if(this.active == ACTIVE_ACTIVE) + this.active = ACTIVE_NOT; else - self.active = ACTIVE_ACTIVE; + this.active = ACTIVE_ACTIVE; } else - self.active = astate; + this.active = astate; - if(self.active == ACTIVE_NOT) - self.avelocity = '0 0 0'; + if(this.active == ACTIVE_NOT) + this.avelocity = '0 0 0'; else - self.avelocity = self.pos1; + this.avelocity = this.pos1; } /*QUAKED spawnfunc_func_rotating (0 .5 .8) ? - - X_AXIS Y_AXIS diff --git a/qcsrc/common/triggers/func/train.qc b/qcsrc/common/triggers/func/train.qc index 26ecc81f14..2a5a702117 100644 --- a/qcsrc/common/triggers/func/train.qc +++ b/qcsrc/common/triggers/func/train.qc @@ -1,11 +1,11 @@ .float train_wait_turning; void() train_next; #ifdef SVQC -void train_use(); +void train_use(entity this, entity actor, entity trigger); #endif void train_wait() {SELFPARAM(); - WITHSELF(self.enemy, SUB_UseTargets()); + SUB_UseTargets(this.enemy, NULL, NULL); self.enemy = world; // if turning is enabled, the train will turn toward the next point while waiting @@ -43,7 +43,7 @@ void train_wait() entity tg = find(world, targetname, self.target); if(tg.spawnflags & 4) { - self.use = train_use; + self.use1 = train_use; self.SUB_THINK = func_null; self.SUB_NEXTTHINK = 0; } @@ -176,12 +176,11 @@ void train_link() //Net_LinkEntity(self, 0, false, train_send); } -void train_use() +void train_use(entity this, entity actor, entity trigger) { - SELFPARAM(); - self.SUB_NEXTTHINK = self.SUB_LTIME + 1; - self.SUB_THINK = train_next; - self.use = func_null; // not again + this.SUB_NEXTTHINK = this.SUB_LTIME + 1; + this.SUB_THINK = train_next; + this.use1 = func_null; // not again } void func_train_find() @@ -225,7 +224,7 @@ spawnfunc(func_train) self.effects |= EF_LOWPRECISION; if(self.spawnflags & 4) - self.use = train_use; + self.use1 = train_use; if (self.spawnflags & 2) { diff --git a/qcsrc/common/triggers/misc/laser.qc b/qcsrc/common/triggers/misc/laser.qc index 0f05ce72a8..6ef45922fb 100644 --- a/qcsrc/common/triggers/misc/laser.qc +++ b/qcsrc/common/triggers/misc/laser.qc @@ -10,42 +10,42 @@ REGISTER_NET_LINKED(ENT_CLIENT_LASER) #ifdef SVQC .float modelscale; -void misc_laser_aim() -{SELFPARAM(); +void misc_laser_aim(entity this) +{ vector a; - if(self.enemy) + if(this.enemy) { - if(self.spawnflags & 2) + if(this.spawnflags & 2) { - if(self.enemy.origin != self.mangle) + if(this.enemy.origin != this.mangle) { - self.mangle = self.enemy.origin; - self.SendFlags |= 2; + this.mangle = this.enemy.origin; + this.SendFlags |= 2; } } else { - a = vectoangles(self.enemy.origin - self.origin); + a = vectoangles(this.enemy.origin - this.origin); a_x = -a_x; - if(a != self.mangle) + if(a != this.mangle) { - self.mangle = a; - self.SendFlags |= 2; + this.mangle = a; + this.SendFlags |= 2; } } } else { - if(self.angles != self.mangle) + if(this.angles != this.mangle) { - self.mangle = self.angles; - self.SendFlags |= 2; + this.mangle = this.angles; + this.SendFlags |= 2; } } - if(self.origin != self.oldorigin) + if(this.origin != this.oldorigin) { - self.SendFlags |= 1; - self.oldorigin = self.origin; + this.SendFlags |= 1; + this.oldorigin = this.origin; } } @@ -67,7 +67,7 @@ void misc_laser_think() if(!self.state) return; - misc_laser_aim(); + misc_laser_aim(this); if(self.enemy) { @@ -97,8 +97,7 @@ void misc_laser_think() { self.count = 1; - activator = self.enemy.pusher; - WITHSELF(self.enemy, SUB_UseTargets()); + SUB_UseTargets(self.enemy, self.enemy.pusher, NULL); } } else @@ -107,8 +106,7 @@ void misc_laser_think() { self.count = 0; - activator = self.enemy.pusher; - WITHSELF(self.enemy, SUB_UseTargets()); + SUB_UseTargets(self.enemy, self.enemy.pusher, NULL); } } } @@ -188,11 +186,11 @@ Keys: "dmg" damage per second (-1 for a laser that kills immediately) */ -void laser_use() -{SELFPARAM(); - self.state = !self.state; - self.SendFlags |= 4; - misc_laser_aim(); +void laser_use(entity this, entity actor, entity trigger) +{ + this.state = !this.state; + this.SendFlags |= 4; + misc_laser_aim(this); } void laser_reset(entity this) @@ -246,7 +244,7 @@ spawnfunc(misc_laser) { this.reset = laser_reset; this.reset(this); - this.use = laser_use; + this.use1 = laser_use; } else this.state = 1; diff --git a/qcsrc/common/triggers/platforms.qc b/qcsrc/common/triggers/platforms.qc index a2efc1142e..b9937f04d3 100644 --- a/qcsrc/common/triggers/platforms.qc +++ b/qcsrc/common/triggers/platforms.qc @@ -133,16 +133,16 @@ void plat_outside_touch() plat_go_down (); } -void plat_trigger_use() -{SELFPARAM(); +void plat_trigger_use(entity this, entity actor, entity trigger) +{ #ifdef SVQC - if (self.think) + if (this.think) return; // already activated #elif defined(CSQC) - if(self.move_think) + if(this.move_think) return; #endif - plat_go_down(); + WITHSELF(this, plat_go_down()); } @@ -176,12 +176,12 @@ void plat_crush() } } -void plat_use() -{SELFPARAM(); - self.use = func_null; - if (self.state != 4) +void plat_use(entity this, entity actor, entity trigger) +{ + this.use1 = func_null; + if (this.state != 4) objerror ("plat_use: not in up state"); - plat_go_down(); + WITHSELF(this, plat_go_down()); } .string sound1, sound2; @@ -192,13 +192,13 @@ void plat_reset(entity this) { setorigin (this, this.pos1); this.state = 4; - this.use = plat_use; + this.use1 = plat_use; } else { setorigin (this, this.pos2); this.state = 2; - this.use = plat_trigger_use; + this.use1 = plat_trigger_use; } #ifdef SVQC diff --git a/qcsrc/common/triggers/platforms.qh b/qcsrc/common/triggers/platforms.qh index e0a581b7cf..9a32e327a2 100644 --- a/qcsrc/common/triggers/platforms.qh +++ b/qcsrc/common/triggers/platforms.qh @@ -5,7 +5,7 @@ void() plat_center_touch; void() plat_outside_touch; -void() plat_trigger_use; +void plat_trigger_use(entity this, entity actor, entity trigger); void() plat_go_up; void() plat_go_down; void() plat_crush; diff --git a/qcsrc/common/triggers/subs.qc b/qcsrc/common/triggers/subs.qc index 87c9c32909..7d6ea9de98 100644 --- a/qcsrc/common/triggers/subs.qc +++ b/qcsrc/common/triggers/subs.qc @@ -2,7 +2,6 @@ void SUB_NullThink() { } void() SUB_CalcMoveDone; void() SUB_CalcAngleMoveDone; -//void() SUB_UseTargets; /* ================== diff --git a/qcsrc/common/triggers/subs.qh b/qcsrc/common/triggers/subs.qh index aebda5d0a3..557bc86212 100644 --- a/qcsrc/common/triggers/subs.qh +++ b/qcsrc/common/triggers/subs.qh @@ -36,6 +36,9 @@ #endif + +.void(entity this, entity actor, entity trigger) use1; + void SUB_SetFade (entity ent, float when, float fading_time); void SUB_VanishOrRemove (entity ent); diff --git a/qcsrc/common/triggers/target/changelevel.qc b/qcsrc/common/triggers/target/changelevel.qc index 69f444073f..3962957b3e 100644 --- a/qcsrc/common/triggers/target/changelevel.qc +++ b/qcsrc/common/triggers/target/changelevel.qc @@ -2,42 +2,40 @@ .string chmap, gametype; .entity chlevel_targ; - -void target_changelevel_use() +void target_changelevel_use(entity this, entity actor, entity trigger) { - SELFPARAM(); - if(self.spawnflags & 2) + if(this.spawnflags & 2) { // simply don't react if a non-player triggers it - if(!IS_PLAYER(activator)) { return; } + if(!IS_PLAYER(actor)) { return; } - activator.chlevel_targ = self; + actor.chlevel_targ = this; int plnum = 0; int realplnum = 0; // let's not count bots FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it), { ++realplnum; - if(it.chlevel_targ == self) + if(it.chlevel_targ == this) ++plnum; }); - if(plnum < ceil(realplnum * min(1, self.count))) // 70% of players + if(plnum < ceil(realplnum * min(1, this.count))) // 70% of players return; } - if(self.gametype != "") - MapInfo_SwitchGameType(MapInfo_Type_FromString(self.gametype)); + if(this.gametype != "") + MapInfo_SwitchGameType(MapInfo_Type_FromString(this.gametype)); - if (self.chmap == "") + if (this.chmap == "") localcmd("endmatch\n"); else - localcmd(strcat("changelevel ", self.chmap, "\n")); + localcmd(strcat("changelevel ", this.chmap, "\n")); } spawnfunc(target_changelevel) { - self.use = target_changelevel_use; + this.use1 = target_changelevel_use; - if(!self.count) { self.count = 0.7; } + if(!this.count) { this.count = 0.7; } } #endif diff --git a/qcsrc/common/triggers/target/music.qc b/qcsrc/common/triggers/target/music.qc index 5a4e86c48b..0b06efb265 100644 --- a/qcsrc/common/triggers/target/music.qc +++ b/qcsrc/common/triggers/target/music.qc @@ -44,23 +44,23 @@ void target_music_kill() WITHSELF(it, target_music_sendto(MSG_ALL, 0)); }); } -void target_music_use() +void target_music_use(entity this, entity actor, entity trigger) { - if(!activator) + if(!actor) return; - if(IS_REAL_CLIENT(activator)) + if(IS_REAL_CLIENT(actor)) { - msg_entity = activator; + msg_entity = actor; target_music_sendto(MSG_ONE, 1); } - FOREACH_CLIENT(IS_SPEC(it) && it.enemy == activator, { + FOREACH_CLIENT(IS_SPEC(it) && it.enemy == actor, { msg_entity = it; target_music_sendto(MSG_ONE, 1); }); } spawnfunc(target_music) { - self.use = target_music_use; + self.use1 = target_music_use; self.reset = target_music_reset; if(!self.volume) self.volume = 1; @@ -132,10 +132,10 @@ void trigger_music_reset(entity this) this.cnt = !(this.spawnflags & 1); this.SendFlags |= 0x80; } -void trigger_music_use() -{SELFPARAM(); - self.cnt = !self.cnt; - self.SendFlags |= 0x80; +void trigger_music_use(entity this, entity actor, entity trigger) +{ + this.cnt = !this.cnt; + this.SendFlags |= 0x80; } spawnfunc(trigger_music) { @@ -148,7 +148,7 @@ spawnfunc(trigger_music) } trigger_music_reset(this); - this.use = trigger_music_use; + this.use1 = trigger_music_use; this.reset = trigger_music_reset; Net_LinkEntity(this, false, 0, trigger_music_SendEntity); diff --git a/qcsrc/common/triggers/target/spawn.qc b/qcsrc/common/triggers/target/spawn.qc index 960e818b6d..3a8eb7b363 100644 --- a/qcsrc/common/triggers/target/spawn.qc +++ b/qcsrc/common/triggers/target/spawn.qc @@ -31,8 +31,8 @@ void target_spawn_helper_setsize() setsize(self, self.mins, self.maxs); } -void target_spawn_edit_entity(entity e, string msg, entity kt, entity t2, entity t3, entity t4, entity act) -{SELFPARAM(); +void target_spawn_edit_entity(entity this, entity e, string msg, entity kt, entity t2, entity t3, entity t4, entity act, entity trigger) +{ float i, n, valuefieldpos; string key, value, valuefield, valueoffset, valueoffsetrandom; entity valueent; @@ -97,7 +97,7 @@ void target_spawn_edit_entity(entity e, string msg, entity kt, entity t2, entity if(value == "self") { - valueent = self; + valueent = this; value = ""; } else if(value == "activator") @@ -107,7 +107,7 @@ void target_spawn_edit_entity(entity e, string msg, entity kt, entity t2, entity } else if(value == "other") { - valueent = other; + valueent = trigger; value = ""; } else if(value == "pusher") @@ -236,72 +236,72 @@ void target_spawn_edit_entity(entity e, string msg, entity kt, entity t2, entity } } -void target_spawn_useon(entity e) -{SELFPARAM(); - self.target_spawn_activator = activator; +void target_spawn_useon(entity e, entity this, entity actor, entity trigger) +{ + this.target_spawn_activator = actor; target_spawn_edit_entity( + this, e, - self.message, - find(world, targetname, self.killtarget), - find(world, targetname, self.target2), - find(world, targetname, self.target3), - find(world, targetname, self.target4), - activator + this.message, + find(world, targetname, this.killtarget), + find(world, targetname, this.target2), + find(world, targetname, this.target3), + find(world, targetname, this.target4), + actor, + trigger ); } -float target_spawn_cancreate() -{SELFPARAM(); +bool target_spawn_cancreate(entity this) +{ float c; entity e; - c = self.count; + c = this.count; if(c == 0) // no limit? - return 1; + return true; ++c; // increase count to not include MYSELF - for(e = world; (e = findfloat(e, target_spawn_id, self.target_spawn_id)); --c) + for(e = world; (e = findfloat(e, target_spawn_id, this.target_spawn_id)); --c) ; // if c now is 0, we have AT LEAST the given count (maybe more), so don't spawn any more if(c == 0) - return 0; - return 1; + return false; + return true; } -void target_spawn_use() -{SELFPARAM(); - entity e; - - if(self.target == "") +void target_spawn_use(entity this, entity actor, entity trigger) +{ + if(this.target == "") { // spawn new entity - if(!target_spawn_cancreate()) + if(!target_spawn_cancreate(this)) return; - e = spawn(); + entity e = spawn(); e.spawnfunc_checked = true; - target_spawn_useon(e); - e.target_spawn_id = self.target_spawn_id; + target_spawn_useon(e, this, actor, trigger); + e.target_spawn_id = this.target_spawn_id; } - else if(self.target == "*activator") + else if(this.target == "*activator") { // edit entity if(activator) - target_spawn_useon(activator); + target_spawn_useon(actor, this, actor, trigger); } else { // edit entity - for(e = world; (e = find(e, targetname, self.target)); ) - target_spawn_useon(e); + for(entity e = world; (e = find(e, targetname, this.target)); ) + target_spawn_useon(e, this, actor, trigger); } } void target_spawn_spawnfirst() {SELFPARAM(); - activator = self.target_spawn_activator; + entity act = self.target_spawn_activator; if(self.spawnflags & 2) - target_spawn_use(); + target_spawn_use(this, act, NULL); } void initialize_field_db() @@ -335,7 +335,7 @@ void initialize_field_db() spawnfunc(target_spawn) { initialize_field_db(); - self.use = target_spawn_use; + self.use1 = target_spawn_use; self.message = strzone(strreplace("'", "\"", self.message)); self.target_spawn_id = ++target_spawn_count; InitializeEntity(self, target_spawn_spawnfirst, INITPRIO_LAST); diff --git a/qcsrc/common/triggers/target/speaker.qc b/qcsrc/common/triggers/target/speaker.qc index 3c43b0e9ea..c095597e5e 100644 --- a/qcsrc/common/triggers/target/speaker.qc +++ b/qcsrc/common/triggers/target/speaker.qc @@ -1,21 +1,21 @@ #ifdef SVQC // TODO add a way to do looped sounds with sound(); then complete this entity -void target_speaker_use_off(); -void target_speaker_use_activator() -{SELFPARAM(); - if (!IS_REAL_CLIENT(activator)) +void target_speaker_use_off(entity this, entity actor, entity trigger); +void target_speaker_use_activator(entity this, entity actor, entity trigger) +{ + if (!IS_REAL_CLIENT(actor)) return; string snd; - if(substring(self.noise, 0, 1) == "*") + if(substring(this.noise, 0, 1) == "*") { - var .string sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1)); + var .string sample = GetVoiceMessageSampleField(substring(this.noise, 1, -1)); if(GetPlayerSoundSampleField_notFound) snd = SND(Null); - else if(activator.(sample) == "") + else if(actor.(sample) == "") snd = SND(Null); else { - tokenize_console(activator.(sample)); + tokenize_console(actor.(sample)); float n; n = stof(argv(1)); if(n > 0) @@ -25,23 +25,23 @@ void target_speaker_use_activator() } } else - snd = self.noise; - msg_entity = activator; - soundto(MSG_ONE, self, CH_TRIGGER, snd, VOL_BASE * self.volume, self.atten); + snd = this.noise; + msg_entity = actor; + soundto(MSG_ONE, this, CH_TRIGGER, snd, VOL_BASE * this.volume, this.atten); } -void target_speaker_use_on() -{SELFPARAM(); +void target_speaker_use_on(entity this, entity actor, entity trigger) +{ string snd; - if(substring(self.noise, 0, 1) == "*") + if(substring(this.noise, 0, 1) == "*") { - var .string sample = GetVoiceMessageSampleField(substring(self.noise, 1, -1)); + var .string sample = GetVoiceMessageSampleField(substring(this.noise, 1, -1)); if(GetPlayerSoundSampleField_notFound) snd = SND(Null); - else if(activator.(sample) == "") + else if(actor.(sample) == "") snd = SND(Null); else { - tokenize_console(activator.(sample)); + tokenize_console(actor.(sample)); float n; n = stof(argv(1)); if(n > 0) @@ -51,27 +51,27 @@ void target_speaker_use_on() } } else - snd = self.noise; - _sound(self, CH_TRIGGER_SINGLE, snd, VOL_BASE * self.volume, self.atten); - if(self.spawnflags & 3) - self.use = target_speaker_use_off; + snd = this.noise; + _sound(this, CH_TRIGGER_SINGLE, snd, VOL_BASE * this.volume, this.atten); + if(this.spawnflags & 3) + this.use1 = target_speaker_use_off; } -void target_speaker_use_off() -{SELFPARAM(); - sound(self, CH_TRIGGER_SINGLE, SND_Null, VOL_BASE * self.volume, self.atten); - self.use = target_speaker_use_on; +void target_speaker_use_off(entity this, entity actor, entity trigger) +{ + sound(this, CH_TRIGGER_SINGLE, SND_Null, VOL_BASE * this.volume, this.atten); + this.use1 = target_speaker_use_on; } void target_speaker_reset(entity this) { if(this.spawnflags & 1) // LOOPED_ON { - if(this.use == target_speaker_use_on) - target_speaker_use_on(); + if(this.use1 == target_speaker_use_on) + target_speaker_use_on(this, NULL, NULL); } else if(this.spawnflags & 2) { - if(this.use == target_speaker_use_off) - target_speaker_use_off(); + if(this.use1 == target_speaker_use_off) + target_speaker_use_off(this, NULL, NULL); } } @@ -98,19 +98,19 @@ spawnfunc(target_speaker) IFTARGETED { if(self.spawnflags & 8) // ACTIVATOR - self.use = target_speaker_use_activator; + self.use1 = target_speaker_use_activator; else if(self.spawnflags & 1) // LOOPED_ON { - target_speaker_use_on(); + target_speaker_use_on(self, NULL, NULL); self.reset = target_speaker_reset; } else if(self.spawnflags & 2) // LOOPED_OFF { - self.use = target_speaker_use_on; + self.use1 = target_speaker_use_on; self.reset = target_speaker_reset; } else - self.use = target_speaker_use_on; + self.use1 = target_speaker_use_on; } else if(self.spawnflags & 1) // LOOPED_ON { diff --git a/qcsrc/common/triggers/target/voicescript.qc b/qcsrc/common/triggers/target/voicescript.qc index 1d1816a774..b6ed6dcffa 100644 --- a/qcsrc/common/triggers/target/voicescript.qc +++ b/qcsrc/common/triggers/target/voicescript.qc @@ -9,13 +9,13 @@ void target_voicescript_clear(entity pl) pl.voicescript = world; } -void target_voicescript_use() -{SELFPARAM(); - if(activator.voicescript != self) +void target_voicescript_use(entity this, entity actor, entity trigger) +{ + if(actor.voicescript != this) { - activator.voicescript = self; - activator.voicescript_index = 0; - activator.voicescript_nextthink = time + self.delay; + actor.voicescript = this; + actor.voicescript_index = 0; + actor.voicescript_nextthink = time + this.delay; } } @@ -84,7 +84,7 @@ spawnfunc(target_voicescript) // delay: initial delay before the first message float i, n; - self.use = target_voicescript_use; + self.use1 = target_voicescript_use; n = tokenize_console(self.message); self.cnt = n / 2; diff --git a/qcsrc/common/triggers/teleporters.qh b/qcsrc/common/triggers/teleporters.qh index 0e9e23572f..6f2fa28a4a 100644 --- a/qcsrc/common/triggers/teleporters.qh +++ b/qcsrc/common/triggers/teleporters.qh @@ -30,7 +30,7 @@ entity teleport_first; #ifdef SVQC -void trigger_teleport_use(); +void trigger_teleport_use(entity this, entity actor, entity trigger); #define TDEATHLOOP(o) \ entity head; \ diff --git a/qcsrc/common/triggers/trigger/counter.qc b/qcsrc/common/triggers/trigger/counter.qc index d5811e479e..07e5de68c5 100644 --- a/qcsrc/common/triggers/trigger/counter.qc +++ b/qcsrc/common/triggers/trigger/counter.qc @@ -1,25 +1,25 @@ #ifdef SVQC -void counter_use() -{SELFPARAM(); - self.count -= 1; - if (self.count < 0) +void counter_use(entity this, entity actor, entity trigger) +{ + this.count -= 1; + if (this.count < 0) return; - if (self.count == 0) + if (this.count == 0) { - if(IS_PLAYER(activator) && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) - Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COMPLETED); + if(IS_PLAYER(actor) && (this.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) + Send_Notification(NOTIF_ONE, actor, MSG_CENTER, CENTER_SEQUENCE_COMPLETED); - self.enemy = activator; - multi_trigger (); + this.enemy = actor; + WITHSELF(this, multi_trigger ()); } else { - if(IS_PLAYER(activator) && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) - if(self.count >= 4) - Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COUNTER); + if(IS_PLAYER(actor) && (this.spawnflags & SPAWNFLAG_NOMESSAGE) == 0) + if(this.count >= 4) + Send_Notification(NOTIF_ONE, actor, MSG_CENTER, CENTER_SEQUENCE_COUNTER); else - Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COUNTER_FEWMORE, self.count); + Send_Notification(NOTIF_ONE, actor, MSG_CENTER, CENTER_SEQUENCE_COUNTER_FEWMORE, this.count); } } @@ -43,7 +43,7 @@ spawnfunc(trigger_counter) self.count = 2; self.cnt = self.count; - self.use = counter_use; + self.use1 = counter_use; self.reset = counter_reset; } #endif diff --git a/qcsrc/common/triggers/trigger/delay.qc b/qcsrc/common/triggers/trigger/delay.qc index fb341ebb77..3329fc37a2 100644 --- a/qcsrc/common/triggers/trigger/delay.qc +++ b/qcsrc/common/triggers/trigger/delay.qc @@ -1,8 +1,8 @@ #ifdef SVQC -void delay_use() -{SELFPARAM(); - self.think = SUB_UseTargets; - self.nextthink = self.wait; +void delay_use(entity this, entity actor, entity trigger) +{ + this.think = SUB_UseTargets_self; + this.nextthink = this.wait; } void delay_reset(entity this) @@ -16,7 +16,7 @@ spawnfunc(trigger_delay) if(!self.wait) self.wait = 1; - self.use = delay_use; + self.use1 = delay_use; self.reset = delay_reset; } #endif diff --git a/qcsrc/common/triggers/trigger/disablerelay.qc b/qcsrc/common/triggers/trigger/disablerelay.qc index a1f13d277e..137213f34a 100644 --- a/qcsrc/common/triggers/trigger/disablerelay.qc +++ b/qcsrc/common/triggers/trigger/disablerelay.qc @@ -1,21 +1,18 @@ #ifdef SVQC -void trigger_disablerelay_use() -{SELFPARAM(); - entity e; - - float a, b; - a = b = 0; +void trigger_disablerelay_use(entity this, entity actor, entity trigger) +{ + int a = 0, b = 0; - for(e = world; (e = find(e, targetname, self.target)); ) + for(entity e = world; (e = find(e, targetname, this.target)); ) { - if(e.use == SUB_UseTargets) + if(e.use1 == SUB_UseTargets) { - e.use = SUB_DontUseTargets; + e.use1 = SUB_DontUseTargets; ++a; } - else if(e.use == SUB_DontUseTargets) + else if(e.use1 == SUB_DontUseTargets) { - e.use = SUB_UseTargets; + e.use1 = SUB_UseTargets; ++b; } } @@ -26,6 +23,6 @@ void trigger_disablerelay_use() spawnfunc(trigger_disablerelay) { - self.use = trigger_disablerelay_use; + this.use1 = trigger_disablerelay_use; } #endif diff --git a/qcsrc/common/triggers/trigger/flipflop.qc b/qcsrc/common/triggers/trigger/flipflop.qc index d2549f6c50..8265d12351 100644 --- a/qcsrc/common/triggers/trigger/flipflop.qc +++ b/qcsrc/common/triggers/trigger/flipflop.qc @@ -2,18 +2,18 @@ /*QUAKED spawnfunc_trigger_flipflop (.5 .5 .5) (-8 -8 -8) (8 8 8) START_ENABLED "Flip-flop" trigger gate... lets only every second trigger event through */ -void flipflop_use() -{SELFPARAM(); - self.state = !self.state; - if(self.state) - SUB_UseTargets(); +void flipflop_use(entity this, entity actor, entity trigger) +{ + this.state = !this.state; + if(this.state) + SUB_UseTargets(this, actor, trigger); } spawnfunc(trigger_flipflop) { if(this.spawnflags & 1) this.state = 1; - this.use = flipflop_use; + this.use1 = flipflop_use; this.reset = spawnfunc_trigger_flipflop; // perfect resetter } diff --git a/qcsrc/common/triggers/trigger/gamestart.qc b/qcsrc/common/triggers/trigger/gamestart.qc index d90e3418ca..c083fc187b 100644 --- a/qcsrc/common/triggers/trigger/gamestart.qc +++ b/qcsrc/common/triggers/trigger/gamestart.qc @@ -1,24 +1,23 @@ #ifdef SVQC -void gamestart_use() -{SELFPARAM(); - activator = self; - SUB_UseTargets(); - remove(self); +void gamestart_use(entity this, entity actor, entity trigger) +{ + SUB_UseTargets(this, this, trigger); + remove(this); } void self_spawnfunc_trigger_gamestart(); spawnfunc(trigger_gamestart) { - this.use = gamestart_use; + this.use1 = gamestart_use; this.reset2 = self_spawnfunc_trigger_gamestart; if(this.wait) { - this.think = this.use; + this.think = adaptor_think2use; this.nextthink = game_starttime + this.wait; } else - InitializeEntity(this, gamestart_use, INITPRIO_FINDTARGET); + InitializeEntity(this, adaptor_think2use, INITPRIO_FINDTARGET); } void self_spawnfunc_trigger_gamestart() { SELFPARAM(); spawnfunc_trigger_gamestart(this); } diff --git a/qcsrc/common/triggers/trigger/gravity.qc b/qcsrc/common/triggers/trigger/gravity.qc index a6b3eedde6..1f61e50ac8 100644 --- a/qcsrc/common/triggers/trigger/gravity.qc +++ b/qcsrc/common/triggers/trigger/gravity.qc @@ -32,9 +32,9 @@ void trigger_gravity_check_think() } } -void trigger_gravity_use() -{SELFPARAM(); - self.state = !self.state; +void trigger_gravity_use(entity this, entity actor, entity trigger) +{ + this.state = !this.state; } void trigger_gravity_touch() @@ -98,7 +98,7 @@ spawnfunc(trigger_gravity) self.state = true; IFTARGETED { - self.use = trigger_gravity_use; + self.use1 = trigger_gravity_use; if(self.spawnflags & 2) self.state = false; } diff --git a/qcsrc/common/triggers/trigger/hurt.qc b/qcsrc/common/triggers/trigger/hurt.qc index 771b4f0648..1e29bf8d28 100644 --- a/qcsrc/common/triggers/trigger/hurt.qc +++ b/qcsrc/common/triggers/trigger/hurt.qc @@ -1,10 +1,10 @@ #ifdef SVQC -void trigger_hurt_use() -{SELFPARAM(); - if(IS_PLAYER(activator)) - self.enemy = activator; +void trigger_hurt_use(entity this, entity actor, entity trigger) +{ + if(IS_PLAYER(actor)) + this.enemy = actor; else - self.enemy = world; // let's just destroy it, if taking over is too much work + this.enemy = world; // let's just destroy it, if taking over is too much work } .float triggerhurttime; @@ -62,7 +62,7 @@ spawnfunc(trigger_hurt) EXACTTRIGGER_INIT; self.active = ACTIVE_ACTIVE; self.touch = trigger_hurt_touch; - self.use = trigger_hurt_use; + self.use1 = trigger_hurt_use; self.enemy = world; // I hate you all if (!self.dmg) self.dmg = 1000; diff --git a/qcsrc/common/triggers/trigger/jumppads.qc b/qcsrc/common/triggers/trigger/jumppads.qc index 7b82c39590..e90f0bfc30 100644 --- a/qcsrc/common/triggers/trigger/jumppads.qc +++ b/qcsrc/common/triggers/trigger/jumppads.qc @@ -3,12 +3,12 @@ #include "jumppads.qh" #include -void trigger_push_use() -{SELFPARAM(); +void trigger_push_use(entity this, entity actor, entity trigger) +{ if(teamplay) { - self.team = activator.team; - self.SendFlags |= 2; + this.team = actor.team; + this.SendFlags |= 2; } } #endif @@ -235,10 +235,7 @@ void trigger_push_touch() } if(this.enemy.target) - { - activator = other; - WITHSELF(this.enemy, SUB_UseTargets()); - } + SUB_UseTargets(this.enemy, other, other); // TODO: do we need other as trigger too? if (other.flags & FL_PROJECTILE) { @@ -384,7 +381,7 @@ spawnfunc(trigger_push) trigger_init(this); this.active = ACTIVE_ACTIVE; - this.use = trigger_push_use; + this.use1 = trigger_push_use; this.touch = trigger_push_touch; // normal push setup diff --git a/qcsrc/common/triggers/trigger/jumppads.qh b/qcsrc/common/triggers/trigger/jumppads.qh index 0c41808496..5744c66d43 100644 --- a/qcsrc/common/triggers/trigger/jumppads.qh +++ b/qcsrc/common/triggers/trigger/jumppads.qh @@ -15,8 +15,8 @@ const int NUM_JUMPPADSUSED = 3; float trigger_push_calculatevelocity_flighttime; #ifdef SVQC -void() SUB_UseTargets; -void trigger_push_use(); +void SUB_UseTargets(entity this, entity actor, entity trigger); +void trigger_push_use(entity this, entity actor, entity trigger); #endif /* diff --git a/qcsrc/common/triggers/trigger/keylock.qc b/qcsrc/common/triggers/trigger/keylock.qc index 182650ed5b..5b24b1b63f 100644 --- a/qcsrc/common/triggers/trigger/keylock.qc +++ b/qcsrc/common/triggers/trigger/keylock.qc @@ -3,22 +3,9 @@ */ void trigger_keylock_trigger(string s) {SELFPARAM(); - entity otemp = other; - entity atemp = activator; - - entity t; - for(t = world; (t = find(t, targetname, s)); ) - if(t.use) - { - setself(t); - other = this; - activator = atemp; - self.use(); - } - - setself(this); - other = otemp; - activator = atemp; + for(entity t = world; (t = find(t, targetname, s)); ) + if(t.use1) + t.use1(t, NULL, this); } /** diff --git a/qcsrc/common/triggers/trigger/magicear.qc b/qcsrc/common/triggers/trigger/magicear.qc index f973c7a6fd..2c94fa395d 100644 --- a/qcsrc/common/triggers/trigger/magicear.qc +++ b/qcsrc/common/triggers/trigger/magicear.qc @@ -28,13 +28,10 @@ string trigger_magicear_processmessage(entity ear, entity source, float teamsay, if(dotrigger) { - activator = source; - setself(ear); savemessage = self.message; self.message = string_null; - SUB_UseTargets(); + SUB_UseTargets(ear, source, NULL); self.message = savemessage; - setself(this); } if(ear.netname != "") @@ -118,13 +115,10 @@ string trigger_magicear_processmessage(entity ear, entity source, float teamsay, if(dotrigger) { - activator = source; - setself(ear); savemessage = self.message; self.message = string_null; - SUB_UseTargets(); + SUB_UseTargets(ear, source, NULL); self.message = savemessage; - setself(this); } if(ear.spawnflags & 16) diff --git a/qcsrc/common/triggers/trigger/monoflop.qc b/qcsrc/common/triggers/trigger/monoflop.qc index 26975ab6d1..4c0e27c756 100644 --- a/qcsrc/common/triggers/trigger/monoflop.qc +++ b/qcsrc/common/triggers/trigger/monoflop.qc @@ -2,30 +2,29 @@ /*QUAKED spawnfunc_trigger_monoflop (.5 .5 .5) (-8 -8 -8) (8 8 8) "Mono-flop" trigger gate... turns one trigger event into one "on" and one "off" event, separated by a delay of "wait" */ -void monoflop_use() -{SELFPARAM(); - self.nextthink = time + self.wait; - self.enemy = activator; - if(self.state) +void monoflop_use(entity this, entity actor, entity trigger) +{ + this.nextthink = time + this.wait; + this.enemy = actor; + if(this.state) return; - self.state = 1; - SUB_UseTargets(); + this.state = 1; + SUB_UseTargets(this, actor, trigger); } -void monoflop_fixed_use() -{SELFPARAM(); - if(self.state) +void monoflop_fixed_use(entity this, entity actor, entity trigger) +{ + if(this.state) return; - self.nextthink = time + self.wait; - self.state = 1; - self.enemy = activator; - SUB_UseTargets(); + this.nextthink = time + this.wait; + this.state = 1; + this.enemy = actor; + SUB_UseTargets(this, actor, trigger); } void monoflop_think() {SELFPARAM(); - self.state = 0; - activator = self.enemy; - SUB_UseTargets(); + this.state = 0; + SUB_UseTargets(this, this.enemy, NULL); } void monoflop_reset(entity this) @@ -36,14 +35,14 @@ void monoflop_reset(entity this) spawnfunc(trigger_monoflop) { - if(!self.wait) - self.wait = 1; - if(self.spawnflags & 1) - self.use = monoflop_fixed_use; + if(!this.wait) + this.wait = 1; + if(this.spawnflags & 1) + this.use1 = monoflop_fixed_use; else - self.use = monoflop_use; - self.think = monoflop_think; - self.state = 0; - self.reset = monoflop_reset; + this.use1 = monoflop_use; + this.think = monoflop_think; + this.state = 0; + this.reset = monoflop_reset; } #endif diff --git a/qcsrc/common/triggers/trigger/multi.qc b/qcsrc/common/triggers/trigger/multi.qc index 3f0a4b27fe..5576e5468e 100644 --- a/qcsrc/common/triggers/trigger/multi.qc +++ b/qcsrc/common/triggers/trigger/multi.qc @@ -41,9 +41,7 @@ void multi_trigger() // don't trigger again until reset self.takedamage = DAMAGE_NO; - activator = self.enemy; - other = self.goalentity; - SUB_UseTargets(); + SUB_UseTargets(self, self.enemy, self.goalentity); if (self.wait > 0) { @@ -61,11 +59,11 @@ void multi_trigger() } } -void multi_use() -{SELFPARAM(); - self.goalentity = other; - self.enemy = activator; - multi_trigger(); +void multi_use(entity this, entity actor, entity trigger) +{ + this.goalentity = trigger; + this.enemy = actor; + WITHSELF(this, multi_trigger()); } void multi_touch() @@ -160,7 +158,7 @@ spawnfunc(trigger_multiple) self.wait = 0.2; else if(self.wait < -1) self.wait = 0; - self.use = multi_use; + self.use1 = multi_use; EXACTTRIGGER_INIT; diff --git a/qcsrc/common/triggers/trigger/multivibrator.qc b/qcsrc/common/triggers/trigger/multivibrator.qc index 78b3383fc0..886bed55cf 100644 --- a/qcsrc/common/triggers/trigger/multivibrator.qc +++ b/qcsrc/common/triggers/trigger/multivibrator.qc @@ -8,9 +8,8 @@ void multivibrator_send() newstate = (time < cyclestart + self.wait); - activator = self; if(self.state != newstate) - SUB_UseTargets(); + SUB_UseTargets(self, self, NULL); self.state = newstate; if(self.state) @@ -19,20 +18,20 @@ void multivibrator_send() self.nextthink = cyclestart + self.wait + self.respawntime + 0.01; } -void multivibrator_toggle() -{SELFPARAM(); - if(self.nextthink == 0) +void multivibrator_toggle(entity this, entity actor, entity trigger) +{ + if(this.nextthink == 0) { - multivibrator_send(); + WITHSELF(this, multivibrator_send()); } else { - if(self.state) + if(this.state) { - SUB_UseTargets(); - self.state = 0; + SUB_UseTargets(this, actor, trigger); + this.state = 0; } - self.nextthink = 0; + this.nextthink = 0; } } @@ -63,7 +62,7 @@ spawnfunc(trigger_multivibrator) self.respawntime = self.wait; self.state = 0; - self.use = multivibrator_toggle; + self.use1 = multivibrator_toggle; self.think = multivibrator_send; self.nextthink = max(1, time); diff --git a/qcsrc/common/triggers/trigger/relay.qc b/qcsrc/common/triggers/trigger/relay.qc index 1df446ba32..a3fcb95129 100644 --- a/qcsrc/common/triggers/trigger/relay.qc +++ b/qcsrc/common/triggers/trigger/relay.qc @@ -4,7 +4,7 @@ This fixed size trigger cannot be touched, it can only be fired by other events. */ spawnfunc(trigger_relay) { - this.use = SUB_UseTargets; + this.use1 = SUB_UseTargets; this.reset = spawnfunc_trigger_relay; // this spawnfunc resets fully } #endif diff --git a/qcsrc/common/triggers/trigger/relay_activators.qc b/qcsrc/common/triggers/trigger/relay_activators.qc index 147b6178a1..f47e4ae330 100644 --- a/qcsrc/common/triggers/trigger/relay_activators.qc +++ b/qcsrc/common/triggers/trigger/relay_activators.qc @@ -1,11 +1,10 @@ #ifdef SVQC -void relay_activators_use() -{SELFPARAM(); +void relay_activators_use(entity this, entity actor, entity trigger) +{ for(entity trg = world; (trg = find(trg, targetname, this.target)); ) { - setself(trg); if (trg.setactive) - trg.setactive(this.cnt); + trg.setactive(trg, this.cnt); else { //bprint("Not using setactive\n"); @@ -18,24 +17,23 @@ void relay_activators_use() trg.active = this.cnt; } } - setself(this); } spawnfunc(relay_activate) { - self.cnt = ACTIVE_ACTIVE; - self.use = relay_activators_use; + this.cnt = ACTIVE_ACTIVE; + this.use1 = relay_activators_use; } spawnfunc(relay_deactivate) { - self.cnt = ACTIVE_NOT; - self.use = relay_activators_use; + this.cnt = ACTIVE_NOT; + this.use1 = relay_activators_use; } spawnfunc(relay_activatetoggle) { - self.cnt = ACTIVE_TOGGLE; - self.use = relay_activators_use; + this.cnt = ACTIVE_TOGGLE; + this.use1 = relay_activators_use; } #endif diff --git a/qcsrc/common/triggers/trigger/relay_if.qc b/qcsrc/common/triggers/trigger/relay_if.qc index e45996bd85..1d7991cbab 100644 --- a/qcsrc/common/triggers/trigger/relay_if.qc +++ b/qcsrc/common/triggers/trigger/relay_if.qc @@ -1,20 +1,19 @@ #ifdef SVQC -void trigger_relay_if_use() -{SELFPARAM(); - float n; - n = self.count; +void trigger_relay_if_use(entity this, entity actor, entity trigger) +{ + int n = this.count; // TODO make this generic AND faster than nextent()ing through all, if somehow possible - n = (cvar_string(self.netname) == cvar_string(self.message)); - if(self.spawnflags & 1) + n = (cvar_string(this.netname) == cvar_string(this.message)); + if(this.spawnflags & 1) n = !n; if(n) - SUB_UseTargets(); + SUB_UseTargets(this, actor, trigger); } spawnfunc(trigger_relay_if) { - self.use = trigger_relay_if_use; + this.use1 = trigger_relay_if_use; } #endif diff --git a/qcsrc/common/triggers/trigger/relay_teamcheck.qc b/qcsrc/common/triggers/trigger/relay_teamcheck.qc index 193dba3682..289371fccd 100644 --- a/qcsrc/common/triggers/trigger/relay_teamcheck.qc +++ b/qcsrc/common/triggers/trigger/relay_teamcheck.qc @@ -1,23 +1,23 @@ #ifdef SVQC -void trigger_relay_teamcheck_use() -{SELFPARAM(); - if(activator.team) +void trigger_relay_teamcheck_use(entity this, entity actor, entity trigger) +{ + if(actor.team) { - if(self.spawnflags & 2) + if(this.spawnflags & 2) { - if(DIFF_TEAM(activator, self)) - SUB_UseTargets(); + if(DIFF_TEAM(actor, this)) + SUB_UseTargets(this, actor, trigger); } else { - if(SAME_TEAM(activator, self)) - SUB_UseTargets(); + if(SAME_TEAM(actor, this)) + SUB_UseTargets(this, actor, trigger); } } else { - if(self.spawnflags & 1) - SUB_UseTargets(); + if(this.spawnflags & 1) + SUB_UseTargets(this, actor, trigger); } } @@ -29,7 +29,7 @@ void trigger_relay_teamcheck_reset(entity this) spawnfunc(trigger_relay_teamcheck) { this.team_saved = this.team; - this.use = trigger_relay_teamcheck_use; + this.use1 = trigger_relay_teamcheck_use; this.reset = trigger_relay_teamcheck_reset; } #endif diff --git a/qcsrc/common/triggers/trigger/secret.qc b/qcsrc/common/triggers/trigger/secret.qc index f94cd00ad9..cb64f9602c 100644 --- a/qcsrc/common/triggers/trigger/secret.qc +++ b/qcsrc/common/triggers/trigger/secret.qc @@ -82,6 +82,6 @@ spawnfunc(trigger_secret) // take over the touch() function, so we can mark secret as found self.touch = trigger_secret_touch; // ignore triggering; - self.use = func_null; + self.use1 = func_null; } #endif diff --git a/qcsrc/common/triggers/trigger/teleport.qc b/qcsrc/common/triggers/trigger/teleport.qc index 92ae805b52..49e8cdb554 100644 --- a/qcsrc/common/triggers/trigger/teleport.qc +++ b/qcsrc/common/triggers/trigger/teleport.qc @@ -1,12 +1,12 @@ REGISTER_NET_LINKED(ENT_CLIENT_TRIGGER_TELEPORT) #ifdef SVQC -void trigger_teleport_use() -{SELFPARAM(); +void trigger_teleport_use(entity this, entity actor, entity trigger) +{ if(teamplay) - self.team = activator.team; + this.team = actor.team; #ifdef SVQC - self.SendFlags |= SF_TRIGGER_UPDATE; + this.SendFlags |= SF_TRIGGER_UPDATE; #endif } #endif @@ -49,12 +49,11 @@ void Teleport_Touch () e = Simple_TeleportPlayer(self, other); #ifdef SVQC - activator = other; string s = self.target; self.target = string_null; - SUB_UseTargets(); + SUB_UseTargets(self, other, other); // TODO: should we be using other for trigger too? if (!self.target) self.target = s; - WITHSELF(e, SUB_UseTargets()); + SUB_UseTargets(e, other, other); #endif } @@ -85,7 +84,7 @@ spawnfunc(trigger_teleport) self.active = ACTIVE_ACTIVE; //trigger_init(self); // only for predicted triggers? EXACTTRIGGER_INIT; - self.use = trigger_teleport_use; + self.use1 = trigger_teleport_use; if(self.noise != "") FOREACH_WORD(self.noise, true, precache_sound(it)); diff --git a/qcsrc/common/triggers/triggers.qc b/qcsrc/common/triggers/triggers.qc index 1ca03fd4fe..691aea5056 100644 --- a/qcsrc/common/triggers/triggers.qc +++ b/qcsrc/common/triggers/triggers.qc @@ -1,11 +1,10 @@ -void SUB_DontUseTargets() { } +void SUB_DontUseTargets(entity this, entity actor, entity trigger) { } -void() SUB_UseTargets; +void SUB_UseTargets(entity this, entity actor, entity trigger); void DelayThink() {SELFPARAM(); - activator = this.enemy; - SUB_UseTargets (); + SUB_UseTargets (this, this.enemy, NULL); remove(this); } @@ -184,22 +183,18 @@ match (string)self.target and call their .use function ============================== */ -void SUB_UseTargets() -{SELFPARAM(); - entity t, otemp, act; - string s; - float i; - +void SUB_UseTargets(entity this, entity actor, entity trigger) +{ // // check for a delay // if (this.delay) { // create a temp object to fire at a later time - t = new(DelayedUse); + entity t = new(DelayedUse); t.nextthink = time + this.delay; t.think = DelayThink; - t.enemy = activator; + t.enemy = actor; t.message = this.message; t.killtarget = this.killtarget; t.target = this.target; @@ -209,18 +204,19 @@ void SUB_UseTargets() return; } + string s; // // print the message // #ifdef SVQC if(this) - if(IS_PLAYER(activator) && this.message != "") - if(IS_REAL_CLIENT(activator)) + if(IS_PLAYER(actor) && this.message != "") + if(IS_REAL_CLIENT(actor)) { - centerprint(activator, this.message); + centerprint(actor, this.message); if (this.noise == "") - play2(activator, SND(TALK)); + play2(actor, SND(TALK)); } // @@ -229,7 +225,7 @@ void SUB_UseTargets() s = this.killtarget; if (s != "") { - for(t = world; (t = find(t, targetname, s)); ) + for(entity t = world; (t = find(t, targetname, s)); ) remove(t); } #endif @@ -237,13 +233,11 @@ void SUB_UseTargets() // // fire targets // - act = activator; - otemp = other; if(this.target_random) RandomSelection_Init(); - for(i = 0; i < 4; ++i) + for(int i = 0; i < 4; ++i) { switch(i) { @@ -257,38 +251,34 @@ void SUB_UseTargets() { // Flag to set func_clientwall state // 1 == deactivate, 2 == activate, 0 == do nothing - float aw_flag = this.antiwall_flag; - for(t = world; (t = find(t, targetname, s)); ) - if(t.use) + int aw_flag = this.antiwall_flag; + for(entity t = world; (t = find(t, targetname, s)); ) { - if(this.target_random) + if(t.use1) { - RandomSelection_Add(t, 0, string_null, 1, 0); - } - else - { - if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary") - t.antiwall_flag = aw_flag; - setself(t); - other = this; - activator = act; - self.use(); + if(this.target_random) + { + RandomSelection_Add(t, 0, string_null, 1, 0); + } + else + { + if (t.classname == "func_clientwall" || t.classname == "func_clientillusionary") + t.antiwall_flag = aw_flag; + + t.use1(t, actor, this); + } } } } } if(this.target_random && RandomSelection_chosen_ent) - { - setself(RandomSelection_chosen_ent); - other = this; - activator = act; - self.use(); - } + RandomSelection_chosen_ent.use1(RandomSelection_chosen_ent, actor, this); +} - activator = act; - setself(this); - other = otemp; +void SUB_UseTargets_self() +{SELFPARAM(); + SUB_UseTargets(this, NULL, NULL); } #ifdef CSQC diff --git a/qcsrc/common/turrets/sv_turrets.qc b/qcsrc/common/turrets/sv_turrets.qc index 1502be2511..c226a9867b 100644 --- a/qcsrc/common/turrets/sv_turrets.qc +++ b/qcsrc/common/turrets/sv_turrets.qc @@ -455,7 +455,7 @@ void turret_projectile_damage(entity this, entity inflictor, entity attacker, fl this.health -= damage; //this.realowner = attacker; // Dont change realowner, it does not make much sense for turrets if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(this.owner, turret_projectile_explode)); + W_PrepareExplosionByDamage(this, this.owner, turret_projectile_explode); } entity turret_projectile(Sound _snd, float _size, float _health, float _death, float _proj_type, float _cull, float _cli_anim) @@ -1179,16 +1179,16 @@ void turret_think() When .used a turret switch team to activator.team. If activator is world, the turret go inactive. */ -void turret_use() -{SELFPARAM(); - LOG_TRACE("Turret ",self.netname, " used by ", activator.classname, "\n"); +void turret_use(entity this, entity actor, entity trigger) +{ + LOG_TRACE("Turret ",this.netname, " used by ", actor.classname, "\n"); - self.team = activator.team; + this.team = actor.team; - if(self.team == 0) - self.active = ACTIVE_NOT; + if(this.team == 0) + this.active = ACTIVE_NOT; else - self.active = ACTIVE_ACTIVE; + this.active = ACTIVE_ACTIVE; } @@ -1341,7 +1341,7 @@ float turret_initialize(Turret tur) self.view_ofs = '0 0 0'; self.turret_firecheckfunc = turret_firecheck; self.event_damage = turret_damage; - self.use = turret_use; + self.use1 = turret_use; self.bot_attack = true; self.nextthink = time + 1; self.nextthink += turret_count * sys_frametime; diff --git a/qcsrc/common/turrets/turret/ewheel.qc b/qcsrc/common/turrets/turret/ewheel.qc index 798e141ecd..1c3d5731fd 100644 --- a/qcsrc/common/turrets/turret/ewheel.qc +++ b/qcsrc/common/turrets/turret/ewheel.qc @@ -49,8 +49,8 @@ void ewheel_move_path() if (self.pathgoal) { - if (self.pathgoal.use) - self.pathgoal.use(); + if (self.pathgoal.use1) + self.pathgoal.use1(self.pathgoal, NULL, NULL); if (self.pathgoal.enemy) { diff --git a/qcsrc/common/turrets/turret/walker.qc b/qcsrc/common/turrets/turret/walker.qc index 491b5bbd92..fb6d496bfe 100644 --- a/qcsrc/common/turrets/turret/walker.qc +++ b/qcsrc/common/turrets/turret/walker.qc @@ -109,7 +109,7 @@ void walker_rocket_damage(entity this, entity inflictor, entity attacker, float this.velocity = this.velocity + vforce; if (this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(this.owner, walker_rocket_explode)); + W_PrepareExplosionByDamage(this, this.owner, walker_rocket_explode); } #define WALKER_ROCKET_MOVE movelib_move_simple(self, newdir, (autocvar_g_turrets_unit_walker_rocket_speed), (autocvar_g_turrets_unit_walker_rocket_turnrate)); UpdateCSQCProjectile(self) @@ -312,8 +312,8 @@ void walker_move_path() if (self.pathgoal) { - if (self.pathgoal.use) - self.pathgoal.use(); + if (self.pathgoal.use1) + self.pathgoal.use1(self, NULL, NULL); if (self.pathgoal.enemy) { diff --git a/qcsrc/common/vehicles/sv_vehicles.qc b/qcsrc/common/vehicles/sv_vehicles.qc index 35b6c677f9..69907c04b3 100644 --- a/qcsrc/common/vehicles/sv_vehicles.qc +++ b/qcsrc/common/vehicles/sv_vehicles.qc @@ -208,7 +208,7 @@ void vehicles_projectile_damage(entity this, entity inflictor, entity attacker, { this.takedamage = DAMAGE_NO; this.event_damage = func_null; - this.think = this.use; + this.think = adaptor_think2use; this.nextthink = time; } } @@ -232,6 +232,11 @@ void vehicles_projectile_explode() remove (self); } +void vehicles_projectile_explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, vehicles_projectile_explode()); +} + entity vehicles_projectile(entity this, string _mzlfx, Sound _mzlsound, vector _org, vector _vel, float _dmg, float _radi, float _force, float _size, @@ -257,7 +262,7 @@ entity vehicles_projectile(entity this, string _mzlfx, Sound _mzlsound, proj.bot_dodgerating = _dmg; proj.velocity = _vel; proj.touch = vehicles_projectile_explode; - proj.use = vehicles_projectile_explode; + proj.use1 = vehicles_projectile_explode_use; proj.owner = this; proj.realowner = _owner; proj.think = SUB_Remove_self; @@ -541,29 +546,29 @@ void vehicles_setreturn(entity veh) } -void vehicle_use() -{SELFPARAM(); - LOG_TRACE("vehicle ",self.netname, " used by ", activator.classname, "\n"); +void vehicle_use(entity this, entity actor, entity trigger) +{ + LOG_TRACE("vehicle ",this.netname, " used by ", actor.classname, "\n"); - self.tur_head.team = activator.team; + this.tur_head.team = actor.team; - if(self.tur_head.team == 0) - self.active = ACTIVE_NOT; + if(this.tur_head.team == 0) + this.active = ACTIVE_NOT; else - self.active = ACTIVE_ACTIVE; + this.active = ACTIVE_ACTIVE; - if(self.active == ACTIVE_ACTIVE && !IS_DEAD(self) && !gameover) + if(this.active == ACTIVE_ACTIVE && !IS_DEAD(this) && !gameover) { - LOG_TRACE("Respawning vehicle: ", self.netname, "\n"); - if(self.effects & EF_NODRAW) + LOG_TRACE("Respawning vehicle: ", this.netname, "\n"); + if(this.effects & EF_NODRAW) { - self.think = vehicles_spawn; - self.nextthink = time + 3; + this.think = vehicles_spawn; + this.nextthink = time + 3; } else { - vehicles_setreturn(self); - vehicles_reset_colors(self); + vehicles_setreturn(this); + vehicles_reset_colors(this); } } } @@ -1179,7 +1184,7 @@ bool vehicle_initialize(entity this, Vehicle info, bool nodrop) else { this.team = this.vehicle_controller.team; - this.use = vehicle_use; + this.use1 = vehicle_use; if(teamplay) { diff --git a/qcsrc/common/vehicles/vehicle/racer_weapon.qc b/qcsrc/common/vehicles/vehicle/racer_weapon.qc index ee86a62297..65f82459b3 100644 --- a/qcsrc/common/vehicles/vehicle/racer_weapon.qc +++ b/qcsrc/common/vehicles/vehicle/racer_weapon.qc @@ -74,7 +74,7 @@ void racer_rocket_tracker() if (IS_DEAD(self.owner) || self.cnt < time) { - self.use(); + self.use1(self, NULL, NULL); return; } @@ -126,7 +126,7 @@ void racer_rocket_groundhugger() if(IS_DEAD(self.owner) || self.cnt < time) { - self.use(); + self.use1(self, NULL, NULL); return; } diff --git a/qcsrc/common/vehicles/vehicle/spiderbot_weapons.qc b/qcsrc/common/vehicles/vehicle/spiderbot_weapons.qc index afa57de2da..caf64c0686 100644 --- a/qcsrc/common/vehicles/vehicle/spiderbot_weapons.qc +++ b/qcsrc/common/vehicles/vehicle/spiderbot_weapons.qc @@ -23,7 +23,7 @@ void spiderbot_rocket_unguided() UpdateCSQCProjectile(self); if (IS_DEAD(self.owner) || self.cnt < time || vdist(self.pos1 - self.origin, <, 16)) - self.use(); + self.use1(self, NULL, NULL); } void spiderbot_rocket_guided() @@ -43,7 +43,7 @@ void spiderbot_rocket_guided() UpdateCSQCProjectile(self); if (IS_DEAD(self.owner) || self.cnt < time) - self.use(); + self.use1(self, NULL, NULL); } void spiderbot_guide_release(entity this) diff --git a/qcsrc/common/weapons/weapon/arc.qc b/qcsrc/common/weapons/weapon/arc.qc index 3c23e33e77..804a24fb7d 100644 --- a/qcsrc/common/weapons/weapon/arc.qc +++ b/qcsrc/common/weapons/weapon/arc.qc @@ -239,6 +239,11 @@ void W_Arc_Bolt_Explode() remove(self); } +void W_Arc_Bolt_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Arc_Bolt_Explode()); +} + void W_Arc_Bolt_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { if(this.health <= 0) @@ -251,13 +256,13 @@ void W_Arc_Bolt_Damage(entity this, entity inflictor, entity attacker, float dam this.angles = vectoangles(this.velocity); if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, this.think)); + W_PrepareExplosionByDamage(this, attacker, this.think); } void W_Arc_Bolt_Touch() {SELFPARAM(); PROJECTILE_TOUCH; - self.use(); + self.use1(this, NULL, NULL); } void W_Arc_Attack_Bolt(Weapon thiswep) @@ -282,7 +287,7 @@ void W_Arc_Attack_Bolt(Weapon thiswep) missile.damagedbycontents = true; missile.touch = W_Arc_Bolt_Touch; - missile.use = W_Arc_Bolt_Explode; + missile.use1 = W_Arc_Bolt_Explode_use; missile.think = adaptor_think2use_hittype_splash; missile.nextthink = time + WEP_CVAR(arc, bolt_lifetime); PROJECTILE_MAKETRIGGER(missile); diff --git a/qcsrc/common/weapons/weapon/devastator.qc b/qcsrc/common/weapons/weapon/devastator.qc index 2d930ad721..1cde73d446 100644 --- a/qcsrc/common/weapons/weapon/devastator.qc +++ b/qcsrc/common/weapons/weapon/devastator.qc @@ -344,7 +344,7 @@ void W_Devastator_Damage(entity this, entity inflictor, entity attacker, float d this.angles = vectoangles(this.velocity); if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, W_Devastator_Explode)); + W_PrepareExplosionByDamage(this, attacker, W_Devastator_Explode); } void W_Devastator_Attack(Weapon thiswep) diff --git a/qcsrc/common/weapons/weapon/electro.qc b/qcsrc/common/weapons/weapon/electro.qc index b751068062..71ce3cb946 100644 --- a/qcsrc/common/weapons/weapon/electro.qc +++ b/qcsrc/common/weapons/weapon/electro.qc @@ -191,6 +191,11 @@ void W_Electro_Explode() remove(self); } +void W_Electro_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Electro_Explode()); +} + void W_Electro_TouchExplode() { PROJECTILE_TOUCH; @@ -201,7 +206,7 @@ void W_Electro_Bolt_Think() {SELFPARAM(); if(time >= self.ltime) { - self.use(); + this.use1(this, NULL, NULL); return; } @@ -242,7 +247,7 @@ void W_Electro_Bolt_Think() // if we triggered an orb, should we explode? if not, lets try again next time if(found && WEP_CVAR_PRI(electro, midaircombo_explode)) - { self.use(); } + { this.use1(this, NULL, NULL); } else { self.nextthink = min(time + WEP_CVAR_PRI(electro, midaircombo_interval), self.ltime); } } @@ -272,7 +277,7 @@ void W_Electro_Attack_Bolt(Weapon thiswep) proj.owner = proj.realowner = self; proj.bot_dodge = true; proj.bot_dodgerating = WEP_CVAR_PRI(electro, damage); - proj.use = W_Electro_Explode; + proj.use1 = W_Electro_Explode_use; proj.think = W_Electro_Bolt_Think; proj.nextthink = time; proj.ltime = time + WEP_CVAR_PRI(electro, lifetime); @@ -342,7 +347,7 @@ void W_Electro_Orb_Damage(entity this, entity inflictor, entity attacker, float } else { - this.use = W_Electro_Explode; + this.use1 = W_Electro_Explode_use; this.think = adaptor_think2use; // not _hittype_splash, as this runs "immediately" } } @@ -369,7 +374,7 @@ void W_Electro_Attack_Orb(Weapon thiswep) entity proj = new(electro_orb); proj.owner = proj.realowner = self; - proj.use = W_Electro_Explode; + proj.use1 = W_Electro_Explode_use; proj.think = adaptor_think2use_hittype_splash; proj.bot_dodge = true; proj.bot_dodgerating = WEP_CVAR_SEC(electro, damage); diff --git a/qcsrc/common/weapons/weapon/fireball.qc b/qcsrc/common/weapons/weapon/fireball.qc index a6db7c9b71..a86def7d36 100644 --- a/qcsrc/common/weapons/weapon/fireball.qc +++ b/qcsrc/common/weapons/weapon/fireball.qc @@ -112,6 +112,11 @@ void W_Fireball_Explode() remove(self); } +void W_Fireball_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Fireball_Explode()); +} + void W_Fireball_TouchExplode() { PROJECTILE_TOUCH; @@ -179,7 +184,7 @@ void W_Fireball_Damage(entity this, entity inflictor, entity attacker, float dam if(this.health <= 0) { this.cnt = 1; - WITHSELF(this, W_PrepareExplosionByDamage(attacker, W_Fireball_Explode)); + W_PrepareExplosionByDamage(this, attacker, W_Fireball_Explode); } } @@ -196,7 +201,7 @@ void W_Fireball_Attack1() proj.bot_dodge = true; proj.bot_dodgerating = WEP_CVAR_PRI(fireball, damage); proj.pushltime = time + WEP_CVAR_PRI(fireball, lifetime); - proj.use = W_Fireball_Explode; + proj.use1 = W_Fireball_Explode_use; proj.think = W_Fireball_Think; proj.nextthink = time; proj.health = WEP_CVAR_PRI(fireball, health); diff --git a/qcsrc/common/weapons/weapon/hagar.qc b/qcsrc/common/weapons/weapon/hagar.qc index b764a9e66f..94d3e5f66a 100644 --- a/qcsrc/common/weapons/weapon/hagar.qc +++ b/qcsrc/common/weapons/weapon/hagar.qc @@ -71,6 +71,11 @@ void W_Hagar_Explode() remove(self); } +void W_Hagar_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Hagar_Explode()); +} + void W_Hagar_Explode2() {SELFPARAM(); self.event_damage = func_null; @@ -79,6 +84,11 @@ void W_Hagar_Explode2() remove(self); } +void W_Hagar_Explode2_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Hagar_Explode2()); +} + void W_Hagar_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { if(this.health <= 0) @@ -100,13 +110,13 @@ void W_Hagar_Damage(entity this, entity inflictor, entity attacker, float damage this.angles = vectoangles(this.velocity); if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, this.think)); + W_PrepareExplosionByDamage(this, attacker, this.think); } void W_Hagar_Touch() {SELFPARAM(); PROJECTILE_TOUCH; - self.use(); + this.use1(this, NULL, NULL); } void W_Hagar_Touch2() @@ -114,7 +124,7 @@ void W_Hagar_Touch2() PROJECTILE_TOUCH; if(self.cnt > 0 || other.takedamage == DAMAGE_AIM) { - self.use(); + this.use1(this, NULL, NULL); } else { self.cnt++; Send_Effect(EFFECT_HAGAR_BOUNCE, self.origin, self.velocity, 1); @@ -146,7 +156,7 @@ void W_Hagar_Attack(Weapon thiswep) missile.damagedbycontents = true; missile.touch = W_Hagar_Touch; - missile.use = W_Hagar_Explode; + missile.use1 = W_Hagar_Explode_use; missile.think = adaptor_think2use_hittype_splash; missile.nextthink = time + WEP_CVAR_PRI(hagar, lifetime); PROJECTILE_MAKETRIGGER(missile); @@ -189,7 +199,7 @@ void W_Hagar_Attack2(Weapon thiswep) missile.touch = W_Hagar_Touch2; missile.cnt = 0; - missile.use = W_Hagar_Explode2; + missile.use1 = W_Hagar_Explode2_use; missile.think = adaptor_think2use_hittype_splash; missile.nextthink = time + WEP_CVAR_SEC(hagar, lifetime_min) + random() * WEP_CVAR_SEC(hagar, lifetime_rand); PROJECTILE_MAKETRIGGER(missile); @@ -247,7 +257,7 @@ void W_Hagar_Attack2_Load_Release(.entity weaponentity) missile.damagedbycontents = true; missile.touch = W_Hagar_Touch; // not bouncy - missile.use = W_Hagar_Explode2; + missile.use1 = W_Hagar_Explode2_use; missile.think = adaptor_think2use_hittype_splash; missile.nextthink = time + WEP_CVAR_SEC(hagar, lifetime_min) + random() * WEP_CVAR_SEC(hagar, lifetime_rand); PROJECTILE_MAKETRIGGER(missile); diff --git a/qcsrc/common/weapons/weapon/hook.qc b/qcsrc/common/weapons/weapon/hook.qc index 91c2840e6d..da14caac9d 100644 --- a/qcsrc/common/weapons/weapon/hook.qc +++ b/qcsrc/common/weapons/weapon/hook.qc @@ -118,6 +118,11 @@ void W_Hook_Explode2() self.movetype = MOVETYPE_NONE; } +void W_Hook_Explode2_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Hook_Explode2()); +} + void W_Hook_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { if(this.health <= 0) @@ -129,13 +134,13 @@ void W_Hook_Damage(entity this, entity inflictor, entity attacker, float damage, this.health = this.health - damage; if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(this.realowner, W_Hook_Explode2)); + W_PrepareExplosionByDamage(this, this.realowner, W_Hook_Explode2); } void W_Hook_Touch2() {SELFPARAM(); PROJECTILE_TOUCH; - self.use(); + this.use1(this, NULL, NULL); } void W_Hook_Attack2(Weapon thiswep, entity actor) @@ -155,7 +160,7 @@ void W_Hook_Attack2(Weapon thiswep, entity actor) gren.nextthink = time + WEP_CVAR_SEC(hook, lifetime); gren.think = adaptor_think2use_hittype_splash; - gren.use = W_Hook_Explode2; + gren.use1 = W_Hook_Explode2_use; gren.touch = W_Hook_Touch2; gren.takedamage = DAMAGE_YES; diff --git a/qcsrc/common/weapons/weapon/minelayer.qc b/qcsrc/common/weapons/weapon/minelayer.qc index c6e0fb86bc..9a02c850bb 100644 --- a/qcsrc/common/weapons/weapon/minelayer.qc +++ b/qcsrc/common/weapons/weapon/minelayer.qc @@ -308,7 +308,7 @@ void W_MineLayer_Damage(entity this, entity inflictor, entity attacker, float da this.angles = vectoangles(this.velocity); if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, W_MineLayer_Explode)); + W_PrepareExplosionByDamage(this, attacker, W_MineLayer_Explode); } void W_MineLayer_Attack(Weapon thiswep) diff --git a/qcsrc/common/weapons/weapon/mortar.qc b/qcsrc/common/weapons/weapon/mortar.qc index 7c9b908947..f871da725a 100644 --- a/qcsrc/common/weapons/weapon/mortar.qc +++ b/qcsrc/common/weapons/weapon/mortar.qc @@ -84,6 +84,11 @@ void W_Mortar_Grenade_Explode() remove(self); } +void W_Mortar_Grenade_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Mortar_Grenade_Explode()); +} + void W_Mortar_Grenade_Explode2() {SELFPARAM(); if(other.takedamage == DAMAGE_AIM) @@ -104,6 +109,10 @@ void W_Mortar_Grenade_Explode2() remove(self); } +void W_Mortar_Grenade_Explode2_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Mortar_Grenade_Explode2()); +} void W_Mortar_Grenade_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { @@ -116,7 +125,7 @@ void W_Mortar_Grenade_Damage(entity this, entity inflictor, entity attacker, flo this.health = this.health - damage; if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, this.use)); + W_PrepareExplosionByDamage(this, attacker, adaptor_think2use); } void W_Mortar_Grenade_Think1() @@ -138,7 +147,7 @@ void W_Mortar_Grenade_Touch1() PROJECTILE_TOUCH; if(other.takedamage == DAMAGE_AIM || WEP_CVAR_PRI(mortar, type) == 0) // always explode when hitting a player, or if normal mortar projectile { - self.use(); + this.use1(this, NULL, NULL); } else if(WEP_CVAR_PRI(mortar, type) == 1) // bounce { @@ -170,7 +179,7 @@ void W_Mortar_Grenade_Touch2() PROJECTILE_TOUCH; if(other.takedamage == DAMAGE_AIM || WEP_CVAR_SEC(mortar, type) == 0) // always explode when hitting a player, or if normal mortar projectile { - self.use(); + this.use1(this, NULL, NULL); } else if(WEP_CVAR_SEC(mortar, type) == 1) // bounce { @@ -227,7 +236,7 @@ void W_Mortar_Attack(Weapon thiswep) gren.cnt = time + WEP_CVAR_PRI(mortar, lifetime); gren.nextthink = time; gren.think = W_Mortar_Grenade_Think1; - gren.use = W_Mortar_Grenade_Explode; + gren.use1 = W_Mortar_Grenade_Explode_use; gren.touch = W_Mortar_Grenade_Touch1; gren.takedamage = DAMAGE_YES; @@ -274,7 +283,7 @@ void W_Mortar_Attack2(Weapon thiswep) gren.nextthink = time + WEP_CVAR_SEC(mortar, lifetime); gren.think = adaptor_think2use_hittype_splash; - gren.use = W_Mortar_Grenade_Explode2; + gren.use1 = W_Mortar_Grenade_Explode2_use; gren.touch = W_Mortar_Grenade_Touch2; gren.takedamage = DAMAGE_YES; diff --git a/qcsrc/common/weapons/weapon/seeker.qc b/qcsrc/common/weapons/weapon/seeker.qc index 34b6e895f3..86ea7d1f54 100644 --- a/qcsrc/common/weapons/weapon/seeker.qc +++ b/qcsrc/common/weapons/weapon/seeker.qc @@ -220,7 +220,7 @@ void W_Seeker_Missile_Damage(entity this, entity inflictor, entity attacker, flo this.health = this.health - damage; if(this.health <= 0) - WITHSELF(this, W_PrepareExplosionByDamage(attacker, W_Seeker_Missile_Explode)); + W_PrepareExplosionByDamage(this, attacker, W_Seeker_Missile_Explode); } /* @@ -313,6 +313,11 @@ void W_Seeker_Flac_Explode() remove(self); } +void W_Seeker_Flac_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_Seeker_Flac_Explode()); +} + void W_Seeker_Flac_Touch() { PROJECTILE_TOUCH; @@ -355,7 +360,7 @@ void W_Seeker_Fire_Flac(Weapon thiswep) missile.bot_dodge = true; missile.bot_dodgerating = WEP_CVAR(seeker, flac_damage); missile.touch = W_Seeker_Flac_Explode; - missile.use = W_Seeker_Flac_Explode; + missile.use1 = W_Seeker_Flac_Explode_use; missile.think = adaptor_think2use_hittype_splash; missile.nextthink = time + WEP_CVAR(seeker, flac_lifetime) + WEP_CVAR(seeker, flac_lifetime_rand); missile.solid = SOLID_BBOX; diff --git a/qcsrc/common/weapons/weapon/vaporizer.qc b/qcsrc/common/weapons/weapon/vaporizer.qc index 933124564c..f9cdc00e95 100644 --- a/qcsrc/common/weapons/weapon/vaporizer.qc +++ b/qcsrc/common/weapons/weapon/vaporizer.qc @@ -227,6 +227,11 @@ void W_RocketMinsta_Laser_Explode () remove(self); } +void W_RocketMinsta_Laser_Explode_use(entity this, entity actor, entity trigger) +{ + WITHSELF(this, W_RocketMinsta_Laser_Explode()); +} + void W_RocketMinsta_Laser_Touch () {SELFPARAM(); PROJECTILE_TOUCH; @@ -258,7 +263,7 @@ void W_RocketMinsta_Attack2() proj.owner = proj.realowner = self; proj.bot_dodge = true; proj.bot_dodgerating = autocvar_g_rm_laser_damage; - proj.use = W_RocketMinsta_Laser_Explode; + proj.use1 = W_RocketMinsta_Laser_Explode_use; proj.think = adaptor_think2use_hittype_splash; proj.nextthink = time + autocvar_g_rm_laser_lifetime; PROJECTILE_MAKETRIGGER(proj); @@ -310,7 +315,7 @@ void W_RocketMinsta_Attack3 () proj.owner = proj.realowner = self; proj.bot_dodge = true; proj.bot_dodgerating = autocvar_g_rm_laser_damage; - proj.use = W_RocketMinsta_Laser_Explode; + proj.use1 = W_RocketMinsta_Laser_Explode_use; proj.think = adaptor_think2use_hittype_splash; proj.nextthink = time + autocvar_g_rm_laser_lifetime; PROJECTILE_MAKETRIGGER(proj); diff --git a/qcsrc/lib/defer.qh b/qcsrc/lib/defer.qh index 56014121f8..373e4325f8 100644 --- a/qcsrc/lib/defer.qh +++ b/qcsrc/lib/defer.qh @@ -9,6 +9,7 @@ class(Defer).entity owner; class(Defer).void() think; class(Defer).float nextthink; + class(Defer).void() defer_func; /** Remove self */ void SUB_Remove(entity this) @@ -28,7 +29,7 @@ SELFPARAM(); this.think = SUB_Remove_self; this.nextthink = time; - WITHSELF(this.owner, this.use()); + WITHSELF(this.owner, this.defer_func()); } /* @@ -39,7 +40,7 @@ { entity e = new_pure(deferred); e.owner = this; - e.use = func; + e.defer_func = func; e.think = defer_think; e.nextthink = time + fdelay; } diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index 2b860d6f43..13e5a95998 100644 --- a/qcsrc/lib/warpzone/server.qc +++ b/qcsrc/lib/warpzone/server.qc @@ -241,21 +241,18 @@ void WarpZone_Touch () { #ifdef SVQC string save1, save2; - activator = other; save1 = this.target; this.target = string_null; save2 = this.target3; this.target3 = string_null; - SUB_UseTargets(); + SUB_UseTargets(this, other, other); // use other too? if (!this.target) this.target = save1; if (!this.target3) this.target3 = save2; - setself(this.enemy); - save1 = this.target; this.target = string_null; - save2 = this.target2; this.target2 = string_null; - SUB_UseTargets(); - if (!this.target) this.target = save1; - if (!this.target2) this.target2 = save2; - setself(this); + save1 = this.enemy.target; this.enemy.target = string_null; + save2 = this.enemy.target2; this.enemy.target2 = string_null; + SUB_UseTargets(this.enemy, other, other); // use other too? + if (!this.enemy.target) this.enemy.target = save1; + if (!this.enemy.target2) this.enemy.target2 = save2; #endif } else @@ -412,27 +409,19 @@ float WarpZone_CheckProjectileImpact(entity player) player.velvec = player.warpzone_oldvelocity; if(WarpZone_Teleport(wz, player, 0, 1)) { - entity oldself; string save1, save2; - oldself = self; - self = wz; - other = player; - activator = player; - - save1 = self.target; self.target = string_null; - save2 = self.target3; self.target3 = string_null; - SUB_UseTargets(); - if (!self.target) self.target = save1; - if (!self.target3) self.target3 = save2; - - self = self.enemy; - save1 = self.target; self.target = string_null; - save2 = self.target2; self.target2 = string_null; - SUB_UseTargets(); - if (!self.target) self.target = save1; - if (!self.target2) self.target2 = save2; - self = oldself; + save1 = wz.target; wz.target = string_null; + save2 = wz.target3; wz.target3 = string_null; + SUB_UseTargets(wz, player, player); + if (!wz.target) wz.target = save1; + if (!wz.target3) wz.target3 = save2; + + save1 = wz.enemy.target; wz.enemy.target = string_null; + save2 = wz.enemy.target2; wz.enemy.target2 = string_null; + SUB_UseTargets(wz.enemy, player, player); + if (!wz.enemy.target) wz.enemy.target = save1; + if (!wz.enemy.target2) wz.enemy.target2 = save2; } else { @@ -906,8 +895,8 @@ bool visible_to_some_client(entity ent) )); return false; } -void trigger_warpzone_reconnect_use() -{SELFPARAM(); +void trigger_warpzone_reconnect_use(entity this, entity actor, entity trigger) +{ // NOTE: this matches for target, not targetname, but of course // targetname must be set too on the other entities for(entity e = warpzone_first; e; e = e.warpzone_next) @@ -930,7 +919,7 @@ void trigger_warpzone_reconnect_use() spawnfunc(trigger_warpzone_reconnect) { - this.use = trigger_warpzone_reconnect_use; + this.use1 = trigger_warpzone_reconnect_use; } spawnfunc(target_warpzone_reconnect) diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 933f4ac63c..362f7aa8ef 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -675,8 +675,7 @@ float CheatCommand(float argc) IS_CHEAT(0, argc, 0); setself(spawn()); self.target = argv(1); - activator = this; - SUB_UseTargets(); + SUB_UseTargets(self, this, NULL); remove(self); setself(this); DID_CHEAT(); @@ -685,8 +684,7 @@ float CheatCommand(float argc) IS_CHEAT(0, argc, 0); setself(spawn()); self.killtarget = argv(1); - activator = this; - SUB_UseTargets(); + SUB_UseTargets(self, this, NULL); remove(self); setself(this); DID_CHEAT(); diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 9edcf8d5f0..e859f6f328 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -607,9 +607,7 @@ void PutClientInServer() { string s = spot.target; spot.target = string_null; - WITH(entity, activator, this, LAMBDA( - WITHSELF(spot, SUB_UseTargets()) - )); + SUB_UseTargets(spot, this, NULL); spot.target = s; } diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 7124e4468f..29374036cf 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -299,8 +299,8 @@ void W_Porto_Remove (entity p); .entity ballcarried; // Also used for keepaway float g_nexball_meter_period; -void SUB_DontUseTargets(); -void SUB_UseTargets(); +void SUB_DontUseTargets(entity this, entity actor, entity trigger); +void SUB_UseTargets(entity this, entity actor, entity trigger); .void(entity this) reset; // if set, an entity is reset using this .void() reset2; // if set, an entity is reset using this (after calling ALL the reset functions for other entities) @@ -384,7 +384,7 @@ const float ACTIVE_IDLE = 2; const float ACTIVE_BUSY = 2; const float ACTIVE_TOGGLE = 3; .float active; -.void (float act_state) setactive; +.void (entity this, int act_state) setactive; .entity realowner; //float serverflags; diff --git a/qcsrc/server/g_lights.qc b/qcsrc/server/g_lights.qc index 74e03b7a0d..68be5df137 100644 --- a/qcsrc/server/g_lights.qc +++ b/qcsrc/server/g_lights.qc @@ -85,13 +85,12 @@ void dynlight_find_target() self.think = dynlight_think; self.nextthink = time + 0.1; } -void dynlight_use() +void dynlight_use(entity this, entity actor, entity trigger) { - SELFPARAM(); - if (self.light_lev == 0) - self.light_lev = self.lefty; + if (this.light_lev == 0) + this.light_lev = this.lefty; else - self.light_lev = 0; + this.light_lev = 0; } spawnfunc(dynlight) { @@ -100,7 +99,7 @@ spawnfunc(dynlight) if (!self.color) self.color = '1 1 1'; self.lefty = self.light_lev; - self.use = dynlight_use; + self.use1 = dynlight_use; setsize (self, '0 0 0', '0 0 0'); setorigin (self, self.origin); //self.pflags = PFLAGS_FULLDYNAMIC; diff --git a/qcsrc/server/g_models.qc b/qcsrc/server/g_models.qc index 6612b837c1..4f75e7beb8 100644 --- a/qcsrc/server/g_models.qc +++ b/qcsrc/server/g_models.qc @@ -16,39 +16,39 @@ class(BGMScript) .float bgmscriptrelease; .float modelscale; -void g_model_setcolormaptoactivator () -{SELFPARAM(); +void g_model_setcolormaptoactivator(entity this, entity actor, entity trigger) +{ if(teamplay) { - if(activator.team) - self.colormap = (activator.team - 1) * 0x11; + if(actor.team) + this.colormap = (actor.team - 1) * 0x11; else - self.colormap = 0x00; + this.colormap = 0x00; } else - self.colormap = floor(random() * 256); - self.colormap |= BIT(10); // RENDER_COLORMAPPED + this.colormap = floor(random() * 256); + this.colormap |= BIT(10); // RENDER_COLORMAPPED } -void g_clientmodel_setcolormaptoactivator () -{SELFPARAM(); - g_model_setcolormaptoactivator(); - self.SendFlags |= (BIT(3) | BIT(0)); +void g_clientmodel_setcolormaptoactivator(entity this, entity actor, entity trigger) +{ + g_model_setcolormaptoactivator(this, actor, trigger); + this.SendFlags |= (BIT(3) | BIT(0)); } -void g_clientmodel_use() -{SELFPARAM(); - if (self.antiwall_flag == 1) +void g_clientmodel_use(entity this, entity actor, entity trigger) +{ + if (this.antiwall_flag == 1) { - self.inactive = 1; - self.solid = SOLID_NOT; + this.inactive = 1; + this.solid = SOLID_NOT; } - else if (self.antiwall_flag == 2) + else if (this.antiwall_flag == 2) { - self.inactive = 0; - self.solid = self.default_solid; + this.inactive = 0; + this.solid = this.default_solid; } - g_clientmodel_setcolormaptoactivator(); + g_clientmodel_setcolormaptoactivator(this, actor, trigger); } void g_model_dropbyspawnflags() @@ -168,7 +168,7 @@ bool g_clientmodel_genericsendentity(entity this, entity to, int sf) if(self.geomtype) if(autocvar_physics_ode && checkextension("DP_PHYSICS_ODE")) self.movetype = MOVETYPE_PHYSICS; \ if(!self.scale) self.scale = self.modelscale; \ SetBrushEntityModel(); \ - self.use = g_model_setcolormaptoactivator; \ + self.use1 = g_model_setcolormaptoactivator; \ InitializeEntity(self, g_model_dropbyspawnflags, INITPRIO_DROPTOFLOOR); \ if(!self.solid) self.solid = (sol); else if(self.solid < 0) self.solid = SOLID_NOT; @@ -176,7 +176,7 @@ bool g_clientmodel_genericsendentity(entity this, entity to, int sf) if(self.geomtype) if(autocvar_physics_ode && checkextension("DP_PHYSICS_ODE")) self.movetype = MOVETYPE_PHYSICS; \ if(!self.scale) self.scale = self.modelscale; \ SetBrushEntityModel(); \ - self.use = g_clientmodel_use; \ + self.use1 = g_clientmodel_use; \ InitializeEntity(self, g_clientmodel_dropbyspawnflags, INITPRIO_DROPTOFLOOR); \ if(!self.solid) self.solid = (sol); else if(self.solid < 0) self.solid = SOLID_NOT; \ if(!self.bgmscriptsustain) self.bgmscriptsustain = 1; else if(self.bgmscriptsustain < 0) self.bgmscriptsustain = 0; \ diff --git a/qcsrc/server/g_subs.qh b/qcsrc/server/g_subs.qh index 90378d510d..fe32e09e84 100644 --- a/qcsrc/server/g_subs.qh +++ b/qcsrc/server/g_subs.qh @@ -4,7 +4,6 @@ void SUB_NullThink(); void() SUB_CalcMoveDone; void() SUB_CalcAngleMoveDone; -//void() SUB_UseTargets; spawnfunc(info_null); diff --git a/qcsrc/server/item_key.qc b/qcsrc/server/item_key.qc index 0230a21cbb..9688d51db1 100644 --- a/qcsrc/server/item_key.qc +++ b/qcsrc/server/item_key.qc @@ -84,8 +84,7 @@ void item_key_touch() string oldmsg = self.message; self.message = ""; - activator = other; - SUB_UseTargets(); + SUB_UseTargets(self, other, other); // TODO: should we be using other for the trigger here? self.message = oldmsg; }; diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index bb5f176b60..09837f20de 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -969,21 +969,15 @@ void adaptor_think2touch() void adaptor_think2use() {SELFPARAM(); - entity o, a; - o = other; - a = activator; - activator = world; - other = world; - self.use(); - other = o; - activator = a; + if(this.use1) + this.use1(this, NULL, NULL); } void adaptor_think2use_hittype_splash() // for timed projectile detonation {SELFPARAM(); - if(!(IS_ONGROUND(self))) // if onground, we ARE touching something, but HITTYPE_SPLASH is to be networked if the damage causing projectile is not touching ANYTHING - self.projectiledeathtype |= HITTYPE_SPLASH; - adaptor_think2use(); + if(!(IS_ONGROUND(this))) // if onground, we ARE touching something, but HITTYPE_SPLASH is to be networked if the damage causing projectile is not touching ANYTHING + this.projectiledeathtype |= HITTYPE_SPLASH; + WITHSELF(this, adaptor_think2use()); } // deferred dropping diff --git a/qcsrc/server/mutators/mutator/gamemode_assault.qc b/qcsrc/server/mutators/mutator/gamemode_assault.qc index e017f8a17f..c2d5ed3b90 100644 --- a/qcsrc/server/mutators/mutator/gamemode_assault.qc +++ b/qcsrc/server/mutators/mutator/gamemode_assault.qc @@ -62,29 +62,27 @@ const float ST_ASSAULT_OBJECTIVES = 1; const float SP_ASSAULT_OBJECTIVES = 4; // predefined spawnfuncs -void target_objective_decrease_activate(); +void target_objective_decrease_activate(entity this); #endif #ifdef IMPLEMENTATION .entity sprite; // random functions -void assault_objective_use() -{SELFPARAM(); +void assault_objective_use(entity this, entity actor, entity trigger) +{ // activate objective - self.health = 100; - //print("^2Activated objective ", self.targetname, "=", etos(self), "\n"); - //print("Activator is ", activator.classname, "\n"); + this.health = 100; + //print("^2Activated objective ", this.targetname, "=", etos(this), "\n"); + //print("Activator is ", actor.classname, "\n"); for (entity e = world; (e = find(e, target, this.targetname)); ) { if (e.classname == "target_objective_decrease") { - WITHSELF(e, target_objective_decrease_activate()); + target_objective_decrease_activate(e); } } - - setself(this); } vector target_objective_spawn_evalfunc(entity player, entity spot, vector current) @@ -102,9 +100,9 @@ void assault_objective_reset(entity this) } // decrease the health of targeted objectives -void assault_objective_decrease_use() -{SELFPARAM(); - if(activator.team != assault_attacker_team) +void assault_objective_decrease_use(entity this, entity actor, entity trigger) +{ + if(actor.team != assault_attacker_team) { // wrong team triggered decrease return; @@ -123,26 +121,19 @@ void assault_objective_decrease_use() { if(self.enemy.health - self.dmg > 0.5) { - PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.dmg); + PlayerTeamScore_Add(actor, SP_SCORE, ST_SCORE, self.dmg); self.enemy.health = self.enemy.health - self.dmg; } else { - PlayerTeamScore_Add(activator, SP_SCORE, ST_SCORE, self.enemy.health); - PlayerTeamScore_Add(activator, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1); + PlayerTeamScore_Add(actor, SP_SCORE, ST_SCORE, self.enemy.health); + PlayerTeamScore_Add(actor, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1); self.enemy.health = -1; - entity oldactivator; - - setself(this.enemy); - if(self.message) - FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(centerprint(it, self.message))); + if(this.enemy.message) + FOREACH_CLIENT(IS_PLAYER(it), LAMBDA(centerprint(it, this.enemy.message))); - oldactivator = activator; - activator = this; - SUB_UseTargets(); - activator = oldactivator; - setself(this); + SUB_UseTargets(this.enemy, this, trigger); } } } @@ -178,11 +169,11 @@ float assault_decreaser_sprite_visible(entity e) return true; } -void target_objective_decrease_activate() -{SELFPARAM(); +void target_objective_decrease_activate(entity this) +{ entity ent, spr; - self.owner = world; - for(ent = world; (ent = find(ent, target, self.targetname)); ) + this.owner = world; + for(ent = world; (ent = find(ent, target, this.targetname)); ) { if(ent.assault_sprite != world) { @@ -192,7 +183,7 @@ void target_objective_decrease_activate() } spr = WaypointSprite_SpawnFixed(WP_Assault, 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite, RADARICON_OBJECTIVE); - spr.assault_decreaser = self; + spr.assault_decreaser = this; spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible; spr.classname = "sprite_waypoint"; WaypointSprite_UpdateRule(spr, assault_attacker_team, SPRITERULE_TEAMPLAY); @@ -220,15 +211,14 @@ void target_assault_roundend_reset(entity this) this.winning = false; // up round } -void target_assault_roundend_use() -{SELFPARAM(); - self.winning = 1; // round has been won by attackers +void target_assault_roundend_use(entity this, entity actor, entity trigger) +{ + this.winning = 1; // round has been won by attackers } -void assault_roundstart_use() -{SELFPARAM(); - activator = self; - SUB_UseTargets(); +void assault_roundstart_use(entity this, entity actor, entity trigger) +{ + SUB_UseTargets(this, this, trigger); //(Re)spawn all turrets FOREACH_ENTITY_CLASS("turret_main", true, LAMBDA( @@ -362,7 +352,7 @@ spawnfunc(target_objective) if (!g_assault) { remove(this); return; } this.classname = "target_objective"; - this.use = assault_objective_use; + this.use1 = assault_objective_use; this.reset = assault_objective_reset; this.reset(this); this.spawn_evalfunc = target_objective_spawn_evalfunc; @@ -377,7 +367,7 @@ spawnfunc(target_objective_decrease) if(!self.dmg) self.dmg = 101; - self.use = assault_objective_decrease_use; + self.use1 = assault_objective_decrease_use; self.health = ASSAULT_VALUE_INACTIVE; self.max_health = ASSAULT_VALUE_INACTIVE; self.enemy = world; @@ -421,7 +411,7 @@ spawnfunc(target_assault_roundend) self.winning = 0; // round not yet won by attackers self.classname = "target_assault_roundend"; - self.use = target_assault_roundend_use; + self.use1 = target_assault_roundend_use; self.cnt = 0; // first round self.reset = target_assault_roundend_reset; } @@ -432,9 +422,9 @@ spawnfunc(target_assault_roundstart) assault_attacker_team = NUM_TEAM_1; self.classname = "target_assault_roundstart"; - self.use = assault_roundstart_use; - self.reset2 = assault_roundstart_use; - InitializeEntity(self, assault_roundstart_use, INITPRIO_FINDTARGET); + self.use1 = assault_roundstart_use; + self.reset2 = adaptor_think2use; + InitializeEntity(self, adaptor_think2use, INITPRIO_FINDTARGET); } // legacy bot code diff --git a/qcsrc/server/mutators/mutator/gamemode_domination.qc b/qcsrc/server/mutators/mutator/gamemode_domination.qc index ba6a48f354..4954be26a7 100644 --- a/qcsrc/server/mutators/mutator/gamemode_domination.qc +++ b/qcsrc/server/mutators/mutator/gamemode_domination.qc @@ -150,8 +150,7 @@ void dompoint_captured () old_team = self.team; self.team = real_team; self.delay = 0; - activator = self; - SUB_UseTargets (); + SUB_UseTargets (self, self, NULL); self.delay = old_delay; self.team = old_team; diff --git a/qcsrc/server/race.qc b/qcsrc/server/race.qc index 8b46c210b8..b32463c78c 100644 --- a/qcsrc/server/race.qc +++ b/qcsrc/server/race.qc @@ -580,10 +580,9 @@ void checkpoint_passed() */ if (!((self.spawnflags & 2) && (IS_PLAYER(other)))) { - activator = other; oldmsg = self.message; self.message = ""; - SUB_UseTargets(); + SUB_UseTargets(self, other, other); // TODO: should we be using other for the trigger here? self.message = oldmsg; } @@ -652,10 +651,9 @@ void checkpoint_passed() */ if(self.spawnflags & 2) { - activator = other; oldmsg = self.message; self.message = ""; - SUB_UseTargets(); + SUB_UseTargets(self, other, other); // TODO: should we be using other for the trigger here? self.message = oldmsg; } @@ -707,12 +705,12 @@ void checkpoint_touch() checkpoint_passed(); } -void checkpoint_use() +void checkpoint_use(entity this, entity actor, entity trigger) { - if(other.classname == "info_player_deathmatch") // a spawn, a spawn + if(trigger.classname == "info_player_deathmatch") // a spawn, a spawn return; - other = activator; + other = actor; checkpoint_passed(); } @@ -929,7 +927,7 @@ spawnfunc(trigger_race_checkpoint) EXACTTRIGGER_INIT; - self.use = checkpoint_use; + self.use1 = checkpoint_use; if (!(self.spawnflags & 1)) self.touch = checkpoint_touch; @@ -978,7 +976,7 @@ spawnfunc(target_checkpoint) // defrag entity EXACTTRIGGER_INIT; - self.use = checkpoint_use; + self.use1 = checkpoint_use; if (!(self.spawnflags & 1)) self.touch = checkpoint_touch; @@ -1122,9 +1120,9 @@ void penalty_touch() } } -void penalty_use() -{SELFPARAM(); - race_ImposePenaltyTime(activator, self.race_penalty, self.race_penalty_reason); +void penalty_use(entity this, entity actor, entity trigger) +{ + race_ImposePenaltyTime(actor, this.race_penalty, this.race_penalty_reason); } spawnfunc(trigger_race_penalty) @@ -1134,7 +1132,7 @@ spawnfunc(trigger_race_penalty) EXACTTRIGGER_INIT; - self.use = penalty_use; + self.use1 = penalty_use; if (!(self.spawnflags & 1)) self.touch = penalty_touch; diff --git a/qcsrc/server/spawnpoints.qc b/qcsrc/server/spawnpoints.qc index 51af4d16e3..31e941ad44 100644 --- a/qcsrc/server/spawnpoints.qc +++ b/qcsrc/server/spawnpoints.qc @@ -58,12 +58,12 @@ void spawnpoint_think() } } -void spawnpoint_use() -{SELFPARAM(); +void spawnpoint_use(entity this, entity actor, entity trigger) +{ if(teamplay) if(have_team_spawns > 0) { - self.team = activator.team; + this.team = actor.team; some_spawn_has_been_used = 1; } //LOG_INFO("spawnpoint was used!\n"); @@ -102,7 +102,7 @@ void relocate_spawnpoint() } } - self.use = spawnpoint_use; + self.use1 = spawnpoint_use; self.think = spawnpoint_think; self.nextthink = time + 0.5 + random() * 2; // shouldn't need it for a little second self.team_saved = self.team; diff --git a/qcsrc/server/spawnpoints.qh b/qcsrc/server/spawnpoints.qh index b010350908..a22ebb60c8 100644 --- a/qcsrc/server/spawnpoints.qh +++ b/qcsrc/server/spawnpoints.qh @@ -6,4 +6,4 @@ bool SpawnEvent_Send(entity this, entity to, int sf); entity Spawn_FilterOutBadSpots(entity firstspot, float mindist, float teamcheck); entity SelectSpawnPoint (float anypoint); spawnfunc(info_player_deathmatch); -void spawnpoint_use(); +void spawnpoint_use(entity this, entity actor, entity trigger); diff --git a/qcsrc/server/weapons/common.qc b/qcsrc/server/weapons/common.qc index 2a439f3d9e..4a06e16661 100644 --- a/qcsrc/server/weapons/common.qc +++ b/qcsrc/server/weapons/common.qc @@ -73,21 +73,21 @@ float W_CheckProjectileDamage(entity inflictor, entity projowner, int deathtype, return true; // if none of these return, then allow damage anyway. } -void W_PrepareExplosionByDamage(entity attacker, void() explode) -{SELFPARAM(); - self.takedamage = DAMAGE_NO; - self.event_damage = func_null; +void W_PrepareExplosionByDamage(entity this, entity attacker, void() explode) +{ + this.takedamage = DAMAGE_NO; + this.event_damage = func_null; if(IS_CLIENT(attacker) && !autocvar_g_projectiles_keep_owner) { - self.owner = attacker; - self.realowner = attacker; + this.owner = attacker; + this.realowner = attacker; } - MUTATOR_CALLHOOK(PrepareExplosionByDamage, self, attacker); + MUTATOR_CALLHOOK(PrepareExplosionByDamage, this, attacker); // do not explode NOW but in the NEXT FRAME! // because recursive calls to RadiusDamage are not allowed - self.nextthink = time; - self.think = explode; + this.nextthink = time; + this.think = explode; } diff --git a/qcsrc/server/weapons/common.qh b/qcsrc/server/weapons/common.qh index 7633c386e7..2ab8ea5acc 100644 --- a/qcsrc/server/weapons/common.qh +++ b/qcsrc/server/weapons/common.qh @@ -5,4 +5,4 @@ void W_GiveWeapon (entity e, float wep); .float prevstrengthsoundattempt; void W_PlayStrengthSound(entity player); float W_CheckProjectileDamage(entity inflictor, entity projowner, int deathtype, float exception); -void W_PrepareExplosionByDamage(entity attacker, void() explode); +void W_PrepareExplosionByDamage(entity this, entity attacker, void() explode);