void CFuncTank::__MAKE_VHOOK(Think)() { pev->avelocity = g_vecZero; TrackTarget(); if (Q_fabs(float_precision(pev->avelocity.x)) > 1 || Q_fabs(float_precision(pev->avelocity.y)) > 1) StartRotSound(); else StopRotSound(); }
node_index_t CLocalNav::GetBestNode(Vector &vecOrigin, Vector &vecDest) { node_index_t nindexCurrent; localnode_t *nodeCurrent; node_index_t nindexBest; float flBestVal; nindexBest = NODE_INVALID_EMPTY; nindexCurrent = 0; flBestVal = 1000000.0; while (nindexCurrent < m_nindexAvailableNode) { nodeCurrent = GetNode(nindexCurrent); if (!nodeCurrent->fSearched) { float_precision flCurrentVal; float_precision flDistFromStart; float flDistToDest; float_precision flZDiff = -1.0; flDistFromStart = LengthSubtract <float_precision, float_precision, float_precision, float_precision>(vecDest, nodeCurrent->vecLoc); flDistToDest = nodeCurrent->vecLoc.z - vecDest.z; if (flDistToDest >= 0.0) { flZDiff = 1.0; } if ((flDistToDest * flZDiff) <= s_flStepSize) flZDiff = 1.0; else flZDiff = 1.25; flCurrentVal = flZDiff * (float_precision(nodeCurrent->bDepth) * HOSTAGE_STEPSIZE + flDistFromStart); if (flCurrentVal < flBestVal) { flBestVal = flCurrentVal; nindexBest = nindexCurrent; } } ++nindexCurrent; } return nindexBest; }
BOOL CLocalNav::SlopeTraversable(Vector &vecSource, Vector &vecDest, int fNoMonsters, TraceResult &tr) { Vector vecSlopeEnd; Vector vecDown; Vector vecAngles; vecSlopeEnd = vecDest; vecDown = vecDest - vecSource; vecAngles = UTIL_VecToAngles(tr.vecPlaneNormal); vecSlopeEnd.z = vecDown.Length2D() * Q_tan(float_precision((90.0 - vecAngles.x) * (M_PI / 180))) + vecSource.z; if (!PathClear(vecSource, vecSlopeEnd, fNoMonsters, tr)) { if (tr.fStartSolid) return FALSE; if ((tr.vecEndPos - vecSource).Length2D() < 1.0f) return FALSE; } vecSlopeEnd = tr.vecEndPos; vecDown = vecSlopeEnd; vecDown.z -= s_flStepSize; if (!PathClear(vecSlopeEnd, vecDown, fNoMonsters, tr)) { if (tr.fStartSolid) { vecDest = vecSlopeEnd; return TRUE; } } vecDest = tr.vecEndPos; return TRUE; }
void CBaseButton::__MAKE_VHOOK(Spawn)() { char *pszSound; //---------------------------------------------------- //determine sounds for buttons //a sound of 0 should not make a sound //---------------------------------------------------- pszSound = ButtonSound(m_sounds); PRECACHE_SOUND(pszSound); pev->noise = ALLOC_STRING(pszSound); Precache(); // this button should spark in OFF state if (pev->spawnflags & SF_BUTTON_SPARK_IF_OFF) { SetThink(&CBaseButton::ButtonSpark); // no hurry, make sure everything else spawns pev->nextthink = gpGlobals->time + 0.5f; } SetMovedir(pev); pev->movetype = MOVETYPE_PUSH; pev->solid = SOLID_BSP; SET_MODEL(ENT(pev), STRING(pev->model)); if (pev->speed == 0) pev->speed = 40; if (pev->health > 0) { pev->takedamage = DAMAGE_YES; } if (m_flWait == 0) { m_flWait = 1; } if (m_flLip == 0) { m_flLip = 4; } m_toggle_state = TS_AT_BOTTOM; m_vecPosition1 = pev->origin; // Subtract 2 from size because the engine expands bboxes by 1 in all directions making the size too big m_vecPosition2 = m_vecPosition1 + (pev->movedir * (Q_fabs(float_precision(pev->movedir.x * (pev->size.x - 2))) + Q_fabs(float_precision(pev->movedir.y * (pev->size.y - 2))) + Q_fabs(float_precision(pev->movedir.z * (pev->size.z - 2))) - m_flLip)); // Is this a non-moving button? if (((m_vecPosition2 - m_vecPosition1).Length() < 1) || (pev->spawnflags & SF_BUTTON_DONTMOVE)) { m_vecPosition2 = m_vecPosition1; } m_fStayPushed = (m_flWait == -1 ? TRUE : FALSE); m_fRotating = FALSE; // if the button is flagged for USE button activation only, take away it's touch function and add a use function // touchable button if (pev->spawnflags & SF_BUTTON_TOUCH_ONLY) { SetTouch(&CBaseButton::ButtonTouch); } else { SetTouch(NULL); SetUse(&CBaseButton::ButtonUse); } }
void CLocalNav::AddPathNode(node_index_t nindexSource, int offsetX, int offsetY, int fNoMonsters) { int bDepth; Vector vecSource, vecDest; int offsetXAbs, offsetYAbs; if (nindexSource == NODE_INVALID_EMPTY) { bDepth = 1; offsetXAbs = offsetX; offsetYAbs = offsetY; vecSource = m_vecStartingLoc; vecDest = vecSource + Vector(float_precision(offsetX) * HOSTAGE_STEPSIZE, float_precision(offsetY) * HOSTAGE_STEPSIZE, 0); } else { localnode_t *nodeSource; localnode_t *nodeCurrent; node_index_t nindexCurrent; nodeCurrent = GetNode(nindexSource); offsetXAbs = offsetX + nodeCurrent->offsetX; offsetYAbs = offsetY + nodeCurrent->offsetY; nodeSource = GetNode(m_nindexAvailableNode); // if there exists a node, then to ignore adding a the new node if (NodeExists(offsetXAbs, offsetYAbs) != NODE_INVALID_EMPTY) { return; } vecSource = nodeCurrent->vecLoc; vecDest = vecSource + Vector((float_precision(offsetX) * HOSTAGE_STEPSIZE), (float_precision(offsetY) * HOSTAGE_STEPSIZE), 0); if (m_nindexAvailableNode) { nindexCurrent = m_nindexAvailableNode; do { nodeSource--; nindexCurrent--; offsetX = (nodeSource->offsetX - offsetXAbs); if (offsetX >= 0) { if (offsetX > 1) { continue; } } else { if (-offsetX > 1) { continue; } } offsetY = (nodeSource->offsetY - offsetYAbs); if (offsetY >= 0) { if (offsetY > 1) { continue; } } else { if (-offsetY > 1) { continue; } } if (PathTraversable(nodeSource->vecLoc, vecDest, fNoMonsters) != PATH_TRAVERSABLE_EMPTY) { nodeCurrent = nodeSource; nindexSource = nindexCurrent; } } while (nindexCurrent); } vecSource = nodeCurrent->vecLoc; bDepth = int(nodeCurrent->bDepth) + 1; } if (PathTraversable(vecSource, vecDest, fNoMonsters) != PATH_TRAVERSABLE_EMPTY) { AddNode(nindexSource, vecDest, offsetXAbs, offsetYAbs, bDepth); } }