From 30a4b26430ba252a91454e9898127eca9082f4ab Mon Sep 17 00:00:00 2001 From: Jackz Date: Thu, 21 Jul 2022 22:54:27 -0500 Subject: [PATCH] Add manual targetting turret --- plugins/l4d2_turret.smx | Bin 16383 -> 19773 bytes scripting/l4d2_turret.sp | 301 ++++++++++++++++++++++++++------------- 2 files changed, 201 insertions(+), 100 deletions(-) diff --git a/plugins/l4d2_turret.smx b/plugins/l4d2_turret.smx index aa01888d1ebc74a511e51d3dcf6e393be72a2a68..39c78a4ba7c54ebab296987636d47443d12b0d1f 100644 GIT binary patch literal 19773 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 @@ -29,6 +34,8 @@ int g_iLaserIndex; int g_iBeamSprite; int g_iHaloSprite; +int manualTargetter; + /* TODO: Entity_ChangeOverTime` @@ -75,6 +82,7 @@ public void OnPluginStart() { RegAdminCmd("sm_turret", Command_SpawnTurret, ADMFLAG_CHEATS); RegAdminCmd("sm_rmturrets", Command_RemoveTurrets, ADMFLAG_CHEATS); + RegAdminCmd("sm_mturret", Command_ManualTarget, ADMFLAG_CHEATS); CreateTimer(0.1, Timer_Think, _, TIMER_REPEAT); for(int i = 1; i <= MaxClients; i++) { if(IsClientConnected(i) && IsClientInGame(i)) { @@ -84,10 +92,11 @@ public void OnPluginStart() { } public void OnPluginEnd() { - OnMapEnd(); + ClearTurrets(false); } enum TurretState { + Turret_Disabled = -1, Turret_Invalid = 0, Turret_Idle, Turret_Active @@ -115,17 +124,20 @@ void FindTurrets() { } } -void SetupTurret(int turret) { +void SetupTurret(int turret, float time = 0.0) { float pos[3]; GetEntPropVector(turret, Prop_Send, "m_vecOrigin", pos); - turretState[turret] = Turret_Idle; + turretState[turret] = Turret_Disabled; turretActivatorParticle[turret] = INVALID_ENT_REFERENCE; char targetName[32]; Format(targetName, sizeof(targetName), "laser_target_%d", turret); - - + CreateTimer(time, Timer_ActivateTurret, turret); turretCount++; } +Action Timer_ActivateTurret(Handle h, int turret) { + turretState[turret] = Turret_Idle; + return Plugin_Handled; +} void DeactivateTurret(int turret) { int particle = EntRefToEntIndex(turretActivatorParticle[turret]); @@ -136,29 +148,38 @@ void DeactivateTurret(int turret) { turretActiveEntity[turret] = 0; } -int ClearTurrets() { +int ClearTurrets(bool fullClear = true) { int entity = INVALID_ENT_REFERENCE; int count; char targetname[32]; - while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { - GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); - if(view_as(turretState[entity]) > 0) { - count++; - AcceptEntityInput(entity, "Kill"); - int particle = EntRefToEntIndex(turretActivatorParticle[entity]); - if(IsValidEntity(particle)) - AcceptEntityInput(particle, "Kill"); + if(fullClear) { + while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { + GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + if(turretState[entity] != Turret_Invalid) { + count++; + AcceptEntityInput(entity, "Kill"); + int particle = EntRefToEntIndex(turretActivatorParticle[entity]); + if(IsValidEntity(particle)) + AcceptEntityInput(particle, "Kill"); - turretState[entity] = Turret_Invalid; - turretActivatorParticle[entity] = 0; - } else if(StrEqual(targetname, "turret_activate")) { + turretState[entity] = Turret_Invalid; + turretActivatorParticle[entity] = 0; + } else if(StrEqual(targetname, "turret_activate")) { + AcceptEntityInput(entity, "Kill"); + } + } + entity = INVALID_ENT_REFERENCE; + } + while ((entity = FindEntityByClassname(entity, "env_laser")) != INVALID_ENT_REFERENCE) { + if(turretIsActiveLaser[entity]) { + AcceptEntityInput(entity, "TurnOff"); AcceptEntityInput(entity, "Kill"); } } entity = INVALID_ENT_REFERENCE; - while ((entity = FindEntityByClassname(entity, "env_laser")) != INVALID_ENT_REFERENCE) { - if(turretIsActiveLaser[entity]) { - AcceptEntityInput(entity, "TurnOff"); + while ((entity = FindEntityByClassname(entity, "info_target")) != INVALID_ENT_REFERENCE) { + GetEntPropString(entity, Prop_Data, "m_iName", targetname, sizeof(targetname)); + if(StrContains(targetname, "turret_target_") > -1) { AcceptEntityInput(entity, "Kill"); } } @@ -172,9 +193,15 @@ int ClearTurrets() { } public void OnClientPutInServer(int client) { + pendingDeletion[client] = false; SDKHook(client, SDKHook_OnTakeDamageAlive, OnTakeDamageAlive); } +public void OnClientDisconnect(int client) { + if(manualTargetter == client) + manualTargetter = 0; +} + public Action OnTakeDamageAlive(int victim, int& attacker, int& inflictor, float& damage, int& damagetype) { if(attacker > MaxClients && attacker < 2048 && turretIsActiveLaser[attacker] && GetClientTeam(victim) != 3) { int health = L4D_GetPlayerTempHealth(victim); @@ -243,12 +270,26 @@ public void OnEntityDestroyed(int entity) { } }*/ + public Action Command_SpawnTurret(int client, int args) { float pos[3]; GetClientEyePosition(client, pos); int base = CreateParticleNamed(ENT_PORTAL_NAME, PARTICLE_ELMOS, pos, NULL_VECTOR); - SetupTurret(base); - ReplyToCommand(client, "Created turret"); + SetupTurret(base, TURRET_ACTIVATION_TIME); + ReplyToCommand(client, "New turret (%d) will activate in %.0f seconds", base, TURRET_ACTIVATION_TIME); + return Plugin_Handled; +} + +public Action Command_ManualTarget(int client, int args) { + if(manualTargetter == client) { + manualTargetter = 0; + ReplyToCommand(client, "No longer manually targetting"); + return Plugin_Handled; + } else if(manualTargetter > 0) { + ReplyToCommand(manualTargetter, "%N is now manually targetting", client); + } + manualTargetter = client; + ReplyToCommand(client, "Now manually targetting"); return Plugin_Handled; } @@ -271,7 +312,7 @@ public Action Command_RemoveTurrets(int client, int args) { } public Action Timer_Think(Handle h) { - if(turretCount == 0) return Plugin_Continue; + if(turretCount == 0 || manualTargetter > 0) return Plugin_Continue; // Probably better to just store from CreateParticle static int entity = INVALID_ENT_REFERENCE; // static char targetname[32]; @@ -289,7 +330,7 @@ public Action Timer_Think(Handle h) { if(target > 0 && IsValidEntity(target)) { bool ragdoll = GetEntProp(target, Prop_Data, "m_bClientSideRagdoll") == 1; if(!ragdoll && CanSeeEntity(pos, target)) { - FireTurret(pos, target, turretDamage[entity]); + FireTurretAuto(pos, target, turretDamage[entity]); continue; } entityActiveTurret[target] = 0; @@ -297,16 +338,15 @@ public Action Timer_Think(Handle h) { DeactivateTurret(entity); turretState[entity] = Turret_Idle; } - /*int particle = EntRefToEntIndex(turretActivatorParticle[entity]); - if(IsValidEntity(particle)) { - AcceptEntityInput(particle, "Kill"); - turretActivatorParticle[entity] = 0; - }*/ + // Skip activation if a survivor is too close + if(FindNearestClient(TEAM_SURVIVORS, pos, TURRET_MAX_RANGE_HUMANS_OPTIMIZED) > 0) { + continue; + } 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 = FindNearestVisibleSpecial(pos, TURRET_MAX_RANGE_SPECIALS_OPTIMIZED); + if(target == -1) target = FindNearestClient(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; @@ -314,9 +354,10 @@ public Action Timer_Think(Handle h) { turretActiveEntity[entity] = EntIndexToEntRef(target); turretActivatorParticle[entity] = EntIndexToEntRef(CreateParticleNamed("turret_activate", PARTICLE_TES1, pos, NULL_VECTOR)); // AcceptEntityInput(turretActivatorParticle[entity], "Start"); - FireTurret(pos, target, turretDamage[entity]); + FireTurretAuto(pos, target, turretDamage[entity]); turretState[entity] = Turret_Active; } + // Optimization incase there's multiple info_particle_system if(++count > turretCount) { count = 0; break; @@ -330,29 +371,23 @@ public Action Timer_Think(Handle h) { static float TURRET_LASER_COLOR[3] = { 0.0, 255.0, 255.0 }; -void FireTurret(const float origin[3], int target, float damage = 105.0) { - int laser = CreateLaser(origin, target, TURRET_LASER_COLOR, damage, 1.0, 0.2); +void FireTurretAuto(const float origin[3], int targetEntity, float damage = 105.0) { + int laser = CreateLaserAuto(origin, targetEntity, TURRET_LASER_COLOR, damage, 1.0, 0.2); EmitSoundToAll(SOUND_LASER_FIRE, laser, SNDCHAN_WEAPON, .flags = SND_CHANGEPITCH, .pitch = 150); turretIsActiveLaser[laser] = true; } -stock int CreateLaser(const float origin[3], int targetEnt, float color[3], float damage = 0.0, float width, float duration = 5.0) { +void FireTurret(const float origin[3], const char[] targetName, float damage = 105.0, bool emitSound = true) { + int laser = CreateLaser(origin, targetName, TURRET_LASER_COLOR, damage, 1.0, 0.2); + if(emitSound) + EmitSoundToAll(SOUND_LASER_FIRE, laser, SNDCHAN_WEAPON, .flags = SND_CHANGEPITCH, .pitch = 150); + turretIsActiveLaser[laser] = true; +} + +stock int CreateLaser(const float origin[3], const char[] targetName, float color[3], float damage, float width, float duration) { int laser = CreateEntityByName("env_laser"); - DataPack pack; - CreateDataTimer(duration, Timer_ClearEnts, pack); if(laser > 0) { DispatchKeyValue(laser, "targetname", "sm_laser"); - - static char targetName[32]; - Format(targetName, sizeof(targetName), "laser_target_%d", targetEnt); - - static float pos[3]; - GetEntPropVector(targetEnt, Prop_Send, "m_vecOrigin", pos); - pos[2] += 40.0; - int target = CreateTarget(pos, targetName); - SetParent(target, targetEnt); - pack.WriteCell(target); - DispatchKeyValue(laser, "LaserTarget", targetName); DispatchKeyValue(laser, "spawnflags", "1"); DispatchKeyValue(laser, "dissolvetype", "2"); @@ -367,62 +402,71 @@ stock int CreateLaser(const float origin[3], int targetEnt, float color[3], floa DispatchSpawn(laser); - pack.WriteCell(laser); + if(duration > 0) + CreateTimer(duration, Timer_Kill, laser); } return laser; } -int CreateTarget(const float origin[3], const char[] targetName) { +// Creates a beam from beginTarget to endTarget. If target name starts with NUL, then will not be set. See env_beam on wiki +stock int CreateBeam(const char[] beginTarget, const float center[3], const char[] endTarget, float color[3], float damage, float width, float duration) { + int laser = CreateEntityByName("env_beam"); + if(laser > 0) { + DispatchKeyValue(laser, "targetname", "sm_laserbeam"); + if(beginTarget[0] != '\0') + DispatchKeyValue(laser, "LightningStart", beginTarget); + if(endTarget[0] != '\0') + DispatchKeyValue(laser, "LightningEnd", endTarget); + DispatchKeyValue(laser, "spawnflags", "1"); + DispatchKeyValue(laser, "dissolvetype", "2"); + DispatchKeyValue(laser, "NoiseAmplitude", "1"); + DispatchKeyValueFloat(laser, "damage", damage); + DispatchKeyValueFloat(laser, "life", duration); + DispatchKeyValueVector(laser, "rendercolor", color); + DispatchKeyValue(laser, "texture", "sprites/laserbeam.spr"); + + TeleportEntity(laser, center); + DispatchKeyValueFloat(laser, "BoltWidth", width); + + DispatchSpawn(laser); + + if(duration > 0) + CreateTimer(duration, Timer_Kill, laser); + } + return laser; +} + + +stock int CreateLaserAuto(const float origin[3], int targetEnt, float color[3], float damage = 0.0, float width, float duration = 5.0, bool createInfoTarget = true) { + static char targetName[32]; + Format(targetName, sizeof(targetName), "laser_target_%d", targetEnt); + + static float pos[3]; + GetEntPropVector(targetEnt, Prop_Send, "m_vecOrigin", pos); + pos[2] += 40.0; + int target = CreateTarget(pos, targetName, duration); + SetParent(target, targetEnt); + + return CreateLaser(origin, targetName, color, damage, width, duration); +} + +int CreateTarget(const float origin[3], const char[] targetName, float duration = 0.0) { int target = CreateEntityByName("info_target"); DispatchKeyValue(target, "targetname", targetName); TeleportEntity(target, origin, NULL_VECTOR, NULL_VECTOR); DispatchSpawn(target); + if(duration > 0.0) { + CreateTimer(duration, Timer_Kill, target); + } return target; } -public Action Timer_ClearEnts(Handle h, DataPack pack) { - pack.Reset(); - while(pack.IsReadable()) { - int ent = pack.ReadCell(); - if(IsValidEntity(ent)) { - AcceptEntityInput(ent, "Kill"); - } - turretIsActiveLaser[ent] = false; - } - return Plugin_Handled; -} - -public void SetEntitySelfDestruct(int entity, float duration) { - char output[64]; - Format(output, sizeof(output), "OnUser1 !self:kill::%.1f:1", duration); - SetVariantString(output); - AcceptEntityInput(entity, "AddOutput"); - AcceptEntityInput(entity, "FireUser1"); -} - -stock int FindNearestSurvivor(const float origin[3], float maxRange = 0.0) { +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) == 2 && IsPlayerAlive(i)) { - GetClientAbsOrigin(i, pos); - float distance = GetVectorDistance(origin, pos); - if(maxRange > 0.0 && distance > maxRange) continue; - if(client == -1 || distance <= closestDist) { - client = i; - closestDist = distance; - } - } - } - return client; -} - -stock int FindNearestSpecial(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) == 3 && !pendingDeletion[i]) { + if(IsClientConnected(i) && IsClientInGame(i) && GetClientTeam(i) == team && !pendingDeletion[i]) { GetClientAbsOrigin(i, pos); float distance = GetVectorDistance(origin, pos); if(maxRange > 0.0 && distance > maxRange) continue; @@ -518,23 +562,17 @@ public void OnMapStart() { } -stock int CreateParticleNamed(const char[] targetname, const char[] sParticle, const float vPos[3], const float vAng[3], int client = 0) -{ +stock int CreateParticleNamed(const char[] targetname, const char[] sParticle, const float vPos[3], const float vAng[3], int parent = 0) { int entity = CreateEntityByName("info_particle_system"); - - if( entity != -1 ) - { + if( entity != -1 ) { DispatchKeyValue(entity, "effect_name", sParticle); DispatchKeyValue(entity, "targetname", targetname); DispatchSpawn(entity); ActivateEntity(entity); AcceptEntityInput(entity, "start"); - if( client ) - { - // Attach to survivor - SetVariantString("!activator"); - AcceptEntityInput(entity, "SetParent", client); + if(parent){ + SetParent(entity, parent); } TeleportEntity(entity, vPos, vAng, NULL_VECTOR); @@ -557,11 +595,74 @@ stock int CreateParticleNamed(const char[] targetname, const char[] sParticle, c return entity; } - - return 0; + return -1; } stock void SetParent(int child, int parent) { SetVariantString("!activator"); AcceptEntityInput(child, "SetParent", parent); +} + +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; +} + + +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]; + 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); + if(!IsValidEntity(manualTarget)) manualTarget = CreateTarget(ang, MANUAL_TARGETNAME); + 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); + } + TeleportEntity(manualTarget, ang, NULL_VECTOR, NULL_VECTOR); + + if(buttons & IN_ATTACK) { + PhysicsExplode(ang, 10, 20.0, true); + TE_SetupExplodeForce(ang, 20.0, 10.0); + } + + int entity = INVALID_ENT_REFERENCE; + while ((entity = FindEntityByClassname(entity, "info_particle_system")) != INVALID_ENT_REFERENCE) { + if(view_as(turretState[entity]) > 0) { + GetEntPropVector(entity, Prop_Send, "m_vecOrigin", pos); + 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); + } + } + } + buttons &= ~IN_ATTACK; + SetEntPropFloat(client, Prop_Send, "m_flNextAttack", GetGameTime() + 1.0); + return Plugin_Changed; + } + return Plugin_Continue; +} + +public Action Timer_Kill(Handle h, int target) { + if(IsValidEntity(target)) + AcceptEntityInput(target, "Kill"); + return Plugin_Handled; +} + +stock void GetHorizontalPositionFromOrigin(const float pos[3], const float ang[3], float units, float finalPosition[3]) { + float theta = DegToRad(ang[1]); + finalPosition[0] = units * Cosine(theta) + pos[0]; + finalPosition[1] = units * Sine(theta) + pos[1]; + finalPosition[2] = pos[2]; } \ No newline at end of file