- 12
- 25
- Версия SA-MP
-
- Любая
Попробую кратко: в мобильном самп клиенте есть проблема с регистрацией урона от самолёта Rustler, а точнее она не реализована, либо работает неправильно. По этому поводу уже пробовал несколько раз писать разработчикам лаунчера, но судя по всему данную проблему считают не существенной, так как полёты это не самое популярное занятие в сампе. Да и скорее всего такая работа обусловлена тем как именно устроен мобильный порт гта, переделывать который у разработчиков лаунчера врядли есть желание. Так или иначе, в данной теме расскажу свои наблюдения по поводу данного бага и предложу неоптимальное решение проблемы.
Начать стоит с того что я никогда не писал читов для самп и до того как взялся за эту тему имел только общие представления о том как работает взаимодействие между клиентами через сервер. Поэтому пришлось разбираться в этом по ходу дела, мой анализ ситуации скорее всего поверхностный и вероятно далее у меня будут какие-либо неточности, которые буду исправлять по мере появления новых сообщений в теме. Или не буду.
p.s. Видео для большинства описанных "экспериментов" мне было влом снимать, поэтому вам придётся поверить мне на слово, либо самостоятельно всё перепроверить
Таким образом после всех манипуляций у меня получился скрипт, который здесь и выкладываю.
p.s. Видео для большинства описанных "экспериментов" мне было влом снимать, поэтому вам придётся поверить мне на слово, либо самостоятельно всё перепроверить
Для начала я проверил, видит ли вообще мобильный клиент стрельбу, или этот параметр пакета DriverSync не обрабатывается. Для этого зашёл на сервер с обычного клиента (ПК) и мобильного (android), взял на ПК клиенте самолёт и пострелял в рандомных направлениях. При этом на мобильном клиенте тишина, никакой стрельбы не видно. После этого попробовал наоборот сесть уже с мобильного клиента в растлер, а с пк наблюдать, результат тот же.
Отсюда я сделал вывод что данная информация вообще не обрабатывается на стороне мобильного клиента и не передаётся на сервер.
Отсюда я сделал вывод что данная информация вообще не обрабатывается на стороне мобильного клиента и не передаётся на сервер.
Раз стандартное средство передачи не работает и вообще не обрабатывается клиентом, я решил пойти другим путём и передавать сам выстрел пакетом BulletSync. По сути растлер стреляет теми же патронами что и м4. Таким образом, мне нужно каждый раз, когда в зону поражения самолёта попадает пеший игрок/игрок в авто, передавать начальное, конечное положение патрона и статус попадания по игроку/транспорту.
Для этого я наговнокодил небольшой скрипт на луа, который, если игрок сидит в растлере, при нажатии на LCTRL ищет цели внутри зоны поражения самолёта и если находит, то отправляет пакет с попаданием по ней, то есть по задумке, скрипт просто повторяет оригинальное поведение игры, но передаёт не статус ведения огня самолётом, а уже конкретные попадания по найденой цели.
Конечно, чтобы стрельба теперь не получилась слишком имбовой пришлось существенно сузить зону регистрации урона от оригинальной, так как в игре растлер умеет попадать и по целям которые находятся под углом 45 градусов по азимуту, и возможно больше, но всё же оригинальный клиент очень нестабильно регистрирует этот урон и всё зависит скорее от того как обработает игровую ситуацию сторона, получающая урон, нежели от того под каким углом игрок на самом деле заходил на цель.
Когда скрипт был написан, на этапе тестирования выяснилось, что для оригинального (ПК) клиента самп пакета BulletSync уже достаточно чтобы обработать урон, однако андроид клиент всё ещё отказывался корректно реагировать на отправленные ему пакеты и просто игнорировал их.
Для этого я наговнокодил небольшой скрипт на луа, который, если игрок сидит в растлере, при нажатии на LCTRL ищет цели внутри зоны поражения самолёта и если находит, то отправляет пакет с попаданием по ней, то есть по задумке, скрипт просто повторяет оригинальное поведение игры, но передаёт не статус ведения огня самолётом, а уже конкретные попадания по найденой цели.
Конечно, чтобы стрельба теперь не получилась слишком имбовой пришлось существенно сузить зону регистрации урона от оригинальной, так как в игре растлер умеет попадать и по целям которые находятся под углом 45 градусов по азимуту, и возможно больше, но всё же оригинальный клиент очень нестабильно регистрирует этот урон и всё зависит скорее от того как обработает игровую ситуацию сторона, получающая урон, нежели от того под каким углом игрок на самом деле заходил на цель.
Когда скрипт был написан, на этапе тестирования выяснилось, что для оригинального (ПК) клиента самп пакета BulletSync уже достаточно чтобы обработать урон, однако андроид клиент всё ещё отказывался корректно реагировать на отправленные ему пакеты и просто игнорировал их.
Далее я обнаружил, что андроид клиент начинает обрабатывать получаемый через BulletSync урон, если сесть в транспорт в зоне прорисовки андроид игрока, при этом если отлететь на расстояние, а затем вернуться обратно в зону прорисовки - мобильный клиент начинает снова игнорировать пакеты BulletSync. Это навело меня на мысли о том, что вероятно для стабильной регистрации урона можно попробовать отправлять пакет OnFootSync в зоне стрима. Флудить этими пакетами находясь в транспорте не хотелось бы, поэтому поставил таймер примерно на 10сек и наконец-то урон начал проходить как задумывалось. Из-за долгой синхронизации урон может не всегда проходить сразу, но это по крайней мере работает.
Но конечно и здесь не всё так просто. Андроид клиент, получая пакет BulletSync, берёт информацию об используемом оружии не из самого пакета, а получает оружие, которое находится на данный момент в руках у персонажа, отправившего пакет. Таким образом отправляя пакет следующего вида:
андроид клиент регистрирует это как урон с дигла, потому что в руках у моего персонажа, сидящего в растлере, именно дигл. Эту особенность тоже нужно учитывать, поэтому перед отправкой пакета синхронизации я попробовал скриптово менять и оружие, находящееся в руках у персонажа.
Пакет BulletSync:
local newData = {
targetType = 2,
targetId = data.targetid,
origin = data.pos,
target = data.vec,
offset = {x = 0, y = 0, z = 0},
weaponId = 31,--Оружие M4A1
}
Помимо основной своей задачи по подключению урона мобильным игрокам, данный скрипт немного улучшает синхронизацию стрельбы с растлера в целом, потому как теперь каждое попадание обрабатывается как выстрел из оружия, а не как анимация стрельбы самолёта. Из основных минусов данного вектора решения этой проблемы могу выделить то что на многих крупных проектах за сетевую активность вас может карать античит. На серверах где я играю это периодически происходит, но скорее как исключение из правил, к тому же пока это единственное решение данной проблемы, которое я нашёл в интернетах.
И не могу немного не поныть на эту тему. Всё-таки мне кажется что оптимальным решением было бы исправление поведения андроид клиента в целом, тогда не пришлось бы писать костыли и придумывать как передать урон мобильному игроку и не отлететь по античиту. Хотя получается забавная ситуация что гм против растлера у мобильных игроков, а думать над "не читерским" способом нужно лётчикам.
В общий чат самп: /rustlerFire - включение/отключение фикса (по умолчанию включен)
В консоль sampfuncs:
rustlerfire - включение/отключение фикса (по умолчанию включен)
rustlerFireRender [значение] - изменение режима рендера (по умолчанию 0)
Режимы рендера:
0 - ничего не показывать
1- показывать попадания
2 - показывать зону поражения и попадания
В консоль sampfuncs:
rustlerfire - включение/отключение фикса (по умолчанию включен)
rustlerFireRender [значение] - изменение режима рендера (по умолчанию 0)
Режимы рендера:
0 - ничего не показывать
1- показывать попадания
2 - показывать зону поражения и попадания
p.s.
Вложения
Последнее редактирование: