Форум Pawn.Wiki - Воплоти мечту в реальность!: Вопрос по Pawn.RakNet. - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Тема закрыта

[ Pawn ]
Вопрос по Pawn.RakNet. Вопрос

#1
Пользователь офлайн   DigitalOneThe 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Пытаюсь передать массив компонентов.

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

0

#2
Пользователь офлайн   Gene 

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
        BS_WriteValue(
            bitstream,
            PR_UINT8,   PACKET_CUSTOM,
            PR_UINT32,  RPC_SET_COMPONENTS,
            PR_UINT16,  vehicle_id
        );

        for (new i = 0; i < sizeof components; i++) {
            BS_WriteValue(
                bitstream,
                PR_UINT16,  components[i]
            );
        }

0

#3
Пользователь офлайн   Nexius 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Я бы всё-таки рассмотрел вариант реализации, при котором передавались бы только те компоненты, что действительно были изменены, а не все и всегда. Лучше иметь вариативное число аргументов и чуть более сложно их доставать из битстрима, чем постоянно передавать пустую и бесполезную инфу, которая никак не поменялась. Ну или вообще передавать один компонент в одной rpc'шке за раз, если подразумевается примерно та же логика, что и со стандартным гташным тюнингом.

Сообщение отредактировал Nexius: 08 октября 2024 - 00:42

1

#4
Пользователь офлайн   DigitalOneThe 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияNexius (08 октября 2024 - 00:38) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Имеется у меня такая реализация, но как быть с загрузкой? Когда я устанавливал несколько компонентов отправляя несколько пакетов, то у меня ничего не получалось. Как бы, устанавливался только один компонент. Может поможете правильно реализовать способ отправки пакетов на установку тюнинг деталей для машинки?

Реализация в Pawn.

CMD:set_component(playerid, params[]) {
	extract params -> new vehicle_id, component_id; else
		return SendClientMessage(playerid, -1, "Usage: /set_component <vehicle_id> <component_id>");

	SetComponentVehicle(vehicle_id, component_id);
	return 1;
}

stock SetComponentVehicle(vehicle_id, component_id) {
	new 
		BitStream: bitstream = BS_New();

    BS_ResetWritePointer(bitstream);
	BS_WriteValue(
		bitstream,
		PR_UINT8, PACKET_CUSTOM,
		PR_UINT32, RPC_SET_COMPONENT,
		PR_UINT16, vehicle_id,
		PR_UINT16, component_id
	);

	PR_SendRPCToVehicleStream(bitstream, vehicle_id, PACKET_CUSTOM);

	return BS_Delete(bitstream);
}


Реализация на клиенте:

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;
                char components[14];
                unsigned int cast[14];

                bs->Read(vehicle_id);
                bs->Read(components);

                CVehicle* vehicle = PluginMultiplayer::GetVehicle(vehicle_id);
                CAutomobile* automobile = reinterpret_cast<CAutomobile*>(vehicle);

                automobile->m_pHandlingData->m_fSteeringLock = 55.0;

                if (vehicle != nullptr) {
                    for (int i = 0; i < ARRAY_SIZE(components); i++) {
                        if (!components[i]) continue;

                        cast[i] = static_cast<int>(components[i]);

                        CStreaming::RequestModel(cast[i], eStreamingFlags::PRIORITY_REQUEST);
                        CStreaming::LoadAllRequestedModels(true);
                        vehicle->AddVehicleUpgrade(cast[i]);
                        CStreaming::SetModelIsDeletable(cast[i]);
                    }
                }

                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: 08 октября 2024 - 18:42

0

#5
Пользователь офлайн   DigitalOneThe 

  • Профессионал
  • Вставить ник
  • Раскрыть информацию
Проблему решил, спасибо тем, кто пытался помочь.
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Тема закрыта

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика