From: Mario Date: Sat, 10 Dec 2016 16:29:29 +0000 (+1000) Subject: Allow target_push to be used as a pusher itself (Quake 3 compatibility) X-Git-Tag: xonotic-v0.8.2~386 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=faa18c987f83ea9e8dc63aec9ecbc5eeb6420e2b;p=xonotic%2Fxonotic-data.pk3dir.git Allow target_push to be used as a pusher itself (Quake 3 compatibility) --- diff --git a/qcsrc/common/triggers/trigger/jumppads.qc b/qcsrc/common/triggers/trigger/jumppads.qc index 498f0ff2d..edbe9c580 100644 --- a/qcsrc/common/triggers/trigger/jumppads.qc +++ b/qcsrc/common/triggers/trigger/jumppads.qc @@ -130,23 +130,14 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht) return sdir * vs + '0 0 1' * vz; } -void trigger_push_touch(entity this, entity toucher) +bool jumppad_push(entity this, entity targ) { - if (this.active == ACTIVE_NOT) - return; - - if (!isPushable(toucher)) - return; - - if(this.team) - if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, toucher))) - return; - - EXACTTRIGGER_TOUCH(this, toucher); + if (!isPushable(targ)) + return false; if(this.enemy) { - toucher.velocity = trigger_push_calculatevelocity(toucher.origin, this.enemy, this.height); + targ.velocity = trigger_push_calculatevelocity(targ.origin, this.enemy, this.height); } else if(this.target && this.target != "") { @@ -159,105 +150,117 @@ void trigger_push_touch(entity this, entity toucher) else RandomSelection_AddEnt(e, 1, 1); } - toucher.velocity = trigger_push_calculatevelocity(toucher.origin, RandomSelection_chosen_ent, this.height); + targ.velocity = trigger_push_calculatevelocity(targ.origin, RandomSelection_chosen_ent, this.height); } else { - toucher.velocity = this.movedir; + targ.velocity = this.movedir; } - UNSET_ONGROUND(toucher); + UNSET_ONGROUND(targ); #ifdef CSQC - if (toucher.flags & FL_PROJECTILE) + if (targ.flags & FL_PROJECTILE) { - toucher.angles = vectoangles (toucher.velocity); - switch(toucher.move_movetype) + targ.angles = vectoangles (targ.velocity); + switch(targ.move_movetype) { case MOVETYPE_FLY: - set_movetype(toucher, MOVETYPE_TOSS); - toucher.gravity = 1; + set_movetype(targ, MOVETYPE_TOSS); + targ.gravity = 1; break; case MOVETYPE_BOUNCEMISSILE: - set_movetype(toucher, MOVETYPE_BOUNCE); - toucher.gravity = 1; + set_movetype(targ, MOVETYPE_BOUNCE); + targ.gravity = 1; break; } } #endif #ifdef SVQC - if (IS_PLAYER(toucher)) + if (IS_PLAYER(targ)) { // reset tracking of oldvelocity for impact damage (sudden velocity changes) - toucher.oldvelocity = toucher.velocity; + targ.oldvelocity = targ.velocity; if(this.pushltime < time) // prevent "snorring" sound when a player hits the jumppad more than once { // flash when activated - Send_Effect(EFFECT_JUMPPAD, toucher.origin, toucher.velocity, 1); - _sound (toucher, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM); + Send_Effect(EFFECT_JUMPPAD, targ.origin, targ.velocity, 1); + _sound (targ, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM); this.pushltime = time + 0.2; } - if(IS_REAL_CLIENT(toucher) || IS_BOT_CLIENT(toucher)) + if(IS_REAL_CLIENT(targ) || IS_BOT_CLIENT(targ)) { bool found = false; - for(int i = 0; i < toucher.jumppadcount && i < NUM_JUMPPADSUSED; ++i) - if(toucher.(jumppadsused[i]) == this) + for(int i = 0; i < targ.jumppadcount && i < NUM_JUMPPADSUSED; ++i) + if(targ.(jumppadsused[i]) == this) found = true; if(!found) { - toucher.(jumppadsused[toucher.jumppadcount % NUM_JUMPPADSUSED]) = this; - toucher.jumppadcount = toucher.jumppadcount + 1; + targ.(jumppadsused[targ.jumppadcount % NUM_JUMPPADSUSED]) = this; + targ.jumppadcount = targ.jumppadcount + 1; } - if(IS_REAL_CLIENT(toucher)) + if(IS_REAL_CLIENT(targ)) { if(this.message) - centerprint(toucher, this.message); + centerprint(targ, this.message); } else - toucher.lastteleporttime = time; + targ.lastteleporttime = time; - if (!IS_DEAD(toucher)) - animdecide_setaction(toucher, ANIMACTION_JUMP, true); + if (!IS_DEAD(targ)) + animdecide_setaction(targ, ANIMACTION_JUMP, true); } else - toucher.jumppadcount = true; + targ.jumppadcount = true; // reset tracking of who pushed you into a hazard (for kill credit) - toucher.pushltime = 0; - toucher.istypefrag = 0; + targ.pushltime = 0; + targ.istypefrag = 0; } if(this.enemy.target) - SUB_UseTargets(this.enemy, toucher, toucher); // TODO: do we need toucher as trigger too? + SUB_UseTargets(this.enemy, targ, targ); // TODO: do we need targ as trigger too? - if (toucher.flags & FL_PROJECTILE) + if (targ.flags & FL_PROJECTILE) { - toucher.angles = vectoangles (toucher.velocity); - toucher.com_phys_gravity_factor = 1; - switch(toucher.move_movetype) + targ.angles = vectoangles (targ.velocity); + targ.com_phys_gravity_factor = 1; + switch(targ.move_movetype) { case MOVETYPE_FLY: - set_movetype(toucher, MOVETYPE_TOSS); - toucher.gravity = 1; + set_movetype(targ, MOVETYPE_TOSS); + targ.gravity = 1; break; case MOVETYPE_BOUNCEMISSILE: - set_movetype(toucher, MOVETYPE_BOUNCE); - toucher.gravity = 1; + set_movetype(targ, MOVETYPE_BOUNCE); + targ.gravity = 1; break; } - UpdateCSQCProjectile(toucher); + UpdateCSQCProjectile(targ); } +#endif - /*if (toucher.flags & FL_ITEM) - { - ItemUpdate(toucher); - toucher.SendFlags |= ISF_DROP; - }*/ + return true; +} + +void trigger_push_touch(entity this, entity toucher) +{ + if (this.active == ACTIVE_NOT) + return; - if (this.spawnflags & PUSH_ONCE) + if(this.team) + if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, toucher))) + return; + + EXACTTRIGGER_TOUCH(this, toucher); + + noref bool success = jumppad_push(this, toucher); + +#ifdef SVQC + if (success && (this.spawnflags & PUSH_ONCE)) { settouch(this, func_null); setthink(this, SUB_Remove); @@ -272,17 +275,14 @@ void trigger_push_updatelink(entity this); #endif void trigger_push_findtarget(entity this) { - entity t; - vector org; - // first calculate a typical start point for the jump - org = (this.absmin + this.absmax) * 0.5; + vector org = (this.absmin + this.absmax) * 0.5; org_z = this.absmax.z - STAT(PL_MIN, NULL).z; if (this.target) { - float n = 0; - for(t = NULL; (t = find(t, targetname, this.target)); ) + int n = 0; + for(entity t = NULL; (t = find(t, targetname, this.target)); ) { ++n; #ifdef SVQC @@ -328,7 +328,6 @@ void trigger_push_findtarget(entity this) delete(e); } - trigger_push_link(this); defer(this, 0.1, trigger_push_updatelink); #endif } @@ -393,6 +392,8 @@ spawnfunc(trigger_push) this.noise = "misc/jumppad.wav"; precache_sound (this.noise); + trigger_push_link(this); // link it now + // this must be called to spawn the teleport waypoints for bots InitializeEntity(this, trigger_push_findtarget, INITPRIO_FINDTARGET); } @@ -415,6 +416,11 @@ bool target_push_send(entity this, entity to, float sf) return true; } +void target_push_use(entity this, entity actor, entity trigger) +{ + jumppad_push(this, actor); +} + void target_push_link(entity this) { BITSET_ASSIGN(this.effects, EF_NODEPTHTEST); @@ -429,7 +435,18 @@ void target_push_init(entity this) target_push_link(this); } -spawnfunc(target_push) { target_push_init(this); } +void target_push_init2(entity this) +{ + if(this.target && this.target != "") // we have an old style pusher! + { + InitializeEntity(this, trigger_push_findtarget, INITPRIO_FINDTARGET); + this.use = target_push_use; + } + + target_push_init(this); // normal push target behaviour can be combined with a legacy pusher? +} + +spawnfunc(target_push) { target_push_init2(this); } spawnfunc(info_notnull) { target_push_init(this); } spawnfunc(target_position) { target_push_init(this); }