GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Segítségkérés => A témát indította: Dfoglalo - 2013. Október 28. - 11:15:16

Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 11:15:16
Sziasztok!
Két kérdésem lenne hozzátok.
1. kérdés - MEGOLDVA
A DIALOG_STYLE_LIST-be írható soroknak mi a limitje? Tehát a dialogban hány darab sort írhatok le egymás alá, pl.
 
ShowPlayerDialog(playerid, ID, DIALOG_STYLE_LIST, \"Cím\", \"Sor1\\nSor2\\nSor3 ... Ebbõl hány lehet?*, \"Kiválaszt\", \"Mégsem\");

 
* A forráskódban nyilván akármennyit odaírhatok (igaz, több sorban, mert maximum 512 karakterbõl állhat egy sor), de ezekbõl mennyit fog mutatni a szerver? Van limit? Ha igen, akkor mennyi? Remélem érhetõ a kérdésem :D
Ha ez kisebb kérdésnek számít, sorry, de nem akartam beleszerkeszteni a hozzászólásomba a kisebb kérdéseknél, amelyben éppen segítek, mert úgy nem veszik észre, hogy kérdeztem + azt a témát alig nézi valaki... :( Mindegy, majd egy moderátor eldönti, hogy lezárja e ezt a témát, avagy sem. Mindegy is, csak valahogyan megkapjam a választ ^-^


De most kiegészítettem egy újabb kérdésemmel, ami azért kifejtésre és megvitatásra vár, szóval egy saját téma a dolognak talán nem nagy probléma. :P :D


Idõ közben ebbõl egy bõven nem kis kérdés lett, de hát ez van :P


2. kérdés - MEGOLDVA
Van több karakterláncom, amelyeket különbözõ néven szeretnék elnevezni, és eltárolni. Eddig valami ilyesmire jutottam, de ez úgy ahogy van fuck logic.
 
while(mysql_fetch_row(mysql_line))
{
i++;
format(string, sizeof(string), \"T%d\", i); // A stringet mindig máshogy írom át, T1, T2, T3, stb. Na most ezeket a T1, T2, stb.ket szeretném használni több stringhez.
format(string, sizeof(string), \"{0000FF}%s\", mysql_line); // Itt a string helyén a  T1, T2, T3, T4, stb.nek kéne szerepelnie, mindig annak, ami éppen jön. Így az éppen következõ adatot mindig külön karakterláncként el tudnám tárolni, és ez is lenne a cél. Csak ugye ez, amit itt leírtam, a lekérdezés eredményét rakja bele a \"string\" nevezetû karakterláncba, átszínezve. De én azt szeretném, hogy a soron következõ TX (X = pl. 3) nevezetû karakterláncba pakolja bele a dolgot.
SendClientMessage(playerid, 0xFFFFFFFF, T1); // A példa kedvéért
SendClientMessage(playerid, 0xFFFFFFFF, T2); // A példa kedvéért
}

 
Remélem érhetõ a dolog. Amit én itt most leírogattam, eléggé fuck logic dolog, talán nem is így kéne megoldani. Próbálkoztam ilyesmivel is:
 

new T[50];
while(mysql_fetch_row(mysql_line))
{
i++;
format(T, sizeof(T), \"{0000FF}%s\", mysql_line);
SendClientMessage(playerid, 0xFFFFFFFF, T1); // A példa kedvéért
SendClientMessage(playerid, 0xFFFFFFFF, T2); // A példa kedvéért
}

 
de sajnos nem nagyon vált be. Habár ez egy fokkal logikusabb út, talán ezen is kéne elindulnom. A példában említett SendClientMessage függvényekrõl pedig tudom, hogy igen, mysql-os lekérdezésnél bõven elég ezt a sok sz*rságot hátrahagyni, egyszer egy
 
SendClientMessage(playerid, 0xFFFFFFFF, mysql_line);

 
-t írni, és akkor minden kiíródik. Csakhogy itt nekem minden adatra a késõbbiekben szükségem lenne, és külön szeretném kezelni õket. És nem is SendClientMessage függvénnyel szeretném kiíratni õket, hisz azok csak a példában szerepelnek. Szóval ezt szeretném valahogyan megoldani, számítok a segítségetekre! (OFF-okat mellõzzük, köszönöm.)


Ehhez a Bútorrendszerhez kellettek a dolgok. Videó:
 

 
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: NiCoLaj - 2013. Október 28. - 11:31:06
Nekem 44 darabot engedett, a Nemzetiség scriptemnél, tehát 44. :)
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 11:34:21

Nekem 44 darabot engedett, a Nemzetiség scriptemnél, tehát 44. :)
 
[/quote]
Attól még, hogy nálad annyit engedett, nem biztos, hogy annyi a határ, ha van határ. Függ a karakterlánc hosszúságától is szerintem. 44, mint limit? Kizárt... Nem limitnek való szám... 44, mint limit, pedig szinte biztosan nem limit sehol sem, egyik programnyelvben sem.
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: NiCoLaj - 2013. Október 28. - 11:37:08
Értelmezned kéne a válaszomat -.-
\"Nálam\" szó benne volt a kommentben. Hogyne függne a karakterlánc hosszúságától! Pontosan nem tudom megmondani, de utána nézek! :)
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Rupert - 2013. Október 28. - 11:46:19
http://wiki.sa-mp.com/wiki/Limits
2048 karaktert engedélyez maximum.
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 11:59:46

Értelmezned kéne a válaszomat -.-
\"Nálam\" szó benne volt a kommentben. Hogyne függne a karakterlánc hosszúságától! Pontosan nem tudom megmondani, de utána nézek! :)
 
[/quote]
Jajj de szeretem az offolókat... :facepalm:


Téma bõvítve egy új kérdéssel, amely a dologhoz kapcsolódik.


Rupert, azt már néztem (azzal kezdtem), és nem találtam meg rajta. Én viszont külön arra vonatkozóan kerestem adatot (legyen szó sorról, vagy karakterszámról), de nem találtam sajnos. De már megvan, csak azért nem láttam, mert az összes dialogra vonatkozik a dolog. Köszi. Akkor viszont hogyan oldhatom meg, hogy annál is többet írjak ki? Nyilván sehogy sem, igaz? Mert akkor sajnos marad a több oldalas megoldás, amelyet igyekeznék elkerülni...
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: .Ex@Mpl3. - 2013. Október 28. - 19:37:34
Szerintem csak a több oldalas megoldás a jó. Máshogy szerintem nem lehet megoldani.  ;)
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 28. - 19:49:58
Jó felé kapizsgálnak egyesek.
A dialog stringben (karakterláncban) lévõ karakterek számától függ a megjeleníthetõ sorok száma.
Ugye a következõ sor jelzés is már kettõ darab karaktert foglal így ha egy pontot jelenítenél meg soronként akkor 3 karakternyi hely szükséges hozzá.
Én úgy emlékszek, ellentétben a wiki-n lévõ adatnál hogy 4096 karakternél van ez a határ.
Tehát egy kis matekkal számolva 4096/3-al 1365 sor jeleníthetõ maximálisan abban az esetben ha csak egyetlen egy karakter szerepel soronként, akik meg észrevették hogy 1 kimarad (1365*3 = 4095) és oda még elférne egy karakter (1366. sornak) azoknak mondom hogy az a NULL karakter helye és az nem jelenik meg. :D
De ha tévedek, akkor ez van.  :angel:
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 20:00:14
Zsolesszka, köszönjük az elmélkedést, és az új információkat :D Az új adat, miszerint 2x annyi karakter fér el egy dialogban, eléggé jó hír a számomra. Engedd meg, hogy én is matekozzak egy kicsit. Számoljunk 22 karakterrel soronként (benne a \\n-el). Akkor 22*100 = 2200. Akkor ha igaz amit mondasz, és valóban 4096 a határ, el fog férni a dolog egy dialogban is. Imádkozzunk, hogy igazad legyen! :thumbsup: ^-^ Igaz, 100 sor csak néhány esetben lesz létrehozva, de ha mégis, az utolsó sorok egyikében sem szeretnék bugot. Azt hiszem, holnap utánajárok a dolognak, és egy kis teszt kóddal (ha addig nem elõz meg senki) leellenõrzöm az állítást, és kiíratok annyi sort, amennyit csak tudok. Habár majd számításba kell vennem azt is, hogy 10-nél, majd 100-nál +1 karaktert kapunk, ugyanis - hogy ne kelljen manuálisan számolgatnom - a dialogba a számot írnám le. Na mindegy, holnap úgyis minden kiderül - ha valóban lesz idõm és kedvem letesztelni a dolgot :angel: Azonban itt van még a 2. kérdés is, amelyet nehéz egy jelzõvel illetni, inkább nézzétek meg a példáimat, és a magyarázataimat, hátha megértitek, hogy mit szeretnék megvalósítani - és talán még megoldást is adtok rá :D Van egy olyan érzésem, hogy egy strcat függvény is lesz a dologban. Igaz, akkor a kapott eredményt nem tudom eltárolni stringekbe, de legalább ki tudom íratni õket, valamint a kiíráskor egy újabb változónak megadok egy értéket, ami a lekérdezett sor ID-je lenne. És akkor utólag vissza tudom keresni az ID alapján a sor bármely adatát. Lehet, hogy megvan a megoldás? De nem szeretnék lekérdezgetni állandóan, szóval ha a különbözõ stringekbe való eltárolásra tudnátok megoldást adni, akkor annak nagyon örülnék. Igaz, amit az elõbb a hozzászólásom írása közben kielmélkedtem, lehet, hogy megoldás lesz... Na majd kiderül.
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 28. - 20:14:13
Azt ne feledd ha jól emlékszek akkor az inputtext vissza adja neked annak a sornak a tartalmát amelyikre kattintasz DIALOG_STYLE_LIST-nél. :D
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 20:22:24
An*@d de szeretlek Zsolesszka, te mindig meglepsz :D Na de komolyra fordítva a szót, ha ez tényleg így van, akkor ez az egész hercehurca elmehet melegebb éghajlatra, mert akkor ott lesz minden adat, ami csak kell a számomra, és nincs semmiféle plusz változó, ezer meg ezer lekérdezgetés, stb. Csak ki kell írni a dolgot. Na majd holnap ezzel kapcsolatban is munkálkodom. De ma már csak mapolok, és fórumozok, ha nem baj :P Azonban kérdéses még a max karakterek száma... Ha esetleg több lenne mint 2048 (ha jól számoltam), akkor meg lenne oldva a dolog. Így viszont túl lógok a 2048-on a 2200-ammal, és abból a 22 karakterbõl nem nagyon szeretnék engedni - inkább csak növelni. Ha viszont két karakter csökkentésére kényszerülök, hát legyen... 21 karakter kiesik ugye, mert az 2100, marad a 20, ami 2000. És akkor maga a szöveg maximum 18 karakter lehet, de én 20-at szerettem volna. De majd még eldöntöm. Esetleg 2 oldal legyen e, stb. Valkai mondhatna már egy biztos adatot a limitrõl :rolleyes: :shurg: Habár a wiki eléggé megbízható, lehet hogy valami csoda folytán még Zsolesszkának lesz igaza :D :angel:


Edit: nem ide tartozik, de akkor ezek szerint az MSGBOX-nál a kiírt szöveg az inputtext?
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 28. - 20:34:43

Edit: nem ide tartozik, de akkor ezek szerint az MSGBOX-nál a kiírt szöveg az inputtext?
 
[/quote]Nem.
Átolvastam az egészet, és eléggé meglepõ hogy egy ilyen kis apróságon fennakadsz.
Karakterláncok összefûzésére valóban az strcat használata a célszerû de mivel új adatokat is be kell illeszteni, és elgondolkodtató hogy egy darab illetve két darab változót szeretne az ember használni így kétféle lehetõség marad:
 

new
    bigstr[4096];
bigstr = \"{0000FF}\"; // színkód elhelyezése a karakterlánc legelejére ha az egész szöveget egy színben akarod megjeleníteni.
while(mysql_fetch_row(mysql_line))
{
       format(bigstr, sizeof bigstr, \"%s%s\\n\", bigstr, mysql_line);
}
ShowPlayerDialog(playerid, 342, DIALOG_STYLE_LIST, \"teszt\", bigstr, \"Select\", \"\"); // A SendClientMessage lehet crashel ekkora karakterláncnál meg megse tudja jeleníteni.

 
Persze ebben az új adatra arra gondoltam ha netalán szeretnéd megszámozni a sorokat.  (persze ezt lehet mysql lekérdezéssel is be lehetne illeszteni de csak a példa kedvéért írtam ezt) :D



new
    bigstr[4096],
    temp[128],
    i;
bigstr = \"{0000FF}\"; // színkód elhelyezése a karakterlánc legelejére ha az egész szöveget egy színben akarod megjeleníteni.
while(mysql_fetch_row(mysql_line))
{
   format(temp, sizeof temp, \"(%d)%s\\n\", i, mysql_line);
   strcat(bigstr, temp);
   i++;
}
ShowPlayerDialog(playerid, 342, DIALOG_STYLE_LIST, \"teszt\", bigstr, \"Select\", \"\");
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 20:43:09
Talán meglepõ, de igen, én pont az apróságokon akadok fent. Egy házrendszer, meg bútorrendszer, vagy esetleg valami kis függvény mennek mint a karikacsapás, az ilyen kis apróságok viszont sokszor nem mennek. :P
 

while(mysql_fetch_row(mysql_line))
{
       format(bigstr, sizeof bigstr, \"%s%s\\n\", bigstr, mysql_line);
}

 
[/quote]
Itt mintha a lekérdezett adat mindig a soron következõ %s helyére kerülne. Ez így is történik? Csak mert erre gondoltam már párszor, de még mindig nem látom a logikáját, hogy miért ne az elsõ helyre kerülne a karakterlánc minden alkalommal. Valahogy sosem próbáltam meg e miatt... Ezek szerint hagyjam a fenébe azt a sok változót, amelyet késõbb egy stingbe tennék vagy format(bigstr, sizeof bigstr...-al, vagy pedig strcat-al?


Upsz, rosszul értelmeztem, már látom benne a logikát. Akkor amirõl én az elõbb beszéltem, kicsit másról szólt. Na mindegy is, akkor ezt most már értem. Eleinte az lesz a bigstr, hogy {00FF00}Valami\\n, aztán már {00FF00}Valami\\nSonkaaa\\n, majd {00FF00}Valami\\nSonkaaa\\nSaaajt\\n, stb., és így tovább.


A második \"megoldás\" már nem is igazán megoldás, hiszen a lényeg nem az, hogy különbözõ számot adjak neki, hanem az, hogy kiírjam a dolgokat egy dialogba, majd azokat késõbb még fel is tudjam használni, az adott adat újbóli lekérdezések nélkül. Viszont az elsõ megoldásod abszolúte tökéletes. A végén még ma megvalósítom a dolgot, habár nemsokára lépni készülõdök.



// A SendClientMessage lehet crashel ekkora karakterláncnál meg megse tudja jeleníteni.

 
[/quote]
Amúgy a SendClientMessage csak egy példa volt, természetesen nem ahhoz kell, hanem dialoghoz. Igazából írhattam volna azt is a SendClientMessage helyett, csakhogy nem tudtam hogyan kéne azt leírni, hisz errõl is szól a 2. kérdésem. Meg persze a SendClientMessage rövidebb is, mint egy dialog, szóval miért ne írtam volna le azt, amelyikkel gyorsabban megvagyok? :P
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 28. - 20:51:08
Teljesen mindegy melyik verziót használod, ha sikerül mûködésre bírni.
A format függvénynél ha újra beilleszted argumentumként pont azt a változót amelyiket szeretnéd úgymond formázni, az mindaddig megtartja tartalmát amíg el nem tárolja saját magának így újra betudja illeszteni ugyanabba a változóba.
Tehát egy semmire nem való pawn kóddal szemléltetve:
 

new
   str[128];
str = \"teszt\";
for(new i; i < 100; i++)
{
   format(str, sizeof str, \"%s\", str);
   print(str);
}

 
Végig megtartja a \"teszt\" karakterláncot az str változóban.
A sorrend amirõl te beszélsz az csak annyi hogy milyen sorrendben helyezed el az argumentumokat a format függvény legvégén:
 
 bigstr, mysql_line);
mysql_line, bigstr);

 
Edit:
Sajnos arra nem emlékszek hogy valóban elég csak egyetlen egy színkódot elhelyezni a legelsõ sorban és valóban az összes sor olyan színû lesz DIALOG_STYLE_LIST -nél a ShowPlayerDialogban, ezt le kell tesztelni mivel kopnak az emlékek sajna ahogy egyre kevesebbet foglalkozok samp-al.  :(
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 21:01:21
Köszi ezt a plusz példát, de már leesett a dolog az elsõ alapján is - végül. :P De még a plusz példád elõtt :D Nos, akkor
 
while(mysql_fetch_row(mysql_line))
{
       format(bigstr, sizeof bigstr, \"%s%s\\n\", bigstr, mysql_line);
}

 
ilyesmit fogok használni. Gyorsan beteszem ezt a pár mapot meg kocsit a módba, aztán ha még lesz idõm, nekilátok a dolognak. Ha mégsem, akkor majd holnap. :P Amint sikerült megcsinálnom a dolgot, értesítem róla a kedves fórumozókat egy csodálatos hozzászólás keretein belül. A maradék dolog pedig csak a maxium karakterek száma... Valaki egy pontos, alátámasztott adatot nem tudna közölni végre? :D :hmmm:
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 28. - 21:16:59
Ha nem illesztesz be semmilyen plusz adatot akkor meg format helyett simán használhatod az strcat-ot is a következõképp:
 

new
   bigstr[4096];
bigstr = \"{0000FF}\";    
while(mysql_fetch_row(mysql_line))
{
   strcat(bigstr, mysql_line);
   strcat(bigstr, \"\\n\");
}
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 21:24:05
Most már ez lett.
 
format(thestring, sizeof thestring, \"%s%s\\n\", thestring, mysql_line);

 
Minden mûködött, egy kivételével: a \\n, azaz az új sor után a színezés eltûnt. Ez akkor is így történt, amikor simán dialog style ..... \"cím\", \"{FF0000}asdasdasd\\nererer\"  .....-ot írtam, meg amikor lekérdezett adatot írtam ki. Tehát a \"asdasdasd\" még zöld volt, de az 2ererer\" már nem. Azért kicsit furcsa, hogy pár sorban letudtam ezt a sok mindent a segítségeddel, és az is, hogy ilyen egyszerû volt megoldani a dolgot... Tehát a 2. dolog kipipálva! Már csak a hosszúság maradt...


Edit: ja és: yesss! - kiprinteltem - az inputtext tényleg a sor szövege volt. Ez most sokat segít :D Habár rájöttem, hogy az a szöveg akár meg is egyezhet egy másikkal, szóval kénytelen leszek egy ID-t is adni a dolgokhoz.
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 28. - 21:28:04
Igen ezt említettem is az egyik hozzászólásban, hogy mintha nem mûködne így, ezért be kell illesztened minden sorba a színezést:
 
format(thestring, sizeof thestring, \"%s{0000FF}%s\\n\", thestring, mysql_line);

 
Ez persze minden sorban újabb 8 karakter helyet foglal.  :(
Edit:
Akkor arra is jól emlékszek.
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 28. - 21:34:58
Ja igen, azt beleszerkesztetted, bocsi :D De akkor ez rengeteg + karaktert eredményez... :( Valószínûleg 2 oldal lesz a dologból... Hogyan oldjam meg a dolog, hogy 2 oldalra kerüljön, és az elsõ 50 eredményt ne írja ki még egyszer? Biztos van valami feltétel, amellyel az elsõ 50 eredményt át tudom ugrani... Esetleg beválhat valami ilyesmi:
 
while
{
     i++;
     if(i > 50)
     {
           // Innentõl rakosgatja bele a karakterláncba az adatokat
     }
}

 
?
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Zsolesszka - 2013. Október 29. - 07:09:40
Megoldható hogy több oldalas legyen a dialog.
Csak ki kell kísérletezni a megfelelõ megoldást ez persze pár tesztelést igényelni fog a játékban mivel a print/printf nem képes ennyire hosszú karakterláncot megjeleníteni consol ablakban, ezért csak a játékban lévõ ShowPlayerDialogot lehet használni erre a célra.
Mivel mysql adatbázisból kéred le az adatokat egyszerûen határt szabhatsz a lekért adatok mennyiségének illetve a kezdés pontját is beállíthatod mégpedig a LIMIT utasítás használatával.
Melynek ha kettõ szám adatot adsz meg, abban az esetben az elsõ szám a kezdés pozícióját jelenti a második a megjelenített adatsorok számát.
 
SELECT * FROM `tablename` LIMIT  0, 20
SELECT * FROM `tablename` LIMIT  50, 20

 
Az érthetõség kedvéért csak 20-at adtam meg a lekért sorok maximális számának.
Magyarázat:
Az összes adat (*) kiválasztása (SELECT) a (tablename) adatbázisból melynek kezdése a (LIMIT 0, 20)  (a példában az elsõnél 0 majd a másodiknál az 50.) rekordtól számított maximálisan 20 darab adatsor.
Azt megismétlem hogy ez csak akkor ilyen ha kettõ szám adat szerepel a LIMIT utasítás után egy picit másképp mûködik ha csak egy adat van ott, de az is csak a maximálisan lekért adatsorok számát jelöli.
Cím: DIALOG_STYLE_LIST Limit & Változó nevének megváltoztatása (?)
Írta: Dfoglalo - 2013. Október 29. - 10:30:09
Ismerem a LIMIT-et, használom is, csak még nem használtam X-tõl Y-ig terjedõ adat lekérdezésére. Még ezt az oldalt is néztem, csak nem néztem meg eléggé. Pedig onnan is 2 másodperc alatt megtudtam volna a dolgot.
 

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15

 
[/quote]


Na minden MEGOLDVA, köszi srácok! :D Amúgy pedig ehhez a Bútorrendszerhez kellettek a dolgok. Videó: