Exemple #1
0
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;
}
Exemple #2
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);
}
Exemple #3
0
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);
}
Exemple #4
0
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);
}
Exemple #5
0
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)); }
      }
   }
}
Exemple #6
0
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);
}
Exemple #7
0
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;
}
Exemple #8
0
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);
}
Exemple #9
0
/** 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);
}
Exemple #10
0
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);
  }
}
Exemple #11
0
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);
}
Exemple #12
0
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);
  }
}
Exemple #13
0
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);
}
Exemple #14
0
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);
}
Exemple #15
0
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);
}
Exemple #16
0
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);
}
Exemple #17
0
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);
}