Teraz jest Cz 05 mar, 2026 16:56


Jednistki w JIP

Dział poświęcony edytorowi ArmA II i Operation Arrowhead, czyli tworzeniu misji.
  • Autor
  • Wiadomość
Offline
Avatar użytkownika

kondor

Major

Major

  • Posty: 880
  • Dołączył(a): Pt 11 lut, 2005 04:00
  • Lokalizacja: Berlin (wschodni)

PostN 16 maja, 2010 12:28

1. A jeśli gracz z wyłączonego dla AI slotu wyjdzie? Zmienna GCE_pNUMER będzie nullem!
2. Sprawdzałeś komendy: http://community.bistudio.com/wiki/onPlayerConnected oraz http://community.bistudio.com/wiki/onPlayerDisconnected - jeśli w nich da się pobrać obiekt dołączanego gracza, wówczas cała ta synchronizacja, w której być może chowa się kilka bugów, nie będzie potrzebna
3.
Kod: Zaznacz cały
waitUntil {!(isNil {player}) AND (player == player)};
player nigdy nie jest nilem, lecz (gdy JIP) nullem, czyli powinno być ! isNull player. Ale wystarczy sprawdzać 1 warunek, czyli player == player wystarczy
Kod: Zaznacz cały
if(true) exitWith {};
na końcu skryptu to jest niepotrzebne, chyba, że ten skrypt jest includowany poprzez "#include"
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

PostN 16 maja, 2010 19:10

Oglądałem te komendy, ale z tego, co tam jest napisane przekazywane jest _name i _id, z czego pierwsze, to jak rozumiem imię gracza, a więc niezbyt przydatne, ale być może jestem przyślepy ;).

Edit:

Co do drugiej sprawy - pusty GCE_pNUMBER nie boli mnie w żaden sposób, bo dodawana jest grupa i wszystkie jednostki w niej s a sorawdzane na odległość poprzez units(group). Po wyjściu jednostki bez włączonego AIka i jeżeli jest ostatnią w niej jednostką, to w GCE_Groups zostaje <grpnull>, które jest usuwane przez JIPmanagement.sqf.

Ale dzięki za uwagę :).
Obrazek
Offline
Avatar użytkownika

kondor

Major

Major

  • Posty: 880
  • Dołączył(a): Pt 11 lut, 2005 04:00
  • Lokalizacja: Berlin (wschodni)

PostPn 17 maja, 2010 17:18

Oglądałem te komendy, ale z tego, co tam jest napisane przekazywane jest _name i _id, z czego pierwsze, to jak rozumiem imię gracza, a więc niezbyt przydatne, ale być może jestem przyślepy ;) .

Możesz pobrać jednostkę poprzez badanie w pętli, czy któreś z (name GCE_pNUMBER) nie równa się _name. Czyli coś takiego:
Kod: Zaznacz cały
getUnitByName =
{
  private ["_str", "_unit", "_i", "_name", "_res"];
  _name = _this select 0;
  for "_i" from 0 to (MAX_GROUP - 1) do
  {
    _str = format ["GCE_p%1", _i];
    if (not isNil _str) then
    {
       if (_name == (name call compile _str)) then
       {
          //przydalby sie jeszcze jakis break
          _res = call compile _str;
       };
    };
  };
  _res
};

addGroupToGCE =
{
  GCE_Groups = GCE_Groups + [_this select 0];
};

onPlayerConnected = "[group ([_name] call getUnitByName)] call addGroupToGCE;";
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

PostWt 18 maja, 2010 07:26

kondor napisał(a):
Kod: Zaznacz cały
getUnitByName =
{
  private ["_str", "_unit", "_i", "_name", "_res"];
  _name = _this select 0;
  for "_i" from 0 to (MAX_GROUP - 1) do
  {
    _str = format ["GCE_p%1", _i];
    if (not isNil _str) then
    {
       if (_name == (name call compile _str)) then
       {
          //przydalby sie jeszcze jakis break
          _res = call compile _str;
       };
    };
  };
  _res
};

addGroupToGCE =
{
  GCE_Groups = GCE_Groups + [_this select 0];
};

onPlayerConnected "[group ([_name] call getUnitByName)] call addGroupToGCE;";

