Wie kann ich einen Befehl schreiben womit man Spieler eine Einladung sendet z.b für einen 1o1.
Der andere Spieler kann dann halt annehmenn oder ablehnen.
Mfg
Wie kann ich einen Befehl schreiben womit man Spieler eine Einladung sendet z.b für einen 1o1.
Der andere Spieler kann dann halt annehmenn oder ablehnen.
Mfg
So in etwa könnte es aussehen
COMMAND:invite(playerid,params[])
{
new string[128],pID,name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
if(sscanf(params,"u",pID))return SendClientMessage(playerid,Hellblau,"Einladen: [Spieler ID]");
format(string,sizeof(string),"Du wurdest von %s zu einem 1o1 herrausgefordert!",name);
ShowPlayerDialog(pID,1,DIALOG_STYLE_MSGBOX,"1o1",string,"Annehmen","Ablehnen");
return 1;
}
Alles anzeigenSo in etwa könnte es aussehen
COMMAND:invite(playerid,params[])
{
new string[128],pID,name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));
if(sscanf(params,"u",pID))return SendClientMessage(playerid,Hellblau,"Einladen: [Spieler ID]");
format(string,sizeof(string),"Du wurdest von %s zu einem 1o1 herrausgefordert!",name);
ShowPlayerDialog(pID,1,DIALOG_STYLE_MSGBOX,"1o1",string,"Annehmen","Ablehnen");
return 1;
}
Ja und wenn der eine annimmt wie sollen dann beide z.b in ein Raum geportet werden?
Weil so würde es ja nicht gehen
Schau dir dafür mal OnDialogReponse an.
Dort musst du die Dialogid abfragen und je nachdem, ob man den linken oder den rechten Button angeklickt hat, den Spieler porten.
// Ganz oben in dein Script
new g_Invite[MAX_PLAYERS] = {-1,...}; // Hier wird die ID des Spielers gespeichert, der die Anfrage geschickt hat. Brauchen wir, um ihn nachher zu porten ( Damit es nicht zu Buggs kommt, hab' ich direkt alle Variablen auf -1 gesettet )
// In deinen Command
g_Invite[pID] = playerid; // ID des Spielers, der die Anfrage geschickt hat, wird gespeichert.
// In OnDialogResponse
if(dialogid == /* DIALOG */ )
{
if(!response)return 1; // Wenn er ablehnt, abbrechen
SetPlayerPos(playerid,/* .. */); // Der, der angenommen hat
SetPlayerPos(g_Invite[playerid],/*..*/); // Der, der die Anfrage gesendet hat
}
new g_Invite[MAX_PLAYERS] = {-1,...};
Danke
Aber wieso sind da Punkte in der Variable.
Könntest du mir das vielleicht kurz erklären?
und die -1
new g_Invite[MAX_PLAYERS] = {-1,...};
Das heißt, dass alle Indizes von 0 bis MAX_PLAYERS-1 auf -1 gesetzt werden, wenn der Code geladen wird.
Das ist wie:
new var = -1;
nur eben für ein Array.
Wenn du eine Variable erstellst, hat diesen standardmäßig den Wert 0.
Sollte es nun zu einem Bugg kommen & dir wird der Dialog angezeigt, ohne dass dich jemand eingeladen hat, würde der Spieler mit der ID 0 geportet werden, da ja vorher keine andere ID festgelegt wurde. Um das zu umgehen, setze ich für alle Variablen des Arrays ( Ja, g_Invite[MAX_PLAYERS] ist ein Array :p )den Wert auf -1. Einfach zur Sicherheit.
Wenn ich new g_Invite[MAX_PLAYERS] = -1; schreiben würde, würde lediglich der erste Index des Arrays -1 sein.
Mit "..." werden alle Variablen des Arrays auf -1 gesetzt.
Kann sein, dass dich das ein bisschen verwirrt :p
/edit: ^ kürzere Erklärung
COMMAND:1o1invite(playerid,params[])
{
new str[128],pID,str2[128];
if(User[playerid][InMap] == 1) return SendClientMessage(playerid,GELB,"Du bist bereits in einer Arena!");
if(sscanf(params,"u",pID)) return SendClientMessage(playerid,GRAU,"BENUTZE: /1o1invite [SpielerName/ID]");
g_Invite[pID] = playerid;
format(str,1288,"Du hast dem Spieler %s eine 1o1 Anfrage gesendet",PlayerName(pID));
SendClientMessage(playerid,HELLBLAU,str);
format(str,128,"Der Spieler %s hat dich zum 1o1 eingeladen. Klicke auf 'Annehmen' um das 1o1 zu starten",PlayerName(playerid));
ShowPlayerDialog(pID,DIALOG_INVITE,DIALOG_STYLE_MSGBOX,"LDM | 1o1 Invite",str2,"Annehmen","Abbrechen");
return 1;
}
Warum bekommt der Typ kein Dialog angezeigt?
format(str,1288,"Du hast dem Spieler %s eine 1o1 Anfrage gesendet",PlayerName(pID));
Da ist ne 8 zu viel.
Ist sonst okay.
format(str,1288,"Du hast dem Spieler %s eine 1o1 Anfrage gesendet",PlayerName(pID));
Da ist ne 8 zu viel.
Ist sonst okay.
besteht immer noch
Siehe anderen Thread. Bitte auch nur einen verwenden.
Siehe anderen Thread. Bitte auch nur einen verwenden.
Ja xd
Aufjedenfall klappt es
Noch eine Frage, wie mache ich dass, das der Spieler beim sterben wieder in der Arena spawnt.
Bei mir ist derzeit so das beide geportet werden und wenn einer stirbt spawnt er einfach am Spawn obwohl ich das wie bei den anderen Arenen gemacht habe.
Alles anzeigenDafür gibt es OnPlayerDeath.
Da ich dein System nicht kenne, gehe ich mal vom einfachsten aus.
switch(Arena[playerid]) // Arena des Spielers. 0 = keine Arena
{
case 0:// Spieler ist in keiner Arena
{
SetPlayerPos(playerid, /* spawn */);
}
case 1:// Spieler ist in Arena 1
{
SetPlayerPos(playerid, /* arena */);
}
}
if(invite1o1raum[playerid] == 1)
{
SetPlayerInterior(playerid,6);
SetPlayerPos(playerid,768.2683,-37.4128,1000.5859);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
}
habs so gemacht in einem Stock was bei OnPlayerSpawn aufgerufen wird.
Klappt aber net
Vergiss das, was ich vorher geschrieben habe. War falsch.
Ist die Variable 100% auf 1 gesetzt? Lass dir diese mal ausgeben. ( printf("%d",invite1o1raum[playerid]); )
Wie sieht der komplette Code aus?
Vergiss das, was ich vorher geschrieben habe. War falsch.
Ist die Variable 100% auf 1 gesetzt?
Wie sieht der komplette Code aus?
Befehl:
COMMAND:1o1invite(playerid,params[])
{
new str[128],pID,str2[128];
if(User[playerid][InMap] == 1) return SendClientMessage(playerid,GELB,"Du bist bereits in einer Arena!");
if(sscanf(params,"u",pID)) return SendClientMessage(playerid,GRAU,"BENUTZE: /1o1invite [SpielerName/ID]");
g_Invite[pID] = playerid;
format(str,128,"Du hast dem Spieler %s eine 1o1 Anfrage gesendet",PlayerName(pID));
SendClientMessage(playerid,HELLBLAU,str);
format(str2,128,"Der Spieler %s hat dich zum 1o1 eingeladen. Klicke auf 'Annehmen' um das 1o1 zu starten",PlayerName(playerid));
ShowPlayerDialog(pID,DIALOG_INVITE,DIALOG_STYLE_MSGBOX,"LDM | 1o1 Invite",str2,"Annehmen","Abbrechen");
return 1;
}
Response:
case DIALOG_INVITE:
{
if(!response)return 1;
new world;
world +=1;
invite1o1raum[playerid] = 1;
invite1o1raum[g_Invite[playerid]] = 1;
SetPlayerArena(playerid);
SetPlayerArena(g_Invite[playerid]);
SetPlayerVirtualWorld(playerid,world);
SetPlayerVirtualWorld(g_Invite[playerid],world);
}
stock SetPlayerArena
stock SetPlayerArena(playerid)
{
if(dmspawn[0][playerid] == 1)
{
new randomspawn = random(sizeof(DeagleSpawn));
SetPlayerPos(playerid,DeagleSpawn[randomspawn][0],DeagleSpawn[randomspawn][1],DeagleSpawn[randomspawn][2]);
SetPlayerInterior(playerid,1);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
}else if(dmspawn[1][playerid] == 1)
{
new randomspawn = random(sizeof(DMSpawn));
SetPlayerPos(playerid,DMSpawn[randomspawn][0],DMSpawn[randomspawn][1],DMSpawn[randomspawn][2]);
SetPlayerInterior(playerid,10);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201),GivePlayerWeapon(playerid,25,2201),GivePlayerWeapon(playerid,33,2201);
}else if(dmspawn[2][playerid] == 1)
{
new randomspawn = random(sizeof(CBugSpawn));
SetPlayerPos(playerid,CBugSpawn[randomspawn][0],CBugSpawn[randomspawn][1],CBugSpawn[randomspawn][2]);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201),GivePlayerWeapon(playerid,34,2201);
}else if(dmspawn[3][playerid] == 1)
{
new randomspawn = random(sizeof(TeamDMSpawn));
SetPlayerPos(playerid,TeamDMSpawn[randomspawn][0],TeamDMSpawn[randomspawn][1],TeamDMSpawn[randomspawn][2]);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201),GivePlayerWeapon(playerid,34,2201),GivePlayerWeapon(playerid,31,2201),GivePlayerWeapon(playerid,25,2201);
}
else if(oneraum[0][playerid] == 1)
{
SetPlayerInterior(playerid,6);
SetPlayerPos(playerid,768.2683,-37.4128,1000.5859);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
SetPlayerVirtualWorld(playerid,4);
}else if(oneraum[1][playerid] == 1)
{
SetPlayerInterior(playerid,6);
SetPlayerPos(playerid,768.2683,-37.4128,1000.5859);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
SetPlayerVirtualWorld(playerid,5);
}
else if(oneraum[2][playerid] == 1)
{
SetPlayerInterior(playerid,6);
SetPlayerPos(playerid,768.2683,-37.4128,1000.5859);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
SetPlayerVirtualWorld(playerid,6);
}else if(oneraum[3][playerid] == 1)
{
SetPlayerPos(playerid,1543.9360,-1353.3961,329.4742);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
SetPlayerVirtualWorld(playerid,7);
}else if(oneraum[4][playerid] == 1)
{
SetPlayerPos(playerid,1543.9360,-1353.3961,329.4742);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
SetPlayerVirtualWorld(playerid,8);
}else if(oneraum[5][playerid] == 1)
{
SetPlayerPos(playerid,1543.9360,-1353.3961,329.4742);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
SetPlayerVirtualWorld(playerid,9);
}else if(invite1o1raum[playerid] == 1)
{
SetPlayerInterior(playerid,6);
SetPlayerPos(playerid,768.2683,-37.4128,1000.5859);
ResetPlayerWeapons(playerid);
GivePlayerWeapon(playerid,24,2201);
}
return 1;
}
Hast du unter OnPlayerSpawn auch SetPlayerArena(playerid); stehen?
Hast du unter OnPlayerSpawn auch SetPlayerArena(playerid); stehen?
Jap..
Komisch. Mir fällt beim drüberschaun' kein Fehler auf.
Debugge das mal.
d.h nach dem Zeigen des Dialog die Variable invite1o1raum für beide Spieler (printf("%d | %d|", invite1o1raum[playerid],invite1o1raum[g_Invite[playerid]]);, dann direkt unter "stock SetPlayerArena" in die erste Zeile "print("SetPlayerArena called") und danach nochmal die beiden Variablen und schlussendlich in dem ifstatement "print("IF-Statement reached");