==============================
*/
-void SUB_UseTargets_Ex(entity this, entity actor, entity trigger, bool preventReuse)
+void SUB_UseTargets_Ex(entity this, entity actor, entity trigger, bool preventReuse, int skiptargets)
{
//
// check for a delay
t.enemy = actor;
t.message = this.message;
t.killtarget = this.killtarget;
- t.target = this.target;
- t.target2 = this.target2;
- t.target3 = this.target3;
- t.target4 = this.target4;
+ if(!(skiptargets & BIT(1))) t.target = this.target;
+ if(!(skiptargets & BIT(2))) t.target2 = this.target2;
+ if(!(skiptargets & BIT(3))) t.target3 = this.target3;
+ if(!(skiptargets & BIT(4))) t.target4 = this.target4;
t.antiwall_flag = this.antiwall_flag;
return;
}
for(int i = 0; i < 4; ++i)
{
+ if(skiptargets & BIT(i + 1))
+ continue;
switch(i)
{
default:
}
}
-void SUB_UseTargets(entity this, entity actor, entity trigger) { SUB_UseTargets_Ex(this, actor, trigger, false); }
-void SUB_UseTargets_PreventReuse(entity this, entity actor, entity trigger) { SUB_UseTargets_Ex(this, actor, trigger, true); }
+void SUB_UseTargets(entity this, entity actor, entity trigger) { SUB_UseTargets_Ex(this, actor, trigger, false, 0); }
+void SUB_UseTargets_PreventReuse(entity this, entity actor, entity trigger) { SUB_UseTargets_Ex(this, actor, trigger, true, 0); }
+void SUB_UseTargets_SkipTargets(entity this, entity actor, entity trigger, int skiptargets) { SUB_UseTargets_Ex(this, actor, trigger, false, skiptargets); }
void SUB_UseTargets_PreventReuse(entity this, entity actor, entity trigger);
+// allow excluding certain .target* fields without needing to nullify them
+// use BIT(1) through BIT(4)
+void SUB_UseTargets_SkipTargets(entity this, entity actor, entity trigger, int skiptargets);
+
void generic_setactive(entity this, int act);
// generic methods for netlinked entities
void generic_netlinked_reset(entity this);
#include <server/utils.qh>
#endif
+#ifdef SVQC
+bool autocvar_sv_warpzone_allow_selftarget;
+#endif
+
#ifdef WARPZONELIB_KEEPDEBUG
#define WARPZONELIB_REMOVEHACK
#endif
if(WarpZone_Teleport(this, toucher, f, 0))
{
#ifdef SVQC
- string save1, save2;
-
- save1 = this.target; this.target = string_null;
- save2 = this.target3; this.target3 = string_null;
- SUB_UseTargets(this, toucher, toucher); // use toucher too?
- if (!this.target) this.target = save1;
- if (!this.target3) this.target3 = save2;
-
- save1 = this.target; this.target = string_null;
- save2 = this.target2; this.target2 = string_null;
- SUB_UseTargets(this.enemy, toucher, toucher); // use toucher too?
- if (!this.target) this.target = save1;
- if (!this.target2) this.target2 = save2;
+ SUB_UseTargets_SkipTargets(this, toucher, toucher, BIT(1) | BIT(3)); // use toucher too?
+ SUB_UseTargets_SkipTargets(this.enemy, toucher, toucher, BIT(1) | BIT(2)); // use toucher too?
#endif
}
else
player.velocity = player.warpzone_oldvelocity;
if(WarpZone_Teleport(wz, player, 0, 1))
{
- string save1, save2;
-
- 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;
+ SUB_UseTargets_SkipTargets(wz, player, player, BIT(1) | BIT(3));
+ SUB_UseTargets_SkipTargets(wz.enemy, player, player, BIT(1) | BIT(2));
}
else
{
// this way only one of the two ents needs to target
if(this.target != "")
{
- this.enemy = this; // so the if(!e.enemy) check also skips this, saves one IF
+ if(!autocvar_sv_warpzone_allow_selftarget)
+ this.enemy = this; // so the if(!e.enemy) check also skips this, saves one IF
e2 = NULL;
for(e = NULL, i = 0; (e = find(e, targetname, this.target)); )