Внимание!
Данный код может не работать на сборках sup (нужно тестировать отдельно)
Данный код есть в двух вариациях старый стиль и Новый стиль.
Старый стиль был написан поверх нового стиля, по этому имеет код который есть, но не используется, к примеру имена типа SetNW (Angle ,bool и т.д).
Так же Сам код основан на доработанной мной библиотеки
gBetterNet(Ссылка на Github).
Она не так важна просто немного меняет стиль работы с net.
Данный код изменяет стандартный SetNW основанный на usmg на net.
Стандартный SetNW каждые 10 секунд или изменённое значение, командой: sv_playerforcedupdate, отправляет данные и не важно менялись ли они или нет.
Работает почти как SetNW2, но игрок, получает данные даже вне PVS, эти данные отправляются в сеть 1 раз, а так же синхронизируются с новым подключённым игроком.
Всё это уменьшает нагрузку на сервер, так как ему не надо каждые 10 секунд, отправлять много данных.
Исправляя вот такие приколы (грязновато жёлтый)
Скриншот сделан на Бебраград’е с онлайном, 14 человек.
Новые функции
PLAYER:AddText( ‘Цвет’, ‘Сообщение’ ) – отправляет с sv части цветное сообщение.
Пример:
Цвета желательно сохранить в переменных!
Если используете один и тот же текст сделайте через net с cl стороны.
Player(1):AddText( Color(255,255,255), 'Белый ',Color(255,0,0),'Красный ',Color(0,255,0),'Зелённый ',Color(0,0,255),'Синий')
Получит определённый игрок.
player.AddText( ‘Цвет’, ‘Сообщение’ ) – тоже самое но отправляет всем игрокам.
Новые SetNW
ENTITY:SetNWVar(‘name’,var)
ENTITY:GetNWVar(‘name’,fallback = nil)
– автоматически определяет тип отправляемого значения
– var любой тип string,int,Color,Entity,Table и т.д,
– смотреть разницу Int и Uint
ENTITY:SetNWUInt(‘name’,var)
ENTITY:GetNWUInt(‘name’,fallback = nil)
Приватность SetNW
Работает только если целью указан игрок!
Так же аддон позволяет отправлять данные только одному игроку, пример:
--=Стандарт=-
--Server
Player(1):SetString('password','dfgFfdt')
-- Client - Player(1)
localplayer():GetString('password','none')
-- вернёт dfgFfdt
-- Client - Player(2)
Player(1):GetString('password','none')
-- вернёт dfgFfdt
--=NW System=--
--Server
Player(1):SetString('password','dfgFfdt',true)
-- Client - Player(1)
localplayer():GetString('password','none')
-- вернёт dfgFfdt
-- Client - Player(2)
Player(1):GetString('password','none')
-- вернёт none
Это позволяет проще отправлять кондифициальную информацию.
Работает только если целью указан игрок!
Новый хук
hook.Add('PlayerNWRead','Name',function(pl, id)
-- pl -игрок
-- id - Player(id)
--
end)
запускается когда игрок зашёл на сервер
хук гарантированно передаёт net сообщение
используется как синхронизация NW таблицы.
Разница UInt и Int:
UInt - передаёт значения от 0 до 4294967295.
Int-передаёт значения от -2147483648 до 2147483647
Разница между Старым стилем и Новым:
Старый стиль полностью совместим с аддонами, Новый может ломать некоторые аддоны, так как авторы могут использовать на одном значении разные типы запросов.
Пример:
Entity(1):SetNWBool(‘test’,true)
Entity(1):GetNWInt((‘test’,0)-- получим 1 так как true в бите является 1.
Почему так? Новый стиль создаёт под каждый тип отдельную таблицу, и по этому они не пересекаются.
Так же Есть функция нулить NW значения просто поставте nil
Entity(1):SetNWString(‘Text’,nil)
Внимание!
Личные NW нельзя занулить, после обновлю и будет можно.
Личные NW не синхронизируются но остаются в доступе у игрока и сервера.
Личные NW не в приоритете при получении NW значения.
Установка:
распаковать в папку Addons.
!!_system2.rar (Установка распаковка в garrysmod/addons/)
Данный Код позволяет устанавливать для него свои аддоны.
Да бы не засорять файлами в других каталогах.
!!nw_system\lua\nw_addons
В открытом доступе только старый стиль.
С вас