-- 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