Świetny pomysł, warty potestowania.
Rzecz w tym, że jezeli onPlayerConnected jest wykonywany w czasie, gdy gracz ma jeszcze ekran ładowania, to nie zostanie on dodany, bo jeszcze nie ma jednostki w grze.
Kod: Zaznacz cały
hint format["%1", player];

w pliku init.sqf wyrzuca <null>, a serwer też może nie widzieć jednostki GCE_pNUMBER.
Obrazek
Offline
Avatar użytkownika

kondor

Major

Major

  • Posty: 880
  • Dołączył(a): Pt 11 lut, 2005 04:00
  • Lokalizacja: Berlin (wschodni)

PostWt 18 maja, 2010 12:08

Kod: Zaznacz cały
hint format["%1", player];
nie ma wiele wspolnego z onPlayerConnected
http://community.bistudio.com/wiki/6thS ... ialization
onPlayerConnected wykonuje sie tylko na serwerze, a player dziala na kliencie. Z punktu widzenia logiki misji, sa zupelnie niezalezne od siebie i uzywanie komendy player w onPlayerConnected jest zle (choc dziala w przypadku niededykowanych serwerow).
Na pewno dziala (testowalem dzialanie onPlayerConnected, nie to co napisalem powyzej) dla nie JIP. Dla JIP nie testowalem (w pojedynke trudno przetestowac, mimo ustawienia serwera jako persistence)
onPlayerConnected odpali sie, gdy gracz sie podlaczy (czyli, ze chyba obiekt jednostki bedzie jakos zainicjalizowany, przynajmniej na serwerze, co w tym przypadku wystarczy) A to, ze podlaczajacy gracz jeszcze nie jest w pelni zainicjalizowany u siebie, to w niczym nie przeszkadza, o ile logike GCE masz po stronie serwera.

Oczywiscie ten kod powyzszy powinien byc w jakims init_server.sqf lub w bloku if (isServer) then ...
Offline
Avatar użytkownika

tsuki

Porucznik

Porucznik

  • Posty: 491
  • Dołączył(a): Cz 21 sty, 2010 22:33
  • Lokalizacja: z Nienacka

PostWt 18 maja, 2010 13:34

Chyba się nie zrozumieliśmy.

W trakcie, gdy gracza nie ma jeszcze na mapie plik "init.sqf" jest już wykonywany. Natomiast gracz siebie lokalnie widzi jako <null> (co wykazał ten hint) do czasu, kiedy fizycznie pojawi się w grze (jego model będzie widoczny dla innych grczy).

Z tego wnioskuję, że serwer w czasie ładowania, kiedy nie ma jeszcze jednostki też widzi GCE_pNUMBER jako <null>.

Nie ma żadnej gwarancji, że jeżeli gracz wchodzi na slot bez AI, to serwer już w trakcie, gdy gracz jest wczytywany, (a jeszcze nie ma go na mapie) nie wykonuje "onPlayerConnected". Jeżeli tak, to fizycznie jednostki gracza nie ma, a więc "grup GCE_pNUMBER" będzie nil i posypie visibleTowns.sqf.

Oczywiście, nie ma też żadnej gwarancji, że tak będzie, a więc muszę potestować, czego teraz zrobić nie mogę, bo jestem w pracy.
Obrazek
Offline
Avatar użytkownika

kondor

Major

Major

  • Posty: 880
  • Dołączył(a): Pt 11 lut, 2005 04:00
  • Lokalizacja: Berlin (wschodni)

PostWt 18 maja, 2010 13:48

http://forums.bistudio.com/showthread.p ... rConnected
http://community.bistudio.com/wiki/6thSense.eu:EG
onPlayerConnected will process new players after they are connected to their player body. So JIP player connects, world initializes, he gets control of his character, now the onPlayerConnected fires on the server.

That means that the players who JIP during briefing don't fire the onPlayerConnected until it's too late and isJIP is already set to false.

Wg mnie, bez czekania, az player rzeczywiscie sie ucielesni, ta komenda bylaby bardzo malo uzyteczna. Dlatego wierze, ze "czeka".
btw: zastanawiajace jest to, ze dostaje _name, a nie cos wygodniejszego w stylu _newPlayer
Poprzednia strona

Powrót do [ArmA II] Edytor

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości