Also du könntest über deiner AddAuftrag Funktion, die Seite hinzufügen aber das
Problem hierbei ist, mann sieht dennoch dann 12 Items bzw. das 13 sogar als überschrift.
siehe https://wiki.sa-mp.com/wiki/AddMenuItem
Deswegen würde ich das so nicht ganz machen, du machst gerade jedes Item(Auftrag) gleich als AddMenuItem aber das wird dir bald Probleme geben.
Ich würde dir empfehlen wenn du es über so ein Menu weiter machen willst, erstelle dir gleich ein Menu mit genau 10 Items und der "Nächsten Seite".
Also so hier, das wäre ein Lösungsansatz/vorschlag von mir (mit diesem kannst du dann auch ganz einfach Items/Aufträge wieder löschen)
InGame dann so:
//oben anpassen :)
new Menu:teleportmenu[MAX_PLAYERS];
//-----------------------
stock AddAuftrag(titel[],autor[],auftragtext[],position,Float:AuftragX,Float:AuftragY,Float:AuftragZ) // && listauftrage
{
new i = FindFreeAuftragID();
if(i == -1) return 0;
format(Auftrag[i][a_autor],MAX_PLAYER_NAME+1,autor);
format(Auftrag[i][a_description],30,titel);
format(Auftrag[i][a_auftragtext],256,auftragtext);
Auftrag[i][auftragid] = i;
Auftrag[i][a_position] = position;
new subString[148];
format(subString, sizeof(subString), "Auftrag erstellt, ID: %d, Länge: %d, Text: %s ",Auftrag[i][auftragid],strlen(Auftrag[i][a_description]),Auftrag[i][a_description]);
SendClientMessageToAll(-1,subString);
if(position)
{
Auftrag[i][a_PosX] = AuftragX;
Auftrag[i][a_PosY] = AuftragY;
Auftrag[i][a_PosZ] = AuftragZ;
}
return 1;
//ListAuftrage();
}//mitgettime
ocmd:auftragadden(playerid,params[])
{
new titel[30],text[100],koordinaten;
if(sscanf(params, "ssd", titel,text,koordinaten)) return SendClientMessage(playerid, -1, "/auftragadden [titel] [Beschreibung::MAX__100] [Koordinaten? 0 / 1]");
// AddAuftrag("Farmer","DrWho","Ich suche einen Farmer.",0,0,0,0); // Legendär
AddAuftrag(titel,"Mogly",text,koordinaten,0,0,0);
return 1;
}
ocmd:auftrage(playerid,params[])
{
new subString[128],count;
DialogTempIndex[playerid] = 0;
DestroyMenu(teleportmenu[playerid]);
teleportmenu[playerid] = CreateMenu("Auftraege", 1, 50.0, 180.0, 200.0, 200.0);
for(new i=0; i<sizeof(Auftrag); i++)
{
if(Auftrag[i][auftragid] != -1)
{
if(count==10)
{
AddMenuItem(teleportmenu[playerid], 0,"Naeste Seite");
DialogTemp[playerid][DialogTempIndex[playerid]++] = -1;
SetPVarInt(playerid,"Auftrag_Seite",1);
break;
}
else
{
//SCM(playerid,-1,"Auftrag ausgeführt!");
/* format(subString, sizeof(subString), "ID: %d, Länge: %d, Text: %s ",Auftrag[i][auftragid],strlen(Auftrag[i][a_description]),Auftrag[i][a_description]);
SCM(playerid,-1,subString);*/
count++;
AddMenuItem(teleportmenu[playerid], 0,Auftrag[i][a_description]);
DialogTemp[playerid][DialogTempIndex[playerid]++] = i;
}
}
}
if(count == 0) return SendClientMessage(playerid,-1,"Es konnte kein Auftrag gefunden werden!");
ShowMenuForPlayer(teleportmenu[playerid],playerid);
return 1;
}
//remove auftrag? or not1
stock FindFreeAuftragID()
{
for(new i=0; i<sizeof(Auftrag); i++)
{
if(Auftrag[i][auftragid]==-1) return i;
}
return -1;
}
public OnPlayerSelectedMenuRow(playerid, row)
{
TogglePlayerControllable(playerid,true);
new Menu:CurrentMenu = GetPlayerMenu(playerid);
if(CurrentMenu == teleportmenu[playerid])
{
new i = DialogTemp[playerid][row];
if(i==-1)
{
DialogTempIndex[playerid]=0;
DestroyMenu(teleportmenu[playerid]);
teleportmenu[playerid] = CreateMenu("Auftraege", 1, 50.0, 180.0, 200.0, 200.0);
new count,next_count;
for(new a=0; a<sizeof(Auftrag); a++)
{
if(Auftrag[a][auftragid]!=-1)
{
count++;
if(count > GetPVarInt(playerid,"Auftrag_Seite")*10)
{
if(next_count==10)
{
AddMenuItem(teleportmenu[playerid], 0,"Naechste Seite");
DialogTemp[playerid][DialogTempIndex[playerid]++] = -1;
SetPVarInt(playerid,"Auftrag_Seite", GetPVarInt(playerid,"Auftrag_Seite")+1);
break;
}
next_count++;
DialogTemp[playerid][DialogTempIndex[playerid]++] = a;
AddMenuItem(teleportmenu[playerid], 0,Auftrag[a][a_description]);
}
}
}
ShowMenuForPlayer(teleportmenu[playerid],playerid);
}
else
{
new string[84],string2[312]; // "Aufrag von " + string wie in C
format(string,sizeof(string),"Auftrag von{B40404} %s",Auftrag[i][a_autor]);
format(string2,sizeof(string2),"%s %d",Auftrag[i][a_auftragtext],Auftrag[i][auftragid]);
ShowPlayerDialog(playerid, DIALOG_MENU_ROW, DIALOG_STYLE_MSGBOX, string, string2, "Contact", "Go Back");
}
}
return 1;
}
Alles anzeigen
Was genau, habe ich da jetzt gemacht?
Also ich habe bei AddAuftrag dei AddMenuItems raus genommen, und bei ocmd:auftrage die abfrage das er bei count 10 den "Nächste Seite" Button hinzufügt, dieser hat die id -1 um ihn unter OnPlayerSelectedMenuRow wieder nutzen zu können. Unter OnPlayerSelectedMenuRow habe Ich somit die if abfrage == -1 hinzugefügt und Resete das Menu dort um die näcshte Seite zu laden in dem ich mit dem ersten count zähle wie viele wir überspringen (also die erste Seite und mit next_count zählen wir wieder 9 Items ab bis zum "Näcshten Seite".
Und Mit Set und GetPvarInt(playerid,"Auftrag_Seite") speichern und setzen wir usnere Seite /für die Mathematische Berechnung ).
Und wir haben das teleportmenu[playerid] nun playerid basierend um Bugs zu vermeiden.
hoffe, es war etwas verständlich als Erklärung.
Beachte bitte: "128 menus in total" und da das Menu dann Player abhängig sein müsste, wegen Nächste Seite, kann es bei zu vielen Spielern zu Probleme führen.
(Bei anderen Ansätzen, bin ich gerne offen, falls dieser unnötig oder co. ist)
MfG Mogly1.