X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ftrigger%2Fimpulse.qc;h=c4e7ae287a8e9a6eda6d79532d0c06684cc38b6b;hb=15560a4a494efe42e0e5fa69a628eebc11d97fc7;hp=cb9c2d293558fad6829c7e888a08c9cfc63c0f40;hpb=06ac66a5edaa645e19ed9a6482409e8656a65b1d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/trigger/impulse.qc b/qcsrc/common/triggers/trigger/impulse.qc index cb9c2d293..c4e7ae287 100644 --- a/qcsrc/common/triggers/trigger/impulse.qc +++ b/qcsrc/common/triggers/trigger/impulse.qc @@ -1,6 +1,6 @@ #include "impulse.qh" // targeted (directional) mode -void trigger_impulse_touch1(entity this, entity toucher) +void trigger_impulse_touch_directional(entity this, entity toucher) { entity targ; float pushdeltatime; @@ -22,26 +22,26 @@ void trigger_impulse_touch1(entity this, entity toucher) return; } - str = min(this.radius, vlen(this.origin - toucher.origin)); - - if(this.falloff == 1) - str = (str / this.radius) * this.strength; - else if(this.falloff == 2) - str = (1 - (str / this.radius)) * this.strength; - else - str = this.strength; + // falloff is not supported because radius is always 0 in directional mode + str = this.strength; pushdeltatime = time - toucher.lastpushtime; - if (pushdeltatime > 0.15) pushdeltatime = 0; + if (pushdeltatime > IMPULSE_MAX_PUSHDELTATIME) + { + pushdeltatime = 0; + } toucher.lastpushtime = time; - if(!pushdeltatime) return; + if(!pushdeltatime) + { + return; + } - if(this.spawnflags & 64) + if(this.spawnflags & IMPULSE_DIRECTIONAL_SPEEDTARGET) { float addspeed = str - toucher.velocity * normalize(targ.origin - this.origin); if (addspeed > 0) { - float accelspeed = min(8 * pushdeltatime * str, addspeed); + float accelspeed = min(IMPULSE_DIRECTIONAL_MAX_ACCEL_FACTOR * pushdeltatime * str, addspeed); toucher.velocity += accelspeed * normalize(targ.origin - this.origin); } } @@ -56,7 +56,7 @@ void trigger_impulse_touch1(entity this, entity toucher) } // Directionless (accelerator/decelerator) mode -void trigger_impulse_touch2(entity this, entity toucher) +void trigger_impulse_touch_accel(entity this, entity toucher) { float pushdeltatime; @@ -69,12 +69,18 @@ void trigger_impulse_touch2(entity this, entity toucher) EXACTTRIGGER_TOUCH(this, toucher); pushdeltatime = time - toucher.lastpushtime; - if (pushdeltatime > 0.15) pushdeltatime = 0; + if (pushdeltatime > IMPULSE_MAX_PUSHDELTATIME) + { + pushdeltatime = 0; + } toucher.lastpushtime = time; - if(!pushdeltatime) return; + if(!pushdeltatime) + { + return; + } // div0: ticrate independent, 1 = identity (not 20) - toucher.velocity = toucher.velocity * pow(this.strength, pushdeltatime); + toucher.velocity = toucher.velocity * (this.strength ** pushdeltatime); #ifdef SVQC UpdateCSQCProjectile(toucher); @@ -82,7 +88,7 @@ void trigger_impulse_touch2(entity this, entity toucher) } // Spherical (gravity/repulsor) mode -void trigger_impulse_touch3(entity this, entity toucher) +void trigger_impulse_touch_radial(entity this, entity toucher) { float pushdeltatime; float str; @@ -96,17 +102,23 @@ void trigger_impulse_touch3(entity this, entity toucher) EXACTTRIGGER_TOUCH(this, toucher); pushdeltatime = time - toucher.lastpushtime; - if (pushdeltatime > 0.15) pushdeltatime = 0; + if (pushdeltatime > IMPULSE_MAX_PUSHDELTATIME) + { + pushdeltatime = 0; + } toucher.lastpushtime = time; - if(!pushdeltatime) return; + if(!pushdeltatime) + { + return; + } setsize(this, '-1 -1 -1' * this.radius,'1 1 1' * this.radius); str = min(this.radius, vlen(this.origin - toucher.origin)); - if(this.falloff == 1) + if(this.falloff == FALLOFF_LINEAR) str = (1 - str / this.radius) * this.strength; // 1 in the inside - else if(this.falloff == 2) + else if(this.falloff == FALLOFF_LINEAR_INV) str = (str / this.radius) * this.strength; // 0 in the inside else str = this.strength; @@ -121,15 +133,16 @@ void trigger_impulse_touch3(entity this, entity toucher) REGISTER_NET_LINKED(ENT_CLIENT_TRIGGER_IMPULSE) /*QUAKED spawnfunc_trigger_impulse (.5 .5 .5) ? +Force field -------- KEYS -------- target : If this is set, this points to the spawnfunc_target_position to which the player will get pushed. If not, this trigger acts like a damper/accelerator field. -strength : This is how mutch force to add in the direction of .target each second - when .target is set. If not, this is hoe mutch to slow down/accelerate - someting cought inside this trigger. (1=no change, 0,5 half speed rougthly each tic, 2 = doubble) +strength : This is how much force to add in the direction of .target each second + when .target is set. If not, this is how much to slow down/accelerate + something cought inside this trigger. (1=no change, 0,5 half speed rougthly each tic, 2 = doubble) -radius : If set, act as a spherical device rather then a liniar one. +radius : If set, act as a spherical device rather then a linear one. falloff : 0 = none, 1 = liniar, 2 = inverted liniar @@ -142,7 +155,7 @@ bool trigger_impulse_send(entity this, entity to, int sf) { WriteHeader(MSG_ENTITY, ENT_CLIENT_TRIGGER_IMPULSE); - WriteInt24_t(MSG_ENTITY, this.spawnflags); + WriteByte(MSG_ENTITY, this.spawnflags); WriteCoord(MSG_ENTITY, this.radius); WriteCoord(MSG_ENTITY, this.strength); WriteByte(MSG_ENTITY, this.falloff); @@ -166,23 +179,32 @@ spawnfunc(trigger_impulse) if(this.radius) { - if(!this.strength) this.strength = 2000 * autocvar_g_triggerimpulse_radial_multiplier; + if(!this.strength) + { + this.strength = IMPULSE_DEFAULT_RADIAL_STRENGTH * autocvar_g_triggerimpulse_radial_multiplier; + } setorigin(this, this.origin); setsize(this, '-1 -1 -1' * this.radius,'1 1 1' * this.radius); - settouch(this, trigger_impulse_touch3); + settouch(this, trigger_impulse_touch_radial); } else { if(this.target) { - if(!this.strength) this.strength = 950 * autocvar_g_triggerimpulse_directional_multiplier; - settouch(this, trigger_impulse_touch1); + if(!this.strength) + { + this.strength = IMPULSE_DEFAULT_DIRECTIONAL_STRENGTH * autocvar_g_triggerimpulse_directional_multiplier; + } + settouch(this, trigger_impulse_touch_directional); } else { - if(!this.strength) this.strength = 0.9; - this.strength = pow(this.strength, autocvar_g_triggerimpulse_accel_power) * autocvar_g_triggerimpulse_accel_multiplier; - settouch(this, trigger_impulse_touch2); + if(!this.strength) + { + this.strength = IMPULSE_DEFAULT_ACCEL_STRENGTH; + } + this.strength = (this.strength ** autocvar_g_triggerimpulse_accel_power) * autocvar_g_triggerimpulse_accel_multiplier; + settouch(this, trigger_impulse_touch_accel); } } @@ -191,7 +213,7 @@ spawnfunc(trigger_impulse) #elif defined(CSQC) NET_HANDLE(ENT_CLIENT_TRIGGER_IMPULSE, bool isnew) { - this.spawnflags = ReadInt24_t(); + this.spawnflags = ReadByte(); this.radius = ReadCoord(); this.strength = ReadCoord(); this.falloff = ReadByte(); @@ -205,8 +227,17 @@ NET_HANDLE(ENT_CLIENT_TRIGGER_IMPULSE, bool isnew) this.entremove = trigger_remove_generic; this.move_time = time; - if (this.radius) { settouch(this, trigger_impulse_touch3); } - else if (this.target) { settouch(this, trigger_impulse_touch1); } - else { settouch(this, trigger_impulse_touch2); } + if (this.radius) + { + settouch(this, trigger_impulse_touch_radial); + } + else if (this.target) + { + settouch(this, trigger_impulse_touch_directional); + } + else + { + settouch(this, trigger_impulse_touch_accel); + } } #endif