Jump to content
  • 0

pomoc Jak získat proměnnou z GM ve FS


ForestCZE

Dotaz

Čau čau, rád bych vyřešil jednu věc. Mám v GameModu nějakou proměnnou, třeba:

new test[MAX_PLAYERS];

A pak mám admin systém jako Filterscript a potřebuju v něm pracovat s tou proměnnou. Logicky to zařve, že neexistuje ve FS a když ji nadefinuju, tak jsou ve skutečnosti dvě se stejným názvem. Dlouho jsem přemýšlel, jak to vyřešit a jednou jsem to vyřešil takto:

GetPVarInt(playerid, "Test");
SetPVarInt(playerid, "Test", 12345);

No jenže zjišťuju, že potřebuju čím dál tím víc pracovat s těmi proměnými v GM i FS a nedokážu si představit, že bych takto všechny předělal.

A navíc je tu ještě jedna věc. Jestli jsem dobře pochopil, tak tento typ funguje na hráče. Co když ale potřebuju proměnnou s autem? Např.

new TestAuto[MAX_VEHICLES];

 

Vím, že FS se incializuje dřív než GM. Je teda nějaká normální a easy cesta, jak s tím pracovat? Díky :)

Edited by ForestCZE
Link to comment
Share on other sites

13 odpovědí na tuto otázku

Recommended Posts

  • 2
před 43 minutami, ForestCZE said:

Jak na to teda? Tady v tom se vůbec nevyznám :)

Tak povedzme, že máš v GM globálnu premennú "myVar", ktorej hodnotu chceš čítať alebo meniť z nejakého FS..

========= v GM =========

new myVar;

forward SetMyVar(value);
public SetMyVar(value)
{
    myVar = value;
}

forward GetMyVar();
public GetMyVar()
{
    return myVar;
}

========= vo FS =========

