local PLUGIN = PLUGIN local groupToConfig = { ["sponsor"] = "killRewardSponsor", ["premium"] = "killRewardPremium", ["vip_plus"] = "killRewardVIPPlus", ["vip"] = "killRewardVIP", ["admin"] = "killRewardAdmin", ["st.admin"] = "killRewardAdmin", ["curator"] = "killRewardAdmin", ["projectteam"] = "killRewardAdmin", ["teh.admin"] = "killRewardAdmin", ["superadmin"] = "killRewardAdmin" } -- Прямой вывод в консоль при загрузке файла для проверки print("[KillRewards] Server-side script loaded successfully!") local function FormatMoney(amount, ply) local amountVal = math.floor(math.abs(amount)) local formatted = tostring(amountVal):reverse():gsub("(%d%d%d)", "%1 "):reverse():gsub("^ ", "") local char = ply:GetCharacter() if (!char) then return formatted end local faction = char:GetFaction() -- Логика из F4 меню (cl_plugin.lua:29-38) if (faction == _G.FACTION_UKRAINE) then return formatted .. " валюты " elseif (faction == _G.FACTION_RUSSIAN) then return formatted .. " валюты " end return formatted end -- Используем PLUGIN:PlayerDeath вместо hook.Add для лучшей интеграции с Helix function PLUGIN:PlayerDeath(victim, inflictor, attacker) if (!IsValid(victim) or !victim:IsPlayer()) then return end local victimChar = victim:GetCharacter() if (!victimChar) then return end -- Штраф за смерть (УДАЛЕНО: теперь штраф списывается в плагине death_screen при нажатии Пробела) --[[ local deathPenalty = ix.config.Get("deathPenalty", 3000) if (deathPenalty > 0) then local money = victimChar:GetMoney() local toTake = math.min(money, deathPenalty) if (toTake > 0) then victimChar:TakeMoney(toTake) victim:NotifyLocalized("deathPenaltyMsg", FormatMoney(toTake, victim)) end end ]] -- Пытаемся найти реального игрока-убийцу local killer = attacker if (IsValid(killer)) then if (killer.GetDriver and IsValid(killer:GetDriver())) then killer = killer:GetDriver() elseif (killer.lvsGetDriver and IsValid(killer:lvsGetDriver())) then killer = killer:lvsGetDriver() elseif (killer:IsVehicle() and killer.GetPassenger and IsValid(killer:GetPassenger(0))) then killer = killer:GetPassenger(0) elseif (IsValid(killer:GetOwner()) and killer:GetOwner():IsPlayer()) then killer = killer:GetOwner() elseif (killer.GetCreator and IsValid(killer:GetCreator()) and killer:GetCreator():IsPlayer()) then killer = killer:GetCreator() end end -- Если убийца не игрок или убил сам себя - выходим if (!IsValid(killer) or !killer:IsPlayer() or killer == victim) then return end local killerChar = killer:GetCharacter() if (!killerChar) then return end -- Отладочная инфа в консоль сервера (безопасное форматирование через tostring) MsgC(Color(0, 255, 0), string.format("[KillRewards] %s (F:%s) killed %s (F:%s)\n", tostring(killer:Nick()), tostring(killerChar:GetFaction()), tostring(victim:Nick()), tostring(victimChar:GetFaction()) )) -- Сравнение фракций. В Helix GetFaction() может возвращать как число, так и строку (internal name) if (tostring(killerChar:GetFaction()) != tostring(victimChar:GetFaction())) then -- НАГРАДА local group = killer:GetUserGroup() local confKey = groupToConfig[group] or "killRewardBase" local reward = ix.config.Get(confKey, 300) killerChar:GiveMoney(reward) killer:NotifyLocalized("killRewardMsg", FormatMoney(reward, killer)) ix.log.Add(killer, "playerKillReward", victim:Nick(), reward) else -- ШТРАФ (FF) local penalty = ix.config.Get("friendlyFirePenalty", 5000) if (penalty > 0) then local money = killerChar:GetMoney() local toTake = math.min(money, penalty) if (toTake > 0) then killerChar:TakeMoney(toTake) killer:NotifyLocalized("killPenaltyMsg", FormatMoney(toTake, killer)) ix.log.Add(killer, "playerKillPenalty", victim:Nick(), toTake) end end end end