function Server:Start() Server.RegisterCustomSound("test.mp3") -- обязательно делать такую регистрацию звука если используем в коде звуки end ——— ServerSendNetLib.PlaySound("test.wav") -- всем игрокам проигрывает звук ServerSendNetLib.PlaySound(peer, "test.wav") -- лишь одному нужному игроку проигрывает звук ServerSendNetLib.PlayerVfxRpc(peer.Player.Id, "test.mp3") -- это способ воспроизведение звука на игроке которую услышат другие игроки entity = peer.Player.NetworkEntityPlayer -- способ привязки к игроку player = peer.Player -- другой способ привязки ServerSendNetLib.EventMessage(peer, "", "Ивент", 3, Color32(0, 153, 0, 255), Color32(255, 255, 0, 255), "", 711, 99999, 0, -200, 350, 100, 0, 31 ) -- ивент который покажется лишь одному нужному игроку на экране. ServerSendNetLib.EventMessage( "", "Ивент", 3, Color32(0, 153, 0, 255), Color32(255, 255, 0, 255), "", 711, 99999, 0, -200, 350, 100, 0, 31 ) -- ивент без peer, которая показывает ивент на экране всем игрокам. ServerSendNetLib.EventMessage(peer, "", "Ивент", 3, Color32(0, 153, 0, 255), Color32(255, 255, 0, 255), "", 711 -- это айди ивента, 99999 -- длительность ивента в секундах, 0 -- влево/вправо координаты, -200 -- вверх вниз координаты, 350, 100, 0, 31 -- размер ивента ) -- инструкция ServerSendNetLib.EventMessage(peer, "", "Ивент!", 0, Color32(255, 255, 0, 255), Color32(255, 0, 0, 255), "", 0, 3) -- ивент которую покажет в чате лишь одному нужному игроку. ServerSendNetLib.EventMessage("", "Ивент!", 0, Color32(255, 255, 0, 255), Color32(255, 0, 0, 255), "", 0, 3) -- ивент которую покажет в чате всем. ——— кулдаун создание: local cooldowns = {} local function CheckCooldown(key, seconds) local now = os.time() local last = cooldowns[key] or 0 if now - last < seconds then return false, seconds - (now - last) end cooldowns[key] = now return true, 0 end ——— расстояние между точками: local function GetDistance(pos1, pos2) local dx = pos1.x - pos2.x local dy = pos1.y - pos2.y local dz = pos1.z - pos2.z return math.sqrt(dx*dx + dy*dy + dz*dz) end ——— нормализация вектора: local function Normalize(x, z) local m = math.sqrt(x*x + z*z) if m < 0.0001 then return 0, 1 end return x/m, z/m end ——— entity.KnifeWeapon.SetWeaponModel(entity, 41) -- установка модели ножей ID ножей: 0 - классический 32 - гравитации 33 - скорости 34 - катана 35 - топор 41 - обычный зомби 42 - призрак 43 - курильщик 44 - прыгун 45 - мумия 46 - крик 47 - сильный 48 - рой 51 - вип зомби 52 - вип нож ——— if entity:get_CharacterModelType() ~= 14 then -- проверка какая модель у игрока, к примеру есть ли модель (14) сами модели: sas — 0 gsg9 — 1 gsg9-admin — 2 gign — 3 sas_custom — 4 elite_arctic — 5 leet — 6 leet_pirate — 7 professional — 8 zombie_classic — 9 zombie ghost — 10 zombie_smoker — 11 zombie_jumper — 12 zombie_mummy — 13 zombie_scream — 14 zombie_strong — 15 zomble_swarm — 16 zombie_nemesis — 17 zombie_assassin — 18 survivor — 19 zombie mauler — 20 ——— peer = Server.playerSessions[i] -- Получить игрока по индексу (1-16) peer.Player -- Доступ к объекту игрока peer.Player.Id -- ID игрока peer.Player.username -- Ник игрока peer.Player.password -- Пароль игрока peer.Player.AccessFlags -- Флаги доступа (привилегии) if peer.Player.Money < 10000 then -- проверка достаточно ли денег у игрока. peer.Payer.Money = peer.Player.Money - 10000 -- снимает с игрока -10000 денег peer.Payer.Money = peer.Player.Money + 10000 -- дает игроку +10000 денег entity:SignificantMoneyChange(1, true) -- дает игроку + 1 денег ——— bit32.band(peer.Player.AccessFlags, ЧИСЛО) == ЧИСЛО -- Проверка флага -- Основные флаги привилегий: 524288 -- Deluxe (самый высокий) 262144 -- Premium 1048576 -- Vip+ (самый низкий) -- Другие флаги: 512 -- Саймон (CT) 2 -- Админ 1024 -- Дополнительный флаг if bit32.band(peer.Player.AccessFlags, 262144) == 262144 then -- проверка флаг доступа для премиум ——— local color = Color32(0, 255, 0, 100) -- "0" это красный цвет, "255" это зеленый, "0" это синий, "100" это прозрачность всех 3 видов цвета ServerSendNetLib.EnvFade(peer, 3, 0.3, color, false) -- сама подсветка экрана "3" это скорость, "0.3" это длительность подсветки в секундах. ——— function Server:OnRconCommand(peer, command) if command == "/test" then -- срабатывание при команде /test ——— function Server:Start() -- сервер запущен function Server:Stop() -- сервер остановился function Server:OnPlayerChangedTeam() -- срабатывание при смене команды function Server:OnPlayerJoined() -- срабатывание при входе игрока. function Server:OnPlayerDied() -- срабатывание при смерти игрока. function Server:OnPlayerLeft() -- срабатывание при выходе игрока. function Server:OnPlayerRevived() -- срабатывание при возрождении игрока. function Server:Start() -- Сервер запущен function Server:Stop() -- Сервер остановлен function Server:RoomStateChanged(newState) -- Изменилось состояние игры function Server:OnRconCommand(peer, command) -- Введена команда function Server:OnChatMessage(peer, message) -- Написано в чат ——— math.random(1, 10) -- Случайное число от 1 до 10 math.floor(число) -- Округление вниз math.ceil(число) -- Округление вверх math.sqrt(число) -- Квадратный корень math.abs(число) -- Модуль числа os.time() -- Текущее время в секундах os.clock() -- Текущее время с высокой точностью ——— if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 8) ~= 8 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.bor(peer.Player.NetworkEntityPlayer.clientFlags, 8) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.bor( peer.Player.NetworkEntityPlayer.localStateFlags, 8) -- делает заморозку экрана игроку if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 8) == 8 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, bit32.bnot(8)) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.band( peer.Player.NetworkEntityPlayer.localStateFlags, bit32.bnot(8)) -- преращает заморожку экрана игроку if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 2048) ~= 2048 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.bor(peer.Player.NetworkEntityPlayer.clientFlags, 2048) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.bor( peer.Player.NetworkEntityPlayer.localStateFlags, 2048) -- делает синий эффект заморозки самому игроку if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 2048) == 2048 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, bit32.bnot(2048)) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.band( peer.Player.NetworkEntityPlayer.localStateFlags, bit32.bnot(2048)) -- забирает синий эффект заморозки у игрока if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 4) ~= 4 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.bor(peer.Player.NetworkEntityPlayer.clientFlags, 4) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.bor( peer.Player.NetworkEntityPlayer.localStateFlags, 4) -- делает поджигающий экран игроку if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 4) == 4 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, bit32.bnot(4)) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.band( peer.Player.NetworkEntityPlayer.localStateFlags, bit32.bnot(4)) -- забирает поджигающий экран у игрока if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 1024) ~= 1024 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.bor(peer.Player.NetworkEntityPlayer.clientFlags, 1024) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.bor( peer.Player.NetworkEntityPlayer.localStateFlags, 1024) -- делает поджигающий эффект самому игроку if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 1024) == 1024 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, bit32.bnot(1024)) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.band( peer.Player.NetworkEntityPlayer.localStateFlags, bit32.bnot(1024)) -- забирает поджигающий эффект у игрока if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 4096) ~= 4096 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.bor(peer.Player.NetworkEntityPlayer.clientFlags, 4096) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.bor( peer.Player.NetworkEntityPlayer.localStateFlags, 4096) -- выдача обычного свечение игроку if bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, 4096) == 4096 then peer.Player.NetworkEntityPlayer.clientFlags = bit32.band(peer.Player.NetworkEntityPlayer.clientFlags, bit32.bnot(4096)) peer.Player.NetworkEntityPlayer.localStateFlags = bit32.band( peer.Player.NetworkEntityPlayer.localStateFlags, bit32.bnot(4096)) -- забрать обычное свечение игрока также вместо "4096" можно и другие варианты: 2 - invisible (прозрачные руки) 4 - (Огонь экран, будто горят руки) 8 - (Синий экран, будто эффект заморозки) 256 - (Бессмертие) 512 - (сама способность делающая невидимым полностью) 1024 - (эффект поджигание игрока "игрок горит но не умирает лишь эффект такой") 2048 - (эффект заморозки игрока "игрок становиться синей но не замораживает это лишь эффект такой") 4096 - (обычное зеленое свечение) ——— <> html фукнции чтобы менять в ивентах стиль текста: — жирный текст — текст нижнего индекса (небольшой текст под базовой линией) — надстрочный текст (небольшой текст над базовой линией) — выделенный текст — зачеркнутый текст — текст курсивом — подчеркнутый текст — текст в верхнем регистре (ЗАГЛАВНЫМИ БУКВАМИ) — текст маленькими прописными буквами (МАЛЫМИ ЗАГЛАВНЫМИ БУКВАМИ) ——— if peer.Player.NetworkEntityPlayer.Terrorist then -- проверка террорист ли. if not peer.Player.NetworkEntityPlayer.Terrorist then -- проверка контр-террорист ли. if peer.Player.NetworkEntityPlayer:get_Dead() then -- проверка мертв ли игрок. ——— local savedPosition = Vector3(0, 0, 0) function SavePosition(peer) -- сохранение позиции игрока. savedPosition = peer.Player.NetworkEntityPlayer.transform.position end function LoadPosition(peer) -- установка позиции игрока. peer.Player.NetworkEntityPlayer.transform.position = savedPosition end ——— peer.Player.get_Money() -- Проверить количество денег игрока. peer.Player.set_Money(30000) -- Установит игроку ровно 30000 денег entity = peer.Player.NetworkEntityPlayer -- Получить физический объект entity.Terrorist -- true = террорист, false = КТ entity:get_Dead() -- true = мертв entity.transform.position -- Позиция игрока (Vector3) entity.transform.forward -- Направление взгляда entity:ButtonState(кнопка) -- Состояние кнопки (10, 11, 2 и т.д.) entity:SignificantMoneyChange(1, true) -- Обновить деньги у игрока entity:get_Hp() -- проверка сколько хп у игрока entity:SetHP(150) -- установка ровно 150 хп игроку, ни больше ни меньше. entity:get_Armor() -- проверка сколько брони у игрока entity:set_Armor(100) -- установка ровно 100 брони игроку, ни больше ни меньше. ——— function Server:Start() if Lua and Lua.Set then Lua.Set("GameManager", "GameServer.GameManager") local gm = GameManager.get_Instance() if not gm then return end local ctParent = gm:get_CTSpawnPointsParent() if not ctParent then return end local childCount = ctParent:get_childCount() if childCount <= 0 then return end for i = 0, childCount - 1 do local spawnPoint = ctParent:GetChild(i) if spawnPoint then local pos = spawnPoint:get_position() if pos then local spawnX = roundToInt(pos.x) local spawnZ = roundToInt(pos.z) if spawnX == 87 and spawnZ == -51 then -- срабатывание если кт спавн равны X Z ——— function Server:RoomStateChanged(roomState) -- срабатывание при румстейт 6, румстейт 6 = матч активен if roomState == 6 then список румстейт: waitingForPlayers=0 -- ожидание игроков warmUp=1 -- разминка после ожидания игроков warmUpEnd=2 -- конец разминки firstMatchStarting=3 -- переход с разминки на матч matchStarting=4 -- матч начнется duelStarting=5 -- дуэль как из кс 1.6 дизранов начнется matchActive=6 -- матч активен duelActive=7 -- дуэль активен matchEnd=8 -- конец матча mapEnd=9 -- конец карты mapVoting=10 -- переход для голосование карт mapVotingEnded=11 -- голосование карт началась ——— function Server:DayModeChanged(dayMode) -- срабатывание при режиме деймод 6, деймод 6 = простая инфекция if dayMode == 6 then список режимов: none=0 -- режим еще не выбран free=1 -- режим для дизран, "без банихоп" buttons=2 -- режим для дизран, "кнопки" rambo=3 -- режим для дизран, "Рэмбо террор" invisible=4 -- режим для дизран, "невидимый террор" snowRun=5 -- режим для дизран, "снежок даётся террору" infection=6 -- режим для зомби, "простая инфекция" multiInfection=7 -- режим для зомби, "мульти-инфекция" nemesis=8 -- режим для зомби, "немезида" assassin=9 -- режим для зомби, "ассассин" survivor=10 -- режим для зомби, "выживший" ——— function Server:Start() Coroutine(function() -- включение короутины при старте сервера if scriptDestroyed then return true end double() if specialDay == -1 then return true end return 0.2 -- каждые 0.2 сек включает фукнцию double(), фукнция Wait(2), не работает в среде моих создании короутин, лишь через строку "return 0.2" работают короутины. end) end function double() for i = 1, 16 do local peer = Server.playerSessions[i] -- плеерсисон это все 16 игроков. if peer ~= nil then peer.Player.NetworkEntityPlayer.Character.RawAllowDoubleJump = true -- дает доступ к дабл джампу всем игрокам end end end ——— Перебор всех игроков: for i = 1, 16 do local peer = Server.playerSessions[i] if peer and peer.Player then -- Работа с игроком end end Найти игрока по Id: local function FindPeerById(playerId) for i = 1, 16 do local p = Server.playerSessions[i] if p and p.Player and p.Player.Id == playerId then return p end end return nil end ——— -- 1. Направление взгляда: local forward = peer.Player.NetworkEntityPlayer.Character.HeadSocket.forward -- 2. Позиция глаз/головы: local eyePos = peer.Player.NetworkEntityPlayer.Character.HeadSocket.position -- 3. Точка перед игроком (расстояние 10): local pointAhead = eyePos + (forward * 10) -- 4. Маска для проверки ВСЕХ коллизий: local allCollisionsMask = Server.InvertFlags(Server.GetIgnoreWallHitLayers(true)) -- 5. Raycast с проверкой всего: local hit = peer.Player.NetworkEntityPlayer.DoRaycast(allCollisionsMask) -- 6. Проверка результата raycast: if hit.transform ~= nil then -- Попал в объект local hitPoint = hit.point else -- Не попал ни во что local maxDistancePoint = eyePos + (forward * 150) end ——— function Server:HandleInputs() -- Получаем игрока по ID (playerId - скорее всего глобальная переменная) peer = Server.playerSessions[playerId + 1] -- Примечание: индексация в Lua начинается с 1, а playerId скорее начинается с 0 -- поэтому +1 if peer == nil then return -- если игрока нет, выходим end HandleInputs(peer) -- вызываем основную функцию обработки ввода end function HandleInputs(peer) -- Получаем игровую сущность игрока (физическое представление в мире) player = peer.Player.NetworkEntityPlayer -- possible button states: 0 - not pressed/held, 1 - pressed, 2 - released, 3 - held -- возможные состояния кнопок: -- 0 - не нажата/не удерживается -- 1 - нажата (только что) -- 2 - отпущена (только что) -- 3 - удерживается (нажата какое-то время) -- 跳 (китайский: "прыжок") -- /help input_flags для возможных входных данных if player.ButtonState(0) == 1 then -- если кнопка 0 (скорее всего прыжок) нажата -- Повторно получаем ссылку на игрока (избыточно, peer уже есть) peer = Server.playerSessions[playerId + 1] if peer ~= nil then -- если игрок существует -- Добавляем вертикальную скорость для прыжка (8 единиц вверх по оси Y) peer.Player.NetworkEntityPlayer.LatestAdditiveVelocity = peer.Player.NetworkEntityPlayer.LatestAdditiveVelocity + Vector3(0,8,0) -- Умножаем предыдущую аддитивную скорость на 99 (усиление/инерция) peer.Player.NetworkEntityPlayer.PrevAdditiveVelocity = peer.Player.NetworkEntityPlayer.PrevAdditiveVelocity * 99 -- Умножаем последнюю аддитивную скорость на 99 peer.Player.NetworkEntityPlayer.LatestAdditiveVelocity = peer.Player.NetworkEntityPlayer.LatestAdditiveVelocity * 99 -- Умножаем накопленную аддитивную скорость на 99 peer.Player.NetworkEntityPlayer.AccumulatedAdditiveVelocity = peer.Player.NetworkEntityPlayer.AccumulatedAdditiveVelocity * 99 -- Умножаем количество накопленной скорости на 99 peer.Player.NetworkEntityPlayer.AccumulatedVelocityAmount = peer.Player.NetworkEntityPlayer.AccumulatedVelocityAmount * 99 -- Примечание: умножение на 99 дает эффект "супер-скорости" или "инерции" end end -- ("приседание") if player.ButtonState(1) == 1 then -- (кнопка: приседание нажата) -- Пусто - нет обработки end -- ("приседание") if player.ButtonState(1) == 3 then -- (кнопка: приседание зажата) -- Пусто - нет обработки end -- ("атака/стрельба") if player.ButtonState(2) == 1 then -- (кнопка: атака нажата) -- Пусто - нет обработки end -- ("атака/стрельба") if player.ButtonState(2) == 3 then -- (кнопка: атака зажата) -- Пусто - нет обработки end -- attack released (английский: "атака отпущена") if player.ButtonState(2) == 2 then -- кнопка атаки отпущена -- Пусто - нет обработки end -- ("перебор каждого ввода") -- Перебираем все возможные кнопки (0-31) for i = 0,31 do -- Получаем состояние текущей кнопки state = player.ButtonState(i) -- ("кнопка нажата") -- Ошибка в синтаксисе: elseif без if if state == 1 then -- если кнопка нажата -- Пусто - нет обработки end -- здесь должен быть end для if -- Ошибка: elseif без соответствующего if elseif state == 2 then -- если кнопка отпущена -- Пусто - нет обработки end end end -- проверка находиться ли игрок на земле. ( не летит ли) local grounded = false local character = entity:get_Character() if character and character.IsGrounded ~= nil then grounded = character.IsGrounded end ————— peer.Player.AccessFlags = bit32.band(peer.Player.AccessFlags, bit32.bnot(256)) -- забрать флаги 256 у игрока peer.Player.AccessFlags = bit32.bor(peer.Player.AccessFlags, 256) -- дать флаги 256 игроку ——— пример готового кода: local scriptDestroyed = false local activeRoomState = 0 local cooldowns = {} function Server:Start() Server.RegisterCustomSound("sound.wav") Coroutine(function() while true do if scriptDestroyed then return true end if activeRoomState == 6 then -- Твой код end return 0.05 end end) end function Server:RoomStateChanged(newState) activeRoomState = newState end function Server:OnRconCommand(peer, command) if command == "/test" then if activeRoomState ~= 6 then -- Сообщение об ошибке return true end local entity = peer.Player.NetworkEntityPlayer if entity:get_Dead() then return true end -- Проверка флага if bit32.band(peer.Player.AccessFlags, 524288) == 524288 then -- Действие для Deluxe end return true end return false end function Server:Stop() scriptDestroyed = true end