PLUGIN.name = "LeyHitReg"
PLUGIN.author = "Ley (Портирован для Helix)"
PLUGIN.description = "Улучшенная система регистрации попаданий для точной стрельбы"

-- Конфигурация системы
LeyHitreg = LeyHitreg or {}

-- Настройки через ix.config
ix.config.Add("leyHitregEnabled", true, "Включить систему улучшенной регистрации попаданий", nil, {
	category = "LeyHitReg"
})

ix.config.Add("leyHitregShotDirForceDisabled", false, "Принудительно отключить направление выстрела (для тестирования проблемных SWEP баз)", nil, {
	category = "LeyHitReg"
})

ix.config.Add("leyHitregDisableSecurityChecks", false, "Отключить проверки безопасности выстрелов", nil, {
	category = "LeyHitReg"
})

ix.config.Add("leyHitregIgnoreCanNextPrimaryAttack", true, "Игнорировать задержку между выстрелами (рекомендуется)", nil, {
	category = "LeyHitReg"
})

ix.config.Add("leyHitregNoSpread", false, "[DEBUG] Включить режим без разброса для всех", nil, {
	category = "LeyHitReg - Debug"
})

ix.config.Add("leyHitregShowActualHit", false, "[DEBUG] Показывать где на самом деле попала пуля (без разброса)", nil, {
	category = "LeyHitReg - Debug"
})

ix.config.Add("leyHitregShowSpreadedHit", false, "[DEBUG] Показывать где на самом деле попала пуля (с разбросом)", nil, {
	category = "LeyHitReg - Debug"
})

ix.config.Add("leyHitregLogFixedBullets", false, "[DEBUG] Логировать количество исправленных пуль", nil, {
	category = "LeyHitReg - Debug"
})

ix.config.Add("leyHitregLogInvalidShots", false, "[DEBUG] Логировать невалидные выстрелы", nil, {
	category = "LeyHitReg - Debug"
})

-- Применяем настройки к LeyHitreg
LeyHitreg.ShotDirForceDisabled = ix.config.Get("leyHitregShotDirForceDisabled", false)
LeyHitreg.DisableSecurityChecks = ix.config.Get("leyHitregDisableSecurityChecks", false)
LeyHitreg.IgnoreCanNextPrimaryAttack = ix.config.Get("leyHitregIgnoreCanNextPrimaryAttack", true)

-- Debug настройки
LeyHitreg.Disabled = not ix.config.Get("leyHitregEnabled", true)
LeyHitreg.DisabledOnlyOnClient = false
LeyHitreg.NoSpread = ix.config.Get("leyHitregNoSpread", false)
LeyHitreg.ShowActualShotHit = ix.config.Get("leyHitregShowActualHit", false)
LeyHitreg.ShowActualShotSpreadedHit = ix.config.Get("leyHitregShowSpreadedHit", false)
LeyHitreg.BrokenDefaultSpread = false
LeyHitreg.LogHitgroupMismatches = false
LeyHitreg.LogFixedBullets = ix.config.Get("leyHitregLogFixedBullets", false)
LeyHitreg.LogInvalidFOV = false
LeyHitreg.LogInvalidShots = ix.config.Get("leyHitregLogInvalidShots", false)
LeyHitreg.BulletAimbot = false
LeyHitreg.LogTargetBone = false
LeyHitreg.HitScanDisabled = false
LeyHitreg.BulletOverwriteDisabled = false
LeyHitreg.AnnounceClientHits = false
LeyHitreg.DisableLagComp = false

if LeyHitreg.Disabled then
	print("[LeyHitReg] Отключен через настройки")
	return
end

-- Отключение конфликтующих систем хитрега
function LeyHitreg:DisableMoatHitreg()
	if MOAT_HITREG then
		MOAT_HITREG.MaxPing = 1
	end

	if ConVarExists("moat_alt_hitreg") then
		RunConsoleCommand("moat_alt_hitreg", "0")
	end

	if SHR then
		if SHR.Config then
			SHR.Config.Enabled = false
			SHR.Config.ClientDefault = 0
		end
		hook.Remove("EntityFireBullets", "SHR.FireBullets")
		hook.Remove("EntityFireBullets", "‍a")
		net.Receivers["shr"] = function() end
	end
end

function PLUGIN:Initialize()
	print("[LeyHitReg] Загрузка системы регистрации попаданий...")
	
	-- Отключаем конфликтующие системы
	LeyHitreg:DisableMoatHitreg()
	
	print("[LeyHitReg] Система загружена!")
end

-- Обновление настроек при изменении конфига
function PLUGIN:OnConfigChanged(key, oldValue, newValue)
	if key == "leyHitregEnabled" then
		LeyHitreg.Disabled = not newValue
		print("[LeyHitReg] Система " .. (newValue and "включена" or "отключена"))
	elseif key == "leyHitregShotDirForceDisabled" then
		LeyHitreg.ShotDirForceDisabled = newValue
	elseif key == "leyHitregDisableSecurityChecks" then
		LeyHitreg.DisableSecurityChecks = newValue
	elseif key == "leyHitregIgnoreCanNextPrimaryAttack" then
		LeyHitreg.IgnoreCanNextPrimaryAttack = newValue
	elseif key == "leyHitregNoSpread" then
		LeyHitreg.NoSpread = newValue
	elseif key == "leyHitregShowActualHit" then
		LeyHitreg.ShowActualShotHit = newValue
	elseif key == "leyHitregShowSpreadedHit" then
		LeyHitreg.ShowActualShotSpreadedHit = newValue
	elseif key == "leyHitregLogFixedBullets" then
		LeyHitreg.LogFixedBullets = newValue
	elseif key == "leyHitregLogInvalidShots" then
		LeyHitreg.LogInvalidShots = newValue
	end
end

-- Загрузка модулей
ix.util.Include("leyhitreg/shared/spreadsystem/bulletspread.lua")
ix.util.Include("leyhitreg/shared/spreadsystem/firebullets.lua")
ix.util.Include("leyhitreg/shared/disablelagcomp/disablelagcomp.lua")
ix.util.Include("leyhitreg/shared/workarounds/workarounds.lua")
ix.util.Include("leyhitreg/shared/workarounds/swepbases.lua")

ix.util.Include("leyhitreg/client/sendshots/sendshots.lua")
ix.util.Include("leyhitreg/client/sendshots/fetchspreads.lua")

ix.util.Include("leyhitreg/server/bulletprocessing/hitscan.lua")
ix.util.Include("leyhitreg/server/bulletprocessing/processbullet.lua")
ix.util.Include("leyhitreg/server/damageinfo/scaledamagehack.lua")
ix.util.Include("leyhitreg/server/damageinfo/fixscaling.lua")
ix.util.Include("leyhitreg/server/receiveshotinfo/receiveshotinfo.lua")
ix.util.Include("leyhitreg/server/receiveshotinfo/shotvalidator.lua")
