X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ftrigger%2Fjumppads.qc;h=5a279561d374c5c6b0d975e3a4105b5e2f322787;hp=de8458e9f8bc15abe5c63f034c35164c02f3ff6f;hb=c5fcf672c473edef7139d4250398184b8ae17224;hpb=77d6a05629e33da863fccb3cdd03b3c63af890dd diff --git a/qcsrc/common/triggers/trigger/jumppads.qc b/qcsrc/common/triggers/trigger/jumppads.qc index de8458e9f8..5a279561d3 100644 --- a/qcsrc/common/triggers/trigger/jumppads.qc +++ b/qcsrc/common/triggers/trigger/jumppads.qc @@ -1,14 +1,15 @@ +#include "jumppads.qh" // TODO: split target_push and put it in the target folder #ifdef SVQC #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 @@ -129,177 +130,170 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht) return sdir * vs + '0 0 1' * vz; } -void trigger_push_touch() -{SELFPARAM(); - if (this.active == ACTIVE_NOT) - return; - - if (!isPushable(other)) - return; - - if(this.team) - if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, other))) - return; - - EXACTTRIGGER_TOUCH; +bool jumppad_push(entity this, entity targ) +{ + if (!isPushable(targ)) + return false; if(this.enemy) { - other.velocity = trigger_push_calculatevelocity(other.origin, this.enemy, this.height); - other.move_velocity = other.velocity; + targ.velocity = trigger_push_calculatevelocity(targ.origin, this.enemy, this.height); } - else if(this.target) + else if(this.target && this.target != "") { entity e; RandomSelection_Init(); - for(e = world; (e = find(e, targetname, this.target)); ) + for(e = NULL; (e = find(e, targetname, this.target)); ) { if(e.cnt) - RandomSelection_Add(e, 0, string_null, e.cnt, 1); + RandomSelection_AddEnt(e, e.cnt, 1); else - RandomSelection_Add(e, 0, string_null, 1, 1); + RandomSelection_AddEnt(e, 1, 1); } - other.velocity = trigger_push_calculatevelocity(other.origin, RandomSelection_chosen_ent, this.height); - other.move_velocity = other.velocity; + targ.velocity = trigger_push_calculatevelocity(targ.origin, RandomSelection_chosen_ent, this.height); } else { - other.velocity = this.movedir; - other.move_velocity = other.velocity; + targ.velocity = this.movedir; } -#ifdef SVQC - UNSET_ONGROUND(other); -#elif defined(CSQC) - other.move_flags &= ~FL_ONGROUND; + UNSET_ONGROUND(targ); - if (other.flags & FL_PROJECTILE) +#ifdef CSQC + if (targ.flags & FL_PROJECTILE) { - other.move_angles = vectoangles (other.move_velocity); - switch(other.move_movetype) + targ.angles = vectoangles (targ.velocity); + switch(targ.move_movetype) { case MOVETYPE_FLY: - other.move_movetype = MOVETYPE_TOSS; - other.gravity = 1; + set_movetype(targ, MOVETYPE_TOSS); + targ.gravity = 1; break; case MOVETYPE_BOUNCEMISSILE: - other.move_movetype = MOVETYPE_BOUNCE; - other.gravity = 1; + set_movetype(targ, MOVETYPE_BOUNCE); + targ.gravity = 1; break; } } #endif #ifdef SVQC - if (IS_PLAYER(other)) + if (IS_PLAYER(targ)) { // reset tracking of oldvelocity for impact damage (sudden velocity changes) - other.oldvelocity = other.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, other.origin, other.velocity, 1); - _sound (other, 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(other) || IS_BOT_CLIENT(other)) + if(IS_REAL_CLIENT(targ) || IS_BOT_CLIENT(targ)) { bool found = false; - for(int i = 0; i < other.jumppadcount && i < NUM_JUMPPADSUSED; ++i) - if(other.(jumppadsused[i]) == this) + for(int i = 0; i < targ.jumppadcount && i < NUM_JUMPPADSUSED; ++i) + if(targ.(jumppadsused[i]) == this) found = true; if(!found) { - other.(jumppadsused[other.jumppadcount % NUM_JUMPPADSUSED]) = this; - other.jumppadcount = other.jumppadcount + 1; + targ.(jumppadsused[targ.jumppadcount % NUM_JUMPPADSUSED]) = this; + targ.jumppadcount = targ.jumppadcount + 1; } - if(IS_REAL_CLIENT(other)) + if(IS_REAL_CLIENT(targ)) { if(this.message) - centerprint(other, this.message); + centerprint(targ, this.message); } else - other.lastteleporttime = time; + targ.lastteleporttime = time; - if (!IS_DEAD(other)) - animdecide_setaction(other, ANIMACTION_JUMP, true); + if (!IS_DEAD(targ)) + animdecide_setaction(targ, ANIMACTION_JUMP, true); } else - other.jumppadcount = true; + targ.jumppadcount = true; // reset tracking of who pushed you into a hazard (for kill credit) - other.pushltime = 0; - other.istypefrag = 0; + targ.pushltime = 0; + targ.istypefrag = 0; } if(this.enemy.target) - { - activator = other; - WITH(entity, self, this.enemy, SUB_UseTargets()); - } + SUB_UseTargets(this.enemy, targ, targ); // TODO: do we need targ as trigger too? - if (other.flags & FL_PROJECTILE) + if (targ.flags & FL_PROJECTILE) { - other.angles = vectoangles (other.velocity); - switch(other.movetype) + targ.angles = vectoangles (targ.velocity); + targ.com_phys_gravity_factor = 1; + switch(targ.move_movetype) { case MOVETYPE_FLY: - other.movetype = MOVETYPE_TOSS; - other.gravity = 1; + set_movetype(targ, MOVETYPE_TOSS); + targ.gravity = 1; break; case MOVETYPE_BOUNCEMISSILE: - other.movetype = MOVETYPE_BOUNCE; - other.gravity = 1; + set_movetype(targ, MOVETYPE_BOUNCE); + targ.gravity = 1; break; } - UpdateCSQCProjectile(other); + UpdateCSQCProjectile(targ); } +#endif - /*if (other.flags & FL_ITEM) - { - ItemUpdate(other); - other.SendFlags |= ISF_DROP; - }*/ + return true; +} + +void trigger_push_touch(entity this, entity toucher) +{ + if (this.active == ACTIVE_NOT) + return; + + if(this.team) + if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, toucher))) + return; + + EXACTTRIGGER_TOUCH(this, toucher); + + noref bool success = jumppad_push(this, toucher); - if (this.spawnflags & PUSH_ONCE) +#ifdef SVQC + if (success && (this.spawnflags & PUSH_ONCE)) { - this.touch = func_null; - this.think = SUB_Remove_self; + settouch(this, func_null); + setthink(this, SUB_Remove); this.nextthink = time; } #endif } #ifdef SVQC -void trigger_push_link(); -void trigger_push_updatelink(); +void trigger_push_link(entity this); +void trigger_push_updatelink(entity this); #endif -void trigger_push_findtarget() -{SELFPARAM(); - entity t; - vector org; - +void trigger_push_findtarget(entity this) +{ // first calculate a typical start point for the jump - org = (self.absmin + self.absmax) * 0.5; - org_z = self.absmax.z - STAT(PL_MIN, NULL).z; + vector org = (this.absmin + this.absmax) * 0.5; + org.z = this.absmax.z - PL_MIN_CONST.z; - if (self.target) + if (this.target) { - float n = 0; - for(t = world; (t = find(t, targetname, self.target)); ) + int n = 0; + for(entity t = NULL; (t = find(t, targetname, this.target)); ) { ++n; #ifdef SVQC entity e = spawn(); setorigin(e, org); - setsize(e, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL)); - e.velocity = trigger_push_calculatevelocity(org, t, self.height); + setsize(e, PL_MIN_CONST, PL_MAX_CONST); + e.velocity = trigger_push_calculatevelocity(org, t, this.height); tracetoss(e, e); - if(e.movetype == MOVETYPE_NONE) - waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); - remove(e); + if(e.move_movetype == MOVETYPE_NONE) + waypoint_spawnforteleporter(this, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); + delete(e); #endif } @@ -307,19 +301,19 @@ void trigger_push_findtarget() { // no dest! #ifdef SVQC - objerror ("Jumppad with nonexistant target"); + objerror (this, "Jumppad with nonexistant target"); #endif return; } else if(n == 1) { // exactly one dest - bots love that - self.enemy = find(world, targetname, self.target); + this.enemy = find(NULL, targetname, this.target); } else { // have to use random selection every single time - self.enemy = world; + this.enemy = NULL; } } #ifdef SVQC @@ -327,15 +321,14 @@ void trigger_push_findtarget() { entity e = spawn(); setorigin(e, org); - setsize(e, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL)); - e.velocity = self.movedir; + setsize(e, PL_MIN_CONST, PL_MAX_CONST); + e.velocity = this.movedir; tracetoss(e, e); - waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); - remove(e); + waypoint_spawnforteleporter(this, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); + delete(e); } - trigger_push_link(); - defer(self, 0.1, trigger_push_updatelink); + defer(this, 0.1, trigger_push_updatelink); #endif } @@ -344,25 +337,28 @@ float trigger_push_send(entity this, entity to, float sf) { WriteHeader(MSG_ENTITY, ENT_CLIENT_TRIGGER_PUSH); - WriteByte(MSG_ENTITY, self.team); - WriteInt24_t(MSG_ENTITY, self.spawnflags); - WriteByte(MSG_ENTITY, self.active); - WriteCoord(MSG_ENTITY, self.height); + WriteByte(MSG_ENTITY, this.team); + WriteInt24_t(MSG_ENTITY, this.spawnflags); + WriteByte(MSG_ENTITY, this.active); + WriteCoord(MSG_ENTITY, this.height); - trigger_common_write(self, true); + WriteCoord(MSG_ENTITY, this.movedir_x); + WriteCoord(MSG_ENTITY, this.movedir_y); + WriteCoord(MSG_ENTITY, this.movedir_z); + + trigger_common_write(this, true); return true; } -void trigger_push_updatelink() -{SELFPARAM(); - self.SendFlags |= 1; +void trigger_push_updatelink(entity this) +{ + this.SendFlags |= 1; } -void trigger_push_link() +void trigger_push_link(entity this) { - SELFPARAM(); - trigger_link(self, trigger_push_send); + trigger_link(this, trigger_push_send); } /* @@ -379,25 +375,27 @@ void trigger_push_link() */ spawnfunc(trigger_push) { - SetMovedir(self); + SetMovedir(this); - trigger_init(self); + trigger_init(this); - self.active = ACTIVE_ACTIVE; - self.use = trigger_push_use; - self.touch = trigger_push_touch; + this.active = ACTIVE_ACTIVE; + this.use = trigger_push_use; + settouch(this, trigger_push_touch); // normal push setup - if (!self.speed) - self.speed = 1000; - self.movedir = self.movedir * self.speed * 10; + if (!this.speed) + this.speed = 1000; + this.movedir = this.movedir * this.speed * 10; - if (!self.noise) - self.noise = "misc/jumppad.wav"; - precache_sound (self.noise); + if (!this.noise) + 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(self, trigger_push_findtarget, INITPRIO_FINDTARGET); + InitializeEntity(this, trigger_push_findtarget, INITPRIO_FINDTARGET); } @@ -405,19 +403,24 @@ bool target_push_send(entity this, entity to, float sf) { WriteHeader(MSG_ENTITY, ENT_CLIENT_TARGET_PUSH); - WriteByte(MSG_ENTITY, self.cnt); - WriteString(MSG_ENTITY, self.targetname); - WriteCoord(MSG_ENTITY, self.origin_x); - WriteCoord(MSG_ENTITY, self.origin_y); - WriteCoord(MSG_ENTITY, self.origin_z); + WriteByte(MSG_ENTITY, this.cnt); + WriteString(MSG_ENTITY, this.targetname); + WriteCoord(MSG_ENTITY, this.origin_x); + WriteCoord(MSG_ENTITY, this.origin_y); + WriteCoord(MSG_ENTITY, this.origin_z); - WriteAngle(MSG_ENTITY, self.angles_x); - WriteAngle(MSG_ENTITY, self.angles_y); - WriteAngle(MSG_ENTITY, self.angles_z); + WriteAngle(MSG_ENTITY, this.angles_x); + WriteAngle(MSG_ENTITY, this.angles_y); + WriteAngle(MSG_ENTITY, this.angles_z); 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); @@ -432,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); } @@ -440,23 +454,23 @@ spawnfunc(target_position) { target_push_init(this); } NET_HANDLE(ENT_CLIENT_TRIGGER_PUSH, bool isnew) { - make_pure(this); + this.classname = "jumppad"; + int mytm = ReadByte(); if(mytm) { this.team = mytm - 1; } + this.spawnflags = ReadInt24_t(); + this.active = ReadByte(); + this.height = ReadCoord(); - self.classname = "jumppad"; - int mytm = ReadByte(); if(mytm) { self.team = mytm - 1; } - self.spawnflags = ReadInt24_t(); - self.active = ReadByte(); - self.height = ReadCoord(); + this.movedir_x = ReadCoord(); + this.movedir_y = ReadCoord(); + this.movedir_z = ReadCoord(); - trigger_common_read(true); + trigger_common_read(this, true); - self.entremove = trigger_remove_generic; - self.solid = SOLID_TRIGGER; - //self.draw = trigger_draw_generic; - self.move_touch = trigger_push_touch; - self.drawmask = MASK_NORMAL; - self.move_time = time; - defer(self, 0.25, trigger_push_findtarget); + this.entremove = trigger_remove_generic; + this.solid = SOLID_TRIGGER; + settouch(this, trigger_push_touch); + this.move_time = time; + defer(this, 0.25, trigger_push_findtarget); return true; } @@ -474,22 +488,22 @@ void target_push_remove(entity this) NET_HANDLE(ENT_CLIENT_TARGET_PUSH, bool isnew) { - self.classname = "push_target"; - self.cnt = ReadByte(); - self.targetname = strzone(ReadString()); - self.origin_x = ReadCoord(); - self.origin_y = ReadCoord(); - self.origin_z = ReadCoord(); + this.classname = "push_target"; + this.cnt = ReadByte(); + this.targetname = strzone(ReadString()); + this.origin_x = ReadCoord(); + this.origin_y = ReadCoord(); + this.origin_z = ReadCoord(); - self.angles_x = ReadAngle(); - self.angles_y = ReadAngle(); - self.angles_z = ReadAngle(); + this.angles_x = ReadAngle(); + this.angles_y = ReadAngle(); + this.angles_z = ReadAngle(); return = true; - setorigin(self, self.origin); + setorigin(this, this.origin); - self.drawmask = MASK_NORMAL; - self.entremove = target_push_remove; + this.drawmask = MASK_NORMAL; + this.entremove = target_push_remove; } #endif