Autore Topic: [SCRIPT] Dynamic Player Markers by aeroson  (Letto 2564 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

DuM3D0

  • Limbo
  • Nuovo arrivato
  • *
  • Post: 0
  • Cogito Ergo Doom
[SCRIPT] Dynamic Player Markers by aeroson
« il: 07 Novembre 2014, 20:21:16 »
Apro questa discussione per parlare dello script Dynamic Player Markers.

Questo è lo script che uso nella mia missione "Armi non Convenzionali" che permette di vedere i singoli giocatori in mappa o nel GPS, il problema è che quando un giocatore è a terra incosciente, questo sparisce dalla mappa e dal GPS come se il localizzatore si spengesse (cosa assurda).

Il fatto sta nel cambio di status del giocatore che può essere di 3 tipi come si può vedere in questa pagina

finchè è vivo si vede, quando e unconscious o meglio injured x ArmA 3 oppure morto, il segnale sparisce.

Qui sotto trovate il codice, alla riga 116 e 120 vediamo che l'autore ha scritto del codice per verificare e probabilmente visualizzare sulla mappa un player injured se viene usato il "BTC revive" o il "Norrin revive".

Codice: [Seleziona]
/*

AUTHOR: aeroson
NAME: player_markers.sqf
VERSION: 2.6

DOWNLOAD & PARTICIPATE:
https://github.com/aeroson/a3-misc
http://forums.bistudio.com/showthread.php?156103-Dynamic-Player-Markers

DESCRIPTION:
A script to mark players on map
All markers are created locally
Designed to be dynamic, small and fast
Shows driver/pilot, vehicle name and number of passengers
Click vehicle marker to unfold its passengers list
Lets BTC mark unconscious players
Shows Norrin's revive unconscious units
Shows who is in control of UAV unit

USAGE:
in (client's) init do:
0 = [] execVM 'player_markers.sqf';
this will show players for your side in multiplayer
or you and all ais on your side in singleplayer

to change this you can add any of the following options
"players" will show players
"ais" will show ais
"allsides" will show all sides not only the units on player's side
0 = ["player","ai"] execVM 'player_markers.sqf';
this will show all player and all ais, you can add allside if you want to show all sides
once you add any of these default behaviour is not used

*/
   
if (isDedicated) exitWith {}; // is server 
if (!isNil{aero_player_markers_pos}) exitWith {}; // already running
   
private ["_marker","_markerText","_temp","_unit","_vehicle","_markerNumber","_show","_injured","_text","_num","_getNextMarker","_getMarkerColor","_showAllSides","_showPlayers","_showAIs","_l"];

_showAllSides=false;
_showPlayers=false;
_showAIs=false;

if(count _this==0) then {
_showAllSides=false;
_showPlayers=true;
_showAIs=!isMultiplayer;
};
                         
{
_l=toLower _x;
if(_l in ["player","players"]) then {
_showPlayers=true;
};
if(_l in ["ai","ais"]) then {
_showAIs=true;
};
if(_l in ["allside","allsides"]) then {
_showAllSides=true;
};
} forEach _this;

aero_player_markers_pos = [0,0];
onMapSingleClick "aero_player_markers_pos=_pos;";

_getNextMarker = {
private ["_marker"];
_markerNumber = _markerNumber + 1;
_marker = format["um%1",_markerNumber];
if(getMarkerType _marker == "") then {
createMarkerLocal [_marker, _this];
} else {
_marker setMarkerPosLocal _this;
};
_marker;
};

_getMarkerColor = {
[(((side _this) call bis_fnc_sideID) call bis_fnc_sideType),true] call bis_fnc_sidecolor;
};

while {true} do {
 
waitUntil {
sleep 0.025;
true;
};

_markerNumber = 0;

// show players or player's vehicles
{
_show = false;
_injured = false;
_unit = _x;

if(
(
(_showAIs && {!isPlayer _unit} && {0=={ {_x==_unit} count crew _x>0} count allUnitsUav}) ||
(_showPlayers && {isPlayer _unit})
) && {
_showAllSides || side _unit==side player
}
) then {
if((crew vehicle _unit) select 0 == _unit) then {
_show = true;
};
if(!alive _unit || damage _unit > 0.9) then {
_injured = true;
};  
if(!isNil {_unit getVariable "hide"}) then {
_show = false;
}; 
if(_unit getVariable ["BTC_need_revive",-1] == 1) then {
_injured = true;
_show = false;
};  
if(_unit getVariable ["NORRN_unconscious",false]) then {
_injured = true;
};  
};
 
if(_show) then {
_vehicle = vehicle _unit;   
_pos = getPosATL _vehicle;  
_color = _unit call _getMarkerColor; 

_markerText = _pos call _getNextMarker;
_markerText setMarkerColorLocal _color;
  _markerText setMarkerTypeLocal "c_unknown";      
_markerText setMarkerSizeLocal [0.8,0];

_marker = _pos call _getNextMarker;
_marker setMarkerColorLocal _color;
_marker setMarkerDirLocal getDir _vehicle;
_marker setMarkerTypeLocal "mil_triangle";
_marker setMarkerTextLocal "";
if(_vehicle == vehicle player) then {
_marker setMarkerSizeLocal [0.8,1];
} else {
_marker setMarkerSizeLocal [0.5,0.7];
};

  if(_vehicle != _unit && !(_vehicle isKindOf "ParachuteBase")) then {
_text = format["[%1]", getText(configFile>>"CfgVehicles">>typeOf _vehicle>>"DisplayName")];
if(!isNull driver _vehicle) then {
_text = format["%1 %2", name driver _vehicle, _text];
};

if((aero_player_markers_pos distance getPosATL _vehicle) < 50) then {
aero_player_markers_pos = getPosATL _vehicle;
_num = 0;
{
if(alive _x && isPlayer _x && _x != driver _vehicle) then {
_text = format["%1%2 %3", _text, if(_num>0)then{","}else{""}, name _x];
_num = _num + 1;
};
} forEach crew _vehicle;
} else {
_num = {alive _x && isPlayer _x && _x != driver _vehicle} count crew _vehicle;
if (_num>0) then {
if (isNull driver _vehicle) then {
_text = format["%1 %2", _text, name (crew _vehicle select 0)];
_num = _num - 1;
};
if (_num>0) then {
_text = format["%1 +%2", _text, _num];
};
};
};
} else {
_text = name _x;
};
_markerText setMarkerTextLocal _text;
};

} forEach allUnits;


// show player controlled uavs
{
if(isUavConnected _x) then {
_unit=(uavControl _x) select 0;
if(
(
(_showAIs && {!isPlayer _unit}) ||
(_showPlayers && {isPlayer _unit})
) && {
_showAllSides || side _unit==side player
}
) then {
_color = _x call _getMarkerColor;    
_pos = getPosATL _x;

_marker = _pos call _getNextMarker;
_marker setMarkerColorLocal _color;
_marker setMarkerDirLocal getDir _x;
_marker setMarkerTypeLocal "mil_triangle";
_marker setMarkerTextLocal "";
if(_unit == player) then {
_marker setMarkerSizeLocal [0.8,1];
} else {
_marker setMarkerSizeLocal [0.5,0.7];
};
 
_markerText = _pos call _getNextMarker;
_markerText setMarkerColorLocal _color;    
_markerText setMarkerTypeLocal "c_unknown";
_markerText setMarkerSizeLocal [0.8,0];
_markerText setMarkerTextLocal format["%1 [%2]", name _unit, getText(configFile>>"CfgVehicles">>typeOf _x>>"DisplayName")];
};
};
} forEach allUnitsUav;




_markerNumber = _markerNumber + 1;
_marker = format["um%1",_markerNumber];
while {(getMarkerType _marker) != ""} do {
deleteMarkerLocal _marker;
_markerNumber = _markerNumber + 1;
_marker = format["um%1",_markerNumber];
};

};

Ho chiesto sul forum BIS nel thread del Dynamic Player Markers ma mi ha risposto un tizio (non l'autore dello script) con un codice che probabilmente non serve ad una mazza, fatto sta che alla richiesta di ulteriori delucidazioni nessuno mi ha risposto.

Ora la mia conoscenza di programmazione è molto limitata ma chiedo a qualcuno di voi programmatori se possiamo essere in grado di aggiungere la possibilità di visualizzare i player injured anche con il mod AGM, qui trovate la loro wiki su GitHub.

Al momento con Pietro abbiamo provato alla riga 123 ad aggiungere il codice sottostante ma senza successo.

Codice: [Seleziona]
if(_unit getVariable ["AGM_Unconscious", true]) then {
                _injured = true;
            };
« Ultima modifica: 24 Marzo 2016, 18:53:07 da [TS]Epok »

[TS]Uait

  • CIUCCIO SPAMMER!!!SPACCIATORE DI DEMENZA!!!! turubistico e poi speperteristico e anche speperefistico
  • Limbo
  • Utente storico
  • *****
  • Post: 7603
Re:Dynamic Player Markers
« Risposta #1 il: 12 Novembre 2014, 15:04:26 »
o dio

era lo stesso problema della domiuait per i mezzi

ricordate che i mezzi avevano i marker? quando esplodevano era un casino perche' i marker o sparivano o rimanevano dove il mezzo era distrutto

purtroppo non riesco a ricordare come avevo risolto... dovrei avere un paio d'ore per aiutarti...
Citazione da: Eschifa
HA RAGIONE UAIT  :LOL:
Citazione da: Eschifa
Però ha ragione Uait (pd mo mi preoccupa sto fatto  :asd: )
Citazione da: Zago
INCREDIBILE MA PER ESSERE UN CIUCCIO STAVOLTA UAIT HAI FATTO DAVVERO UN CAPOLAVORO!!!  :rulez: :rulez: :rulez:

DuM3D0

  • Limbo
  • Nuovo arrivato
  • *
  • Post: 0
  • Cogito Ergo Doom
Re:Dynamic Player Markers
« Risposta #2 il: 16 Novembre 2014, 15:15:02 »
Mi ha risposto il creatore dello script:


Citazione da: aeroson
Citazione da: DuM3D0
Hi I wrote some time ago on your thread asking about showing unconscious player so to help medic to find them?

You replied: @DuM3D0: setUnconscious players are switched to different side i believe. Or if you have BTC revive enabled: BTC revive shows its own marker, that is why dynamic player markers hide its player marker in such case.

But as I said I don't use BCT revive, I use AGM, is there a way to show unconsciuos player? I need to set "true" somewhere in the script or need to add some new code?

You say, unconsciuos players are switched to different side, do you know how to show also this side to all other players?

tnx


Mate iam sorry for not answering, i've been doing some tests. And trying to figure this out for a while. I know others do it just globally for everyone. The problem is this script can be local. And i have no idea how to do that properly locally. One day i will figure it out.

[TS]PietroTC

  • Tornado Squad
  • Utente storico
  • ****
  • Post: 4168
  • E' tempo di ........
    • Tornado Squad
Re:Dynamic Player Markers
« Risposta #3 il: 28 Novembre 2014, 14:56:27 »
Novità?
When that command remains, no matter what happens to its officer, he has not failed.

Se l'unità rimane, qualsiasi cosa avvenga al suo ufficiale, lui non è sconfitto.

DuM3D0

  • Limbo
  • Nuovo arrivato
  • *
  • Post: 0
  • Cogito Ergo Doom
Re:Dynamic Player Markers
« Risposta #4 il: 28 Novembre 2014, 17:58:26 »
Beh se non ha idea lui di come funzioni sto coso figurati io..  :disgust:

DuM3D0

  • Limbo
  • Nuovo arrivato
  • *
  • Post: 0
  • Cogito Ergo Doom
Re:Dynamic Player Markers
« Risposta #5 il: 10 Giugno 2015, 18:56:45 »
Allora, voglio rimettere mano su questo script.

Un tizio sul forum bis dove avevo chiesto una mano, al tempo mi rispose con questo:

Maybe something like this in the loop somewhere: (io gli volevo rispondere Maybe something like tu madre troia in the street somewhere)  :azz:

Codice: [Seleziona]
if ( ( lifeState _unit ) == "UNCONSCIOUS" ) then {
    _marker setMarkerType "Warning";
} else {
    _marker setMarkerType _defaultType;
}; 

Ma è stato veramente troppo vago e non si capisce dove cazzo debba mettere sto codice, lui poi non mi ha più risposto quindi inutile, però Aeroson l'autore dello script più sotto mi risponde così:

@DuM3D0: setUnconscious players are switched to different side i believe. Or if you have BTC revive enabled: BTC revive shows its own marker, that is why dynamic player markers hide its player marker in such case.

Ora lasciamo un attimo da parte sta roba e ricapitoliamo: da qualche parte nel codice dello script c'è un check che verifica se il giocatore è vivo o è in un mezzo o altro. Il codice verifica (presumo funzioni) se qualcuno non è coscente e lo marca come "injured" se la missione usa il Norrin revive o il BTC revive con questi 2 pezzi di codice:

Codice: [Seleziona]
if(_unit getVariable ["NORRN_unconscious",false]) then {
_injured = true;
};
Codice: [Seleziona]
if(_unit getVariable ["BTC_need_revive",-1] == 1) then {
_injured = true;
_show = false;
};

Io da quel poco che capisco di programmazione presumo che getVariable verifica la variabile "NORRN_unconscious" e la confronta se ha il valore false. Se la condizione è vera allora (then) da alla variabile _injured il valore true e presumo quindi che faccia vedere in mappa un marker con la posizione.
Non capisco il codice del BTC revive, lo confronta con il valore -1 però poi non capisco == 1 ma forse capisco perchè dopo il then mette _show = false, come dice Aeroson "BTC revive shows its own marker, that is why dynamic player markers hide its player marker in such case."

Ma poniamo il caso che usiamo il sistema del Norrin revive, ci serve quindi sapere il nome della variabile che ACE usa per far sapere che un giocatore è privo di conoscienza, quindi mi sono messo a spulciare il codice dei PBO di ACE ed ho trovato questo: fnc_setUnconscious.sqf dove alla riga 27 troviamo:

Codice: [Seleziona]
if (_set isEqualTo (_unit getVariable ["ACE_isUnconscious", false])) exitWith {};
C'è una lievissima somiglianza al "getVariable ["NORRN_unconscious",false]" quindi possiamo provare a fare un test in quel senso, ma se vedete nel mio primo post, in fondo c'è un codice che avevamo già provato con AGM e che non andava, ma adesso forse ho capito qualcosa di diverso e andando a rivedere i post forse ho trovato una via diversa.

Perchè? Perchè probabilmente come dice Aeroson setUnconscious players are switched to different side quindi i giocatori essendo in un altra fazione NON vengono visualizzati dallo script perchè lo script è settato per visualizzare tutti i giocatori della tua fazione: this will show players for your side in multiplayer si legge in cima ai commenti dello script dove viene spiegato un pò l'uso.
Una verifica sul fatto che i giocatori privi di conoscenza vengano spostati in un altra fazione forse è qui sempre nel file fnc_setUnconscious.sqf di ACE dove alla linea 86 troviamo:

Codice: [Seleziona]
// So the AI does not get stuck, we are moving the unit to a temp group on its own.
//Unconscious units shouldn't be put in another group #527:
if (GVAR(moveUnitsFromGroupOnUnconscious)) then {
    [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide);
};

Sia dal commento che dalla presenza di questo side group credo si possa dedurre che i giocatori privi di conoscenza vengano veramente spostati di fazione, allora quindi potremo provare questo:

0 = ["players","allsides"] execVM 'player_markers.sqf';

Questo sta nell'init.sqf e fà partire lo script che appunto uso sempre nelle mie mix per visualizzare i giocatori sulla mappa e nel GPS, di default è così

0 = [] execVM 'player_markers.sqf';

Quindi come ho scritto prima this will show players for your side in multiplayer. Ma con la versione con 0 = ["players","allsides"] execVM 'player_markers.sqf';  forse è possibile visualizzare tutte le fazioni (eccetto le IA) e quindi forse è possibile usare sta cosa come "workaround".

Ulteriore prova a favore di questo è che quando moriamo (in agm o in ace) se abbiamo il gps acceso vediamo soltanto il nostro marker al centro ma di colore viola e se ben ricordo il colore viola indica i civili.

Ovviamente mi serve gente per fare i test, non mi posso dare una pistolettata in testa perchè sarei da solo e che ne so se mi vedono gli altri giocatori?

Gente date una mano.
« Ultima modifica: 10 Giugno 2015, 20:00:10 da [TS]DuM3D0 »

DuM3D0

  • Limbo
  • Nuovo arrivato
  • *
  • Post: 0
  • Cogito Ergo Doom
Re:Dynamic Player Markers
« Risposta #6 il: 10 Giugno 2015, 22:27:33 »
Stasera prima di cena con Orso e Pietro abbiamo fatto un test, ho modificato la mia [TS]Co14_Test_MCC_ACE_v2 modificando prima di tutto il comando che lancia lo script Dynamic Player Markers da init.sqf della missione.

Prima era:

0 = [] execVM "scripts\player_markers.sqf";

ora è:

0 = ["players","allsides"] execVM "scripts\player_markers.sqf";

Come avevo intuito il sistema ACE mette i giocatori privi di conoscenza nella fazione side che in pratica è la fazione dei civili, presumo perchè in questo modo anche se "vivi" non vengono targettati dalle IA.

Così è come normalmente vedete i giocatori in mappa (o nel GPS):

by Dumedo, on Flickr

Così invece adesso è come si vede quando un giocatore è privo di conoscenza:

by Dumedo, on Flickr

I suddetti giocatori vengono visualizzati in VIOLA come in questo caso Orso, quindi tutti ma sopratutto i medici protranno vedere chi è a terra.

Questa è soltanto una via di mezzo, in realtà nello script come ho detto nel mio post precendente si dovrebbero credo vedere i giocatori privi di conoscenza con un icona particolare ma ancora non sono riuscito a capire come poter fare. Non posso vedere come si vedrebbero i giocatori privi di conoscenza perchè dovrei installare i sistemi di revive per i quali lo script è stato fatto ma sarebbe troppo complicato o meglio non ho voglia di testare un revive script 8e imparare ad usarlo) solo per fare questo test, quindi proverò a chiedere info sul forum di ACE per capire qual'è la variabile e quale valore prende quando c'è un giocatore privo di conoscenza per poi fare ulteriori prove.

 :rulez: