Список объектов rage mp

Обновлено: 25.06.2024

Переменные сущностей это пользовательские данные связанные с определенной сущностью (игроком, npc, транспортом и т. п.). Они могут быть локальными или глобальными (доступными для всех клиентов на сервере).

Для работы с ними есть 3 метода:

Entity::getVariable - RAGE Multiplayer Wiki

Entity::setVariable - RAGE Multiplayer Wiki

Events::addDataHandler - RAGE Multiplayer Wiki

Синхронизированные переменные (Synced entity variables)
Синхронизированные переменные сущностей это данные привязанные к сущности глобально и все клиенты могут их прочитать. Синхронизированные переменные могут быть записаны только на стороне сервера, что значит что никто на стороне клиента их не сможет перезаписать.

Предположим вам нужна табличка со списком всех игроков на сервере, которая будет обновляться каждые 3 секунды и будет выводить деньги, пинг, работу и т. п. Чтобы поддерживать актуальность, вам обязательно нужно использовать синхронизированные переменные для отображения обновленных значений, поскольку, например, игрок совершил транзакцию, тогда его денежные средства обновляются на стороне сервера, а затем в таблице данные тоже должны автоматически обновиться локально у каждого клиента.

Пример
Мы сделаем небольшой пример. Выведем деньги игрока в HUD используя синхронизированные переменные.
Сначала настроим серверную часть и API для управления деньгами.
На стороне сервера мы сделаем два обработчика событий которые будут снимать/добавлять деньги игроку и обновлять их значение в синхронизированной переменной cash.


Теперь на стороне клиента сделаем небольшой HUD для вывода количества денег у игрока.

Примечание: addDataHandler срабатывает на всех клиентах когда для любой сущности обновляются ее синхронизированные переменные, это нужно учитывать и в примере выше мы делаем проверку, чтобы обновить данные в hud только у того игрока у которого поменялось значение cash.


Локальные переменные сущностей
Также можно задавать локальные переменные для объекта либо на сервере, либо на клиенте. Такие переменные не синхронизируются и остаются только на той стороне, где они были объявлены.
Например, объявим переменную на сервере

Также если мы объявим подобным образом переменную на одном клиенте, то она будет недоступна на других клиентах и на сервере.


Переменные сущности удаляются вместе с ней, когда объект уже недоступен. Например, когда игрок пере заходит или выходит в сервера.

History is littered with hundreds of conflicts over the future of a community, group, location or business that were "resolved" when one of the parties stepped ahead and destroyed what was there. With the original point of contention destroyed, the debates would fall to the wayside. Archive Team believes that by duplicated condemned data, the conversation and debate can continue, as well as the richness and insight gained by keeping the materials. Our projects have ranged in size from a single volunteer downloading the data to a small-but-critical site, to over 100 volunteers stepping forward to acquire terabytes of user-created data to save for future generations.

This collection contains the output of many Archive Team projects, both ongoing and completed. Thanks to the generous providing of disk space by the Internet Archive, multi-terabyte datasets can be made available, as well as in use by the Wayback Machine, providing a path back to lost websites and work.

Our collection has grown to the point of having sub-collections for the type of data we acquire. If you are seeking to browse the contents of these collections, the Wayback Machine is the best first stop. Otherwise, you are free to dig into the stacks to see what you may find.

The Archive Team Panic Downloads are full pulldowns of currently extant websites, meant to serve as emergency backups for needed sites that are in danger of closing, or which will be missed dearly if suddenly lost due to hard drive crashes or server failures.

В этом уроке напишем с нуля систему секретных пакетов. Подобная система есть во всех играх серии GTA. Идея простая: по карте разбросаны пикапы и когда игрок подбирает их все, то получает какую-то награду.

Видео часть с подробным описанием:

Условия:
- Нужно запоминать какие пакеты уже нашел игрок и при перезаходе их больше уже не показывать ему
- Когда игрок подбирает пакет, нужно показывать ему уведомление в котором будет указано сколько пакетов он уже нашел и сколько их всего
- Когда игрок подбирает все пакеты - выдать награду и соответствующее уведомление

