142 lines
4.0 KiB
Lua
142 lines
4.0 KiB
Lua
-- d:\ft 4.0\VnU\garrysmod\gamemodes\militaryrp\plugins\killzone\sv_plugin.lua
|
|
|
|
local PLUGIN = PLUGIN
|
|
|
|
PLUGIN.camperTimers = PLUGIN.camperTimers or {}
|
|
|
|
local function IsInKillzone(pos)
|
|
for _, zone in pairs(PLUGIN.zones) do
|
|
if (pos:WithinAABox(zone.min, zone.max)) then
|
|
return true, zone.name
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function PLUGIN:TickKillzoneChecks()
|
|
local punishDelay = ix.config.Get("killzonePunishDelay", 300)
|
|
local currentTime = CurTime()
|
|
|
|
for _, ply in ipairs(player.GetAll()) do
|
|
if (!IsValid(ply) or !ply:Alive() or !ply:GetCharacter() or (ply.IsAdminMode and ply:IsAdminMode())) then
|
|
if (self.camperTimers[ply]) then
|
|
self.camperTimers[ply] = nil
|
|
end
|
|
continue
|
|
end
|
|
|
|
local target = ply
|
|
local pos = ply:GetPos()
|
|
|
|
-- Проверка LVS / Техники
|
|
local veh = ply:GetVehicle()
|
|
if (IsValid(veh)) then
|
|
-- Для LVS ищем корень всей конструкции
|
|
local root = veh
|
|
if (veh.GetBaseEntity and IsValid(veh:GetBaseEntity())) then
|
|
root = veh:GetBaseEntity()
|
|
elseif (IsValid(veh:GetParent())) then
|
|
root = veh:GetParent()
|
|
end
|
|
target = root
|
|
pos = target:GetPos()
|
|
end
|
|
|
|
local inZone, zoneName = IsInKillzone(pos)
|
|
|
|
if (inZone) then
|
|
if (!self.camperTimers[target]) then
|
|
self.camperTimers[target] = currentTime
|
|
print("[Killzone] " .. ply:Name() .. " вошел в " .. zoneName)
|
|
else
|
|
local timeInZone = currentTime - self.camperTimers[target]
|
|
|
|
if (timeInZone >= punishDelay) then
|
|
self:PunishTarget(target, ply)
|
|
end
|
|
end
|
|
else
|
|
if (self.camperTimers[target]) then
|
|
print("[Killzone] " .. ply:Name() .. " покинул киллзону.")
|
|
end
|
|
self.camperTimers[target] = nil
|
|
end
|
|
end
|
|
end
|
|
|
|
function PLUGIN:PunishTarget(ent, ply)
|
|
if (!ent.nextKillzoneBomb or ent.nextKillzoneBomb <= CurTime()) then
|
|
ent.nextKillzoneBomb = CurTime() + 5
|
|
|
|
local targetPos = ent:GetPos()
|
|
|
|
-- Создаем "свист" падающей бомбы только для игрока
|
|
if (IsValid(ply)) then
|
|
ply:EmitSound("ambient/levels/canals/headcrab_canister_ambient.wav", 100, 100)
|
|
end
|
|
|
|
-- Небольшая задержка перед ударом
|
|
timer.Simple(0.5, function()
|
|
if (!IsValid(ent)) then return end
|
|
local currentPos = ent:GetPos()
|
|
|
|
-- Создаем мощный взрыв
|
|
local explosion = ents.Create("env_explosion")
|
|
if (IsValid(explosion)) then
|
|
explosion:SetPos(currentPos)
|
|
explosion:SetOwner(ent)
|
|
explosion:SetKeyValue("iMagnitude", "500")
|
|
explosion:SetKeyValue("iRadiusOverride", "300")
|
|
explosion:Spawn()
|
|
explosion:Fire("Explode", 0, 0)
|
|
end
|
|
|
|
-- Эффект взрыва
|
|
local effectData = EffectData()
|
|
effectData:SetOrigin(currentPos)
|
|
util.Effect("Explosion", effectData)
|
|
|
|
-- Наносим урон игроку (если это игрок)
|
|
if (IsValid(ply) and ply:Alive()) then
|
|
local dmg = DamageInfo()
|
|
dmg:SetDamage(1000)
|
|
dmg:SetDamageType(DMG_BLAST)
|
|
dmg:SetAttacker(game.GetWorld())
|
|
dmg:SetInflictor(game.GetWorld())
|
|
ply:TakeDamageInfo(dmg)
|
|
end
|
|
|
|
-- Если это техника, наносим ей урон отдельно
|
|
if (ent != ply and IsValid(ent)) then
|
|
local dmg = DamageInfo()
|
|
dmg:SetDamage(5000)
|
|
dmg:SetDamageType(DMG_BLAST)
|
|
dmg:SetAttacker(game.GetWorld())
|
|
dmg:SetInflictor(game.GetWorld())
|
|
ent:TakeDamageInfo(dmg)
|
|
end
|
|
|
|
print("[Killzone] Наказание применено к " .. (IsValid(ply) and ply:Name() or ent:GetClass()))
|
|
end)
|
|
end
|
|
end
|
|
|
|
-- Запуск таймера при загрузке плагина
|
|
if (timer.Exists("ixKillzoneTimer")) then
|
|
timer.Remove("ixKillzoneTimer")
|
|
end
|
|
|
|
timer.Create("ixKillzoneTimer", 1, 0, function()
|
|
if (PLUGIN) then
|
|
PLUGIN:TickKillzoneChecks()
|
|
end
|
|
end)
|
|
|
|
function PLUGIN:OnLoaded()
|
|
-- Дублируем на случай перезагрузки плагина
|
|
if (timer.Exists("ixKillzoneTimer")) then timer.Remove("ixKillzoneTimer") end
|
|
timer.Create("ixKillzoneTimer", 1, 0, function()
|
|
self:TickKillzoneChecks()
|
|
end)
|
|
end
|