// takto zmeníš hodnotu myVar napríklad na 42:
CallRemoteFunction(#SetMyVar, "d", 42);

 

Dobrý príklad nájdeš aj na samp fóre, CallRemoteFunction sa tam používa na zistenie hráčovho admin levelu.

 

EDIT:
Po prečítaní samp wiki som zistil, že by ti môj kód zhodil server. CallRemoteFunction vraj nesmie dostať ako argument prázdny string. (Teraz by ma zaujímalo, ako zavolať GetMyVar.. Možno použiť nejaký nadbytočný argument?)

 

EDIT2:
Volanie CallRemoteFunction(#Foo, "s", emptyString) vraj zhodí server (v prípade, že premenná emptyString je prázdny string),
ale u volania CallRemoteFunction(#GetMyVar, "") si nie som istý, otestujem a dám vedieť.

Edited by DuFF
Link to comment
Share on other sites

  • 2
před 17 hodinami, Amenadiel said:

Ale zajímavé je že format vrací smajlík... Easteregg možná ?:D

Som si pomerne isty, ze format nevracia smajlik, ale 1. :d Nicmenej ked das cislo do %s, tak precitas nejaku nahodnu adresu v amx, na ktorej v tvojom pripade je smajlik.

-------------------------------------------------------------------------------------------------


A k teme, najlepsi sposob na premenne medzi FS je asi nieco ako:

Gettery a settery ako napisal Duff (najjednoduchsie, ale pomale)

GVar plugin (stredne zlozite, stredne rychle)
 

Cele to hacknut pomocou amx_assembly a pouzivat adresy medzi FS :d Ale to fakt neodporucam pre nikoho, kdo nevie o com hovorim. Ak neviete s pointermi, tak si na nich zlomite krk :d

(mega rychle, ziadny plugin, ale pointeryyyyy, zlozite jak svina)

Edited by xhunterx
Link to comment
Share on other sites

  • 0

Možno by si mohol v GM vyrobiť nejaký getter / setter a ten potom volať cez CallRemoteFunction.. Táto metóda ale asi nebude ideálna, pretože nebudeš môcť napríklad vyrobiť getter na stringy (public nedokáže vrátiť string).

Link to comment
Share on other sites

  • 0
před 17 minutami, DuFF said:

Možno by si mohol v GM vyrobiť nejaký getter / setter a ten potom volať cez CallRemoteFunction.. Táto metóda ale asi nebude ideálna, pretože nebudeš môcť napríklad vyrobiť getter na stringy (public nedokáže vrátiť string).

 

w02yIsIqRuOGmahu4kvATA.png

 

a jak myslíš že nedokáže public vratit string ? 

 

forward Name(playerid)
public Name(playerid)
{
   new name[MAX_PLAYER_NAME + 1];
   GetPlayerName(playerid,name,sizeof(name));
   return name;
}

 

Nebo jak myslíš že public nedokáže vratit string

Edited by Amenadiel
Link to comment
Share on other sites

  • 0
před 5 minutami, Amenadiel said:

Nebo jak myslíš že public nedokáže vratit string

error 090: public functions may not return arrays (symbol "Name")

Link to comment
Share on other sites

  • 0
forward Name(playerid)

Tohle jsem napsal špatně. Na konci má být ;

forward Name(playerid);

 

stahl jsem si kvůli tomu pawno a fakt to nejde.. jediné řešení které jde je se stockem.

stock GetName(playerid)
{
   new Name[MAX_PLAYER_NAME + 1];
   GetPlayerName(playerid,Name,sizeof(Name));
   return Name;
}

 

ok ale tohle je zvláštní docela :d

 

F00qrJoWR3mLAtlSvJtzrA.png

Edited by Amenadiel
Link to comment
Share on other sites

  • 0
před 1 hodinou, DuFF said:

Možno by si mohol v GM vyrobiť nejaký getter / setter a ten potom volať cez CallRemoteFunction.. Táto metóda ale asi nebude ideálna, pretože nebudeš môcť napríklad vyrobiť getter na stringy (public nedokáže vrátiť string).

Jak na to teda? Tady v tom se vůbec nevyznám :)

Link to comment
Share on other sites

  • 0

Tak public asi teda opravdu nedokáže returnovat string. Docela mě to překvapilo i :d ale stock umí returnovat string už.

 

Ale zajímavé je že format vrací smajlík... Easteregg možná ?:D

Edited by Amenadiel
Link to comment
Share on other sites

  • 0
před 18 hodinami, DuFF said:

ale u volania CallRemoteFunction(#GetMyVar, "") si nie som istý, otestujem a dám vedieť.

A toto samozrejme funguje, iba prazdny string ako parameter nejde a na to tiez existuje standardna metoda, ze miesto "" sa posle "\1". A "\1" sa potom kontroluje ako prazdny string napr pomocou makra isnull().

  • Děkuji (+1) 1
Link to comment
Share on other sites

  • 0

Normální funkce (a nejen stock tedy) umí vracet řetězec z toho důvodu, že kompilátor ve skutečnosti té funkci přidá skrytý parametr označující cílovou adresu, kam se má ten řetězec zkopírovat. Funguje to, protože kompilátor ví, že to udělal takhle, a při každém volání může alokovat potřebné místo, i když o tom programátor neví. U veřejné funkce by musela být omezená velikost toho, co se může vrátit (normální funkce ji taky mají omezenou, ale implicitně podle toho, co se vrací) a s tím by se pak pracovalo ještě hůř a ještě k tomu by to způsobalo zmatek při externím volání (neviditelné parametry nejsou zrovna zřetelné). Tak či tak, parametr navíc tam bude vždy, pokud je třeba vrátit řetězec.

Jiná možnost je použít PawnPlus a vracet dynamické řetězce. ;-)

Link to comment
Share on other sites

  • 0
On 8. 3. 2018 at 18:25, DuFF said:

Tak povedzme, že máš v GM globálnu premennú "myVar", ktorej hodnotu chceš čítať alebo meniť z nejakého FS..

========= v GM =========

new myVar;

forward SetMyVar(value);
public SetMyVar(value)
{
    myVar = value;
}

forward GetMyVar();
public GetMyVar()
{
    return myVar;
}

========= vo FS =========

// takto zmeníš hodnotu myVar napríklad na 42:
CallRemoteFunction(#SetMyVar, "d", 42);

 

Dobrý príklad nájdeš aj na samp fóre, CallRemoteFunction sa tam používa na zistenie hráčovho admin levelu.

 

EDIT:
Po prečítaní samp wiki som zistil, že by ti môj kód zhodil server. CallRemoteFunction vraj nesmie dostať ako argument prázdny string. (Teraz by ma zaujímalo, ako zavolať GetMyVar.. Možno použiť nejaký nadbytočný argument?)

 

EDIT2:
Volanie CallRemoteFunction(#Foo, "s", emptyString) vraj zhodí server (v prípade, že premenná emptyString je prázdny string),
ale u volania CallRemoteFunction(#GetMyVar, "") si nie som istý, otestujem a dám vedieť.

No tak získávání je mi jasné. Mám v módu:

 

new carlocked[MAX_VEHICLES]; //Použil bych boolean, ale podle wiki se to nedá

forward GetLocking(playerid);
public GetLocking(playerid) return carlocked[GetPlayerVehicleID(playerid)];

A ve FS pak:

printf("%i", CallRemoteFunction("GetLocking", "i", playerid));

To funguje v pořádku, ale nějak mi není jasné, jak přes tu fci CRF proměnnou nastavit na nějaké číslo.

 

Je to takto správně?

forward SetLocking(playerid, value);
public SetLocking(playerid, value) carlocked[GetPlayerVehicleID(playerid)] = value;

CallRemoteFunction("SetLocking", "i", 1); //Když chci nastavit proměnnou na číslo 1

Ale asi by tam mělo být i to playerid. Vážně nevím, jak to má být. Poradí mi někdo, prosím? Díky :)

Link to comment
Share on other sites

  • 0
před 7 minutami, ForestCZE said:

ale nějak mi není jasné, jak přes tu fci CRF proměnnou nastavit na nějaké číslo.

Je to takto správně?


forward SetLocking(playerid, value);
public SetLocking(playerid, value) carlocked[GetPlayerVehicleID(playerid)] = value;

CallRemoteFunction("SetLocking", "i", 1); //Když chci nastavit proměnnou na číslo 1

Ale asi by tam mělo být i to playerid. Vážně nevím, jak to má být. 

Tušíš správne, že by to tam chcelo aj playerid. CallRemoteFunction(#SetLocking, "ii", playerid, 1);

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...