int check_conflict(const vec3d *src,const vec3d *dest,const vec3d *point,double dis) { vec3d dir; double dirLength; vec3d pDir; double d; vec3d dir2; v3sub(dest,src,&dir); dirLength = v3length(&dir); if (dirLength!=0.0) v3scale(&dir,1.0/dirLength,&dir); v3sub(point,src,&pDir); d = v3dot(&pDir,&dir); if (d<0.0) return 0; if (d>dirLength) return 0; setVec3dToVec3d(&dir,&dir2); v3simpleRotateY(&dir2,90); d = fabs(v3dot(&pDir,&dir2)); if (d<dis) return 1; else return 0; }
BTSV_API vec3 btCalcGroundFloorPoint(vec3 org, vec3 mins, vec3 maxs, btEntity forent) { int i; if(!btCheckGroundDist(org, mins, maxs, 24, forent)) return(org); while(!btCheckGroundDist(org, mins, maxs, 4, forent)) org=v3sub(org, vec3(0,0,3.5)); while(!btCheckGroundDist(org, mins, maxs, 1, forent)) org=v3sub(org, vec3(0,0,0.5)); return(org); }
BTSV_API btEntity BT_FireGrenade(btEntity self, vec3 org, vec3 dir, float dmg, float speed, float radius) { btEntity tmp; tmp=btNewEntityTriggerInit(NULL, NULL); // tmp->solidtype=BT_SOLID_BBOX; tmp->solidtype=BT_SOLID_TRIGGER; tmp->movetype=BT_MOVE_BOUNCE; tmp->owner=self; tmp->mins=vec3(-8,-8,-8); tmp->maxs=vec3( 8, 8, 8); btSetModel(tmp, "models/objects/rocket/rocket0.ac"); tmp->origin=org; tmp->angles=v3sub(btVecToAngles(dir), vec3(0,0,180)); tmp->velocity=v3scale(dir, speed); tmp->damage=dmg; tmp->height=radius; tmp->effects=BT_EFF_SMOKETRAIL|BT_EFF_NOSHADOW| BT_EFF_GLOW_RED|BT_EFF_GLOW_HIGH| BT_EFF_GLOW_BRIGHT1|BT_EFF_GLOW_BRIGHT0; tmp->vt->touch=BT_GrenadeTouch; btSetThink(tmp, BT_GrenadeThink, 10); return(tmp); }
void back_to_destination(const vec3d *v) { double power = 0.0; double steering = 0.0; char msg[100]; vec3d dir; double dis; double targetVel; v3sub(v,&loc,&dir); dis = v3length(&dir); if (dis!=0.0) v3normalize(&dir); targetVel = dis > 15 ? 15 : dis; if (v3dot(&dir,&front)<0.0) { steering = 0.3 * v3dot(&dir,&left); power = -300*(targetVel - v3length(&vel)); power = power > 300 ? 300 : power; power = power < -300 ? -300 : power; } else { steering = 1.0; power = 150; } sprintf(msg,"drive %.16f %.16f",power,steering); my_send(msg); }
void rebuildTmat(transformData* xform) { vector3d v; if (xform) { if (xform->type == ROTxform) { vector3d axis; matrix4 m1, m2, m3, m4; double twistangle = 0.0; v = xform->a2; v3translationMat(&v, &m1); twistangle = xform->currVal - xform->phase; v3makeVec(&(xform->a2), &(xform->a1), &axis); v3rotationMat(&axis, twistangle, &m2); v3negate(&v); v3translationMat(&v, &m4); v3matMul(&m2, &m1, &m3); v3matMul(&m4, &m3, &(xform->tmat)); } else if (xform->type == TRANSxform) { v3sub(&(xform->a2), &(xform->a1), &v); if (v3squaredLength(&v) > 0.000001) { v3scale(&v, xform->currVal - xform->phase); v3translationMat(&v, &(xform->tmat)); } else { v3identityMat(&(xform->tmat)); } } } }
BTSV_API int btCheckGroundDist2(vec3 org, vec3 mins, vec3 maxs, float dist, btEntity forent) { static int nostand= BT_CONTENTS_WATER|BT_CONTENTS_SLIME| BT_CONTENTS_LAVA|BT_CONTENTS_SKY; vec3 org1; int i; org1=v3sub(org, vec3(0, 0, dist)); i=btPointBoxContents(org1, mins, maxs, forent); if(!(i&BT_CONTENTS_SOLID)) //nothing underfoot { if(forent)printf("btCheckGroundDist: %d Empty Space (%s) (%s)\n", forent->entnum, btVec3ToStr(org), btVec3ToStr(org1)); return(0); } if(i&nostand) //on something bad { if(forent)printf("btCheckGroundDist: %d Bad Ground\n", forent->entnum); return(0); } //ok, can stand here return(1); }
int get_nearest_burden(vec3d *pos,char *id,vec3d *ret) { int i, idx; double len, min; vec3d tmpV; if (burdens_count==0) return ERROR; idx = 0; min = 1000000.0; for (i=0;i<burdens_count;i++) { v3sub(pos,&(burdens[i].loc),&tmpV); len = v3length(&tmpV); if (min>len) { idx = i; min = len; } } ret->x = burdens[idx].loc.x; ret->y = burdens[idx].loc.y; ret->z = burdens[idx].loc.z; //id = burdens[idx].id; strcpy(id,burdens[idx].id); return NO_ERROR; }
void state_check() { char *msg, *tmp; setVec3dToVec3d(&loc, &oldLoc); msg = my_send("getLoc"); setStrToVec3d(msg,&loc); msg = my_send("getRev"); setStrToVec3d(msg,&rot); setXYZToVec3d(0,0,1,&front); v3rotate(&front,&rot); //v3simpleRotateY(&front,rot.y); setXYZToVec3d(1,0,0,&left); v3rotate(&left,&rot); //v3simpleRotateY(&left,rot.y); v3sub(&loc,&oldLoc,&vel); v3scale(&vel,1.0/dt,&vel); msg = my_send("searchBurdens"); makeBurdenSet(msg); msg = my_send("searchObstacles"); tmp = strtok(msg," "); tmp = strtok(NULL," "); tmp = strtok(NULL," "); obstacle1.x = atof(tmp); tmp = strtok(NULL," "); obstacle1.y = atof(tmp); tmp = strtok(NULL," "); obstacle1.z = atof(tmp); tmp = strtok(NULL," "); tmp = strtok(NULL," "); obstacle2.x = atof(tmp); tmp = strtok(NULL," "); obstacle2.y = atof(tmp); tmp = strtok(NULL," "); obstacle2.z = atof(tmp); }
/** Calculate the bounding radius for an entity from its center. */ BTSV_API float btCalcRadius(btEntity self) { vec3 org; float rad; // org=btCalcCenter(self); org=v3scale(v3add(self->mins, self->maxs), 0.5); rad=v3len(v3sub(self->maxs, org)); return(rad); }
void make_events() { vec3d tmpV; struct event e; make_events_basic(); // car has arrived at the waiting point? v3sub(&waitingPoint,&loc,&tmpV); if (v3length(&tmpV)<1.0) { e.id = ARRIVAL_WAITING_POINT_EVENT; process_event(&e); } // car has arrived at the switch? v3sub(&switch1,&loc,&tmpV); if (v3length(&tmpV)<1.0) { e.id = ARRIVAL_SWITCH_EVENT; process_event(&e); } }
BTSV_API btEntity BT_FirePlasma(btEntity self, vec3 org, vec3 dir, float dmg, float speed, float radius, int clr) { btEntity tmp; tmp=btNewEntityTriggerInit(NULL, NULL); // tmp->solidtype=BT_SOLID_BBOX; tmp->solidtype=BT_SOLID_TRIGGER; tmp->movetype=BT_MOVE_FLYMISSILE; tmp->owner=self; tmp->mins=vec3(-4,-4,-4); tmp->maxs=vec3( 4, 4, 4); tmp->origin=org; tmp->angles=v3sub(btVecToAngles(dir), vec3(0,0,180)); tmp->velocity=v3scale(dir, speed); tmp->damage=dmg; tmp->height=radius; tmp->effects=BT_EFF_NOSHADOW| BT_EFF_GLOW_BRIGHT1|BT_EFF_GLOW_BRIGHT0; switch(clr) { case 0: case 1: btSetModel(tmp, "s_plasma"); tmp->effects|=BT_EFF_GLOW_GREEN|BT_EFF_GLOW_BLUE; break; case 2: btSetModel(tmp, "s_plasma2"); tmp->effects|=BT_EFF_GLOW_RED|BT_EFF_GLOW_BLUE; break; case 3: btSetModel(tmp, "s_plasma3"); tmp->effects|=BT_EFF_GLOW_GREEN|BT_EFF_GLOW_RED; break; case 4: btSetModel(tmp, "s_plasma4"); tmp->effects|=BT_EFF_GLOW_GREEN| BT_EFF_GLOW_RED|BT_EFF_GLOW_BLUE; break; default: btSetModel(tmp, "s_plasma"); tmp->effects|=BT_EFF_GLOW_GREEN|BT_EFF_GLOW_BLUE; break; } tmp->vt->touch=BT_PlasmaTouch; btSetThink(tmp, BT_RocketThink, 25); return(tmp); }
void go_to_waiting_point() { vec3d v; if (check_all_conflict(&loc,&waitingPoint,NULL)) { printf("GAHA:CONFLICT\n"); v3sub(&waitingPoint,&loc,&v); v3simpleRotateY(&v,45); v3add(&v,&loc,&v); go_to_destination(&v); } else { go_to_destination(&waitingPoint); } }
BTSV_API btEntity BT_FireBlockPlacerColor(btEntity self, vec3 org, vec3 dir, float dmg, float speed, float radius, int clr, int voxty) { btEntity tmp; tmp=btNewEntityTriggerInit(NULL, NULL); // tmp->solidtype=BT_SOLID_BBOX; tmp->solidtype=BT_SOLID_TRIGGER; tmp->movetype=BT_MOVE_FLYMISSILE; tmp->owner=self; tmp->mins=vec3(-2,-2,-2); tmp->maxs=vec3( 2, 2, 2); tmp->flags|=BT_FL_FLY; btSetModel(tmp, "models/objects/laser/laser0.ac"); tmp->origin=org; tmp->angles=v3sub(btVecToAngles(dir), vec3(0,0,180)); tmp->velocity=v3scale(dir, speed); tmp->damage=dmg; tmp->height=radius; tmp->state=voxty; tmp->effects=BT_EFF_NOSHADOW| BT_EFF_SPARKSTRAIL| // BT_EFF_GLOW_RED|BT_EFF_GLOW_GREEN| // BT_EFF_GLOW_HIGH| BT_EFF_GLOW_BRIGHT1|BT_EFF_GLOW_BRIGHT0; switch(clr) { case 0: tmp->effects|=BT_EFF_GLOW_RED|BT_EFF_GLOW_GREEN; break; case 1: tmp->effects|=BT_EFF_GLOW_RED; break; case 2: tmp->effects|=BT_EFF_GLOW_GREEN; break; case 3: tmp->effects|=BT_EFF_GLOW_RED|BT_EFF_GLOW_GREEN; break; case 4: tmp->effects|=BT_EFF_GLOW_BLUE; break; case 5: tmp->effects|=BT_EFF_GLOW_RED|BT_EFF_GLOW_BLUE; break; case 6: tmp->effects|=BT_EFF_GLOW_GREEN|BT_EFF_GLOW_BLUE; break; case 7: tmp->effects|=BT_EFF_GLOW_WHITE; break; } tmp->vt->touch=BT_BlockPlacerTouch; // btSetThink(tmp, BT_RocketThink, 25); btSetThink(tmp, BT_PlacerThink, 5); return(tmp); }
BTSV_API btEntity BT_BulletMuzzleFlash(btEntity self, vec3 org, vec3 dir, int mod) { btEntity tmp; tmp=btNewEntityTriggerInit(NULL, NULL); // tmp->solidtype=BT_SOLID_BBOX; // tmp->solidtype=BT_SOLID_TRIGGER; // tmp->movetype=BT_MOVE_FLYMISSILE; tmp->owner=self; tmp->origin=org; tmp->angles=v3sub(btVecToAngles(dir), vec3(0,0,180)); tmp->velocity=v3scale(dir, 1000); tmp->effects=BT_EFF_NOSHADOW| BT_EFF_GLOW_RED|BT_EFF_GLOW_GREEN|BT_EFF_GLOW_HIGH| BT_EFF_GLOW_BRIGHT1|BT_EFF_GLOW_BRIGHT0; btSetThink(tmp, btDeleteEntity, 0.1); }
vec4 BTGE_EntBSP_CalcEntityListNodePlane(btWorld wrl, btEntity lst, vec3 org) { btEntity cur; vec3 dir, tdir; vec4 norm; int i, n; cur=lst; dir=v3zero(); while(cur) { tdir=v3sub(btCalcCenter(cur), org); tdir=v3abs(tdir); dir=v3add(dir, tdir); cur=cur->chain; } dir=v3norm(dir); norm=v4plane(dir, v3dot(org, dir)); return(norm); }
BTSV_API vec3 btBoxStepMoveFall( vec3 org, vec3 mins, vec3 maxs, float dt, btEntity self) { vec3 org1, org2, vel; float f; int i, j; f=256*dt; vel=vec3(0, 0, -f); if(self) { // self->flags&=~BT_FL_INWATER; self->flags&=~(BT_FL_ONGROUND|BT_FL_INWATER); //flying entities don't fall if(self->flags&BT_FL_FLY) return(org); vel=v3scale(self->velocity, dt); } // f=64*dt; // f=256*dt; // org1=v3sub(org, vec3(0, 0, f)); org1=v3add(org, vel); i=btPointBoxContents(org1, mins, maxs, self); if(i&BT_CONTENTS_PLAYERSOLID) { if(self) { if(self->flags&BT_FL_CLIENT) { // printf("client impact\n"); // BT_ClientImpact(self, self->velocity); BT_ClientImpact(self, v3add(self->velocity, self->impulseVelocity)); } self->flags|=BT_FL_ONGROUND; self->velocity=vec3(0,0,0); j=btPointContents(org, self); if(j&BT_CONTENTS_FLUID) { self->flags|=BT_FL_INWATER; } } return(org); } if(self && (self->flags&BT_FL_CLIENT)) { org2=v3sub(org, vec3(0, 0, 2)); i=btPointBoxContents(org2, mins, maxs, self); if(i&BT_CONTENTS_PLAYERSOLID) { self->flags|=BT_FL_ONGROUND; } } j=btPointContents(org, self); if(j&BT_CONTENTS_FLUID) { if(self) { self->flags|=BT_FL_INWATER; //swim entities don't sink if(self->flags&BT_FL_SWIM) return(org); f=1.0-dt; if(f<0)f=0; self->velocity=v3scale(self->velocity, f); // self->velocity=vec3(0,0,0); } //reduced falling speed // f=16*dt; // org1=v3sub(org, vec3(0, 0, f)); if(!self) org1=v3addscale(org, vel, 0.25); } return(org1); }
int BT_PlayerImpulseDamage(btEntity self) { BTGE_Trace tr; vec3 worg; float sc_mp, sc_dmg, sc_ft; btEntity cur; int i; // printf("BT_PlayerImpulseDamage\n"); #if 0 btTraceline(&tr, self->morg, self->mend, BT_TRACE_MONSTERS|BT_TRACE_TRIGGER|BT_TRACE_BSPSOLID, self); cur=tr.ent; while(cur) { // btEntUse(cur, self); BT_Damage(cur, self, 9999, BT_MOD_DAMAGEGUN); cur=cur->chain; } #endif // btSound(self, BT_CHAN_VOICE, "sound/misc/keyuse", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_VOICE, "sound/weapons/sshotf1b", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_VOICE, "sound/weapons/blastf1a", // 1.0, BT_ATTN_NORM); // BT_FireRocket(self, self->morg, self->mdir, 120, 600, 64); // BT_FireBlaster(self, self->morg, self->mdir, 120, 800, 64); if(!BT_AttackFinishedP(self)) return(0); if(self->item) { //holding an item, so use it... btEntityUseItem(self, self->item); if(self->item->flags&BT_ITFL_CONSUMABLE) { } return(0); } sc_dmg=1.0; // sc_mp=0.5; sc_mp=1.0; sc_ft=1.0; switch(self->weaponnum) { case 1: // BT_RadiusDamage(self, self->owner, self->damage, nodmg, // self->height, BT_MOD_ROCKET); if(self->curMP<(1*sc_mp))break; self->curMP-=1*sc_mp; // btSound(self, BT_CHAN_WEAPON, "sound/weapons/blastf1a", // 1.0, BT_ATTN_NORM); // BT_FireBlasterColor(self, self->morg, self->mdir, 45, 800, 24, 1); BT_FireBlockPlacerColor(self, self->morg, self->mdir, 45, 400, 24, 1, -1); BT_AttackFinished(self, 0.3*sc_ft); break; case 2: if(self->curMP<(1*sc_mp))break; self->curMP-=1*sc_mp; btSound(self, BT_CHAN_WEAPON, "sound/weapons/blastf1a", 1.0, BT_ATTN_NORM); BT_FireBlaster(self, self->morg, self->mdir, 25*sc_dmg, 800, 32); BT_AttackFinished(self, 0.5*sc_ft); break; case 3: if(self->curMP<(4*sc_mp))break; self->curMP-=4*sc_mp; btSound(self, BT_CHAN_WEAPON, "sound/weapons/shotgf1b", 1.0, BT_ATTN_NORM); BT_FireBullet(self, self->morg, self->mdir, 35*sc_dmg); BT_AttackFinished(self, 0.5*sc_ft); break; case 4: if(self->curMP<(1*sc_mp))break; self->curMP-=1*sc_mp; btSound(self, BT_CHAN_WEAPON, "sound/weapons/machgf1b", 1.0, BT_ATTN_NORM); BT_FireBullet(self, self->morg, self->mdir, 10*sc_dmg); BT_AttackFinishedRapid(self, 0.09*sc_ft); break; case 5: if(self->curMP<(20*sc_mp))break; self->curMP-=(20*sc_mp); btSound(self, BT_CHAN_WEAPON, "sound/weapons/rocklf1a", 1.0, BT_ATTN_NORM); BT_FireRocket(self, self->morg, self->mdir, 120*sc_dmg, 600, 160); BT_AttackFinished(self, 1.0*sc_ft); break; case 6: if(self->curMP<(2*sc_mp))break; self->curMP-=2*sc_mp; i=btRandom()*3+1; // btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser3_2", // 1.0, BT_ATTN_NORM); btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser2_6", 1.0, BT_ATTN_NORM); // BT_FireBullet(self, self->morg, self->mdir, 10*sc_dmg); BT_FirePlasma(self, self->morg, self->mdir, 35*sc_dmg, 800, 32, 0); // BT_FirePlasma(self, self->morg, self->mdir, 35*sc_dmg, 800, 32, i); BT_AttackFinishedRapid(self, 0.09*sc_ft); break; case 7: if(self->curMP<(40*sc_mp))break; self->curMP-=40*sc_mp; // btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser3_2", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser2_6", // 1.0, BT_ATTN_NORM); btSound(self, BT_CHAN_WEAPON, "sound/weapons/bfg__f1y", 1.0, BT_ATTN_NORM); BT_FireBFG(self, self->morg, self->mdir, 240*sc_dmg, 400, 280); BT_AttackFinished(self, 2.0*sc_ft); break; case 8: if(self->curMP<(1*sc_mp))break; self->curMP-=1*sc_mp; // btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser3_2", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser2_6", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_WEAPON, "sound/weapons/bfg__f1y", // 1.0, BT_ATTN_NORM); // BT_FireBFG(self, self->morg, self->mdir, 240, 600, 180); // btSound(self, BT_CHAN_WEAPON, "sound/weapons/hyprbl1a", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_WEAPON, "sounds/tonal/hz60_e0", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_WEAPON, "sounds/tonal/hz1000t", // 1.0, BT_ATTN_NORM); // btSound(self, BT_CHAN_WEAPON, "sounds/tonal/laser0", // 1.0, BT_ATTN_NORM); btSound(self, BT_CHAN_WEAPON, "sound/weapons/laser4_1", 1.0, BT_ATTN_NORM); worg=v3sub(self->morg, vec3(0, 0, 6)); BT_FireLaser(self, worg, self->mdir, 30*sc_dmg*(1.0/sc_ft)); BT_AttackFinishedRapid(self, 0.09); break; case 9: if(self->curMP<(15*sc_mp))break; self->curMP-=(15*sc_mp); btSound(self, BT_CHAN_WEAPON, "sound/weapons/rocklf1a", 1.0, BT_ATTN_NORM); BT_FireGrenade(self, self->morg, self->mdir, 120*sc_dmg, 600, 160); BT_AttackFinished(self, 1.0*sc_ft); break; // btSpeak2(self, BT_CHAN_VOICE, // "female0", NULL, "This is a test", // 1.0, BT_ATTN_NORM); break; default: break; } return(0); }