Jump to content
Geplaatst:
comment_1526125

Let op dit werkt pas vanaf SAMP 0.3!

Dialog Box

Inleiding

Ik heb van Remi-X de toestemming gekregen om een volledige tutorial te schrijven over dialog boxes omdat de vorige te onvolledig was.

Dialog boxes werken enkel in SAMP 0.3 en zijn erg handig.

Soorten Dialog Boxes

Er zijn 3 soorten dialog boxes:

Text Box: Hierin staat simpelweg tekst:

text.png

Input Box: Handig voor een inlog systeem waar je dan een wachtwoord moet invoeren:

input.png

Selectie Box: Handig voor een wapen menu of voertuigen lijst, ...:

Screen komt...

Dialog Maken

Nu je weet welke soorten er zijn kan je beginnen met dialogs te maken.

We zullen beginnen met een simpele tekst box:

ShowPlayerDialog(playerid,dialogid,style,"title","text","button1","button2");

Playerid: de id van de speler die de dialog moet zien.

Dialogid: het id dat je de dialog wil hebben en je later zal moeten gebruiken.

Style: hier komen we nog op terug.

Title: de tite die vanboven staat.

Text: de tekst.

Button1: de eerste knop waar meestal "OK" staat.

Button2: de tweede knop waar meestal "CANCEL" staat.

Ik geef een voorbeeld van een volledige tekst dialog:

ShowPlayerDialog(playerid,2,DIALOG_STYLE_MSGBOX,"Rules","United Roleplay have the follow rules:\n\n 1. No Cheating\n 2.No Spamming \n 3.No Flooding \n 4. No Killing without reason. \n 5. No Reclame","OK","Cancel");

Het bovenstaande is een tekst dialog die de regels laat zien van de komende United Roleplay.

Nu gaan we de input dialog bespreken:

ShowPlayerDialog(playerid,dialogid,style,"title","text","Button1","Button2");

Je ziet het is hetzelfde, alleen de style moet anders zijn.

Een voorbeeld van het inloggen in United Roleplay:

ShowPlayerDialog(playerid,0,DIALOG_STYLE_INPUT,"Login in United Roleplay","Welcome to United Roleplay.\nThis account exist, please log in.\n\nPassword:","Login","Cancel");

Nu een selectie box, dit is al wat moeilijker en anders dan de vorige dialogs:

new listitems[] = "1\tEerste keuze\n2\tTweede\n3\tDerde enzoverder";
ShowPlayerDialog(playerid,dialogid,style,"Title",listitems,"Button1","Button2");

Je merkt Text is veranderd in listitems die erboven staat het is zo opgedeeld:

de eerste keuze begint zo: 1\tKeuze de rest is zo \n2\tTweede\n3\tDerde enzoverder.

Een voorbeeld van de eerste pagina van het wapen menu in Water States:

 	new listitems[] = "1\tMelee\n2\tPistols\n3\tSub-Machine Guns\n4\tShotguns\n5\tAssault\n6\tRifles\n7\tHeavy Assault\n8\tProjectile\n9\tSpecial";
ShowPlayerDialog(playerid,2,DIALOG_STYLE_LIST,"Wapens:",listitems,"Open","Annuleer");

Styles

Er zijn 3 styles die bepalen wat voor dialog het moet zijn zijn je zag het al in de voorbeelden:

DIALOG_STYLE_MSGBOX : Style voor tekst box.

DIALOG_STYLE_INPUT : Style voor input box.

DIALOG_STYLE_LIST : Style voor selectie box.

Verwerking

Nu gaan we zorgen dat je keuze of wat je invult verwerkt word.

Dat doe je in de public: OnDialogResponse.

De public "OnDialogResponse" bestaat uit dit:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])<BR>{<BR><BR>return 1;<BR>}

playerid = id van de speler

dialogid = id van de dialog die je zelf invoerde.

response = welke knop. (1= eerste, 0= tweede)

listitem = voor selectie dialog geeft de id van de geselecteerde item aan (begint bij 0).

inputtext = tekst dat je invoerde bij input dialog.

Text Dialog: deze heeft geen deel nodig in de OnDialogResponse, maar het kan wel bij bijvoorbeeld regels:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 0){
new string[128];
new playername[MAX_PLAYER_NAME];
GetPlayerName(playerid, playername, sizeof(playername));
if(response){
format(string, sizeof(string), "player %s has accepted the rules", playername);
} else {
format(string, sizeof(string), "player %s won't accept the rules and is kicked", playername);
Kick(playerid);
}
}
SendClientMessageToAll(COLOR_YELLOW, string);
return 1;
}
return 1;
}

Selectie Dialog: zoals ik uitlegde gebruikt deze listitem en begint dit bij 0, een voorbeeldje:

	
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 2 && response == 1)
{
   	if(listitem == 0)
   	{
   	GivePlayerWeapon(playerid, 25, 9999);
   	SendClientMessage(playerid, COLOR_YELLOW, "Je kreeg een Shotgun!");
}
   	if(listitem == 1)
   	{
   	GivePlayerWeapon(playerid, 26, 9999);
   	SendClientMessage(playerid, COLOR_YELLOW, "Je kreeg een Sawnoff Shotgun!");
}
   	if(listitem == 2)
   	{
   	GivePlayerWeapon(playerid, 27, 9999);
   	SendClientMessage(playerid, COLOR_YELLOW, "Je kreeg een Combat Shotgun!");
}
   	return 1;
}
   	return 1;
}

De dialogid heb ik als 2 ingesteld bij ShowDialog dus hier dan ook. (let op indeling klopt niet meer met de showdialog.), ik zet ook een check als response 1 is en dus de eerste button voert hij dat uit en krijg je het wapen, als je de andere kiest gebeurd er niets en sluit de dialog ook gewoon.

Input Dialog: dit valt eigenlijk ook wel mee, deze keer gebruiken we inputtext, een voorbeeldje:

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 0)
 {
  if(response) 
   {
     new message[128];

     password[playerid] = dini_Int(accountfile, "password");
     job[playerid] = dini_Int(accountfile, "job");
     adminlevel[playerid] = dini_Int(accountfile, "adminlevel");

     if(password[playerid] != udb_hash(inputtext))
     {
		SendClientMessage(playerid, COLOR_RED, "The password is wrong.");
		ShowPlayerDialog(playerid,0,DIALOG_STYLE_INPUT,"Login in United Roleplay","Welcome to United Roleplay.\nThis account exist, please login.\n\nPassword:","Login","Cancel");
     } else {
		format(message, sizeof(message), "%s you have succesfully logged in.", playername, inputtext);
		SendClientMessage(playerid, COLOR_YELLOW, message);
		logged[playerid] = 1;
     }
 } else {
SendClientMessage(playerid, COLOR_RED, "You cannot enter the server without login or registering!");
format(kickmessage, sizeof(kickmessage), "UnitedBot kicked %s (reason: no login, no enter.)", playername);
SendClientMessageToAll(COLOR_RED, kickmessage);
Kick(playerid);
 }
 return 1;
}
return 1;
}

De dialogid is als 0 ingesteld bij ShowDialog, hij checkt als response true is en dus 1 is de eerste button aangeduid, en zal hij je inloggen, er staat ook een } else { als de andere button dus de Cancel is aangeduid zal de server je kicken omdat je moet inloggen.

Heb je nog vragen stel ze dan zeker!

Bewerkt: door megadreams

  • Reacties 50
  • Bezichtigingen 18.1k
  • Created
  • Laatste reactie

Top Posters In This Topic

Featured Replies

Geplaatst:
  • Auteur
comment_1657163

Ik kan niet veel eraan doen als ik niet een deel van je script kan zien. ;)

Dus wil je een deel van je script posten?

Bewerkt: door megadreams

Geplaatst:
comment_1657181

Want als ik dat doe, dan komt er in die accountfile

niet "password" te staan, maar "362939266"

Heb je er een verklaring voor?

Wat doe ik verkeerd?

Passwoorden houd je normaal gezien liever privé. Ik zou me niet registreren op een server waar er geen enkele vorm van beveiliging is ...

De methode die je gebruikt (en waarschijnlijk gekopiëerd hebt, anders wist je het wel) heet udb_hash.

Geplaatst:
comment_1657205

Want als ik dat doe, dan komt er in die accountfile

niet "password" te staan, maar "362939266"

Heb je er een verklaring voor?

Wat doe ik verkeerd?

Passwoorden houd je normaal gezien liever privé. Ik zou me niet registreren op een server waar er geen enkele vorm van beveiliging is ...

De methode die je gebruikt (en waarschijnlijk gekopiëerd hebt, anders wist je het wel) heet udb_hash.

Klopt, dat deel heb ik wél gekopieerd, maar natuurlijk kijk ik niet naar die wachtwoorden, alleen als iemand zijn wachtwoord kwijt is..

Script :

if(dialogid == 1)
{
    if(response)
    {
		PlayerInfo[playerid][pPassword] = dini_Int(udb_encode(pName), "pPassword");
		if(PlayerInfo[playerid][pPassword] == udb_hash(inputtext))
		{
		    LoginPlayer(playerid);
		}
		else
		{
		    pLoginTries[playerid] = pLoginTries[playerid]+1;
			format(string, sizeof(string), "Wrong password, %d/3 logintries left!", pLoginTries);
			SendClientMessage(playerid, COLOR_RED, string);
			ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Login", "Enter your password below:","Login", "Kick me");
		}
	}
	else
	{
		Kick(playerid);
	}
}

