Improved skulk ladders

This commit is contained in:
RGreenlees 2024-02-28 23:10:58 +00:00 committed by pierow
parent 567f34cbf7
commit 07d5850e85
4 changed files with 162 additions and 414 deletions

View file

@ -3247,15 +3247,31 @@ void LadderMove(AvHAIPlayer* pBot, const Vector StartPoint, const Vector EndPoin
if (IsPlayerOnLadder(pBot->Edict))
{
// We're on the ladder and actively climbing
Vector CurrentLadderNormal = UTIL_GetNearestLadderNormal(pBot->CollisionHullBottomLocation + Vector(0.0f, 0.0f, 5.0f));
Vector CurrentLadderNormal;
if (IsPlayerSkulk(pBot->Edict))
{
CurrentLadderNormal = UTIL_GetNearestSurfaceNormal(pBot->Edict->v.origin);
}
else
{
CurrentLadderNormal = UTIL_GetNearestLadderNormal(pBot->CollisionHullBottomLocation + Vector(0.0f, 0.0f, 5.0f));
}
//CurrentLadderNormal = UTIL_GetVectorNormal2D(CurrentLadderNormal);
if (vIsZero(CurrentLadderNormal))
{
CurrentLadderNormal = UTIL_GetVectorNormal2D(EndPoint - pBot->Edict->v.origin);
}
UTIL_DrawLine(INDEXENT(1), pBot->Edict->v.origin, pBot->Edict->v.origin + (CurrentLadderNormal * 100.0f), 0.5f);
if (EndPoint.z > StartPoint.z)
{
CurrentLadderNormal = UTIL_GetVectorNormal2D(StartPoint - EndPoint);
}
else
{
CurrentLadderNormal = UTIL_GetVectorNormal2D(EndPoint - StartPoint);
}
}
const Vector LadderRightNormal = UTIL_GetVectorNormal(UTIL_GetCrossProduct(CurrentLadderNormal, UP_VECTOR));
@ -5156,12 +5172,12 @@ void UpdateBotStuck(AvHAIPlayer* pBot)
}
else
{
pBot->BotNavInfo.StuckInfo.TotalStuckTime += AIMGR_GetBotDeltaTime();
pBot->BotNavInfo.StuckInfo.TotalStuckTime += fminf(AIMGR_GetBotDeltaTime(), 0.016f);
}
}
else
{
pBot->BotNavInfo.StuckInfo.TotalStuckTime += AIMGR_GetBotDeltaTime();
pBot->BotNavInfo.StuckInfo.TotalStuckTime += fminf(AIMGR_GetBotDeltaTime(), 0.016f);
}
if (pBot->BotNavInfo.StuckInfo.TotalStuckTime > 0.25f)

View file

