Script de recarga de vehículos sin uso de setVehicleAmmo

Sección para misiones y edición ArmA III

Moderador: C. Misiones & Noticias

Avatar de Usuario
Robin
Visitante
Mensajes: 1340
Registrado: 26 Jul 2015, 09:34

Script de recarga de vehículos sin uso de setVehicleAmmo

Mensaje por Robin »

Este código lo saqué ayer para una misión que tenemos en marcha y lo saqué porque el setVehicleAmmo no me acababa de funcionar como yo quería en modo servidor dedicado.

Matiz: helipuerto2 es un trigger en mapa, activado por players, "no exclusivo para servidor dedicado" y repetible.

El script lo que hace es revisar que el vehículo esté apagado y a una distancia mínima del trigger. Se interrumple si enciendes el motor de vehículo.

El valor 3 que representa el "multiplicador" sirve para acelerar el proceso de repostaje de fuel.

La recarga va en función de la munición actual y lo que hace básicamente es retirar la munición a medias por una nueva completa. Entre descarga y carga se dejan 3 segundos.

Se puede apreciar que se ejecuta con el comando "spawn" para que los "sleep" tengan validez dentro del trigger. El código spawneado se finaliza una vez se ha completado, eliminándolo así de la cola de procesos del servidor.

Los mensajes que se usan, están pensados para hacerlos llegar exclusivamente a la tripulación del vehículo que permanece dentro de este. Si se desmonta del vehículo no se recibirá los mensajes pero el proceso continuará.

El script, seguro que es mejorable; así que si alguien lo mejora, simplemente que añada los cambios ;)

Código: Seleccionar todo

/* Repostaje de helicopteros sin setVehicleAmmo */
private ["_myspawnid"];
_myspawnid = [helipuerto2,3] spawn {
    private ["_trigger","_multiplicador","_vehicle","_fuel","_ammo","_maxammo","_currentMagazineDetail","_currentammo"];
    _trigger = _this select 0;
    _multiplicador = _this select 1;
    _vehicle = (_trigger nearEntities ["Air",15] select 0);
    if (((count fullCrew _vehicle) > 0) and (_trigger distance2D _vehicle < 10)) then {
        _ammo=0;
        _maxammo=0;
        {
            _ammo = _ammo + (_x select 2);
            _currentMagazineDetail = _x select 0;
            _txt2number = parseNumber _currentMagazineDetail;
            if ( _txt2number > 0 ) then { _maxammo = _maxammo + _txt2number; };
        } forEach (magazinesAllTurrets _vehicle);

        waitUntil { !(isEngineOn _vehicle) };
        sleep 3;
        if (fuel _vehicle < 1) then {
            _fuel = fuel _vehicle;
            [_vehicle,"Iniciando el repostaje del vehículo."] remoteExec ["vehicleChat",_vehicle,true];
            for [{ _i = _fuel; }, { _i < 1 }, { _i = _i + (0.0000001*_multiplicador); }] do {
               if (isEngineOn _vehicle) exitWith { [_vehicle,"Interrumpiste el repostaje..."] remoteExec ["vehicleChat",_vehicle,true]; };
               _vehicle setFuel _i;
            };
            [_vehicle,"Finalizó el repostaje del vehículo."] remoteExec ["vehicleChat",_vehicle,true];
        };
        if (_ammo < _maxammo and !(isEngineOn _vehicle)) then {
            [_vehicle,"Iniciando el rearme del vehículo."] remoteExec ["vehicleChat",_vehicle,true];
                {
                    if (isEngineOn _vehicle) exitWith { [_vehicle,"Interrumpiste el rearme..."] remoteExec ["vehicleChat",_vehicle,true]; };
                    _currentMagazineDetail = _x select 0;
                    _turretPath = _x select 1;
                    _currentammo = _x select 2;
                    _txt2number = parseNumber _currentMagazineDetail;
                    if ( (_txt2number > 0) and (_currentammo < _txt2number) ) then {
                        [_vehicle,format ["Retirando... %1",_currentMagazineDetail]] remoteExec ["vehicleChat",_vehicle,true];
                        [_vehicle,[_currentMagazineDetail,_turretPath]] remoteExec ["removeMagazineTurret",owner _vehicle];
                        sleep 3;
                        [_vehicle,format ["Cargando... %1",_currentMagazineDetail]] remoteExec ["vehicleChat",_vehicle,true];
                        [_vehicle,[_currentMagazineDetail,_turretPath]] remoteExec ["addMagazineTurret",owner _vehicle];
                        sleep 3;
                    };
                } forEach (magazinesAllTurrets _vehicle);
        };
        [_vehicle,"Finalizó el rearme del vehículo."] remoteExec ["vehicleChat",_vehicle,true];
    };
};
if (scriptDone _myspawnid) then { terminate _myspawnid; };
Rangers lead the way! All the way.
Imagen

Responder