Что такое синхра самп

Обновлено: 17.05.2024

Произведен полный переезд на SA-MP 0.3.7 R3 Client, отныне модификации/скрипты/плагины для R1 не поддерживаются. Причиной послужило неактуальность клиента, а так же проблемы со стабильностью.

Если в результате перехода на новую версию у Вас перестал работать мод/плагин/скрипт, то напишите нам в ЛС группы, предоставив ссылку на ресурс/файл, если модификация действительно полезна для игры, то мы перенесём/адаптируем его под R3

UPD 19:05 (GMT+3)
CLEO и SAMPFUNCS автоматически обновляются лаунчером на необходимую версию

Lua ALL | Отправка синхры к объектам с выбором клавиши.

Всем привет , представляю вам скрипт
который поможет на расстоянии брать какие то объекты с выбором клавиши и команды, это может быть сервер где взаимодействия с объектом происходит непосредственно на клавишу или на команду.
Скрипт будет дорабатываться до предела , что послужит заменой
некоторых скриптов как
"ящики c авианосца на расстоянии/передача денег на расстоянии и т.д"
это лишает вас от обязанности качать
отдельные скрипты для каждого сервера.

Установка:
sampfuncs последней версии
moonloader
imgui
Сам скрипт кидаем в папку "moonloader" которая находится в корневом папке с GTA SA.

Тема: Синхронизация в SA:MP (Перевод)

Всем привет.
Наткнулся я на эту довольно-таки древнюю статью на официальном форуме и решил перевести. В общем, надеюсь, данная статья поможет новичкам лучше узнать, как работает синхронизация в SA:MP.
Поехали.

Я заметил, что куча багов и проблем возникает у скриптеров из-за отсутствия знаний в этой области. Надеюсь, у меня получится разъяснить для вас некоторые вещи в этой статье.

  • Скрипт выполняется в одном потоке.
  • Обновление данных об игроках.
  • Влияние игрока на функции сервера.
  • Синхронизация клавиш.
  • Потеря пакетов.
  • Смешивание пакетов.

Скрипт выполняется в одном потоке.
Для некоторых это может показаться сложным, поэтому позвольте объяснить: любое действие на сервере происходит только после завершения предыдущего действия.
К примеру, если у вас есть код, который выполняется за 3 секунды в OnPlayerConnect (одна из старых версий плагина GeoIP, например), то сервер будет ждать, пока выполнится этот код, прежде чем начать выполнять что-либо ещё.

  • Работа с длинными строками.
  • Перебор игроков и выполнение действий над ними.
  • Чтение и запись информации в большое количество файлов.

Преимущества однопоточности:
Преимущество работы сервера в одном потоке (на мой взгляд) - полный контроль над потоком информации на сервере. Вы всегда будете обрабатывать каждое событие на сервере, как только оно произойдёт. Если бы сервер был многопоточным, то информация об игроке могла бы обновиться во время выполнения вашего кода. И, если честно, я не думаю, что так было бы лучше.[/INDENT]

  • Здоровье / броня.
  • HP автомобиля / повреждения / цвет / тюнинг.
  • Смерть.
  • Скорость.
  • Позиция / поворот.
  • Анимация.
  • Нажатые клавиши.
  • Оружие / боеприпасы.
  • Положение камеры (при наведении, съемке, если такого действия нет, обновляется раз в 2 секунды).
  1. Если игрок целился или стрелял, угол поворота камеры и поворота игрока будут отправлены в этом же обновлении и будет вызван коллбэк OnPlayerUpdate. Если же игрок не целился и не стрелял, OnPlayerUpdate может и не вызваться.
  2. OnPlayerUpdate вызывается при нажатии кнопок. OnPlayerKeyStateChange не вызывается, если нажаты клавиши ходьбы/движения (вправо/влево/вперед/назад). Анимация игрока будет обновлена до вызова OnPlayerUpdate, если она была изменена мгновенно.

ID, возвращаемый функцией GetPlayerAnimationIndex, меняется так же мгновенно, как и сама анимация обновляется для клиента. Например, когда вы начинаете бегать, анимация будет изменена в тот момент, когда вы нажмете клавишу (хоть вы и можете не заметить этого сразу).

Что произойдёт, если вернуть 0 в OnPlayerUpdate?
OnPlayerUpdate вызывается до того как сервер посылает обновлённую информацию игрокам. Если в этой функции вернуть 0 (как из фильтрскрипта, так и из мода), обновлённая информация просто не будет передана.

Хороший пример:
Этот код не позволит игроку перемещаться/стрелять, когда он заморожен. Больше не будет "призрачной стрельбы", или как вы там это называли.

public OnPlayerUpdate ( playerid )
static // Я использую здесь статистические переменные, чтобы они не создавались каждый раз заново
s_Keys ,
s_UpDown ,
s_LeftRight
;

GetPlayerKeys ( playerid , s_Keys , s_UpDown , s_LeftRight ); // Получаем нажатые в настоящее время клавиши

// Используем 2 функции для заморозки/разморозки игрока

TogglePlayerControllable ( playerid , false );
>

TogglePlayerControllable ( playerid , true );
>

Плохой пример:

Ниже в конце функции нет return 1, из-за чего ни один игрок не будет синхронизироваться.
Примечание (DC): если в функции не возвращать никаких значений, она по умолчанию вернёт 0.

public OnPlayerUpdate ( playerid )
if ( GetPlayerWeapon ( playerid ) == WEAPON_MINIGUN )
Ban ( playerid );
>

public OnPlayerUpdate ( playerid )
if ( GetPlayerWeapon ( playerid ) == WEAPON_MINIGUN )
Ban ( playerid );

Функции сервера, влияюшие на игрока
Такие функции, как SetPlayerHealth, GivePlayerMoney, PutPlayerInVehicle и т.д., передают данные с сервера только тому игроку, которого они затрагивают (за исключением SetPlayerVirtualWorld).

Синхронизация клавиш

SA:MP синхронизируется путем получения статуса нажатия ваших клаквиш и отправки этого статуса другим клиентам. Если вы нажмете клавиши прицела и стрельбы, данные об этом получат и другие клиенты. Это означает, что, даже если вы стреляете на вашем экране, вы можете стоять перед разсинхронизированной машиной или быть зарезаным/убитым от взрыва автомобиля на экранах других клиентов. Это называется рассинхронизацией.

Отправке данных о нажатии клавиш на сервер
Некоторые могут думать, что если нажать клавишу очень быстро, сервер не получит данные о нажатии. Ошибаетесь! Например, если нажать и отпустить клавишу "огонь", сервер получит 2 обновления: вы нажали клавишу и вы отпустили клавишу.


Потеря пакетов
Иногда, когда клиент отправляет обновленные данные на сервер, они теряются. Это может привести к ошибкам и проблемам в скриптах, поэтому нужно быть готовым к потере пакетов!

Как же избежать потери пакетов вызванную ошибкой в скрипте?

  • Игрок 1 имеет 50 брони.
  • Сервер оснащен супер-новым античитом на броню, основанным на обновлениях игрока!
  • Античит сработает, если броня игрока изменилась, но деньги его остались прежними (т.е. он не купил её в магазине оружия).
  1. Игрок 1 идет в магазин оружия. Сервер узнает это из-за вызова OnPlayerInteriorChange.
  2. Игрок покупает новую броню, отправляет на сервер обновлённую информацию и платит $240.
  3. Игрок отправляет пакет с информацией на сервер; пакет потерян!
  4. Игрок 1 начинает передвигаться, тем самым отправляя на сервер данные о позиции, но сервер понятия не имеет о броне и о $240.
  5. В игрока 1 стреляют, на сервер отправляются данные о новой броне, но данные о $240 - утеряны.
  6. Античит всё это видит и банит игрока по причине чита на броню.
  • Сообщаем админам и начисляем игроку +1 к подозрению в читерстве. Если таких подозрений будет более 3, наказываем.
  • Даем игроку $1 и ждем новых данных о деньгах игрока. Возможно также снять броню и вернуть ее, только если новые данные о деньгах будут получены в следующих 1-3 обновлениях.

Смешивание пакетов
Смешивание пакетов происходит, когда отправленные пакеты не получены в том же порядке, в котором они были отправлены.

  • Игрок 1 имеет 85 брони.
  • Сервер оснащен супер-новым античитом на броню, основанным на обновлениях игрока!
  • Античит сработает, если броня игрока изменилась, но деньги его остались прежними (т.е. он не купил её в магазине оружия).
  1. Игрок 1 сражается с кем-то.
  2. Игрок 1 дважды получает урон, сначала на 10 hp, потом на 20 hp. Два пакета данных с обновленной броней отправляются на сервер.
  3. Пакеты перемешаны. Сервер сначала получает данные о том, что у игрока есть 55 брони (85 - 10 - 20).
  4. Первый пакет приходит на сервер после второго, там броня игрока - 75.
  5. Сервер думает, что игрок читом восстановил броню и банит его.
  • Сообщаем админам и начисляем игроку +1 к подозрению в читерстве. Если таких подозрений будет более 3, наказываем.
  • Не применяйте наказание в ближайшие 2-3 обновления, только делайте предупреждения, как в предыдущем пункте.
  • Принимайте меры только если у игрока 100 или более ед. брони.



В заключение, хотелось бы добавить от себя. Данную статью мы с DeimoS перевели специально для того, чтобы расширить ваши общие знания о синхронизации в SA:MP. Несмотря на то, что статья довольно старая, в ней очень много полезной информации. Ну и, конечно, если у вас есть что добавить, можете смело предлагать!

Что такое синхра самп


Давайте обсудим эту не маловажную тему на мой взгляд!

[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)

Жесть конечно, но в принципе реально написать на это античит.

Добавлено (14.12.2009, 15:03)
---------------------------------------------
Жаль вот только нельзя узнать кто передаёт информацию всем игрокам о расположении авто


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

[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)

Отслеживать все машины создаваемые сервером, в OnVehicleStreamIn сравнивать ИД машины с записаными в массиве, если ИД в нем нет уничтожать машину, пускай хоть зачитерятся cool


ы? машины не создаются, а перемещаются!

Бложе
[indent] Мой блог
Уроки по Pawn [/indent]




и что?
телепортация это мгновенное изменение координат машины с X1Y1Z1 на X2Y2Z2, Вам доступна команда GetVehicleVelocity если машина изменяет координаты но при этом ранее озвученная команда возвращает 0, значит машину кто-то телепортирует.

И создал Бог женщину. Существо получилось злобное, но симпатичное.

Отслеживать все машины создаваемые сервером, в OnVehicleStreamIn сравнивать ИД машины с записаными в массиве, если ИД в нем нет уничтожать машину, пускай хоть зачитерятся


в OnVehicleStreamIn они попасть не как не могут! ТПшнуть можно только те, которые находятся в стримере. (т.е. которые уже созданы для тебя).

GetVehicleVelocity если машина изменяет координаты но при этом ранее озвученная команда возвращает 0, значит машину кто-то телепортирует.


Во время телепортации GetVehicleVelocity не вернёт 0 к сожалению

[1337GAMES] Easy RP
(SAMP SERVER, DEVELOPMENT, NOT SAMP-RP, SMART LIFE)

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