@ -820,6 +820,143 @@ Vector UTIL_GetNearestLadderNormal(edict_t* pEdict)
return UTIL_GetNearestLadderNormal(pEdict->v.origin);
}
Vector UTIL_GetNearestSurfaceNormal(Vector SearchLocation)
{
Vector Trace1End, Trace2End, Trace3End, Trace4End, Trace5End, Trace6End, Trace7End, Trace8End;
Trace1End = Trace2End = Trace3End = Trace4End = Trace5End = Trace6End = Trace7End = Trace8End = SearchLocation;
Trace1End.x += 32.0f;
Trace1End.y += 32.0f;
Trace2End.x += 32.0f;
Trace2End.y -= 32.0f;
Trace3End.x -= 32.0f;
Trace3End.y -= 32.0f;
Trace4End.x -= 32.0f;
Trace4End.y += 32.0f;
Trace5End.x += 32.0f;
Trace6End.x -= 32.0f;
Trace7End.y -= 32.0f;
Trace8End.y += 32.0f;
Vector ClosestNormal = ZERO_VECTOR;
float MinDist = 0.0f;
trace_t TraceResult;
NS_TraceLine(SearchLocation, Trace1End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace2End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace3End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace4End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace5End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace6End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace7End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace8End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
return ClosestNormal;
}
Vector UTIL_GetNearestLadderNormal(Vector SearchLocation)
{
TraceResult result;
@ -850,146 +987,7 @@ Vector UTIL_GetNearestLadderNormal(Vector SearchLocation)
{
if (vPointOverlaps3D(SearchLocation, closestLadderRef->pev->absmin, closestLadderRef->pev->absmax))
{
Vector Trace1End, Trace2End, Trace3End, Trace4End, Trace5End, Trace6End, Trace7End, Trace8End;
Trace1End = Trace2End = Trace3End = Trace4End = Trace5End = Trace6End = Trace7End = Trace8End = SearchLocation;
Trace1End.x += 32.0f;
Trace1End.y += 32.0f;
Trace2End.x += 32.0f;
Trace2End.y -= 32.0f;
Trace3End.x -= 32.0f;
Trace3End.y -= 32.0f;
Trace4End.x -= 32.0f;
Trace4End.y += 32.0f;
Trace5End.x += 32.0f;
Trace6End.x -= 32.0f;
Trace7End.y -= 32.0f;
Trace8End.y += 32.0f;
Vector ClosestNormal = ZERO_VECTOR;
float MinDist = 0.0f;
trace_t TraceResult;
NS_TraceLine(SearchLocation, Trace1End, 1, PM_NORMAL, -1, true, TraceResult);
UTIL_DrawLine(INDEXENT(1), SearchLocation, Trace1End, 0.5f, 255, 0, 0);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
UTIL_DrawLine(INDEXENT(1), SearchLocation, Trace2End, 0.5f, 0, 128, 0);
NS_TraceLine(SearchLocation, Trace2End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
UTIL_DrawLine(INDEXENT(1), SearchLocation, Trace3End, 0.5f, 0, 0, 255);
NS_TraceLine(SearchLocation, Trace3End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
UTIL_DrawLine(INDEXENT(1), SearchLocation, Trace4End, 0.5f, 255, 255, 0);
NS_TraceLine(SearchLocation, Trace4End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace5End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace6End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace7End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
NS_TraceLine(SearchLocation, Trace8End, 1, PM_NORMAL, -1, true, TraceResult);
if (TraceResult.fraction < 1.0f)
{
int PointContents = UTIL_PointContents(TraceResult.endpos);
if (vIsZero(ClosestNormal) || TraceResult.fraction < MinDist)
{
ClosestNormal = TraceResult.plane.normal;
MinDist = TraceResult.fraction;
}
}
return ClosestNormal;
return UTIL_GetNearestSurfaceNormal(SearchLocation);
}
else
{

View file

@ -161,4 +161,6 @@ Vector UTIL_GetNearestLadderTopPoint(edict_t* pEdict);
Vector UTIL_GetNearestLadderTopPoint(const Vector SearchLocation);
Vector UTIL_GetNearestLadderBottomPoint(edict_t* pEdict);
Vector UTIL_GetNearestSurfaceNormal(Vector SearchLocation);
#endif

View file

@ -1415,88 +1415,6 @@ BOOL AvHGamerules::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
theSuccess = true;
}
}
else if (FStrEq(pcmd, "drawoffmesh"))
{
AIDEBUG_DrawOffMeshConnections(10.0f);
theSuccess = true;
}
else if (FStrEq(pcmd, "refreshoffmesh"))
{
theSuccess = true;
}
else if (FStrEq(pcmd, "evolvelerk"))
{
vector<AvHAIPlayer*> AIPlayers = AIMGR_GetAllAIPlayers();
for (auto it = AIPlayers.begin(); it != AIPlayers.end(); it++)
{
AvHAIPlayer* thisBot = (*it);
AITASK_SetEvolveTask(thisBot, &thisBot->PrimaryBotTask, thisBot->Edict->v.origin, ALIEN_LIFEFORM_THREE, true);
}
theSuccess = true;
}
else if (FStrEq(pcmd, "evolvegorge"))
{
vector<AvHAIPlayer*> AIPlayers = AIMGR_GetAllAIPlayers();
for (auto it = AIPlayers.begin(); it != AIPlayers.end(); it++)
{
AvHAIPlayer* thisBot = (*it);
AITASK_SetEvolveTask(thisBot, &thisBot->PrimaryBotTask, thisBot->Edict->v.origin, ALIEN_LIFEFORM_TWO, true);
}
theSuccess = true;
}
else if (FStrEq(pcmd, "tracedoor"))
{
Vector TraceStart = GetPlayerEyePosition(theAvHPlayer->edict()); // origin + pev->view_ofs
Vector LookDir = UTIL_GetForwardVector(theAvHPlayer->edict()->v.v_angle); // Converts view angles to normalized unit vector
Vector TraceEnd = TraceStart + (LookDir * 1000.0f);
edict_t* TracedEntity = UTIL_TraceEntity(theAvHPlayer->edict(), TraceStart, TraceEnd);
if (!FNullEnt(TracedEntity))
{
nav_door* Door = UTIL_GetNavDoorByEdict(TracedEntity);
if (Door)
{
for (auto it = Door->TriggerEnts.begin(); it != Door->TriggerEnts.end(); it++)
{
const char* ButtonTarget = STRING(it->Edict->v.target);
const char* DoorTargetName = STRING(Door->DoorEdict->v.targetname);
bool bThing = true;
}
DoorTrigger* Trigger = UTIL_GetNearestDoorTrigger(theAvHPlayer->pev->origin, Door, nullptr, true);
if (Trigger)
{
UTIL_DrawLine(INDEXENT(1), theAvHPlayer->pev->origin, UTIL_GetButtonFloorLocation(theAvHPlayer->pev->origin, Trigger->Edict), 10.0f);
}
}
}
theSuccess = true;
}
else if (FStrEq(pcmd, "setdebugvector1"))
{
AIDEBUG_SetDebugVector1(UTIL_GetFloorUnderEntity(theAvHPlayer->edict()));
theSuccess = true;
}
else if (FStrEq(pcmd, "setdebugvector2"))
{
AIDEBUG_SetDebugVector2(UTIL_GetFloorUnderEntity(theAvHPlayer->edict()));
theSuccess = true;
}
else if (FStrEq(pcmd, "setdebugaiplayer"))
{
CBaseEntity* SpectatedPlayer = theAvHPlayer->GetSpectatingEntity();
@ -1512,170 +1430,6 @@ BOOL AvHGamerules::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
theSuccess = true;
}
else if (FStrEq(pcmd, "testalienreinforce"))
{
vector<AvHAIPlayer*> AlienPlayers = AIMGR_GetAIPlayersOnTeam(TEAM_TWO);
if (AlienPlayers.size() > 0)
{
AvHAIPlayer* NewCapper = AlienPlayers[0];
if (NewCapper)
{
DeployableSearchFilter ResNodeFilter;
ResNodeFilter.DeployableTeam = TEAM_TWO;
ResNodeFilter.ReachabilityTeam = TEAM_TWO;
ResNodeFilter.ReachabilityFlags = NewCapper->BotNavInfo.NavProfile.ReachabilityFlag;
AvHAIResourceNode* ResNode = AITAC_FindNearestResourceNodeToLocation(NewCapper->Edict->v.origin, &ResNodeFilter);
if (ResNode)
{
AITASK_SetReinforceStructureTask(NewCapper, &NewCapper->PrimaryBotTask, ResNode->ActiveTowerEntity, true);
}
}
}
theSuccess = true;
}
else if (FStrEq(pcmd, "showteamstarts"))
{
UTIL_DrawLine(INDEXENT(1), INDEXENT(1)->v.origin, AITAC_GetTeamStartingLocation(TEAM_ONE), 20.0f, 0, 0, 255);
UTIL_DrawLine(INDEXENT(1), INDEXENT(1)->v.origin, AITAC_GetTeamStartingLocation(TEAM_TWO), 20.0f, 255, 255, 0);
theSuccess = true;
}
else if (FStrEq(pcmd, "showhivefloors"))
{
vector<AvHAIHiveDefinition*> AllHives = AITAC_GetAllHives();
for (auto it = AllHives.begin(); it != AllHives.end(); it++)
{
UTIL_DrawLine(INDEXENT(1), INDEXENT(1)->v.origin, (*it)->FloorLocation, 20.0f, 255, 255, 0);
}
theSuccess = true;
}
else if (FStrEq(pcmd, "testresearchavailable"))
{
AvHTeam* PlayerTeam = GetGameRules()->GetTeam(theAvHPlayer->GetTeam());
if (PlayerTeam)
{
AvHMessageID Message = RESEARCH_ARMOR_ONE;
AvHMessageID Message2 = RESEARCH_ARMOR_TWO;
if (PlayerTeam->GetResearchManager().GetIsMessageAvailable(Message))
{
UTIL_SayText("Armour 1: TRUE\n", theAvHPlayer);
}
else
{
UTIL_SayText("Armour 1: FALSE\n", theAvHPlayer);
}
if (PlayerTeam->GetResearchManager().GetIsMessageAvailable(Message2))
{
UTIL_SayText("Armour 2: TRUE\n", theAvHPlayer);
}
else
{
UTIL_SayText("Armour 2: FALSE\n", theAvHPlayer);
}
}
theSuccess = true;
}
else if (FStrEq(pcmd, "amonladder"))
{
if (IsPlayerOnLadder(theAvHPlayer->edict()))
{
UTIL_SayText("TRUE\n", theAvHPlayer);
}
else
{
UTIL_SayText("FALSE\n", theAvHPlayer);
}
theSuccess = true;
}
else if (FStrEq(pcmd, "tracelift"))
{
Vector TraceStart = GetPlayerEyePosition(theAvHPlayer->edict()); // origin + pev->view_ofs
Vector LookDir = UTIL_GetForwardVector(theAvHPlayer->edict()->v.v_angle); // Converts view angles to normalized unit vector
Vector TraceEnd = TraceStart + (LookDir * 1000.0f);
edict_t* TracedEntity = UTIL_TraceEntity(theAvHPlayer->edict(), TraceStart, TraceEnd);
if (!FNullEnt(TracedEntity))
{
nav_door* Door = UTIL_GetNavDoorByEdict(TracedEntity);
if (Door)
{
Vector CurrPoint = ZERO_VECTOR;
for (auto stop = Door->StopPoints.begin(); stop != Door->StopPoints.end(); stop++)
{
Vector Point = (*stop);
Point.z += Door->DoorEdict->v.size.z * 0.5f;
UTIL_DrawLine(INDEXENT(1), INDEXENT(1)->v.origin, Point, 10.0f);
}
const dtOffMeshConnection* NearestCon = DEBUG_FindNearestOffMeshConnectionToPoint(theAvHPlayer->pev->origin, SAMPLE_POLYFLAGS_LIFT);
if (NearestCon)
{
Vector ConnectionStart = Vector(NearestCon->pos[0], -NearestCon->pos[2], NearestCon->pos[1]);
Vector ConnectionEnd = Vector(NearestCon->pos[3], -NearestCon->pos[5], NearestCon->pos[4]);
//UTIL_DrawLine(INDEXENT(1), ConnectionStart, ConnectionEnd, 10.0f);
for (auto stop = Door->StopPoints.begin(); stop != Door->StopPoints.end(); stop++)
{
//UTIL_DrawLine(INDEXENT(1), ConnectionStart, *stop, 10.0f, 255, 0, 0);
Vector NearestPointStart = UTIL_GetClosestPointOnEntityToLocation(ConnectionStart, Door->DoorEdict, *stop);
Vector NearestPointEnd = UTIL_GetClosestPointOnEntityToLocation(ConnectionEnd, Door->DoorEdict, *stop);
//UTIL_DrawLine(INDEXENT(1), ConnectionStart, NearestPointStart, 10.0f, 255, 255, 0);
//UTIL_DrawLine(INDEXENT(1), ConnectionEnd, NearestPointEnd, 10.0f, 0, 0, 255);
}
}
}
}
theSuccess = true;
}
else if (FStrEq(pcmd, "getlift"))
{
const dtOffMeshConnection* NearestCon = DEBUG_FindNearestOffMeshConnectionToPoint(theAvHPlayer->pev->origin, SAMPLE_POLYFLAGS_LIFT);
if (NearestCon)
{
Vector ConnectionStart = Vector(NearestCon->pos[0], -NearestCon->pos[2], NearestCon->pos[1]);
Vector ConnectionEnd = Vector(NearestCon->pos[3], -NearestCon->pos[5], NearestCon->pos[4]);
nav_door* NearestDoor = UTIL_GetClosestLiftToPoints(ConnectionStart, ConnectionEnd);
UTIL_DrawLine(INDEXENT(1), ConnectionStart, ConnectionEnd, 10.0f, 0, 0, 255);
if (NearestDoor)
{
UTIL_DrawLine(INDEXENT(1), theAvHPlayer->pev->origin, UTIL_GetCentreOfEntity(NearestDoor->DoorEdict), 10.0f, 255, 255, 0);
}
}
theSuccess = true;
}
else if (FStrEq(pcmd, "cometome"))
{
vector<AvHAIPlayer*> AIPlayers = AIMGR_GetAllAIPlayers();
@ -1688,28 +1442,6 @@ BOOL AvHGamerules::ClientCommand( CBasePlayer *pPlayer, const char *pcmd )
}
}
theSuccess = true;
}
else if (FStrEq(pcmd, "testpointadjust"))
{
Vector NewLoc = AdjustPointForPathfinding(theAvHPlayer->pev->origin);
if (!vIsZero(NewLoc))
{
UTIL_DrawLine(INDEXENT(1), theAvHPlayer->pev->origin, NewLoc, 10.0f);
}
theSuccess = true;
}
else if (FStrEq(pcmd, "testflightpath"))
{
vector<bot_path_node> path;
path.clear();
FindFlightPathToPoint(GetBaseNavProfile(ALL_NAV_PROFILE), AITAC_GetTeamStartingLocation(TEAM_ONE) + Vector(0.0f, 0.0f, 50.0f), theAvHPlayer->pev->origin, path, 100.0f);
AIDEBUG_DrawPath(path, 20.0f);
theSuccess = true;
}
else if( FStrEq( pcmd, kcRemoveUpgrade) )