Files
VnUtest/garrysmod/gamemodes/militaryrp/plugins/events_system/sh_plugin.lua
2026-03-31 10:27:04 +03:00

213 lines
6.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local PLUGIN = PLUGIN
PLUGIN.name = "Система Ивентов"
PLUGIN.author = "Scripty & RefoselTeamWork"
PLUGIN.description = "Продвинутая система ивентов с сужающейся зоной и кастомными спавнами."
ix.config.Add("eventAllowedRanks", "superadmin,curator,ivent", "Ранги, которым разрешено управление ивентами (через запятую).", nil, {
category = "Events"
})
-- Shared Config (ported from sh_config.lua)
PLUGIN.Config = {
sounds = {
event_start = "ambient/alarms/klaxon1.wav",
event_end = "ambient/levels/citadel/citadel_hit.wav",
player_join = "buttons/button15.wav"
}
}
ix.util.Include("sv_plugin.lua")
ix.util.Include("sv_doomsday.lua")
ix.util.Include("cl_plugin.lua")
ix.util.Include("cl_doomsday.lua")
-- Commands Adaptation
ix.command.Add("EventStart", {
description = "Запустить стандартный боевой ивент.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
if (PLUGIN.active) then
return "Ивент уже активен!"
end
PLUGIN:StartEvent(client)
return "Запуск ивента..."
end
})
ix.command.Add("EventStop", {
description = "Остановить текущий активный ивент.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
if (!PLUGIN.active) then
return "Нет активного ивента для остановки!"
end
PLUGIN:EndEvent(client)
return "Остановка ивента..."
end
})
ix.command.Add("EventOtkat", {
description = "Отменить активный ивент с уведомлением.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
if (!PLUGIN.active) then
return "Нет активного ивента для отмены!"
end
PLUGIN:EndEvent(client, true)
return "Отмена ивента..."
end
})
ix.command.Add("EventJoin", {
description = "Присоединиться к активному ивенту.",
OnRun = function(self, client)
if (!PLUGIN.active) then
return "Нет активного ивента для входа."
end
if (PLUGIN.participants[client:SteamID()]) then
return "Вы уже участвуете!"
end
PLUGIN:AddParticipant(client)
local participants_count = table.Count(PLUGIN.participants)
PLUGIN:BroadcastMessage(string.format("%s присоединился к ивенту! Участников: %d", client:Nick(), participants_count))
end
})
ix.command.Add("EventAddAll", {
description = "Добавить всех игроков онлайн в ивент.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
if (!PLUGIN.active) then
return "Ивент не активен!"
end
PLUGIN:AddAllPlayers(client)
end
})
ix.command.Add("EventSetZone1", {
description = "Установить первую точку зоны ивента.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
PLUGIN:SetZonePoint1(client)
end
})
ix.command.Add("EventSetZone2", {
description = "Установить вторую точку зоны ивента.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
PLUGIN:SetZonePoint2(client)
end
})
ix.command.Add("EventClearZone", {
description = "Очистить зону ивента.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
PLUGIN:ClearZone(client)
end
})
ix.command.Add("EventZoneStart", {
description = "Начать сужение зоны ивента.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
PLUGIN:StartZoneShrinking(client)
end
})
ix.command.Add("EventZoneStop", {
description = "Остановить сужение зоны ивента.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
PLUGIN:StopZoneShrinking(client)
end
})
-- Temporary Spawns Commands
ix.command.Add("EventSpawnAdd", {
description = "Добавить временный спавн для фракции или spec_def.",
privilege = "Manage Events",
adminOnly = true,
arguments = {
ix.type.string, -- Faction Name
bit.bor(ix.type.number, ix.type.optional) -- spec_def
},
OnRun = function(self, client, factionName, specDef)
local faction = ix.faction.teams[factionName]
if (!faction) then
-- Try fuzzy match
for _, v in pairs(ix.faction.indices) do
if (ix.util.StringMatches(v.name, factionName) or ix.util.StringMatches(v.uniqueID, factionName)) then
faction = v
break
end
end
end
if (!faction) then
return "Некорректное название фракции!"
end
PLUGIN:AddTempSpawn(faction.uniqueID, specDef, client:GetPos(), client:GetAngles())
local msg = "Временный спавн добавлен для фракции: " .. faction.name
if (specDef) then
msg = msg .. " (spec_def: " .. specDef .. ")"
end
return msg
end
})
ix.command.Add("EventSpawnRemove", {
description = "Удалить временные спавны ивента в радиусе.",
privilege = "Manage Events",
adminOnly = true,
arguments = {
bit.bor(ix.type.number, ix.type.optional) -- Radius
},
OnRun = function(self, client, radius)
radius = radius or 120
local count = PLUGIN:RemoveTempSpawns(client:GetPos(), radius)
return "Удалено " .. count .. " временных спавнов."
end
})
-- Doomsday Commands
ix.command.Add("DoomsdayStart", {
description = "Запустить ивент Судная Ночь.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
if (DoomsdayNight.active) then
return "Судная Ночь уже активна!"
end
DoomsdayNight:StartEvent(client)
end
})
ix.command.Add("DoomsdayStop", {
description = "Остановить ивент Судная Ночь.",
privilege = "Manage Events",
adminOnly = true,
OnRun = function(self, client)
if (!DoomsdayNight.active) then
return "Судная Ночь не активна!"
end
DoomsdayNight:EndEvent(client, true)
end
})