X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fsteerlib.qc;h=1544fa384a5cbbf16eb4cebf3bf89be17faf1c1f;hb=53ae0010b81fef4c01ccea1ab46be6dcd1bfb81f;hp=2cccbf41c06ab428e75150b64408e15687c708da;hpb=07ba33fa78ea4a305083689460c59a82d84fae3a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/steerlib.qc b/qcsrc/server/steerlib.qc index 2cccbf41c..1544fa384 100644 --- a/qcsrc/server/steerlib.qc +++ b/qcsrc/server/steerlib.qc @@ -7,10 +7,11 @@ /** Uniform pull towards a point **/ -vector steerlib_pull(entity this, vector point) +#define steerlib_pull(ent,point) normalize(point - (ent).origin) +/*vector steerlib_pull(entity this, vector point) { return normalize(point - this.origin); -} +}*/ /** Uniform push from a point @@ -143,7 +144,7 @@ vector steerlib_wander(entity this, float range, float tresh, vector oldpoint) vector wander_point; wander_point = v_forward - oldpoint; - if (vlen(wander_point) > tresh) + if (vdist(wander_point, >, tresh)) return oldpoint; range = bound(0,range,1); @@ -275,25 +276,25 @@ vector steerlib_traceavoid(entity this, float pitch,float length) traceline(this.origin, this.origin + vup_left,MOVE_NOMONSTERS,this); fup_left = trace_fraction; - //te_lightning1(world,this.origin, trace_endpos); + //te_lightning1(NULL,this.origin, trace_endpos); vup_right = (v_forward + (v_right * pitch + v_up * pitch)) * length; traceline(this.origin,this.origin + vup_right ,MOVE_NOMONSTERS,this); fup_right = trace_fraction; - //te_lightning1(world,this.origin, trace_endpos); + //te_lightning1(NULL,this.origin, trace_endpos); vdown_left = (v_forward + (v_left * pitch + v_down * pitch)) * length; traceline(this.origin,this.origin + vdown_left,MOVE_NOMONSTERS,this); fdown_left = trace_fraction; - //te_lightning1(world,this.origin, trace_endpos); + //te_lightning1(NULL,this.origin, trace_endpos); vdown_right = (v_forward + (v_right * pitch + v_down * pitch)) * length; traceline(this.origin,this.origin + vdown_right,MOVE_NOMONSTERS,this); fdown_right = trace_fraction; - //te_lightning1(world,this.origin, trace_endpos); + //te_lightning1(NULL,this.origin, trace_endpos); upwish = v_up * (fup_left + fup_right); downwish = v_down * (fdown_left + fdown_right); leftwish = v_left * (fup_left + fdown_left); @@ -324,13 +325,13 @@ vector steerlib_traceavoid_flat(entity this, float pitch, float length, vector v traceline(this.origin + vofs, this.origin + vofs + vt_left,MOVE_NOMONSTERS,this); f_left = trace_fraction; - //te_lightning1(world,this.origin, trace_endpos); + //te_lightning1(NULL,this.origin, trace_endpos); vt_right = (v_forward + (v_right * pitch)) * length; traceline(this.origin + vofs, this.origin + vofs + vt_right ,MOVE_NOMONSTERS,this); f_right = trace_fraction; - //te_lightning1(world,this.origin, trace_endpos); + //te_lightning1(NULL,this.origin, trace_endpos); leftwish = v_left * f_left; rightwish = v_right * f_right; @@ -339,24 +340,30 @@ vector steerlib_traceavoid_flat(entity this, float pitch, float length, vector v return normalize(leftwish + rightwish + frontwish); } -float beamsweep_badpoint(vector point,float waterok) +bool beamsweep_badpoint(vector point, bool waterok) { - float pc,pc2; - if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY) - return 1; - - pc = pointcontents(point); - pc2 = pointcontents(point - '0 0 1'); - - switch(pc) + return true; + + int pc = pointcontents(point); + int pc2 = pointcontents(point - '0 0 1'); + + if(pc == CONTENT_EMPTY && pc2 == CONTENT_SOLID) + return false; + if(pc == CONTENT_EMPTY && pc2 == CONTENT_WATER && waterok) + return false; + if(pc == CONTENT_WATER && waterok) + return false; + return true; + + /*switch(pc) { case CONTENT_SOLID: break; case CONTENT_SLIME: break; case CONTENT_LAVA: break; case CONTENT_SKY: - return 1; + return true; case CONTENT_EMPTY: if (pc2 == CONTENT_SOLID) @@ -375,14 +382,14 @@ float beamsweep_badpoint(vector point,float waterok) break; } - return 1; + return true;*/ } //#define BEAMSTEER_VISUAL float beamsweep(entity this, vector from, vector dir,float length, float step,float step_up, float step_down) { float i; - vector a,b,u,d; + vector a, b, u, d; u = '0 0 1' * step_up; d = '0 0 1' * step_down; @@ -410,8 +417,8 @@ float beamsweep(entity this, vector from, vector dir,float length, float step,fl if(beamsweep_badpoint(trace_endpos,0)) return i / length; #ifdef BEAMSTEER_VISUAL - te_lightning1(world,a+u,b+u); - te_lightning1(world,b+u,b-d); + te_lightning1(NULL,a+u,b+u); + te_lightning1(NULL,b+u,b-d); #endif a = trace_endpos; } @@ -464,8 +471,8 @@ vector steerlib_beamsteer(entity this, vector dir, float length, float step, flo if(bm_left + bm_right < 0.15) { - vr = normalize((v_forward*-1) + v_right * 0.75); - vl = normalize((v_forward*-1) - v_right * 0.75); + vr = normalize((v_forward*-1) + v_right * 0.90); + vl = normalize((v_forward*-1) - v_right * 0.90); bm_right = beamsweep(this, this.origin, vr, length, step, step_up, step_down); bm_left = beamsweep(this, this.origin, vl, length, step, step_up, step_down); @@ -497,7 +504,7 @@ void flocker_die(entity this) Send_Effect(EFFECT_ROCKET_EXPLODE, this.origin, '0 0 0', 1); this.owner.cnt += 1; - this.owner = world; + this.owner = NULL; this.nextthink = time; setthink(this, SUB_Remove); @@ -556,7 +563,7 @@ void spawn_flocker(entity this) setthink(flocker, flocker_think); flocker.nextthink = time + random() * 5; PROJECTILE_MAKETRIGGER(flocker); - flocker.movetype = MOVETYPE_BOUNCEMISSILE; + set_movetype(flocker, MOVETYPE_BOUNCEMISSILE); flocker.effects = EF_LOWPRECISION; flocker.velocity = randomvec() * 300; flocker.angles = vectoangles(flocker.velocity); @@ -579,8 +586,7 @@ void flockerspawn_think(entity this) void flocker_hunter_think(entity this) { vector dodgemove,attractmove,newmove; - entity e,ee; - float d,bd; + entity ee; this.angles_x = this.angles.x * -1; makevectors(this.angles); @@ -591,26 +597,20 @@ void flocker_hunter_think(entity this) { ee = this.enemy; ee.health = -1; - this.enemy = world; + this.enemy = NULL; } if(!this.enemy) { - e = findchainfloat(flock_id,this.flock_id); - while(e) + FOREACH_ENTITY_FLOAT(flock_id, this.flock_id, { - d = vlen(this.origin - e.origin); - - if(e != this.owner) - if(e != ee) - if(d > bd) - { - this.enemy = e; - bd = d; - } - e = e.chain; - } + if(it == this.owner || it == ee) + continue; + + if(!this.enemy || vlen2(this.origin - it.origin) > vlen2(this.origin - this.enemy.origin)) + this.enemy = it; + }); } if(this.enemy) @@ -624,7 +624,6 @@ void flocker_hunter_think(entity this) this.velocity = movelib_inertmove_byspeed(this, newmove,1250,0.3,0.7); this.velocity = movelib_dragvec(this, 0.01,0.5); - this.angles = vectoangles(this.velocity); this.nextthink = time + 0.1; } @@ -645,11 +644,11 @@ spawnfunc(flockerspawn) this.enemy = new(FLock Hunter); setmodel(this.enemy, MDL_FLOCKER); - setorigin(this.enemy,this.origin + '0 0 768' + (randomvec() * 128)); + setorigin(this.enemy, this.origin + '0 0 768' + (randomvec() * 128)); this.enemy.scale = 3; this.enemy.effects = EF_LOWPRECISION; - this.enemy.movetype = MOVETYPE_BOUNCEMISSILE; + set_movetype(this.enemy, MOVETYPE_BOUNCEMISSILE); PROJECTILE_MAKETRIGGER(this.enemy); setthink(this.enemy, flocker_hunter_think); this.enemy.nextthink = time + 10;