213 lines
6.8 KiB
Lua
213 lines
6.8 KiB
Lua
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
|
||
})
|