X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ftrigger%2Fjumppads.qc;h=67fd752207989e7277c176373c5ae1f22a759cd5;hb=47ac01ac700f05fceef988e8051282f0d41ddf6c;hp=931ff9ceece98d0492268f51316efd4a3c1fe9f1;hpb=3ae1efa7401791e42e3171f4db2cc2d38adde088;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/trigger/jumppads.qc b/qcsrc/common/triggers/trigger/jumppads.qc index 931ff9cee..67fd75220 100644 --- a/qcsrc/common/triggers/trigger/jumppads.qc +++ b/qcsrc/common/triggers/trigger/jumppads.qc @@ -1,18 +1,21 @@ // TODO: split target_push and put it in the target folder #ifdef SVQC #include "jumppads.qh" -#include "../../movetypes/movetypes.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 +REGISTER_NET_LINKED(ENT_CLIENT_TRIGGER_PUSH) +REGISTER_NET_LINKED(ENT_CLIENT_TARGET_PUSH) + /* trigger_push_calculatevelocity @@ -34,7 +37,7 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht) torg = tgt.origin + (tgt.mins + tgt.maxs) * 0.5; - grav = PHYS_GRAVITY; + grav = PHYS_GRAVITY(other); if(PHYS_ENTGRAVITY(other)) grav *= PHYS_ENTGRAVITY(other); @@ -128,83 +131,99 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht) void trigger_push_touch() {SELFPARAM(); - if (self.active == ACTIVE_NOT) + if (this.active == ACTIVE_NOT) return; -#ifdef SVQC if (!isPushable(other)) return; -#endif - if(self.team) - if(((self.spawnflags & 4) == 0) == (DIFF_TEAM(self, other))) + if(this.team) + if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, other))) return; EXACTTRIGGER_TOUCH; - if(self.enemy) + if(this.enemy) { - other.velocity = trigger_push_calculatevelocity(other.origin, self.enemy, self.height); + other.velocity = trigger_push_calculatevelocity(other.origin, this.enemy, this.height); other.move_velocity = other.velocity; } - else if(self.target) + else if(this.target) { entity e; RandomSelection_Init(); - for(e = world; (e = find(e, targetname, self.target)); ) + for(e = world; (e = find(e, targetname, this.target)); ) { if(e.cnt) RandomSelection_Add(e, 0, string_null, e.cnt, 1); else RandomSelection_Add(e, 0, string_null, 1, 1); } - other.velocity = trigger_push_calculatevelocity(other.origin, RandomSelection_chosen_ent, self.height); + other.velocity = trigger_push_calculatevelocity(other.origin, RandomSelection_chosen_ent, this.height); other.move_velocity = other.velocity; } else { - other.velocity = self.movedir; + other.velocity = this.movedir; other.move_velocity = other.velocity; } +#ifdef SVQC UNSET_ONGROUND(other); - +#elif defined(CSQC) other.move_flags &= ~FL_ONGROUND; + if (other.flags & FL_PROJECTILE) + { + other.move_angles = vectoangles (other.move_velocity); + switch(other.move_movetype) + { + case MOVETYPE_FLY: + other.move_movetype = MOVETYPE_TOSS; + other.gravity = 1; + break; + case MOVETYPE_BOUNCEMISSILE: + other.move_movetype = MOVETYPE_BOUNCE; + other.gravity = 1; + break; + } + } +#endif + #ifdef SVQC if (IS_PLAYER(other)) { // reset tracking of oldvelocity for impact damage (sudden velocity changes) other.oldvelocity = other.velocity; - if(self.pushltime < time) // prevent "snorring" sound when a player hits the jumppad more than once + 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, self.noise, VOL_BASE, ATTEN_NORM); - self.pushltime = time + 0.2; + _sound (other, CH_TRIGGER, this.noise, VOL_BASE, ATTEN_NORM); + this.pushltime = time + 0.2; } if(IS_REAL_CLIENT(other) || IS_BOT_CLIENT(other)) { bool found = false; for(int i = 0; i < other.jumppadcount && i < NUM_JUMPPADSUSED; ++i) - if(other.(jumppadsused[i]) == self) + if(other.(jumppadsused[i]) == this) found = true; if(!found) { - other.(jumppadsused[other.jumppadcount % NUM_JUMPPADSUSED]) = self; + other.(jumppadsused[other.jumppadcount % NUM_JUMPPADSUSED]) = this; other.jumppadcount = other.jumppadcount + 1; } if(IS_REAL_CLIENT(other)) { - if(self.message) - centerprint(other, self.message); + if(this.message) + centerprint(other, this.message); } else other.lastteleporttime = time; - if (other.deadflag == DEAD_NO) + if (!IS_DEAD(other)) animdecide_setaction(other, ANIMACTION_JUMP, true); } else @@ -215,11 +234,8 @@ void trigger_push_touch() other.istypefrag = 0; } - if(self.enemy.target) - { - activator = other; - WITH(entity, self, self.enemy, SUB_UseTargets()); - } + if(this.enemy.target) + SUB_UseTargets(this.enemy, other, other); // TODO: do we need other as trigger too? if (other.flags & FL_PROJECTILE) { @@ -238,42 +254,48 @@ void trigger_push_touch() UpdateCSQCProjectile(other); } - if (self.spawnflags & PUSH_ONCE) + /*if (other.flags & FL_ITEM) { - self.touch = func_null; - self.think = SUB_Remove; - self.nextthink = time; + ItemUpdate(other); + other.SendFlags |= ISF_DROP; + }*/ + + if (this.spawnflags & PUSH_ONCE) + { + this.touch = func_null; + this.think = SUB_Remove_self; + this.nextthink = time; } #endif } #ifdef SVQC void trigger_push_link(); -void trigger_push_updatelink(); +void trigger_push_updatelink(entity this); #endif -void trigger_push_findtarget() -{SELFPARAM(); +void trigger_push_findtarget(entity this) +{ entity t; vector org; // first calculate a typical start point for the jump - org = (self.absmin + self.absmax) * 0.5; - org_z = self.absmax.z - PL_MIN.z; + org = (this.absmin + this.absmax) * 0.5; + org_z = this.absmax.z - STAT(PL_MIN, NULL).z; - if (self.target) + if (this.target) { float n = 0; - for(t = world; (t = find(t, targetname, self.target)); ) + for(t = world; (t = find(t, targetname, this.target)); ) { ++n; #ifdef SVQC entity e = spawn(); setorigin(e, org); - setsize(e, PL_MIN, PL_MAX); - e.velocity = trigger_push_calculatevelocity(org, t, self.height); + setsize(e, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL)); + 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)); + waypoint_spawnforteleporter(this, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); remove(e); #endif } @@ -289,12 +311,12 @@ void trigger_push_findtarget() else if(n == 1) { // exactly one dest - bots love that - self.enemy = find(world, targetname, self.target); + this.enemy = find(world, targetname, this.target); } else { // have to use random selection every single time - self.enemy = world; + this.enemy = world; } } #ifdef SVQC @@ -302,54 +324,44 @@ void trigger_push_findtarget() { entity e = spawn(); setorigin(e, org); - setsize(e, PL_MIN, PL_MAX); - e.velocity = self.movedir; + setsize(e, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL)); + e.velocity = this.movedir; tracetoss(e, e); - waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); + waypoint_spawnforteleporter(this, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity)); remove(e); } trigger_push_link(); - defer(0.1, trigger_push_updatelink); + defer(this, 0.1, trigger_push_updatelink); #endif } #ifdef SVQC -float trigger_push_send(entity to, float sf) -{SELFPARAM(); - WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_PUSH); - WriteByte(MSG_ENTITY, sf); - - if(sf & 1) - { - WriteByte(MSG_ENTITY, self.team); - WriteInt24_t(MSG_ENTITY, self.spawnflags); - WriteByte(MSG_ENTITY, self.active); - WriteByte(MSG_ENTITY, self.height); +float trigger_push_send(entity this, entity to, float sf) +{ + WriteHeader(MSG_ENTITY, ENT_CLIENT_TRIGGER_PUSH); - trigger_common_write(true); - } + WriteByte(MSG_ENTITY, this.team); + WriteInt24_t(MSG_ENTITY, this.spawnflags); + WriteByte(MSG_ENTITY, this.active); + WriteCoord(MSG_ENTITY, this.height); - if(sf & 2) - { - WriteByte(MSG_ENTITY, self.team); - WriteByte(MSG_ENTITY, self.active); - } + 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() { - //Net_LinkEntity(self, false, 0, trigger_push_send); + SELFPARAM(); + trigger_link(this, trigger_push_send); } -#endif -#ifdef SVQC + /* * ENTITY PARAMETERS: * @@ -364,107 +376,115 @@ void trigger_push_link() */ spawnfunc(trigger_push) { - SetMovedir (); + SetMovedir(this); - EXACTTRIGGER_INIT; + 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; + this.touch = 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); // 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); } bool target_push_send(entity this, entity to, float sf) { - WriteByte(MSG_ENTITY, ENT_CLIENT_TARGET_PUSH); + 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, this.angles_x); + WriteAngle(MSG_ENTITY, this.angles_y); + WriteAngle(MSG_ENTITY, this.angles_z); return true; } -void target_push_link() -{SELFPARAM(); - Net_LinkEntity(self, false, 0, target_push_send); - self.SendFlags |= 1; // update +void target_push_link(entity this) +{ + BITSET_ASSIGN(this.effects, EF_NODEPTHTEST); + Net_LinkEntity(this, false, 0, target_push_send); + //this.SendFlags |= 1; // update } -spawnfunc(target_push) { target_push_link(); } -spawnfunc(info_notnull) { target_push_link(); } -spawnfunc(target_position) { target_push_link(); } - -#endif +void target_push_init(entity this) +{ + this.mangle = this.angles; + setorigin(this, this.origin); + target_push_link(this); +} -#ifdef CSQC +spawnfunc(target_push) { target_push_init(this); } +spawnfunc(info_notnull) { target_push_init(this); } +spawnfunc(target_position) { target_push_init(this); } -void ent_trigger_push() -{SELFPARAM(); - float sf = ReadByte(); +#elif defined(CSQC) - if(sf & 1) - { - self.classname = "jumppad"; - int mytm = ReadByte(); if(mytm) { self.team = mytm - 1; } - self.spawnflags = ReadInt24_t(); - self.active = ReadByte(); - self.height = ReadByte(); - - trigger_common_read(true); - - self.entremove = trigger_remove_generic; - self.solid = SOLID_TRIGGER; - self.draw = trigger_draw_generic; - self.trigger_touch = trigger_push_touch; - self.drawmask = MASK_NORMAL; - self.move_time = time; - trigger_push_findtarget(); - } +NET_HANDLE(ENT_CLIENT_TRIGGER_PUSH, bool isnew) +{ + this.classname = "jumppad"; + int mytm = ReadByte(); if(mytm) { this.team = mytm - 1; } + this.spawnflags = ReadInt24_t(); + this.active = ReadByte(); + this.height = ReadCoord(); + + trigger_common_read(this, true); + + this.entremove = trigger_remove_generic; + this.solid = SOLID_TRIGGER; + //this.draw = trigger_draw_generic; + this.move_touch = trigger_push_touch; + this.drawmask = MASK_NORMAL; + this.move_time = time; + defer(this, 0.25, trigger_push_findtarget); - if(sf & 2) - { - self.team = ReadByte(); - self.active = ReadByte(); - } + return true; } -void target_push_remove() -{SELFPARAM(); - if(self.classname) - strunzone(self.classname); - self.classname = string_null; +void target_push_remove(entity this) +{ + if(this.classname) + strunzone(this.classname); + this.classname = string_null; - if(self.targetname) - strunzone(self.targetname); - self.targetname = string_null; + if(this.targetname) + strunzone(this.targetname); + this.targetname = string_null; } -void ent_target_push() -{SELFPARAM(); - self.classname = "push_target"; - self.cnt = ReadByte(); - self.targetname = strzone(ReadString()); - self.origin_x = ReadCoord(); - self.origin_y = ReadCoord(); - self.origin_z = ReadCoord(); - setorigin(self, self.origin); - - self.drawmask = MASK_NORMAL; - self.entremove = target_push_remove; +NET_HANDLE(ENT_CLIENT_TARGET_PUSH, bool isnew) +{ + this.classname = "push_target"; + this.cnt = ReadByte(); + this.targetname = strzone(ReadString()); + this.origin_x = ReadCoord(); + this.origin_y = ReadCoord(); + this.origin_z = ReadCoord(); + + this.angles_x = ReadAngle(); + this.angles_y = ReadAngle(); + this.angles_z = ReadAngle(); + + return = true; + + setorigin(this, this.origin); + + this.drawmask = MASK_NORMAL; + this.entremove = target_push_remove; } #endif