Ik hoop dat jullie mij kunnen helpen! Bedankt alvast!

EDIT : Als ik dan wel het wachtwoord intyp, wat ik bij het registreren heb gebrukt, doet hij het wel..

Maar in het bestand slaat hij het dus op als een nummer

- Lex

Bewerkt: door WebGhost

Geplaatst:
  • Auteur
comment_1660225

Ik zie dat je udb_hash gebruikt hebt dan is het normaal dat het cijfers zijn. ;)

Ik kan je probleem natuurlijk in je laatste post verkeerd begrepen hebben. ;)

  • 1 maand later...
  • 1 maand later...
Geplaatst:
comment_1716143

Ik heb nu 2 commando's:

/cmds

/teles

Maar als ik /teles typ, krijg ik de commando lijst :S

EDIT:

Ook als ik een ander CMD intyp, krijg ik nog steeds het Commando Dialog!

Opgelost:

Er zat een foutje in de commands!

Bewerkt: door Johannetje2

Geplaatst:
comment_1718019

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if(dialogid == 10)
{
	if(response)
	{
		if(!strcmp(inputtext, "", true))
		{
			SendClientMessage(playerid, COLOR_RED, "Verkeerd wachtwoord!");
			ShowPlayerDialog(playerid,10,DIALOG_STYLE_INPUT,"Registratie","Registreer jezelf!\n\Wachtwoord:","Registreer","Annuleer");
		}
		else
		{
			dini_Create(udb_encode(playername));
           	dini_IntSet(udb_encode(playername), "password", udb_hash(inputtext));
           	dini_IntSet(udb_encode(playername), "adminlevel", 0);
  	         	dini_IntSet(udb_encode(playername), "money", 0);
           	SendClientMessage(playerid, COLOR_RED, "Registratie succesvol, je bent automatisch ingelogd!");
           	logged[playerid] = 1;
		}
	}
	return 1;
}
return 1;
}

Bij het account systeem van Sandra lukt het me niet het registreren in een InputDialog te krijgen...

Ik wil dat als er niks is ingevuld, dat je een foutmelding krijgt, en als dat wel is dat je dan wordt geregistreerd. Waar zit de fout?

Geplaatst:
comment_1718338

Nog een vraagje, nu ben ik bij het inloggen de functie om te kijken of je al bent ingelogd moet ik er nog eventjes bijzetten...

if(dialogid == 11)
{
	if(response)
	{
	    if (udb_hash(inputtext) != strval(dini_Get(file), "password"))
		{
			SendClientMessage(playerid, COLOR_RED, "Verkeerd wachtwoord!");
			ShowPlayerDialog(playerid,11,DIALOG_STYLE_INPUT,"Inloggen","Inloggen...\n\nWachtwoord:","Inloggen","Annuleer");
		}
		else
		{
           	logged[playerid] = 1;
               money[playerid] = dini_Int(udb_encode(playername), "money");
               adminlevel[playerid] = dini_Int(udb_encode(playername), "adminlevel");
               GivePlayerMoney(playerid, money[playerid]);
               SendClientMessage(playerid, COLOR_RED, "Gefeliciteerd, ingelogd!");
		}
	}
	return 1;
}

Hij zegt met elk woord, enzo 'Verkeerd wachtwoord!'

ERRORS:

C:\SAMP Server\Ultimate Stuntages\filterscripts\Zadmin1.pwn(182) : warning 202: number of arguments does not match definition

C:\SAMP Server\Ultimate Stuntages\filterscripts\Zadmin1.pwn(182) : warning 202: number of arguments does not match definition

Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase

2 Warnings.

Sorry voor uitlijning, dat doet het GTAForum,

Lijn 182 is deze:

if (udb_hash(inputtext) != strval(dini_Get(file), "password"))

Bewerkt: door Johannetje2

Geplaatst:
comment_1718702

En alweer, zit ik vast met de code :bonk::bonk:

Bekijk

Eventjes op Pastebin gezet, de uitlijning is een beetje raar, maar in m'n code is hij goed, geen errors in PAWNO maar ingame bij het registreren geeft hij het volgende aan: Account bestaat al! en bij het inloggen: Verkeerd wachtwoord!

Kan iemand me helpen?

OPGELOST, Ik had een define verkeerd staan!

Bewerkt: door Johannetje2

  • 2 weken later...

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

Recent actief 0

  • Er zijn hier geen geregistreerde gebruikers aanwezig.