#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;
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);
}
}
}
// Directionless (accelerator/decelerator) mode
-void trigger_impulse_touch2(entity this, entity toucher)
+void trigger_impulse_touch_accel(entity this, entity toucher)
{
float pushdeltatime;
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 * (this.strength ** pushdeltatime);
}
// 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;
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;
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
{
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);
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;
+ 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_touch2);
+ settouch(this, trigger_impulse_touch_accel);
}
}
#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();
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