Français essai de script pour prison

26/3/20
148
10
4
1 100
bonjour,
j'ai voulu tenter un script de mise en prison avec temps définie et zone pour alerte évasion mais je rencontre un souci après plusieurs essai je vois pas ce qui coince peut être la fatigue qui m’empêche de voir ce qui cloche du coup je le présente ici si quelqu'un vois le souci car j’essaie d'envoyé en prison rien ce passe l’idéal aurai était sélectionner un joueur proche dans un menu pour envoyé le bon et pas que le joueur a proximité mais bon


Code:
/*
    [_prisoner] call TAG_fnc_alertEscape;
    Script exécuté UNIQUEMENT sur les clients
    Seuls les gendarmes voient l'alerte
*/

params ["_prisoner"];

// 🔒 Sécurité : client uniquement
if (!hasInterface) exitWith {};
if (isNull _prisoner) exitWith {};

// Vérification gendarme
if (playerSide != west) exitWith {};

// =====================
// DONNÉES ÉVASION
// =====================
private _prisonerName = name _prisoner;
private _escapePos = getPosATL _prisoner;
private _time = format [
    "%1:%2",
    date select 3,
    [date select 4, 2] call BIS_fnc_zeroPad
];

// =====================
// MESSAGE
// =====================
private _alertMsg = format [
    "🚨 ALERTE ÉVASION 🚨\n\nDétenu : %1\nPosition : %2\nHeure : %3\n\n⚠️ PEINE ANNULÉE ⚠️\nNouvelle peine requise.\n\nDernière position marquée sur la carte.",
    _prisonerName,
    mapGridPosition _escapePos,
    _time
];

hint _alertMsg;

// =====================
// MARQUEUR LOCAL (gendarmes uniquement)
// =====================
private _markerName = format [
    "escape_%1_%2",
    getPlayerUID _prisoner,
    diag_tickTime
];

private _marker = createMarkerLocal [_markerName, _escapePos];
_marker setMarkerType "mil_warning";
_marker setMarkerColor "ColorRed";
_marker setMarkerText format ["ÉVASION: %1", _prisonerName];
_marker setMarkerSize [1, 1];

// Suppression après 5 minutes
[_markerName] spawn {
    params ["_mName"];
    sleep 300;
    deleteMarkerLocal _mName;
};

// =====================
// SON
// =====================
playSound "FD_Timer_F";

Code:
params ["_unit", "_minutes"];

if (isNull _unit) exitWith {};
if (!alive _unit) exitWith {};

private _jailPos = getMarkerPos "mrk_prison";
private _exitPos = getMarkerPos "mrk_prison_sortie";
private _time    = _minutes * 60;

// ✅ Téléportation forcée SUR LA MACHINE DU JOUEUR
[_unit, _jailPos] remoteExec ["setPosATL", _unit];

_unit setVariable ["isJailed", true, true];
_unit setVariable ["isEscaped", false, true];
_unit setVariable ["jailEndTime", serverTime + _time, true];
_unit setVariable ["originalSentence", _minutes, true];


// =====================
// FIN DE PEINE
// =====================
[_unit, _time, _exitPos] spawn {
    params ["_u", "_t", "_outPos"];

    sleep _t;

    if (
        !isNull _u &&
        alive _u &&
        {_u getVariable ["isJailed", false]} &&
        {!(_u getVariable ["isEscaped", false])}
    ) then {

        _u setVariable ["isJailed", false, true];
        _u setVariable ["jailEndTime", nil, true];
        _u setVariable ["originalSentence", nil, true];

        [_u, _outPos] remoteExec ["setPosATL", _u];

        // ✅ hint côté joueur uniquement
        ["Vous avez terminé votre peine, vous êtes libre."] remoteExec ["hint", _u];
    };
};


// =====================
// DÉTECTION D'ÉVASION
// =====================
[_unit] spawn {
    params ["_prisoner"];

    while {alive _prisoner && {_prisoner getVariable ["isJailed", false]}} do {
        sleep 2;

        if (!(_prisoner inArea "mrk_prison_zone")) then {

            _prisoner setVariable ["isEscaped", true, true];
            _prisoner setVariable ["isJailed", false, true];
            _prisoner setVariable ["jailEndTime", nil, true];

            [_prisoner] remoteExec ["TAG_fnc_alertEscape", 0];

            ["🚨 Vous vous êtes évadé !"] remoteExec ["hint", _prisoner];

            break;
        };
    };
};

Code:
params ["_panneau"];

// Ajout de la fonction d'évasion
if (isNil "TAG_fnc_alertEscape") then {
    TAG_fnc_alertEscape = compile preprocessFileLineNumbers "scripts\fn_alertEscape.sqf";
    publicVariable "TAG_fnc_alertEscape";
};

