Вот
гитхаб SAMP.Lua (во-первых, тебе надо скачать и установить эту библиотеку
отсюда)
Переходишь в samp.lua -> samp -> synchronization.lua, там есть:
typedef struct VehicleSyncData {
uint16_t vehicleId;
uint16_t leftRightKeys;
uint16_t upDownKeys;
union {
uint16_t keysData;
SampKeys keys;
};
float quaternion[4];
VectorXYZ position;
VectorXYZ moveSpeed;
float vehicleHealth;
uint8_t playerHealth;
uint8_t armor;
uint8_t currentWeapon : 6;
uint8_t specialKey : 2;
uint8_t siren;
uint8_t landingGearState;
uint16_t trailerId;
union {
float bikeLean;
float trainSpeed;
uint16_t hydraThrustAngle[2];
};
} VehicleSyncData;
typedef struct PassengerSyncData {
uint16_t vehicleId;
uint8_t seatId : 6;
bool driveBy : 1;
bool cuffed : 1;
uint8_t currentWeapon : 6;
uint8_t specialKey : 2;
uint8_t health;
uint8_t armor;
uint16_t leftRightKeys;
uint16_t upDownKeys;
union {
uint16_t keysData;
SampKeys keys;
};
VectorXYZ position;
} PassengerSyncData;
Значит, когда ты водитель - твой клиент шлёт синхронизацию водителя серверу, тебе надо перехватывать посылку и вместо неё отправлять синхру пассажира, звучит как план 😀. Кстати, всё что мы можем перехватить, можно найти на
том же гитхабе в файле samp.lua -> samp -> events.lua, например:
-- Outgoing packets
OUTCOMING_PACKETS[PACKET.RCON_COMMAND] = {'onSendRconCommand', {command = 'string32'}}
OUTCOMING_PACKETS[PACKET.STATS_UPDATE] = {'onSendStatsUpdate', {money = 'int32'}, {drunkLevel = 'int32'}}
local function empty_writer() end
OUTCOMING_PACKETS[PACKET.PLAYER_SYNC] = {'onSendPlayerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'PlayerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.VEHICLE_SYNC] = {'onSendVehicleSync', function(bs) return utils.process_outcoming_sync_data(bs, 'VehicleSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.PASSENGER_SYNC] = {'onSendPassengerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'PassengerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.AIM_SYNC] = {'onSendAimSync', function(bs) return utils.process_outcoming_sync_data(bs, 'AimSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.UNOCCUPIED_SYNC] = {'onSendUnoccupiedSync', function(bs) return utils.process_outcoming_sync_data(bs, 'UnoccupiedSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.TRAILER_SYNC] = {'onSendTrailerSync', function(bs) return utils.process_outcoming_sync_data(bs, 'TrailerSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.BULLET_SYNC] = {'onSendBulletSync', function(bs) return utils.process_outcoming_sync_data(bs, 'BulletSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.SPECTATOR_SYNC] = {'onSendSpectatorSync', function(bs) return utils.process_outcoming_sync_data(bs, 'SpectatorSyncData') end, empty_writer}
OUTCOMING_PACKETS[PACKET.WEAPONS_UPDATE] = {'onSendWeaponsUpdate', handler.packet_weapons_update_reader, handler.packet_weapons_update_writer}
OUTCOMING_PACKETS[PACKET.AUTHENTICATION] = {'onSendAuthenticationResponse', {response = 'string8'}}
Так вот наш луа код:
local ev = lib 'samp.events'
function ev.onSendVehicleSync(data) -- когда игра пытается серверу отправить синхру водителя
-- тут будем писать наш код замены синхры
return false -- в конце говорим, что мы не будем отправлять ту изначальную синхру (отменяем действие)
end
Идём на
бх.вики, ищем функцию отправки синхры:
sampForcePassengerSyncSeatId(int id, int seatId)
ид тс берём со старой синхры, ид сиденья выбираешь сам. продолжаем писать код:
local ev = lib 'samp.events'
function ev.onSendVehicleSync(data) -- когда игра пытается серверу отправить синхру водителя
local vehId = data.vehicleId -- напомню, структуру data я скинул в начале с гитхаба
sampForcePassengerSyncSeatId(vehId, 1) -- наверное пассажир это 1, мб 0. надо тестить
return false -- в конце говорим, что мы не будем отправлять ту изначальную синхру (отменяем действие)
end
Проверь, должно работать по идее.
Ты будешь у себя ехать за рулём, а у других - наверное сидеть в машине сбоку, а она будет ехать "сама". Мб где то ошибка
Но!
Сервера с анти читом могут кикнуть, потому что если ты был пешеходом, сел на водительское и стал пассажиром - это подозрительно. Надо хукать RPC посадки в машину (список RPC в том же файле events.lua) и там менять место, что ты садишься на пассажира. Тоже проверь