void SP_waypoint_squadpath (gentity_t *ent) { VectorSet(ent->mins, DEFAULT_MINS_0, DEFAULT_MINS_1, DEFAULT_MINS_2); VectorSet(ent->maxs, DEFAULT_MAXS_0, DEFAULT_MAXS_1, DEFAULT_MAXS_2); ent->contents = CONTENTS_TRIGGER; ent->clipmask = MASK_DEADSOLID; gi.linkentity( ent ); if(!ent->target || !ent->target[0]) { if(!ent->target2 || !ent->target2[0]) { if(!ent->target3 || !ent->target3[0]) { if(!ent->target4 || !ent->target4[0]) { //Hmm... dead end } else { G_Error("ERROR: waypoint_squadpath %s has a target4 but not target, target2 or target3!!!\n", ent->targetname); G_FreeEntity(ent); return; } } else { G_Error("ERROR: waypoint_squadpath %s has a target3 but not target or target2!!!\n", ent->targetname); G_FreeEntity(ent); return; } } else { G_Error("ERROR: waypoint_squadpath %s has a target2 but not target!!!\n", ent->targetname); G_FreeEntity(ent); return; } } if(G_CheckInSolid (ent, qtrue)) { ent->maxs[2] = CROUCH_MAXS_2; if(G_CheckInSolid (ent, qtrue)) { gi.Printf(S_COLOR_RED"ERROR: waypoint_squadpath %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); assert(0 && "ERROR: Waypoint_squadpath in solid!"); #ifndef FINAL_BUILD G_Error("Waypoint_squadpath %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); #endif //G_FreeEntity(ent); return; } } }
void SP_waypoint_navgoal( gentity_t *ent ) { int radius = ( ent->radius ) ? (ent->radius) : 12; VectorSet( ent->mins, -16, -16, -24 ); VectorSet( ent->maxs, 16, 16, 32 ); ent->s.origin[2] += 0.125; if ( !(ent->spawnflags&1) && G_CheckInSolid( ent, qfalse ) ) { gi.Printf(S_COLOR_RED"ERROR: Waypoint_navgoal %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); assert(0); #ifndef FINAL_BUILD if (!g_entities[ENTITYNUM_WORLD].s.radius){ //not a region G_Error("Waypoint_navgoal %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); } #endif } TAG_Add( ent->targetname, NULL, ent->s.origin, ent->s.angles, radius, RTF_NAVGOAL ); ent->classname = "navgoal"; NAV::SpawnedPoint(ent, NAV::PT_GOALNODE); G_FreeEntity( ent );//can't do this, they need to be found later by some functions, though those could be fixed, maybe? }
void SP_waypoint ( gentity_t *ent ) { VectorSet(ent->mins, DEFAULT_MINS_0, DEFAULT_MINS_1, DEFAULT_MINS_2); VectorSet(ent->maxs, DEFAULT_MAXS_0, DEFAULT_MAXS_1, DEFAULT_MAXS_2); ent->contents = CONTENTS_TRIGGER; ent->clipmask = MASK_DEADSOLID; gi.linkentity( ent ); ent->count = -1; ent->classname = "waypoint"; if (ent->spawnflags&2) { ent->currentOrigin[2] += 128.0f; } if( !(ent->spawnflags&1) && G_CheckInSolid (ent, qtrue)) {//if not SOLID_OK, and in solid ent->maxs[2] = CROUCH_MAXS_2; if(G_CheckInSolid (ent, qtrue)) { gi.Printf(S_COLOR_RED"ERROR: Waypoint %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); assert(0 && "Waypoint in solid!"); // if (!g_entities[ENTITYNUM_WORLD].s.radius){ //not a region // G_Error("Waypoint %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); // } delayedShutDown = level.time + 100; G_FreeEntity(ent); return; } } //G_SpawnString("targetJump", "", &ent->targetJump); ent->radius = waypoint_getRadius( ent ); NAV::SpawnedPoint(ent); G_FreeEntity(ent); return; }
/*QUAKED waypoint_small (0.7 0.7 0) (-2 -2 -24) (2 2 32) SOLID_OK SOLID_OK - only use if placing inside solid is unavoidable in map, but may be clear in-game (ie: at the bottom of a tall, solid lift that starts at the top position) DROP_TO_FLOOR - will cause the point to auto drop to the floor */ void SP_waypoint_small (gentity_t *ent) { VectorSet(ent->mins, -2, -2, DEFAULT_MINS_2); VectorSet(ent->maxs, 2, 2, DEFAULT_MAXS_2); ent->contents = CONTENTS_TRIGGER; ent->clipmask = MASK_DEADSOLID; gi.linkentity( ent ); ent->count = -1; ent->classname = "waypoint"; if ( !(ent->spawnflags&1) && G_CheckInSolid( ent, qtrue ) ) { ent->maxs[2] = CROUCH_MAXS_2; if ( G_CheckInSolid( ent, qtrue ) ) { gi.Printf(S_COLOR_RED"ERROR: Waypoint_small %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); assert(0); #ifndef FINAL_BUILD if (!g_entities[ENTITYNUM_WORLD].s.radius){ //not a region G_Error("Waypoint_small %s at %s in solid!\n", ent->targetname, vtos(ent->currentOrigin)); } #endif G_FreeEntity(ent); return; } } ent->radius = 2; // radius NAV::SpawnedPoint(ent); G_FreeEntity(ent); return; }
//=============================================================================== qboolean G_CheckInSolid (gentity_t *self, qboolean fix) { trace_t trace; vec3_t end, mins; VectorCopy(self->currentOrigin, end); end[2] += self->mins[2]; VectorCopy(self->mins, mins); mins[2] = 0; gi.trace(&trace, self->currentOrigin, mins, self->maxs, end, self->s.number, self->clipmask, (EG2_Collision)0, 0); if(trace.allsolid || trace.startsolid) { return qtrue; } #ifdef _DEBUG if(trace.fraction < 0.99999713) #else if(trace.fraction < 1.0) #endif { if(fix) {//Put them at end of trace and check again vec3_t neworg; VectorCopy(trace.endpos, neworg); neworg[2] -= self->mins[2]; G_SetOrigin(self, neworg); gi.linkentity(self); return G_CheckInSolid(self, qfalse); } else { return qtrue; } } return qfalse; }