// Fonction locale pour récupérer le joueur le plus proche dans un rayon de 5 m
_fnc_getNearestPlayer = {
    params ["_caller"];

    private _radius = 5;
    private _nearPlayers = playableUnits select {
        _x != _caller && {alive _x} && {_x distance _caller <= _radius}
    };

    if ((count _nearPlayers) == 0) exitWith {
        hint "Aucun joueur à proximité (<= 5 m).";
        objNull
    };

    // Tri par distance (le plus proche en premier)
    _nearPlayers sort true;
    private _target = _nearPlayers select 0;

    // Affiche le nom et la distance
    hint format ["Cible : %1 (%.1f m)", name _target, _target distance _caller];

    _target
};

// Actions de prison
this addAction ["Prison 2 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 2] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 5 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 5] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 10 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 10] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 15 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 15] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 20 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 20] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 25 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 25] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 30 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 30] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 35 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 35] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 40 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 40] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 45 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 45] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 50 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 50] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 55 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 55] execVM "scripts\fn_jail.sqf";
    };
}];

this addAction ["Prison 60 min", {
    params ["_panneau", "_caller"];
    private _target = [_caller] call _fnc_getNearestPlayer;
    if !(isNull _target) then {
        [_target, 60] execVM "scripts\fn_jail.sqf";
    };
}];

Code:
params ["_caller", "_players", "_minutes"];

if (count _players == 0) exitWith { hint "Aucun joueur à proximité."; };

// Créer le dialogue
private _display = findDisplay 46 createDisplay "RscDisplayEmpty";
if (isNull _display) exitWith { hint "Erreur: impossible de créer le menu."; };

// Position et taille
private _x = (safeZoneX + (safeZoneW / 2)) - 0.2;
private _y = (safeZoneY + (safeZoneH / 2)) - 0.25;
private _w = 0.4;
private _h = 0.5;

// Fond
private _bg = _display ctrlCreate ["RscBackground", -1];
_bg ctrlSetPosition [_x, _y, _w, _h];
_bg ctrlSetBackgroundColor [0, 0, 0, 0.9];
_bg ctrlCommit 0;

// Titre
private _title = _display ctrlCreate ["RscText", -1];
_title ctrlSetPosition [_x, _y, _w, 0.06];
_title ctrlSetText "Choisir le joueur à emprisonner:";
_title ctrlSetTextColor [1, 1, 1, 1];
_title ctrlSetFont "PuristaMedium";
_title ctrlSetFontHeight 0.045;
_title ctrlCommit 0;

// Créer les boutons pour chaque joueur
{
    private _idx = _forEachIndex;
    private _playerObj = _x;
    private _playerName = if (!isNull _playerObj) then { name _playerObj } else { "Inconnu" };
    private _distance = if (!isNull _playerObj) then { round (_playerObj distance _caller) } else { 0 };
    
    private _btnY = _y + 0.08 + (_idx * 0.05);
    private _btn = _display ctrlCreate ["RscButton", -1];
    _btn ctrlSetPosition [_x + 0.02, _btnY, _w - 0.04, 0.045];
    _btn ctrlSetText format ["%1. %2 (%3 m)", _idx + 1, _playerName, _distance];
    
    // Stocker l'index et le joueur dans le bouton
    _btn setVariable ["playerIndex", _idx];
    _btn setVariable ["targetPlayer", _playerObj];
    
    _btn ctrlAddEventHandler ["ButtonClick", {
        params ["_ctrl"];
        
        private _display = ctrlParent _ctrl;
        private _target = _ctrl getVariable "targetPlayer";
        private _minutes = _display getVariable "TAG_minutes";
        
        if (!isNull _target) then {
            hint format ["%1 envoyé en prison pour %2 minutes.", name _target, _minutes];
            [_target, _minutes] execVM "scripts\fn_jail.sqf";
        };
        
        _display closeDisplay 0;
    }];
    
    _btn ctrlCommit 0;
} forEach _players;

// Stocker les minutes pour les boutons
_display setVariable ["TAG_minutes", _minutes];

// Bouton Annuler
private _cancelY = _y + 0.08 + (count _players * 0.05) + 0.02;
private _cancelBtn = _display ctrlCreate ["RscButton", -1];
_cancelBtn ctrlSetPosition [_x + 0.02, _cancelY, _w - 0.04, 0.045];
_cancelBtn ctrlSetText "Annuler";
_cancelBtn ctrlAddEventHandler ["ButtonClick", {
    params ["_ctrl"];
    private _display = ctrlParent _ctrl;
    _display closeDisplay 0;
}];
_cancelBtn ctrlCommit 0;

en panneua sur eden j'ai mit ça :

Code:
this execVM "scripts\init_prison_panel.sqf";

et bien evidement mis les marqueur a l'interieur de la prison un a l'exterieur pour la sortir et un pour la zone d'evasion

merci a celui qui vois de ou le souci peut venir