void CMenuMarcher::Think() { BaseClass::Think(); Speak(); Vector vecNewOrigin = GetGlobalOrigin() + Vector(0, 5, 0) * (float)GameServer()->GetFrameTime(); if (vecNewOrigin.y > 80) vecNewOrigin.y -= 160; vecNewOrigin.z = vecNewOrigin.z + GetGlobalVelocity().z * (float)GameServer()->GetFrameTime(); float flNewHoverHeight = FindHoverHeight(vecNewOrigin) + 2; if (vecNewOrigin.z > flNewHoverHeight) { SetGlobalVelocity(Vector(0, 0, GetGlobalVelocity().z - 5 * (float)GameServer()->GetFrameTime())); } else { vecNewOrigin.z = flNewHoverHeight; SetGlobalVelocity(Vector(0, 0, Approach(0, GetGlobalVelocity().z, 1 * (float)GameServer()->GetFrameTime()))); } SetGlobalOrigin(vecNewOrigin); }
void CCharacter::ShowPlayerVectors() const { TMatrix m = GetGlobalTransform(); Vector vecUp = GetUpVector(); Vector vecRight = m.GetForwardVector().Cross(vecUp).Normalized(); Vector vecForward = vecUp.Cross(vecRight).Normalized(); m.SetColumn(0, vecForward); m.SetColumn(1, vecUp); m.SetColumn(2, vecRight); CCharacter* pLocalCharacter = Game()->GetLocalPlayer()->GetCharacter(); TVector vecEyeHeight = GetUpVector() * EyeHeight(); CRenderingContext c(GameServer()->GetRenderer()); c.Translate((GetGlobalOrigin() - pLocalCharacter->GetGlobalOrigin())); c.SetColor(Color(255, 255, 255)); c.BeginRenderDebugLines(); c.Vertex(Vector(0,0,0)); c.Vertex((float)EyeHeight() * vecUp); c.EndRender(); if (!GetGlobalVelocity().IsZero()) { c.BeginRenderDebugLines(); c.Vertex(vecEyeHeight); c.Vertex(vecEyeHeight + GetGlobalVelocity()); c.EndRender(); } c.SetColor(Color(255, 0, 0)); c.BeginRenderDebugLines(); c.Vertex(vecEyeHeight); c.Vertex(vecEyeHeight + vecForward); c.EndRender(); c.SetColor(Color(0, 255, 0)); c.BeginRenderDebugLines(); c.Vertex(vecEyeHeight); c.Vertex(vecEyeHeight + vecRight); c.EndRender(); c.SetColor(Color(0, 0, 255)); c.BeginRenderDebugLines(); c.Vertex(vecEyeHeight); c.Vertex(vecEyeHeight + vecUp); c.EndRender(); TVector vecPoint, vecNormal; if (Game()->TraceLine(GetGlobalOrigin(), GetGlobalOrigin() - GetUpVector()*100, vecPoint, vecNormal, NULL)) { c.Translate(vecPoint - GetGlobalOrigin()); c.Scale(0.1f, 0.1f, 0.1f); c.SetColor(Color(255, 255, 255)); c.RenderSphere(); } }
void CCharacter::FindGroundEntity() { TVector vecVelocity = GetGlobalVelocity(); if (vecVelocity.Dot(GetUpVector()) > JumpStrength()/2.0f) { SetGroundEntity(NULL); SetSimulated(true); return; } TVector vecUp = GetUpVector() * m_flMaxStepSize; size_t iMaxEntities = GameServer()->GetMaxEntities(); for (size_t j = 0; j < iMaxEntities; j++) { CBaseEntity* pEntity = CBaseEntity::GetEntity(j); if (!pEntity) continue; if (pEntity->IsDeleted()) continue; if (!pEntity->ShouldCollide()) continue; if (pEntity == this) continue; TVector vecPoint, vecNormal; if (GetMoveParent() == pEntity) { TMatrix mGlobalToLocal = GetMoveParent()->GetGlobalToLocalTransform(); Vector vecUpLocal = mGlobalToLocal.TransformNoTranslate(GetUpVector()) * m_flMaxStepSize; if (pEntity->CollideLocal(GetLocalOrigin(), GetLocalOrigin() - vecUpLocal, vecPoint, vecNormal)) { SetGroundEntity(pEntity); SetSimulated(false); return; } } else { if (pEntity->Collide(GetGlobalOrigin(), GetGlobalOrigin() - vecUp, vecPoint, vecNormal)) { SetGroundEntity(pEntity); SetSimulated(false); return; } } } SetGroundEntity(NULL); SetSimulated(true); }