-
Helló Helló Sziasztok!
Nos, a következőben problémával fordulok felétek.
No, van egy parancs (pl.) /label [create /del/edit]
No mármost, ha beírom, hogy /label create [szöveg] [szín (hexa)] [Látótáv (opco)] [Átvilágítés (0 / 1 opci)]
A következő képp gondolkoztam:
CMD:label(playerid, params[])
{
if(JatekosInfo[playerid][Admin] >= 3)
{
new szString[128], lText[256], lColor, testLOS, lDD;
if(sscanf(params, \"s[128]\", szString)) return SendClientMessage( playerid, -1, \"Használat: /label [create/edit/delete]\");
if(!strcmp(szString, \"create\", true))
{
if(sscanf(params, \"s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD)) return SendClientMessage( playerid, -1, \"Használat: /label create [szöveg] [szín (hexa)] [Látótáv (opco)] [Átvilágítés (0 / 1 opci)]\");
new Float:pX, Float:pY, Float:pZ, pVW;
GetPlayerPos(playerid, pX, pY, pZ);
pVW = GetPlayerVirtualWorld(playerid);
Create3DTextLabel(lText, lColor, pX, pY, pZ, lDD, pVW, testLOS);
}
} else SendClientMessage(playerid, -1, \"Ismeretlen parancs!\");
return 1;
}
Ez addig jó, hogy kiírja a felépitést de ha kitöltöm akkor halottnak tűnik az egész mindenség.
-
Create3DTextLabel(lText, lColor, pX, pY, pZ, lDD, pVW, testLOS);
lColor = pl. 0xFFFFFFAA sima változóba nem tudod berakni. (tapasztalat)
-
Ühmm. Köszönöm a figyelmeztetést!
Az alap problémára nincsen valami tipped?
-
Akkor tisztázzuk a problémád az ha lerakod akkor nem jelenik meg semmi?
Alap koncepció rossz, lásd használj 2 dimenzius tömböt:
enum E_Labelek
{
lID,
lText[128],
Float:pX,
Float:pY,
Float:pZ,
lDD,
pVW,
testLOS,
Text3D:lLabel,
bool:lVan
};
new Labelek[MAX_LABELEK][E_Labelek];
Mivel a labelek, gangzona, játékos, színeket nem tudod megadni így előre bekell definiálni lásd:
stock Szinek(szin)
{
new szinkod;
switch(szin)
{
case 1: szinkod = 0xFFFFFFAA;
/* és így tovább*/
}
return szinkod;
}
Gondolom be is akarod tölteni a labeleket mysqlból vagy diniből, ami az lID-re alapul ha létrehozol egy új labelt akkor az lID növekszik eggyel, ellenőrző kód:
stock UJLabelID()
{
new id = -1;
for(new x = 0; x < MAX_LABELEK;x++)
{
if(Labelek
- [lVan] == true) continue;
if(Labelek
id = x, break;
}
return id;
}
Ez áltál újra tudod írni a parancsot!
-
Igen... Én és a fogalmazás :D
No az a probléma, hogy van a parancs /label [create /del/edit] és mikor beírom, hogy /label create. Nomármost, a returnt azaz
if(sscanf(params, \"s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD)) return SendClientMessage( playerid, -1, \"Használat: /label create [szöveg] [szín (hexa)] [Látótáv (opco)] [Átvilágítés (0 / 1 opci)]\");
De miután kitöltöm a kért adatokat halott az egész és nem csinál semmit sem. Azt, hogy lehet megoldani, hogy egy paranccsal tudja több parancsot helyettesíteni?
-
CMD:setlabel(playerid, params[]) return cmd_label(playerid, params);
itt a /setlabel fogja ugyanazt csinálni mint a /label parancs, remélem erre gondoltál.
-
Igen... Én és a fogalmazás :D
No az a probléma, hogy van a parancs /label [create /del/edit] és mikor beírom, hogy /label create. Nomármost, a returnt azaz
if(sscanf(params, \"s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD)) return SendClientMessage( playerid, -1, \"Használat: /label create [szöveg] [szín (hexa)] [Látótáv (opco)] [Átvilágítés (0 / 1 opci)]\");
De miután kitöltöm a kért adatokat halott az egész és nem csinál semmit sem. Azt, hogy lehet megoldani, hogy egy paranccsal tudja több parancsot helyettesíteni?
Ezt:
if(sscanf(params, \"s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD))
erre cseréld ki:
if(sscanf(params, \"{s[128]}s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD))
Lásd: sscanf kihagyás módszere
-
Igen... Én és a fogalmazás :D
No az a probléma, hogy van a parancs /label [create /del/edit] és mikor beírom, hogy /label create. Nomármost, a returnt azaz
if(sscanf(params, \"s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD)) return SendClientMessage( playerid, -1, \"Használat: /label create [szöveg] [szín (hexa)] [Látótáv (opco)] [Átvilágítés (0 / 1 opci)]\");
De miután kitöltöm a kért adatokat halott az egész és nem csinál semmit sem. Azt, hogy lehet megoldani, hogy egy paranccsal tudja több parancsot helyettesíteni?
Ezt:
if(sscanf(params, \"s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD))
erre cseréld ki:
if(sscanf(params, \"{s[128]}s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD))
Lásd: sscanf kihagyás módszere
[/quote]
Ezzel sem működik a rendszer.
-
CMD:label(playerid, params[])
{
new szString[10], lText[256], lColor, testLOS, lDD;
if(isnull(params))
return SendClientMessage( playerid, -1, \"Hasznalat: /label [create/edit/delete]\");
sscanf(params, \"s[10]{}\", szString);
if(!strcmp(szString, \"create\", true))
{
if(sscanf(params, \"{s[10]}s[265]xD(40)D(1)\",lText, lColor, testLOS, lDD)) return SendClientMessage( playerid, -1, \"Hasznalat: /label create [szöveg] [szín (hexa)] [Látótáv (opco)] [Átvilágítés (0 / 1 opci)]\");
new Float:pX, Float:pY, Float:pZ, pVW;
GetPlayerPos(playerid, pX, pY, pZ);
pVW = GetPlayerVirtualWorld(playerid);
Create3DTextLabel(lText, lColor, pX, pY, pZ, lDD, pVW, testLOS);
}
return 1;
}
Tesztelve.
Ja és felesleges használni ekkora stringet egy legfeljebb 6 karakterből álló karakterláncak.. Memória pazarlás... :wall:
-
Köszönöm szépen a megoldást :).
Ne félj a mod nem valami memória barát :D