Для начала нам понадобится список координат для пикапов де будут размещаться секретные пакеты. Для урока я взял 4 точки, которые находятся недалеко друг от друга.

При входе игрока на сервер будем отправлять ему этот список

На клиентской стороне будем создавать пикапы по этому списку координат. Кроме пикапа создаем еще и колшейп.

Благодаря наличию колшейпов мы можем определять когда игрок подбирает пикап.
Примечание: Возможно для этого есть более простой способ и без колшейпа, но я честно его не нашел. По логике должен быть event когда игрок подбирает пикап, но на вики ничего нет.

Когда игрок подбираем пикап мы будем отправлять на сервер событие playerCollectedPackage в котором будем передавать id этого пакета.
На сервере мы будем запоминать какие пакеты подобрал игрок, сохранять их в файл. Когда игрок заходит на сервер мы будем загружать список с id найденный пикапов и передавать на клиент не весь список packages, а только те, которые еще не были найдены.
Для этого модифицируем на серверный код

В папке packages/sevret-packages создадим папку data. В ней мы будем сохранять в файлах список id найденных пакетов для каждого игрока в отдельном файле. Название файла должно быть уникально и как-то связанно с игроком, чтобы при повторном заходе мы могли его найти и правильно определить. В этом уроке для простоты мы будем использовать ник игрока, но в реальном проекте советую использовать что-то другое, например, серийный номер клиента.
В самом файле мы будем хранить массив с id в виде JSON строки.

Когда формируем массив playerPackages, то в него не попадут уже найденные ранее игроком координаты. Соответственно в самом playerPackages нумерация координат будет отличаться от исходной в packages. Когда мы сохраняем список id найденных игроком, то они соответствуют порядковым номерам в массиве packages. Поэтому чтобы с клиента нам приходили верные id - мы добавляем к координатам еще и id.
package.id = packageId

Клиентский код тоже немного модифицируем, чтобы учитывать наличие id в самом объекте с координатами.


Когда игрок подбирает пикам мы будем добавлять его в список найденных и сохранять его сразу в файл на сервере.

На клиент обратно будем слать событие с подтверждением. В нем мы отправим число - сколько всего пакетов и сколько из них нашел игрок

Для того чтобы показывать красивые уведомления мы будем использовать библиотеку scaleform_messages

20210108124529_1.jpg

Также на серверной стороне мы будем выдавать какую-то награду когда игрок найдет все секретные пакеты. В нашем случае это будет оружиме миниган

20210108124615_1.jpg

Таким образом получаем полностью функциональный скрипт. Для работы нужно будет добавить больше координат пикапов и использовать более надежные идентификаторы в названиях файлов.

builder1.jpg

Shift - Увеличить скорость движения. Удерживайте эту кнопку при движении чтобы увеличить скорость.

Alt - Уменьшить скорость

Ctrl - Вращение объекта. Удерживайте эту кнопку + нажимайте кнопки перемещения (W,S - вращать по оси X, A,S - по оси Y и PageUp, PageDown - по оси Z ).

Сохранение карт
Все карты сохраняются в формате json в папке rage-builder-maps . Это папка загрузчика карт. При старте сервера он просканирует свою папку и автоматически загрузит на сервере все найденные карты. Также когда в редакторе мы сохраняем карту (новую или уже существующую), то загрузчик автоматически перечитает содержимое карт и перезагрузит их. Таким образом любые изменения будут доступны на сервере сразу же без перезагрузки.

Использование в production
На публичном сервере рекомендуется не использовать редактор, а только загрузчик карт (папка packages/rage-builder-maps). Если все же необходимо использовать и редактор, то советую каким-то образом защитить или переименовать команду /builder на что-нибудь неизвестное (например, /builder6392386), чтобы игроки не смогли зайти в редактор.

Читайте также: