Arma: Construire des ponts

Il existe au moins 2 méthodes pour faire spawn un pont composé de plusieurs objets identiques, ou une succession d’objets.

  • Soit on crée un par un chaque objet, et on les déplace les un à la suite des autres, à la bonne position.
  • Soit on crée un par un chaque objet, et on les attache un à un à l’objet précédent.

Méthode par positionnement

Par défaut, le placement des objets dans Arma n’est pas normalisé. Ainsi fonction des objets, ceux-ci peuvent avoir leur longueur alignée ou pas sur la direction 0.

Voici une fonction qui permet de retourner la longueur, largeur, et la rotation à appliquer en plus, pour aligner correctement la longueur de l’objet sur la direction 0. Grace à cela, on a ainsi toujours les objets qui se placent de la même façon.

   fnc_getSize = {
        private _bbr = boundingBoxReal _this;
        private _p1 = _bbr select 0;
        private _p2 = _bbr select 1;
        private _maxWidth = abs((_p2 select 0)-(_p1 select 0))-8;
        private _maxLength = abs((_p2 select 1)-(_p1 select 1))-8;
        
        if(_maxLength > _maxWidth) exitWith {[_maxLength, _maxWidth, 0];};
        [_maxWidth, _maxLength, 90];
    };

Cette autre fonction permet de créer x fois le même objet dans l’alignement de sa longueur, et ainsi permettre de créer des ponts, ou autres joyeuseté. 🙂 On va boucler x fois fonction du nombre d’objets passés en paramètre et successivement calculer la position de l’objet suivant qui se trouve dans l’alignement de la longueur de l’objet en cours.

   fnc_bridgeA3 = {
        private _start = createVehicle [_this select 2,_this select 0,[],0,"CAN_COLLIDE"];
        _start setVectorUp [0,0,1];
        private _size = _start call fnc_getSize;

        private _dir = _this select 1;
        private _realdir = ((_this select 1) + (_size select 2));

        _start setDir _realdir;
        _start setPosATL (_this select 0);

        for "_i" from 1 to (_this select 3) do {
            private _newpos = [ ((getPosATL _start) select 0) + (((_size select  0) * _i) * sin(_dir)), ((getPosATL _start) select  1) + (((_size select 0 ) * _i) * cos(_dir)), 0];
            _obj = createVehicle [_this select 2, _newpos ,[],0,"CAN_COLLIDE"];
            _obj setVectorUp [0,0,1];
            _realdir = _realdir + _i;
            _obj setDir _realdir;
            _obj setPosATL _newpos;
        };
    };

[position de départ, direction, type d'objet, nombre d'objets] call fnc_bridgeA3;

[position player, 70,"Land_Castle_01_tower_F", 500] call fnc_bridgeA3;

J’ai utilisé deux dir (_dir et _realdir) différents du fait de la première fonction fnc_getSize qui calcule la rotation correcte à appliquer. realdir est l’orientation réelle de l’objet pour que sa longueur soit alignée sur la direction que je lui ai donné (70).

Méthode attachTo

L’autre méthode est plus basique et attache les objets au premier objet crée avec la commande attachTo. Cependant dans Arma3, les objets attachés ne gèrent pas les collisions avec des véhicules.

Ce qui signifie que si vous construisez un pont, et que vous roulez dessus, après avoir passé le 1er objet, vous tomberez à travers le deuxième objet 😦 Pour contourner ce problème, vous conserver la position de l’objet attaché, le détacher, et le re positionner immédiatement.

Certains objets nécessitent d’utiliser une fonction manuelle pour ajuster l’alignement. Exemple avec la fonction de Killzone Kid:

[position de depart, direction , type d’objet, nombre d’objets, point attach X, point attach Y, point attach Z] call fnc_bridgeA3;

ArmA 3 variant

fnc_bridgeA3 = {
    private ["_start","_obj","_objPos","_objDir"];
    _start = createVehicle [_this select 2,_this select 0,[],0,"CAN_COLLIDE"];
    _start setVectorUp [0,0,1];
    _start setDir (_this select 1);
    _start setPosATL (_this select 0);
    for "_i" from 1 to (_this select 3) do {
        _obj = createVehicle [_this select 2,_this select 0,[],0,"CAN_COLLIDE"];
        _obj attachTo [_start, [_i*(_this select 4),_i*(_this select 5),_i*(_this select 6)]];
        _objPos = getPosATL _obj;
        _objDir = getDir _obj;
        detach _obj;
        _obj setDir _objDir;
        _obj setPosATL _objPos;
    };
};

Pont Stratis – Agias

[
    [2740,5640,0],
    60,
    "Land_Pier_small_F",
    10,
    3.5,
    30.65,
    0
] call fnc_bridgeA3;

Il est recommandé d’utiliser ces scripts uniquement du côté server, ce qui permet d’éviter les problèmes de localité et d’objets qui apparaissent en plusieurs exemplaires.

Cet article a été initialement rédigé par Killzone Kid, complété, corrigé par Code34

Votre commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l’aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google

Vous commentez à l’aide de votre compte Google. Déconnexion /  Changer )

Image Twitter

Vous commentez à l’aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l’aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s