stock SetComponentsVehicle(vehicle_id, components[]) { new BitStream: bitstream = BS_New(); BS_ResetWritePointer(bitstream); BS_WriteValue( bitstream, PR_UINT8, PACKET_CUSTOM, PR_UINT32, RPC_SET_COMPONENTS, PR_UINT16, vehicle_id, PR_STRING32, components ); PR_SendRPCToVehicleStream(bitstream, vehicle_id, PACKET_CUSTOM); return BS_Delete(bitstream); }
Пока что-то не очень получается и возникает такой вопрос: А возможно ли вообще передать просто массив, не значение из массива, а просто массив..
И на клиенте создать переменную
int components[14];
и в эту переменную записать данные.
Попробовал циклом передать данные из массива. Итог: установился только один компонент.
stock SetComponentsVehicle(vehicle_id, const components[]) { new BitStream: bitstream = BS_New(); BS_ResetWritePointer(bitstream); for (new i; i < sizeof components[]; i++) { if (!components[i]) continue; BS_WriteValue( bitstream, PR_UINT8, PACKET_CUSTOM, PR_UINT32, RPC_SET_COMPONENTS, PR_UINT16, vehicle_id, PR_UINT16, components[i] ); PR_SendRPCToVehicleStream(bitstream, vehicle_id, PACKET_CUSTOM); } return BS_Delete(bitstream); }
CLIENT:
void game_loop(game_loop_t orig) { orig(); static bool initialized = false; if (initialized || !rakhook::initialize()) return; initialized = true; rakhook::on_receive_rpc += [](unsigned char& id, RakNet::BitStream* bs) -> bool { //std::cout << "receive rpc: " << +id << ' ' << bs << '\n'; uint8_t packetID = 0; uint32_t rpcID = 0; bs->ResetReadPointer(); bs->Read(packetID); bs->Read(rpcID); if (id == PACKET_CUSTOM) { if (rpcID == 23) { uint16_t vehicle_id = 0; uint16_t component = 0; bs->Read(vehicle_id); bs->Read(component); CVehicle* vehicle = PluginMultiplayer::GetVehicle(vehicle_id); if (vehicle != nullptr) { /*for (int i = 0; i < ARRAY_SIZE(components); i++) { if (!components[i]) continue; CStreaming::RequestModel(components[i], eStreamingFlags::PRIORITY_REQUEST); CStreaming::LoadAllRequestedModels(true); vehicle->AddVehicleUpgrade(components[i]); CStreaming::SetModelIsDeletable(components[i]); }*/ CStreaming::RequestModel(component, eStreamingFlags::PRIORITY_REQUEST); CStreaming::LoadAllRequestedModels(true); vehicle->AddVehicleUpgrade(component); CStreaming::SetModelIsDeletable(component); } return true; } if (rpcID == RPC_SET_NEON) { uint8_t r = 0; uint8_t g = 0; uint8_t b = 0; uint32_t vehicle_id = 0; uint8_t isrgb = 0; bs->Read(r); bs->Read(g); bs->Read(b); bs->Read(vehicle_id); bs->Read(isrgb); CVehicle* vehicle = PluginMultiplayer::GetVehicle(vehicle_id); if (vehicle != nullptr) { Neon.Install(vehicle, r, g, b); if (isrgb) { Neon.SetRGB(vehicle, true); } else { Neon.SetRGB(vehicle, false); } } return true; } if (rpcID == RPC_REMOVE_NEON) { uint32_t vehicle_id = 0; bs->Read(vehicle_id); CVehicle* vehicle = PluginMultiplayer::GetVehicle(vehicle_id); if (vehicle != nullptr) { int components[5] = { 7393, 7395, 7401, 7403 }; for (int i = 0; i < ARRAY_SIZE(components); i++) { if (!components[i]) continue; CStreaming::RequestModel(components[i], eStreamingFlags::PRIORITY_REQUEST); CStreaming::LoadAllRequestedModels(true); vehicle->AddVehicleUpgrade(components[i]); CStreaming::SetModelIsDeletable(components[i]); } Neon.Remove(vehicle); } return true; } } return true; }; }
Сообщение отредактировал DigitalOneThe: 07 октября 2024 - 19:57