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