From 4322dc6dcb7040ff0f7ecf04331f4b2f15829163 Mon Sep 17 00:00:00 2001 From: Jackz Date: Fri, 22 Jul 2022 00:06:46 -0500 Subject: [PATCH] Fix auto turret, improve manual turret --- plugins/l4d2_turret.smx | Bin 19773 -> 20419 bytes scripting/l4d2_turret.sp | 155 ++++++++++++++++++++------------------- 2 files changed, 78 insertions(+), 77 deletions(-) diff --git a/plugins/l4d2_turret.smx b/plugins/l4d2_turret.smx index 39c78a4ba7c54ebab296987636d47443d12b0d1f..2e9bd567fd2c782671ab74fcd064c1cf6e96432f 100644 GIT binary patch literal 20419 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 -1) { - AcceptEntityInput(entity, "Kill"); - } - } - entity = INVALID_ENT_REFERENCE; - while ((entity = FindEntityByClassname(entity, "info_target")) != INVALID_ENT_REFERENCE) { - GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); - if(StrContains(targetname, "sm_laser") > -1) { - AcceptEntityInput(entity, "Kill"); - } - } -}*/ - public Action Command_SpawnTurret(int client, int args) { float pos[3]; GetClientEyePosition(client, pos); + pos[2] += 20.0; int base = CreateParticleNamed(ENT_PORTAL_NAME, PARTICLE_ELMOS, pos, NULL_VECTOR); SetupTurret(base, TURRET_ACTIVATION_TIME); ReplyToCommand(client, "New turret (%d) will activate in %.0f seconds", base, TURRET_ACTIVATION_TIME); @@ -288,8 +259,12 @@ public Action Command_ManualTarget(int client, int args) { } else if(manualTargetter > 0) { ReplyToCommand(manualTargetter, "%N is now manually targetting", client); } - manualTargetter = client; - ReplyToCommand(client, "Now manually targetting"); + if(turretCount == 0) { + ReplyToCommand(client, "There are no turrets to manually target"); + } else { + manualTargetter = client; + ReplyToCommand(client, "Now manually targetting"); + } return Plugin_Handled; } @@ -346,7 +321,7 @@ public Action Timer_Think(Handle h) { float damage = 100.0; target = FindNearestVisibleEntity("tank_rock", pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED, entity); if(target > 0) damage = 1000.0; - if(target == -1) target = FindNearestClient(TEAM_SPECIALS, pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED); + if(target == -1) target = FindNearestVisibleClient(TEAM_SPECIALS, pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED); if(target == -1) target = FindNearestVisibleEntity("infected", pos, TURRET_MAX_RANGE_INFECTED_OPTIMIZED, entity); if(target > 0) { turretDamage[entity] = damage; @@ -462,13 +437,14 @@ int CreateTarget(const float origin[3], const char[] targetName, float duration return target; } + stock int FindNearestClient(int team, const float origin[3], float maxRange = 0.0) { int client = -1; float closestDist, pos[3]; for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == team && !pendingDeletion[i]) { GetClientAbsOrigin(i, pos); - float distance = GetVectorDistance(origin, pos); + float distance = GetVectorDistance(origin, pos, true); if(maxRange > 0.0 && distance > maxRange) continue; if(client == -1 || distance <= closestDist) { client = i; @@ -479,12 +455,11 @@ stock int FindNearestClient(int team, const float origin[3], float maxRange = 0. return client; } -stock int FindNearestVisibleSpecial(const float origin[3], float maxRange = 0.0) { +stock int FindNearestVisibleClient(int team, const float origin[3], float maxRange = 0.0) { int client = -1; - static float closestDist; - static float pos[3]; + float closestDist, pos[3]; for(int i = 1; i <= MaxClients; i++) { - if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == 3 && !pendingDeletion[i]) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == team && !pendingDeletion[i]) { GetClientAbsOrigin(i, pos); float distance = GetVectorDistance(origin, pos, true); if(maxRange > 0.0 && distance > maxRange) continue; @@ -517,36 +492,22 @@ stock int FindNearestVisibleEntity(const char[] classname, const float origin[3] return -1; } - -stock int FindNearestInfected(const float origin[3], float maxRange = 0.0) { - int infected = -1; - float closestDist, pos[3]; - int entity = INVALID_ENT_REFERENCE; - while ((entity = FindEntityByClassname(entity, "infected")) != INVALID_ENT_REFERENCE) { - if(GetEntProp(entity, Prop_Send, "m_iHealth") <= 0) continue; - GetEntPropVector(entity, Prop_Send, "m_vecOrigin", pos); - float distance = GetVectorDistance(origin, pos); - if(maxRange > 0.0 && distance > maxRange) continue; - if(infected == -1 || distance <= closestDist) { - infected = entity; - closestDist = distance; - } - } - return infected; -} - stock bool CanSeePoint(const float origin[3], const float point[3]) { TR_TraceRay(origin, point, MASK_ALL, RayType_EndPoint); - if(!TR_DidHit() ) { - return true; - } - return false; + + return !TR_DidHit(); // Can see point if no collisions } stock bool CanSeeEntity(const float origin[3], int entity) { static float point[3]; GetEntPropVector(entity, Prop_Send, "m_vecOrigin", point); - return CanSeePoint(origin, point); + TR_TraceRayFilter(origin, point, MASK_ALL, RayType_EndPoint, Filter_CanSeeEntity, entity); + + return TR_GetEntityIndex() == entity; // Can see point if no collisions +} + +bool Filter_CanSeeEntity(int entity, int contentsMask, int data) { + return entity != data; } @@ -603,39 +564,78 @@ stock void SetParent(int child, int parent) { AcceptEntityInput(child, "SetParent", parent); } +/*#define MAX_IGNORE_TRACE 2 +static char IGNORE_TRACE[MAX_IGNORE_TRACE][] = { + "env_physics_blocker", + "env_player_blocker" +};*/ + static int COLOR_RED[4] = { 255, 0, 0, 200 }; int manualTarget = -1; #define MANUAL_TARGETNAME "turret_target_manual" -bool Filter_IgnorePlayer(int entity, int contentsMask, any data) { - return entity != data && entity != manualTarget; +bool Filter_ManualTarget(int entity, int contentsMask) { + if(entity == 0) return true; + if(entity == manualTarget || entity == manualTargetter) return false; + return true; + /*static char classname[32]; + GetEntityClassname(entity, classname, sizeof(classname)); + for(int i = 0; i < MAX_IGNORE_TRACE; i++) { + if(StrEqual(IGNORE_TRACE[i], classname)) { + return false; + } + } + return true;*/ } +#define MAX_WHITELISTED_AUTO_AIM_TARGETS 2 +static char WHITELISTED_AUTO_AIM_TARGETS[MAX_WHITELISTED_AUTO_AIM_TARGETS][] = { + "infected", + "witch" +}; + public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3], float angles[3], int& weapon, int& subtype, int& cmdnum, int& tickcount, int& seed, int mouse[2]) { if(client == manualTargetter && turretCount > 0) { static float pos[3], ang[3]; + static char classname[32]; GetClientEyePosition(client, pos); GetClientEyeAngles(client, ang); - // ang[2] += 10.0; - // GetHorizontalPositionFromOrigin(pos, ang, 15.0, pos); - // pos[2] += 50.0; - TR_TraceRayFilter(pos, ang, MASK_ALL, RayType_Infinite, Filter_IgnorePlayer, client); + + // Run a ray trace to find a suitable position + // TODO: Possibly run per-turret for more accurate preview + TR_TraceRayFilter(pos, ang, MASK_SHOT, RayType_Infinite, Filter_ManualTarget); if(!IsValidEntity(manualTarget)) manualTarget = CreateTarget(ang, MANUAL_TARGETNAME); + // Disable aim snapping if player is holding WALK (which is apparently IN_SPEED) + bool aimSnapping = ~buttons & IN_SPEED > 0; int targetEntity = TR_GetEntityIndex(); - if(targetEntity > 0 && (targetEntity > MaxClients || GetClientTeam(targetEntity) == 3)) { - GetEntPropVector(targetEntity, Prop_Send, "m_vecOrigin", ang); - ang[2] += 40.0; - } else { - TR_GetEndPosition(ang); + TR_GetEndPosition(ang); + + if(aimSnapping && targetEntity > 0) { + if(targetEntity > MaxClients) { + // Check if aimed non-player entity is an entity to be auto aimed at + GetEntityClassname(targetEntity, classname, sizeof(classname)); + for(int i = 0; i < MAX_WHITELISTED_AUTO_AIM_TARGETS; i++) { + if(StrEqual(WHITELISTED_AUTO_AIM_TARGETS[i], classname)) { + GetEntPropVector(targetEntity, Prop_Send, "m_vecOrigin", ang); + ang[2] += 40.0; + break; + } + } + } else if(GetClientTeam(targetEntity) == 3) { + // Target is an infected player, auto aim + GetClientEyePosition(targetEntity, ang); + ang[2] -= 10.0; + } } TeleportEntity(manualTarget, ang, NULL_VECTOR, NULL_VECTOR); if(buttons & IN_ATTACK) { - PhysicsExplode(ang, 10, 20.0, true); + PhysicsExplode(ang, 100, 20.0, true); TE_SetupExplodeForce(ang, 20.0, 10.0); } + // Activate all turrets int entity = INVALID_ENT_REFERENCE; while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { if(view_as(turretState[entity]) > 0) { @@ -643,10 +643,11 @@ public Action OnPlayerRunCmd(int client, int& buttons, int& impulse, float vel[3 TE_SetupBeamPoints(pos, ang, g_iLaserIndex, 0, 0, 1, 0.1, 0.1, 0.1, 0, 0.0, COLOR_RED, 1); TE_SendToAll(); if(buttons & IN_ATTACK) { - FireTurret(pos, MANUAL_TARGETNAME, 200.0, tickcount % 5 > 0); + FireTurret(pos, MANUAL_TARGETNAME, 50.0, tickcount % 10 > 0); } } } + buttons &= ~IN_ATTACK; SetEntPropFloat(client, Prop_Send, "m_flNextAttack", GetGameTime() + 1.0); return Plugin_Changed;