broma-arma / BromA-Framework-A3-Addon

The addon version of the BromA Framework for ArmA 3.
5 stars 9 forks source link

Randomly Arma'd when player gets in as driver #201

Open Coryf88 opened 1 year ago

Coryf88 commented 1 year ago

Example

I originally thought this was caused by RHS's engine start script, but I'm having doubts after reviewing the code again. For reference/testing: RHS_ENGINE_STARTUP_OFF = true; disables RHS's engine start script.

Perhaps ejection of the dead body causes it? Similar to driving over AI. Though, I can only recall occurrences where it affected RHS.

Royallle commented 1 year ago

Anyway to replicate the error?

Coryf88 commented 1 year ago

Probably not in single player, I have a feeling that a locality change is needed for it to occur. So, replication would probably be:

  1. Join dedicated server.
  2. Spawn test vehicle.
  3. AI, local to server/HC, get in as driver.
  4. AI get out.
  5. Player get in as driver.
  6. Observe.
  7. Repeat step 3+.
Coryf88 commented 1 year ago

I didn't have any luck replicating it.

Spawn Server AI (Local exec)

[player, { private _unit = createGroup [side _this, true] createUnit ["B_Survivor_F", getPosWorld _this select [0, 2], [], 0, "NONE"]; { _x addCuratorEditableObjects [[_unit], false] } forEach allCurators; }] remoteExec ["call", 2];

Spawn HC AI (Local exec)

[player, { private _unit = createGroup [side _this, true] createUnit ["B_Survivor_F", getPosWorld _this select [0, 2], [], 0, "NONE"]; [_unit, { { _x addCuratorEditableObjects [[_this], false] } forEach allCurators; }] remoteExec ["call", 2]; }] remoteExec ["call", entities "HeadlessClient_F" select 0];

HC Auto-test with dead driver (Local exec)

[["UK3CB_CW_SOV_O_EARLY_BMP1", 10, player], {
    params ["_vehicleClass", "_attempts", "_player"];
    private _pos = getPosWorld _player;
    private _side = side _player;
    private _vehicle = createVehicle [_vehicleClass, _pos select [0, 2]];
    private _hc = entities "HeadlessClient_F" select 0;
    private _hcClient = owner _hc;
    _pos = getPosWorld _vehicle;
    private _group = createGroup [_side, false];
    _group setGroupOwner _hcClient;
    private _running = true;
    sleep 1;
    while { _running && _attempts > 0 } do {
        [[_group, _pos], {
            params ["_group", "_pos"];
            private _unit = _group createUnit ["B_Survivor_F", _pos select [0, 2], [], 0, "NONE"];
        }] remoteExec ["call", _hc];
        sleep 0.01;
        waitUntil { { alive _x } count units _group > 0 };
        private _ai = units _group select { alive _x } select 0;
        [_ai, _vehicle] remoteExec ["moveInDriver", _hc];
        waitUntil { owner _vehicle == _hcClient };
        _ai setDamage 1;

        [_player, ["getInDriver", _vehicle]] remoteExec ["action", remoteExecutedOwner];
        waitUntil { !local _vehicle && owner _vehicle == remoteExecutedOwner };
        sleep 2;

        if ((getPosWorld _vehicle) distanceSqr _pos > 1) then {
            _running = false;
            ["Arma'd"] remoteExec ["systemChat", remoteExecutedOwner];
        } else {
            _player moveOut _vehicle;
            waitUntil { driver _vehicle != _player };
            sleep 1;
            _attempts = _attempts - 1;
        };
        deleteVehicle _ai;
    };

    deleteGroup _group;
    deleteVehicle _vehicle;

    if (_attempts < 1) then {
        ["Test attempts exhausted"] remoteExec ["systemChat", remoteExecutedOwner];
    } else {
        ["Test complete"] remoteExec ["systemChat", remoteExecutedOwner];
    };
}] remoteExec ["spawn", 2];