Mit einem kleinen Denkanstoß wird das wohl nicht getan sein, da diese Systeme meist sehr komplex sind.
Wenn du eines mit wenig Aufwand haben möchtest, dann schau dir mal diese Include an, die nutzt SQLite, das könntest du zu deinem Plugin umschreiben, oder einfach lassen, das bleibt dir dann überlassen, da hättest du aber schonmal das meiste was du brauchst: http://forum.sa-mp.com/showthread.php?t=544787
Beiträge von Jeffry
-
-
Auf Nachfrage von @[LnD]JustMe.77 habe ich mir gedacht ich schreibe das kurz für den DIALOG_STYLE_MSGBOX zusammen und poste es hier, falls mal wieder jemand danach sucht bzw. jemand es benötigt.
Externer Inhalt www.youtube.comInhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.Unter den Includes die Variablen sowie der Hook für die Dialoge:
#define DIALOG_TEST 1337
new testCount[MAX_PLAYERS];new pDialog[MAX_PLAYERS] = {-1,...};
stock my_ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]) //©Jeffry
{
if(!IsPlayerConnected(playerid)) return 0;
pDialog[playerid] = dialogid;
ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
return 1;
}#if defined _ALS_ShowPlayerDialog
#undef ShowPlayerDialog
#else
#define _ALS_ShowPlayerDialog
#endif
#define ShowPlayerDialog my_ShowPlayerDialogBei OnFilterScriptInit/OnGameModeInit:
SetTimer("ReshowDialog", 460, true);Bei OnPlayerDisconnect:
pDialog[playerid] = -1;Hier einen Test-Befehl für OnPlayerCommandText:
if(!strcmp(cmdtext, "/dialog", true))
{
testCount[playerid] = gettime();
ShowPlayerDialog(playerid, DIALOG_TEST, DIALOG_STYLE_MSGBOX, "Test Dialog", "Du hast diesen Dialog offen seit: 00:00", "Ok", "Abbrechen");
return 1;
}Dann der Teil zu OnDialogResponse:
//Ganz oben als erstes in OnDialogResponse:
pDialog[playerid] = -1;
Sowie:if(dialogid == DIALOG_TEST)
{
if(response)
{
SendClientMessage(playerid, 0xFFFFFFFF, "Hallo Welt!");
}
else
{
SendClientMessage(playerid, 0xFF0000FF, "Hallo Welt!");
}
return 1;
}Und dann ganz unten im Filterscript/Gamemode:
forward ReshowDialog();
public ReshowDialog()
{
new str[128];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(pDialog[i] == -1) continue;
if(pDialog[i] == DIALOG_TEST)
{
new t = gettime() - testCount[i];
format(str, sizeof(str), "Du hast diesen Dialog offen seit: %02d:%02d", t/60, t%60);
ShowPlayerDialog(i, DIALOG_TEST, DIALOG_STYLE_MSGBOX, "Test Dialog", str, "Ok", "Abbrechen");
}
//andere Dialoge...
}
return 1;
}Oder alternativ hier das ganze als kompletten Filterscript:
#include <a_samp>
#define DIALOG_TEST 1337
new testCount[MAX_PLAYERS];new pDialog[MAX_PLAYERS] = {-1,...};
stock my_ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]) //©Jeffry
{
if(!IsPlayerConnected(playerid)) return 0;
pDialog[playerid] = dialogid;
ShowPlayerDialog(playerid, dialogid, style, caption, info, button1, button2);
return 1;
}#if defined _ALS_ShowPlayerDialog
#undef ShowPlayerDialog
#else
#define _ALS_ShowPlayerDialog
#endif
#define ShowPlayerDialog my_ShowPlayerDialogpublic OnPlayerDisconnect(playerid, reason)
{
pDialog[playerid] = -1;
return 1;
}public OnFilterScriptInit()
{
SetTimer("ReshowDialog", 460, true);
return 1;
}public OnPlayerCommandText(playerid, cmdtext[])
{
if(!strcmp(cmdtext, "/dialog", true))
{
testCount[playerid] = gettime();
ShowPlayerDialog(playerid, DIALOG_TEST, DIALOG_STYLE_MSGBOX, "Test Dialog", "Du hast diesen Dialog offen seit: 00:00", "Ok", "Abbrechen");
return 1;
}
return 0;
}public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
//Ganz oben:
pDialog[playerid] = -1;//...
if(dialogid == DIALOG_TEST)
{
if(response)
{
SendClientMessage(playerid, 0xFFFFFFFF, "Hallo Welt!");
}
else
{
SendClientMessage(playerid, 0xFF0000FF, "Hallo Welt!");
}
return 1;
}//...
return 0;
}forward ReshowDialog();
public ReshowDialog()
{
new str[128];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(pDialog[i] == -1) continue;
if(pDialog[i] == DIALOG_TEST)
{
new t = gettime() - testCount[i];
format(str, sizeof(str), "Du hast diesen Dialog offen seit: %02d:%02d", t/60, t%60);
ShowPlayerDialog(i, DIALOG_TEST, DIALOG_STYLE_MSGBOX, "Test Dialog", str, "Ok", "Abbrechen");
}
//andere Dialoge...
}
return 1;
} -
Wenn du nur INSERT als Anweisung hast, dann kann das nicht funktionieren, sondern dir werden lauter Errors im MySQL Log ausgegeben, bzw. das Fahrzeug X-Mal erstellt, je nach Datenbank Aufbau.
Was aber für mich nicht schlüssig ist, ist, dass du ja den gleichen Code aufrufst, daher sollte das dann auch gleich funktionieren, insofern es dann tut.
Poste bitte mal alles was mit dem Speichern der Fahrzeuge zu tun hat.
-
GetVehicleModelInfo gibt nur die Offset Koordinaten zurück, zum Tankdeckel, deshalb rechne ich danach die Offsets (xx, yy, zz) zu den Koordinaten des Fahrzeugs hinzu.
-
Das ist nur ein INSERT, das legt das Fahrzeug in der Datenbank an.
Hast du auch ein UPDATE dazu, also um die Werte zu aktualisieren? Bei den "veh"-Fahrzeugen müsste das existieren. -
Die Funktion GetVehicleModelInfo gibt die Koordinaten des Tankdeckels ausgesehen von der Mitte des Fahrzeugs zurück, das ist also nur ein Offset. Daher musst du die tatsächlichen Koordinaten noch dazu rechnen, und die Abfrage dann mit IsPlayerInRangeOfPoint machen. Ich habe zwar noch nie mit der Funktion GetVehicleModelInfo gearbeitet, aber insofern ich sie dann richtig verstehe, sollte es so aussehen:
if(strcmp(cmd, "/tanken", true) == 0)
{
if(IsPlayerConnected(playerid))
{
if(gPlayerLogged[playerid] == 0) return SendClientMessage(playerid, COLOR_WHITE, "Du bist {FF8484}nicht{FFFFFF} angemeldet!");
new Float:x, Float:y, Float:z, Floatxx, Float:yy, Float:zz, vid = GetPlayerVehicleID(playerid);
GetVehiclePos(vid, x, y, z);
GetVehicleModelInfo(GetVehicleModel(vid), VEHICLE_MODEL_INFO_PETROLCAP, xx, yy, zz);
x += xx;
y += yy;
z += zz;
if(IsPlayerInRangeOfPoint(playerid, 2.0, x, y, z))
{
SendClientMessage(playerid,COLOR_WHITE," Dein Fahrzeug wird {A4FF85}betankt{FFFFFF}, Bitte warten....");
}
else SendClientMessage(playerid, COLOR_WHITE, "Du bist {FF8484}nicht{FFFFFF} am Tankdeckel des Fahrzeuges!");
}
return 1;
}Gegebenenfalls musst du den Range (2.0) noch anpassen.
-
Also bei mir klappt es ohne Probleme, habe genau die gleichen Bezeichnungen genommen.
Du kannst ja mal versuchen, dir das SA-MP Paket nochmal neu herunterzuladen, und es dort einzufügen.Dann öffne die pawno.exe und wähle deinen Code über "öffnen" aus, achte darauf, dass es der richtige Pfad ist, wenn du den Code vielleicht mehrmals hast. Ging mir mal so, da habe ich in einem Backup herumgewerkelt, und hab es nicht gemerkt, dann kam auch so ein unerklärlicher Fehler zustande.
Die Funktion sollte übrigens so aussehen:
stock PlayerName(playerid){
new str[MAX_PLAYER_NAME];
GetPlayerName(playerid, str, sizeof(str));
return str;
} -
Ja, das meinte ich.
Bei der Datenbankstruktur, mach da bei der Slot ID das "NOT NULL" weg, und erstelle die Tabelle dann nochmal neu. Dann sollte der Eintrag mit Slot ID 0 da sein.
-
Als Hinweis an euch beide @reaL. und @PrideGame :
Mit der Umstellung auf WBB4 wurden alle Themen, die zum Zeitpunkt davor gepostet wurden auf erledigt gestellt, daher sind alle Themen vor September 2015 auf erledigt.
Dazu kam noch, dass in der Zeit um Weihnachten/Neujahr nochmals eine kleine Änderung war, die erneut alle Themen, die bis dahin gepostet waren, auf erledigt gesetzt hat. Deshalb sind nun alle Themen, die vor 2016 gepostet wurden auf erledigt. Man kann also bei den älteren Threads nicht wirklich sagen, ob sie nun erledigt sind oder nicht.Aber: Dieses Thema ist nun fast ein Jahr alt, wäre das noch "aktuell", dann hätte sich der Threadstarter sicher nochmals gemeldet. Gegebenenfalls macht es mehr Sinn, wenn jemand diese Systeme für ihn erstellen will, ihn per PN/Mail zu kontaktieren, die Chance ist größer, dass das gesehen wird.
-
Das ist alles korrekt, für mich ist das nicht schlüssig, warum du in Zeile 1 (Kommentar) einen Error bekommst.
Was du mal probieren kannst ist, dir den aktuellen Server-Ordner nochmal runterzuladen (sa-mp.com) und dann mit der dort beigelegten pawno.exe deinen Code versuchen zu kompilieren, indem du deinen Code dort zu den gamemodes einfügst.
Geht es dann?Wenn nicht, dann kann ich dir anbieten, dass du mir in PN mal den ganzen Code schickst, via Dropbox/OneDrive/GoogleDrive/... dann versuche ich mal bei mir ob ich es kompilieren kann.
-
Poste bitte mal deine Code-Zeilen 1 bis 25.
PS: Du hast das Thema zwei mal gepostet, lösche bitte den anderen Post.
(Function funktioniert nicht) -
Der Fehler ist in Zeile 1 bereits.
Ist das der ganze Code?Dann fehlt ganz oben, also in der ersten Zeile:
#include <a_samp> -
Welche MySQL Version nutzt du?
-
Das Problem taucht in aller Regel dann auf, wenn zu viele Spieler zu vielen Objekten nahe sind, denn es können auch mit Streamer nur 1000 Objekte angezeigt werden, die die zu weit weg sind werden solange eben temporär gelöscht.
Dies kann auch dadurch verursacht werden, dass zu viele Objekte noch mit CreateObject anstatt mit CreateDynamicObject erstellt werden, die sind nämlich dauerhaft dann da. Am besten man hat alle Objekte mit CreateDynamicObject erstellt.In seltenen Fällen hilft es auch, das Streamer Plugin zu aktualisieren, ansonsten mal versuchen, weniger Maps zu verwenden, vor allem diese nicht, die in einem kleinen Umkreis Unmengen an Objekten nutzen.
-
Vom Prinzip her gleich, du müsstest den Code eben an Message Boxen anpassen.
Es muss eben ein Timer laufen, der den Text immer wieder dem Spieler anzeigt, solange er den Dialog offen hat.
-
Hiermit zum Beispiel:
[jTuT] Interaktive DialogeIm Prinzip macht das aber nichts anderes, da es keine Update Funktion für Dialoge gibt.
-
GivePlayerScore(RandomPlayer,15);
GivePlayerScore wird es automatisch erhöhen, daher ohne das GetPlayerScore. -
Dann leere bitte deinen MySQL Log, lösche die Tabelle und mache das gleiche nochmal.
Dann poste den MySQL Log, möglicherweise wird da ein Fehler ausgegeben. -
Hast du die Tabelle gelöscht und neu erstellt? Wenn nicht, mache das mal.
Dem Code nach passt es eigentlich, die Zeile mit dem Slot 0 sollte angelegt werden, wenn es die Tabelle erlaubt. Lösche die mal und lasse sie neu erstellen. -
Dann hast du nach der Klammer zu die geschweifte Klammer entfernt. War etwas ungeschickt von mir gepostet, einmal mit und einmal ohne die Klammer, sorry.
Also so:
if(strlen(params) > 1) {