X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fsteerlib.qc;h=6ebfc8ad3159409c661cfe8305adbbc9033b2216;hb=d5fdcf33ed6bf561a90134526bc2d4c1814d35a8;hp=2f59924df6e894c9a4d96a8281fb671bec802abb;hpb=dbcdd58814a7281aef637c8c07a02242331c4c86;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/steerlib.qc b/qcsrc/server/steerlib.qc index 2f59924df6..6ebfc8ad31 100644 --- a/qcsrc/server/steerlib.qc +++ b/qcsrc/server/steerlib.qc @@ -1,10 +1,15 @@ -.vector steerto; +#if defined(CSQC) +#elif defined(MENUQC) +#elif defined(SVQC) + #include "../dpdefs/progsdefs.qh" + #include "../dpdefs/dpextensions.qh" +#endif /** Uniform pull towards a point **/ vector steerlib_pull(vector point) -{ +{SELFPARAM(); return normalize(point - self.origin); } @@ -22,7 +27,7 @@ vector steerlib_push(vector point) Pull toward a point, The further away, the stronger the pull. **/ vector steerlib_arrive(vector point,float maximal_distance) -{ +{SELFPARAM(); float distance; vector direction; @@ -35,7 +40,7 @@ vector steerlib_arrive(vector point,float maximal_distance) Pull toward a point increasing the pull the closer we get **/ vector steerlib_attract(vector point, float maximal_distance) -{ +{SELFPARAM(); float distance; vector direction; @@ -46,7 +51,7 @@ vector steerlib_attract(vector point, float maximal_distance) } vector steerlib_attract2(vector point, float min_influense,float max_distance,float max_influense) -{ +{SELFPARAM(); float distance; vector direction; float influense; @@ -94,7 +99,7 @@ vector steerlib_attract2(vector point, float maximal_distance,float min_influens Move away from a point. **/ vector steerlib_repell(vector point,float maximal_distance) -{ +{SELFPARAM(); float distance; vector direction; @@ -108,7 +113,7 @@ vector steerlib_repell(vector point,float maximal_distance) Try to keep at ideal_distance away from point **/ vector steerlib_standoff(vector point,float ideal_distance) -{ +{SELFPARAM(); float distance; vector direction; @@ -135,7 +140,7 @@ vector steerlib_standoff(vector point,float ideal_distance) where range is the cicrle radius and tresh is how close we need to be to pick a new heading. **/ vector steerlib_wander(float range,float tresh,vector oldpoint) -{ +{SELFPARAM(); vector wander_point; wander_point = v_forward - oldpoint; @@ -154,7 +159,7 @@ vector steerlib_wander(float range,float tresh,vector oldpoint) Dodge a point. dont work to well. **/ vector steerlib_dodge(vector point,vector dodge_dir,float min_distance) -{ +{SELFPARAM(); float distance; distance = max(vlen(self.origin - point),min_distance); @@ -169,13 +174,13 @@ vector steerlib_dodge(vector point,vector dodge_dir,float min_distance) Group will move towards the unified direction while keeping close to eachother. **/ .float flock_id; -vector steerlib_flock(float radius, float standoff,float separation_force,float flock_force) -{ +vector steerlib_flock(float _radius, float standoff,float separation_force,float flock_force) +{SELFPARAM(); entity flock_member; vector push = '0 0 0', pull = '0 0 0'; float ccount = 0; - flock_member = findradius(self.origin,radius); + flock_member = findradius(self.origin, _radius); while(flock_member) { if(flock_member != self) @@ -183,7 +188,7 @@ vector steerlib_flock(float radius, float standoff,float separation_force,float { ++ccount; push = push + (steerlib_repell(flock_member.origin,standoff) * separation_force); - pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity,radius) * flock_force); + pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity, _radius) * flock_force); } flock_member = flock_member.chain; } @@ -195,13 +200,13 @@ vector steerlib_flock(float radius, float standoff,float separation_force,float Group will move towards the unified direction while keeping close to eachother. xy only version (for ground movers). **/ -vector steerlib_flock2d(float radius, float standoff,float separation_force,float flock_force) -{ +vector steerlib_flock2d(float _radius, float standoff,float separation_force,float flock_force) +{SELFPARAM(); entity flock_member; vector push = '0 0 0', pull = '0 0 0'; float ccount = 0; - flock_member = findradius(self.origin,radius); + flock_member = findradius(self.origin,_radius); while(flock_member) { if(flock_member != self) @@ -209,13 +214,13 @@ vector steerlib_flock2d(float radius, float standoff,float separation_force,floa { ++ccount; push = push + (steerlib_repell(flock_member.origin, standoff) * separation_force); - pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity, radius) * flock_force); + pull = pull + (steerlib_arrive(flock_member.origin + flock_member.velocity, _radius) * flock_force); } flock_member = flock_member.chain; } - push_z = 0; - pull_z = 0; + push.z = 0; + pull.z = 0; return push + (pull * (1 / ccount)); } @@ -226,13 +231,13 @@ vector steerlib_flock2d(float radius, float standoff,float separation_force,floa This results in a aligned movement (?!) much like flocking. **/ -vector steerlib_swarm(float radius, float standoff,float separation_force,float swarm_force) -{ +vector steerlib_swarm(float _radius, float standoff,float separation_force,float swarm_force) +{SELFPARAM(); entity swarm_member; vector force = '0 0 0', center = '0 0 0'; float ccount = 0; - swarm_member = findradius(self.origin,radius); + swarm_member = findradius(self.origin,_radius); while(swarm_member) { @@ -246,7 +251,7 @@ vector steerlib_swarm(float radius, float standoff,float separation_force,float } center = center * (1 / ccount); - force = force + (steerlib_arrive(center,radius) * swarm_force); + force = force + (steerlib_arrive(center,_radius) * swarm_force); return force; } @@ -257,7 +262,7 @@ vector steerlib_swarm(float radius, float standoff,float separation_force,float You need to call makevectors() (or equivalent) before this function to set v_forward and v_right **/ vector steerlib_traceavoid(float pitch,float length) -{ +{SELFPARAM(); vector vup_left,vup_right,vdown_left,vdown_right; float fup_left,fup_right,fdown_left,fdown_right; vector upwish,downwish,leftwish,rightwish; @@ -304,7 +309,7 @@ vector steerlib_traceavoid(float pitch,float length) Run tracelines in a forward trident, bias each direction negative if something is found there. **/ vector steerlib_traceavoid_flat(float pitch, float length, vector vofs) -{ +{SELFPARAM(); vector vt_left, vt_right,vt_front; float f_left, f_right,f_front; vector leftwish, rightwish,frontwish, v_left; @@ -376,7 +381,7 @@ float beamsweep_badpoint(vector point,float waterok) //#define BEAMSTEER_VISUAL float beamsweep(vector from, vector dir,float length, float step,float step_up, float step_down) -{ +{SELFPARAM(); float i; vector a,b,u,d; @@ -416,11 +421,11 @@ float beamsweep(vector from, vector dir,float length, float step,float step_up, } vector steerlib_beamsteer(vector dir, float length, float step, float step_up, float step_down) -{ +{SELFPARAM(); float bm_forward, bm_right, bm_left,p; vector vr,vl; - dir_z *= 0.15; + dir.z *= 0.15; vr = vectoangles(dir); //vr_x *= -1; @@ -492,8 +497,8 @@ vector steerlib_beamsteer(vector dir, float length, float step, float step_up, f //#define TLIBS_TETSLIBS #ifdef TLIBS_TETSLIBS void flocker_die() -{ - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); +{SELFPARAM(); + Send_Effect(EFFECT_ROCKET_EXPLODE, self.origin, '0 0 0', 1); self.owner.cnt += 1; self.owner = world; @@ -504,13 +509,13 @@ void flocker_die() void flocker_think() -{ +{SELFPARAM(); vector dodgemove,swarmmove; vector reprellmove,wandermove,newmove; - self.angles_x = self.angles_x * -1; + self.angles_x = self.angles.x * -1; makevectors(self.angles); - self.angles_x = self.angles_x * -1; + self.angles_x = self.angles.x * -1; dodgemove = steerlib_traceavoid(0.35,1000); swarmmove = steerlib_flock(500,75,700,500); @@ -540,15 +545,16 @@ void flocker_think() self.nextthink = time + 0.1; } +MODEL(FLOCKER, "models/turrets/rocket.md3"); void spawn_flocker() -{ +{SELFPARAM(); entity flocker; flocker = spawn (); setorigin(flocker, self.origin + '0 0 32'); - setmodel (flocker, "models/turrets/rocket.md3"); + setmodel (flocker, MDL_FLOCKER); setsize (flocker, '-3 -3 -3', '3 3 3'); flocker.flock_id = self.flock_id; @@ -569,7 +575,7 @@ void spawn_flocker() } void flockerspawn_think() -{ +{SELFPARAM(); if(self.cnt > 0) @@ -580,14 +586,14 @@ void flockerspawn_think() } void flocker_hunter_think() -{ +{SELFPARAM(); vector dodgemove,attractmove,newmove; entity e,ee; float d,bd; - self.angles_x = self.angles_x * -1; + self.angles_x = self.angles.x * -1; makevectors(self.angles); - self.angles_x = self.angles_x * -1; + self.angles_x = self.angles.x * -1; if(self.enemy) if(vlen(self.enemy.origin - self.origin) < 64) @@ -635,9 +641,7 @@ void flocker_hunter_think() float globflockcnt; void spawnfunc_flockerspawn() -{ - precache_model ( "models/turrets/rocket.md3"); - precache_model("models/turrets/c512.md3"); +{SELFPARAM(); ++globflockcnt; if(!self.cnt) self.cnt = 20; @@ -649,7 +653,7 @@ void spawnfunc_flockerspawn() self.enemy = spawn(); - setmodel(self.enemy, "models/turrets/rocket.md3"); + setmodel(self.enemy, MDL_FLOCKER); setorigin(self.enemy,self.origin + '0 0 768' + (randomvec() * 128)); self.enemy.classname = "FLock Hunter";