void CFuncVehicle::Restart() { ALERT(at_console, "M_speed = %f\n", m_speed); pev->speed = 0; pev->velocity = g_vecZero; pev->avelocity = g_vecZero; pev->impulse = int(m_speed); m_dir = 1; m_flTurnStartTime = -1; m_flUpdateSound = -1; m_pDriver = nullptr; if (FStringNull(pev->target)) { ALERT(at_console, "Vehicle with no target"); } UTIL_SetOrigin(pev, pev->oldorigin); STOP_SOUND(ENT(pev), CHAN_STATIC, (char *)STRING(pev->noise)); NextThink(pev->ltime + 0.1f, FALSE); SetThink(&CFuncVehicle::Find); }
void CFuncVehicle::Spawn() { if (pev->speed == 0) m_speed = 165; else m_speed = pev->speed; if (!m_sounds) m_sounds = 3; ALERT(at_console, "M_speed = %f\n", m_speed); pev->speed = 0; pev->velocity = g_vecZero; pev->avelocity = g_vecZero; pev->impulse = int(m_speed); m_acceleration = 5; m_dir = 1; m_flTurnStartTime = -1; if (FStringNull(pev->target)) { ALERT(at_console, "Vehicle with no target"); } if (pev->spawnflags & SF_TRACKTRAIN_PASSABLE) pev->solid = SOLID_NOT; else pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; SET_MODEL(ENT(pev), STRING(pev->model)); UTIL_SetSize(pev, pev->mins, pev->maxs); UTIL_SetOrigin(pev, pev->origin); // Cache off placed origin for vehicle controls pev->oldorigin = pev->origin; m_controlMins = pev->mins; m_controlMaxs = pev->maxs; m_controlMaxs.z += 72; // start vehicle on the next frame, to make sure their targets have had // a chance to spawn/activate NextThink(pev->ltime + 0.1f, FALSE); SetThink(&CFuncVehicle::Find); Precache(); }
void CFuncVehicle::NearestPath() { CPathTrack *pTrack = nullptr; CPathTrack *pNearest = nullptr; real_t dist; float closest = 1024.0f; while ((pTrack = UTIL_FindEntityInSphere(pTrack, pev->origin, 1024.0f))) { // filter out non-tracks if (!(pTrack->pev->flags & (FL_CLIENT | FL_MONSTER)) && FClassnameIs(pTrack->pev, "path_track")) { dist = (pev->origin - pTrack->pev->origin).Length(); if (dist < closest) { closest = dist; pNearest = pTrack; } } } if (!pNearest) { ALERT(at_console, "Can't find a nearby track !!!\n"); SetThink(nullptr); return; } ALERT(at_aiconsole, "TRAIN: %s, Nearest track is %s\n", STRING(pev->targetname), STRING(pNearest->pev->targetname)); // If I'm closer to the next path_track on this path, then it's my real path pTrack = pNearest->GetNext(); if (pTrack) { if ((pev->origin - pTrack->pev->origin).Length() < (pev->origin - pNearest->pev->origin).Length()) { pNearest = pTrack; } } m_ppath = pNearest; if (pev->speed != 0) { NextThink(pev->ltime + 0.1f, FALSE); SetThink(&CFuncVehicle::Next); } }
/* <1bb0ef> ../cstrike/dlls/vehicle.cpp:956 */ void CFuncVehicle::__MAKE_VHOOK(Spawn)() { if (pev->speed == 0) m_speed = 165; else m_speed = pev->speed; if (!m_sounds) m_sounds = 3; ALERT(at_console, "M_speed = %f\n", m_speed); pev->speed = 0; pev->velocity = g_vecZero; pev->avelocity = g_vecZero; pev->impulse = (int)m_speed; m_acceleration = 5; m_dir = 1; m_flTurnStartTime = -1; if (FStringNull(pev->target)) { ALERT(at_console, "Vehicle with no target"); } if (pev->spawnflags & SF_TRACKTRAIN_PASSABLE) pev->solid = SOLID_NOT; else pev->solid = SOLID_BSP; pev->movetype = MOVETYPE_PUSH; SET_MODEL(ENT(pev), STRING(pev->model)); UTIL_SetSize(pev, pev->mins, pev->maxs); UTIL_SetOrigin(pev, pev->origin); pev->oldorigin = pev->origin; m_controlMins = pev->mins; m_controlMaxs = pev->maxs; m_controlMaxs.z += 72; NextThink(pev->ltime + 0.1, FALSE); SetThink(&CFuncVehicle::Find); Precache(); }
/* <1bb840> ../cstrike/dlls/vehicle.cpp:878 */ void CFuncVehicle::NearestPath() { CBaseEntity *pTrack = NULL; CBaseEntity *pNearest = NULL; float_precision dist; float closest = 1024; while ((pTrack = UTIL_FindEntityInSphere(pTrack, pev->origin, 1024)) != NULL) { if (!(pTrack->pev->flags & (FL_CLIENT | FL_MONSTER)) && FClassnameIs(pTrack->pev, "path_track")) { dist = (pev->origin - pTrack->pev->origin).Length(); if (dist < closest) { closest = dist; pNearest = pTrack; } } } if (!pNearest) { ALERT(at_console, "Can't find a nearby track !!!\n"); SetThink(NULL); return; } ALERT(at_aiconsole, "TRAIN: %s, Nearest track is %s\n", STRING(pev->targetname), STRING(pNearest->pev->targetname)); pTrack = ((CPathTrack *)pNearest)->GetNext(); if (pTrack != NULL) { if ((pev->origin - pTrack->pev->origin).Length() < (pev->origin - pNearest->pev->origin).Length()) { pNearest = pTrack; } } m_ppath = static_cast<CPathTrack *>(pNearest); if (pev->speed != 0) { NextThink(pev->ltime + 0.1, FALSE); SetThink(&CFuncVehicle::Next); } }
void CFuncVehicle::Find() { m_ppath = CPathTrack::Instance(FIND_ENTITY_BY_TARGETNAME(nullptr, STRING(pev->target))); if (!m_ppath) return; entvars_t *pevTarget = m_ppath->pev; if (!FClassnameIs(pevTarget, "path_track")) { ALERT(at_error, "func_track_train must be on a path of path_track\n"); m_ppath = nullptr; return; } Vector nextPos = pevTarget->origin; nextPos.z += m_height; Vector look = nextPos; look.z -= m_height; m_ppath->LookAhead(&look, m_length, 0); look.z += m_height; pev->angles = UTIL_VecToAngles(look - nextPos); pev->angles.y += 180; if (pev->spawnflags & SF_TRACKTRAIN_NOPITCH) { pev->angles.x = 0; } UTIL_SetOrigin(pev, nextPos); NextThink(pev->ltime + 0.1, FALSE); SetThink(&CFuncVehicle::Next); pev->speed = m_startSpeed; UpdateSound(); }
void CFuncVehicle::OverrideReset() { NextThink(pev->ltime + 0.1, FALSE); SetThink(&CFuncVehicle::NearestPath); }
void CFuncVehicle::Next() { Vector vGravityVector, forward, right, up; float time = 0.1f; vGravityVector = g_vecZero; UTIL_MakeVectors(pev->angles); forward = (gpGlobals->v_forward * -1) * (m_length * 0.5); right = (gpGlobals->v_right * -1) * (m_width * 0.5); up = gpGlobals->v_up * 16; m_vFrontLeft = pev->origin + forward - right + up; m_vFrontRight = pev->origin + forward + right + up; m_vFront = pev->origin + forward + up; m_vBackLeft = pev->origin - forward - right + up; m_vBackRight = pev->origin - forward + right + up; m_vBack = pev->origin - forward + up; m_vSurfaceNormal = g_vecZero; CheckTurning(); if (m_flSteeringWheelDecay < gpGlobals->time) { m_flSteeringWheelDecay = gpGlobals->time + 0.1f; if (m_iTurnAngle < 0) m_iTurnAngle++; else if (m_iTurnAngle > 0) m_iTurnAngle--; } if (m_flAcceleratorDecay < gpGlobals->time) { m_flAcceleratorDecay = gpGlobals->time + 0.1f; if (pev->speed < 0) { pev->speed += 20; if (pev->speed > 0) pev->speed = 0; } else if (pev->speed > 0) { pev->speed -= 20; if (pev->speed < 0) pev->speed = 0; } } if (pev->speed == 0) { m_iTurnAngle = 0; pev->avelocity = g_vecZero; pev->velocity = g_vecZero; SetThink(&CFuncVehicle::Next); NextThink(pev->ltime + time, TRUE); return; } TerrainFollowing(); CollisionDetection(); Vector temp; if (m_vSurfaceNormal != g_vecZero) { Vector vTargetAngle, vAngle; float vx; real_t vy; m_vVehicleDirection = CrossProduct(m_vSurfaceNormal, gpGlobals->v_forward); m_vVehicleDirection = CrossProduct(m_vSurfaceNormal, m_vVehicleDirection); vTargetAngle = UTIL_VecToAngles(m_vVehicleDirection); vAngle = pev->angles; vTargetAngle.y += 180; if (m_iTurnAngle != 0) { vTargetAngle.y += m_iTurnAngle; } UTIL_FixupAngles(vTargetAngle); UTIL_FixupAngles(vAngle); vx = UTIL_AngleDistance(vTargetAngle.x, vAngle.x); vy = UTIL_AngleDistance(vTargetAngle.y, vAngle.y); if (vx > 10) vx = 10; else if (vx < -10) vx = -10; if (vy > 10) vy = 10; else if (vy < -10) vy = -10; pev->avelocity.y = int(vy * 10); pev->avelocity.x = int(vx * 10); m_flLaunchTime = -1; m_flLastNormalZ = m_vSurfaceNormal.z; } else { if (m_flLaunchTime != -1) { vGravityVector.x = 0; vGravityVector.y = 0; vGravityVector.z = (gpGlobals->time - m_flLaunchTime) * -35; if (vGravityVector.z < -400) { vGravityVector.z = -400; } } else { m_flLaunchTime = gpGlobals->time; vGravityVector = Vector(0, 0, 0); pev->velocity = pev->velocity * 1.5; } m_vVehicleDirection = gpGlobals->v_forward * -1; } UTIL_VecToAngles(m_vVehicleDirection); if (m_flUpdateSound < gpGlobals->time) { UpdateSound(); m_flUpdateSound = gpGlobals->time + 1.0f; } if (m_vSurfaceNormal != g_vecZero) { pev->velocity = m_vVehicleDirection.Normalize() * pev->speed; } else { pev->velocity = pev->velocity + vGravityVector; } SetThink(&CFuncVehicle::Next); NextThink(pev->ltime + time, TRUE); }
/* <1bb00a> ../cstrike/dlls/vehicle.cpp:926 */ void CFuncVehicle::__MAKE_VHOOK(OverrideReset)() { NextThink(pev->ltime + 0.1, FALSE); SetThink(&CFuncVehicle::NearestPath); }