Comment spawn un véhicule/ped/objet en ligne avec un script

EROOTIIK

VIP
Inscription
2 Novembre 2011
Messages
4 176
Réactions
3 454
Points
24 883
Faire spawn en ligne n'est pas aussi simple qu'avec un sprx, c'est pour cela qu'il a fallu du temps avant d'avoir un vehicle spawner fonctionnel et visible pour tout le monde, pour les objets on peut les spawn mais c'est impossible de faire en sorte qu'ils ne bougent pas quand des autres joueurs sont dans la zone.

D'abord soyez sûr d'avoir utilisé cette native NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME au début de votre script, j'ai eu quelques problèmes en faisant spawn des maps sans cette native.

Puis, nous allons faire en sorte que votre script se transforme en un network script, mettez ceci dans votre boucle principale :
Code:
if (NETWORK_IS_GAME_IN_PROGRESS() && !NETWORK_GET_THIS_SCRIPT_IS_NETWORK_SCRIPT())
{
    NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(LobbySizeWithSpectators, 0, -1);
    NETWORK_GET_SCRIPT_STATUS();
}
Sans ça vous pourrez rien spawn en ligne et vous allez freeze comme un noob, ça permet de faire fonctionner plusieurs natives network qui ne fonctionnent pas sans comme set_network_id_can_migrate si je me souviens bien.
LobbySizeWithSpectators correspond à 18, cette variable est déjà déclaré si vous utilisez le compilateur de ap ii intense et xbltoothpik.
NETWORK_GET_SCRIPT_STATUS devrait être complètement inutile comme on utilise pas la valeur retourné mais pour une raison bizarre rien ne spawn si on ne l'appelle pas.
Si vous voulez spawn un objet directement au début de votre script il faut utiliser WAIT(255); après NETWORK_GET_SCRIPT_STATUS pour que le script est le temps de se transformer en un network script, sinon rien ne devrait spawn au début.

Maintenant on va faire notre fonction de spawn de véhicule, pour commencer on va charger notre model:
Code:
    REQUEST_MODEL(VEHICLE_ADDER);
    while (!HAS_MODEL_LOADED(VEHICLE_ADDER))
        WAIT(0);
seconde partie :
Code:
if (NETWORK_IS_GAME_IN_PROGRESS() && CAN_REGISTER_MISSION_VEHICLES(1))
{
    RESERVE_NETWORK_MISSION_VEHICLES(1);
    Vehicle veh = CREATE_VEHICLE(VEHICLE_ADDER, GET_ENTITY_COORDS(PLAYER_PED_ID(), true), 0, true, 1);
On vérifie si on est bien ligne et qu'on peut enregistrer un véhicule puis on le reserve et on le spawn.
Pensez à bien utiliser true pour le bool utiliser par create_vehicle, c'est ça qui définit si le véhicule spawn est une véhicule online ou non.

Dernière partie, on enregistre le véhicule on choppe son network id et on faire en sorte qu'il existe pour tous les autres joueurs :
Code:
if (NETWORK_DOES_NETWORK_ID_EXIST(netId))
{
    _SET_ENTITY_REGISTER(ped, true);
    if (NETWORK_GET_ENTITY_IS_NETWORKED(ped))
        SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES(netId, true);
}
Voilà comme ça vous aurait pas l'air d'un guignol à sauter dans le vide sur l'écran des autres joueurs.

Seul problème c'est qu'il y a une limite de réservation/enregistrement d'entités, 50 pour les peds et 60 pour les véhicules et les objets ce qui est dommage pour faire spawn des maps en ligne vu que normalement on peut spawn jusqu'à 249 objets.
Pour évitez d'atteindre cette limite vous pouvez utiliser SET_ENTITY_AS_NO_LONGER_NEEDED ça supprimera l'entité quand vous êtes loin de celle-ci.
Si vous n'utilisez pas CAN_REGISTER_MISSION_VEHICLES(1) vous pourrez toujours spawn après la limite atteinte mais les autres joueurs ne verront pas ce que vous faite spawn.
Utilisez SET_NETWORK_ID_CAN_MIGRATE(netId, false) après SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES pour éviter que les objets bougent.

J'ai fait une source pour exemple que vous pourrez trouver ici :
 
Dernière édition:

Lebossdu33

Premium
Inscription
2 Avril 2017
Messages
658
Réactions
111
Points
1 006
Faire spawn en ligne n'est pas aussi simple qu'avec un sprx, c'est pour cela qu'il a fallu du temps avant d'avoir un vehicle spawner fonctionnel et visible pour tout le monde, pour les objets on peut les spawn mais c'est impossible de faire en sorte qu'ils ne bougent pas quand des autres joueurs sont dans la zone.

D'abord soyez sûr d'avoir utilisé cette native NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME au début de votre script, j'ai eu quelques problèmes en faisant spawn des maps sans cette native.

Puis, nous allons faire en sorte que votre script se transforme en un network script, mettez ceci dans votre boucle principale :
Code:
if (NETWORK_IS_GAME_IN_PROGRESS() && !NETWORK_GET_THIS_SCRIPT_IS_NETWORK_SCRIPT())
{
    NETWORK_SET_THIS_SCRIPT_IS_NETWORK_SCRIPT(LobbySizeWithSpectators, 0, -1);
    NETWORK_GET_SCRIPT_STATUS();
}
Sans ça vous pourrez rien spawn en ligne et vous allez freeze comme un noob, ça permet de faire fonctionner plusieurs natives network qui ne fonctionnent pas sans comme set_network_id_can_migrate si je me souviens bien.
LobbySizeWithSpectators correspond à 18, cette variable est déjà déclaré si vous utilisez le compilateur de ap ii intense et xbltoothpik.
NETWORK_GET_SCRIPT_STATUS devrait être complètement inutile comme on utilise pas la valeur retourné mais pour une raison bizarre rien ne spawn si on ne l'appelle pas.
Si vous voulez spawn un objet directement au début de votre script il faut utiliser WAIT(255); après NETWORK_GET_SCRIPT_STATUS pour que le script est le temps de se transformer en un network script, sinon rien ne devrait spawn au début.

Maintenant on va faire notre fonction de spawn de véhicule, pour commencer on va charger notre model:
Code:
    REQUEST_MODEL(VEHICLE_ADDER);
    while (!HAS_MODEL_LOADED(VEHICLE_ADDER))
        WAIT(0);
seconde partie :
Code:
if (NETWORK_IS_GAME_IN_PROGRESS() && CAN_REGISTER_MISSION_VEHICLES(1))
{
    RESERVE_NETWORK_MISSION_VEHICLES(1);
    Vehicle veh = CREATE_VEHICLE(VEHICLE_ADDER, GET_ENTITY_COORDS(PLAYER_PED_ID(), true), 0, true, 1);
On vérifie si on est bien ligne et qu'on peut enregistrer un véhicule puis on le reserve et on le spawn.
Pensez à bien utiliser true pour le bool utiliser par create_vehicle, c'est ça qui définit si le véhicule spawn est une véhicule online ou non.

Dernière partie, on enregistre le véhicule on choppe son network id et on faire en sorte qu'il existe pour tous les autres joueurs :
Code:
if (NETWORK_DOES_NETWORK_ID_EXIST(netId))
{
    _SET_ENTITY_REGISTER(ped, true);
    if (NETWORK_GET_ENTITY_IS_NETWORKED(ped))
        SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES(netId, true);
}
Voilà comme ça vous aurait pas l'air d'un guignol à sauter dans le vide sur l'écran des autres joueurs.

Seul problème c'est qu'il y a une limite de réservation/enregistrement d'entités, 50 pour les peds et 60 pour les véhicules et les objets ce qui est dommage pour faire spawn des maps en ligne vu que normalement on peut spawn jusqu'à 249 objets.
Pour évitez d'atteindre cette limite vous pouvez utiliser SET_ENTITY_AS_NO_LONGER_NEEDED ça supprimera l'entité quand vous êtes loin de celle-ci.
Si vous n'utilisez pas CAN_REGISTER_MISSION_VEHICLES(1) vous pourrez toujours spawn après la limite atteinte mais les autres joueurs ne verront pas ce que vous faite spawn.
Utilisez SET_NETWORK_ID_CAN_MIGRATE(netId, false) après SET_NETWORK_ID_EXISTS_ON_ALL_MACHINES pour éviter que les objets bougent.

J'ai fait une source pour exemple que vous pourrez trouver ici :
Merci apres sa dépend des menu
 
Haut