Ich sage es mal so, für die meisten geht es schneller und ist damit einfacher, wenn man sscanf und ocmd nutzt, anstatt mit strcmp und strtok die Befehle zu erstellen, das ist schwieriger.
Von der Performance ist ocmd auf jeden Fall besser, als es mit strcmp zu machen. sscanf und strtok nehmen sich in den meisten Fällen nicht viel.
Beiträge von Jeffry
-
-
Kann es sein, dass deine Include nicht zum Plugin passt?
Versuche es mal hiermit: MySQL (Installation, Zugriff, Einstellungen, Login & Register Beispiel)Damit dürften die Funktionen auch klappen.
(Mache dir sicherheitshalber ein Backup vom momentanen Plugin & Include). -
Versuche es mal mit "mysql_fetch_row".
Wenn das nicht geht, dann mache es mit:
http://wiki.sa-mp.com/wiki/MySQL#mysql_retrieve_row -
Kannst du den Code dazu bitte posten?
-
sscanf hat mit MySQL nichts direkt zu tun. Das kannst du also machen, wie es dir am liebsten ist, wenn du lieber strtok nutzt, kannst du das natürlich machen. Ich mache die Beispiele meistens mit sscanf, da das die meisten hier nutzen.
-
Füge bei OnPlayerConnect das ein:
pJailTime[playerid] = -1; -
Zum einen Brauchst du einen Stock, der abfragt, welchem Haus du am nächsten bist:
stock GetNearestHaus(playerid)
{
new id = -1, Float:dist, Float:tmp = 5.0;
for(new i = 0; i < sizeof(Hauser); i++)
{
dist = GetPlayerDistanceFromPoint(playerid, Hauser[i][H_X], Hauser[i][H_Y], Hauser[i][H_Z]);
if(dist < tmp)
{
tmp = dist;
id = i;
}
}
return id;
}Dann kann der Befehl so aussehen:
ocmd:hausbearbeiten(playerid, params[])
{
new item[16], value;
if(sscanf(params, "s[16]d", item, value)) return SendClientMessage(playerid, 0xFF0000FF, "Nutze: /hausbearbeiten [Preis/Miete] [Wert]");
new id = GetNearestHaus(playerid);
if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist nicht in der Nähe eines Hauses.");
if(!strcmp(item, "Preis", true))
{
Hauser[id][hPreis] = value;
//Nachricht etc...
return 1;
}
else if(!strcmp(item, "Miete", true))
{
Hauser[id][hMiete] = value;
//Nachricht etc...
return 1;
}
//...
return SendClientMessage(playerid, 0xFF0000FF, "Nutze: /hausbearbeiten [Preis/Miete] [Wert]");
} -
Ja, so kannst du das machen.
Anstatt auf 1 setzen, würde ich lieber die ID des Hauses setzen, und anstatt 0 dann -1, falls du eine Haus ID 0 hast. -
Sicher, dass du es im richtigen Include Ordner drin hast? Es gibt nämlich auch einen im Hauptordner des Servers, da darf die Include nicht drin sein.
-
Die Include (.inc Datei) muss in den Ordner /pawno/includes/, das Plugin (.dll / .so) in den Ordner /plugins/.
Danach musst du die pawno.exe aus /pawno/ öffnen, und deinen Code über "Öffnen" auswählen. -
An sich war das schonmal gut was du gemacht hast.
Nur das mit der VehicleID hat dich anscheinend etwas verwirrt, das war nämlich das einzig wirkliche Problem, was sich durch den ganzen Code gezogen hat. Da wir das hier nicht brauchen, habe ich das einfach entfernt, und die Speicherung beim "Check" mit dem Index "i" gemacht.Teste es so, das sollte dann alles klappen:
#include <a_samp>
#include <Dini>
#include <ocmd>
#include <streamer>#define MaxGifts 10
enum fracVehEnum
{
Float:e_x,
Float:e_y,
Float:e_z,
Float:e_a,
e_oID
};
new GiftBox[MaxGifts][fracVehEnum];public OnFilterScriptInit()
{
LoadGiftBoxs();
return 1;
}LoadGiftBoxs()
{
new CreatedGiftBoxes, path[64];
//Schleife durch alle Dateien:
for(new i=0; i<MaxGifts; i++)
{
//Es wird geprüft, ob ein Fahrzeug mit der ID existiert, wenn nicht, wird diese ID übersprungen
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
if(!fexist(path)) continue;
//Fahrzeug existiert im GiftBoxs-Ordner, wir laden die Daten jetzt aus der Datei.
GiftBox[i][e_x] = floatstr(dini_Get(path, "x"));
GiftBox[i][e_y] = floatstr(dini_Get(path, "y"));
GiftBox[i][e_z] = floatstr(dini_Get(path, "z"));
GiftBox[i][e_a] = floatstr(dini_Get(path, "a"));
GiftBox[i][e_oID] = CreateDynamicObject(19054, GiftBox[i][e_x], GiftBox[i][e_y], GiftBox[i][e_z], 0.0, 0.0, GiftBox[i][e_a]);CreatedGiftBoxes++;
if(CreatedGiftBoxes == MaxGifts) return print("Es können keine weiteren Geschenke geladen werden, Limit (MaxGifts) erreicht.");
}
return 1;
}stock SaveFracVehCheck(i)
{
//Deklaration neuer temporärer Variablen:
new path[64];
if(i > -1 && i < sizeof(GiftBox))
{
//Es wird der Pfad gesetzt:
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
//Und wir speichern die Daten:
dini_FloatSet(path, "x", GiftBox[i][e_x]);
dini_FloatSet(path, "y", GiftBox[i][e_y]);
dini_FloatSet(path, "z", GiftBox[i][e_z]);
dini_FloatSet(path, "a", GiftBox[i][e_a]);
return 1; //Es gibt ja keine zwei gleichen Fahrzeuge
}
return 0; //Fahrzeug ist kein Fraktions-Fahrzeug
}forward SaveAllFracVehs();
public SaveAllFracVehs()
{
//Deklaration neuer temporärer Variablen:
new path[64];
//Schleife durch alle Fraktions-Fahrzeuge:
for(new i=0; i<MaxGifts; i++)
{
//Es wird der Pfad gesetzt:
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
//Und wir speichern die Daten:
dini_FloatSet(path, "x", GiftBox[i][e_x]);
dini_FloatSet(path, "y", GiftBox[i][e_y]);
dini_FloatSet(path, "z", GiftBox[i][e_z]);
dini_FloatSet(path, "a", GiftBox[i][e_a]);
}
return 1;
}ocmd:geschenk(playerid, params[])
{
for(new i=0; i<MaxGifts; i++)
{
if(GiftBox[i][e_x] == 0.0 && GiftBox[i][e_y] == 0.0 && GiftBox[i][e_z] == 0.0)
{
//Daten werden übergeben
new Float:x, Float:y, Float:z, Float:a;
GetPlayerPos(playerid, x, y, z);
GetPlayerFacingAngle(playerid, a);
GiftBox[i][e_x] = x;
GiftBox[i][e_y] = y;
GiftBox[i][e_z] = z - 0.4;
GiftBox[i][e_a] = a;
GiftBox[i][e_oID] = CreateDynamicObject(19054,x, y, z - 0.4, 0.0, 0.0,a);//Zuletzt wird die Datei angelegt und das Fahrzeug gespeichert.
new path[64];
format(path, sizeof(path), "/GiftBoxs/%d.ini", i);
dini_Create(path);
SaveFracVehCheck(i);
return SendClientMessage(playerid, 0x00FF00FF, "Geschenke gespeichert.");
}
}
return SendClientMessage(playerid, 0xFF0000FF, "Error: Limit für Geschenke erreicht.");
}//Stocks
stock strtok2(const string[], &index) //©Jeffry
{
new result[20], length = strlen(string), i = index;
while ((i < length) && (string[i] == ' ')) i++;
strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
index++;
return result;
}
stock IsNumeric(string[])
{
for (new i = 0, j = strlen(string); i < j; i++)
{
if ((string[i] > '9' || string[i] < '0')) return 0;
}
return 1;
} -
printf("[ERROR] Interior '%d' existiert nicht (ID: %d).",Hauser[id][IntID], ID);
zu:
printf("[ERROR] Interior '%d' existiert nicht (ID: %d).",Hauser[id][IntID], id);Das "ID" muss klein geschrieben werden, sonst nutzt du das Teil aus dem Enum, das geht nicht.
-
Nimm die Befehle die nicht gehen, und füge sie direkt unter den Befehl ein, der geht (gleich eine Zeile drunter).
Wenn sie dann noch immer nicht gehen, dann benenne sie mal um zu /abcdef oder sowas, einfach zum Testen, ob vielleicht alle Befehle mit "m" zu Beginn nicht gehen. -
Also ich habe es jetzt grade bei mir ausprobiert, da klappt es ohne Probleme.
Siehe:
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. -
Welche Zeile ist denn die 439? Kannst du die bitte markieren, oder einzeln posten?
-
Nutzt du einen zweiten Command Prozessor?
Poste gegebenenfalls mal einen Befehl, der geht. -
Welches ist denn die 439 und wie sieht dein enum zu Hauser aus?
-
Versuche es so:
cmd:aufbrechen(playerid,params[])
{
if(!IstSpielerInFrak(playerid,5)) return SendClientMessage(playerid,COLOR_RED,"Du bist nicht beim ADAC!");
new Float:vX, Float:vY, Float:vZ, p_vid = GetPlayerVehicleID(playerid);
for(new vid = 0; vid < MAX_VEHICLES; vid++)
{
if(vid == p_vid) continue;
GetVehiclePos(vid,vX,vY,vZ);
if(GetPlayerDistanceFromPoint(playerid, vX, vY, vZ) < 10.0)
{
PutPlayerInVehicle(playerid, vid, 0);
return SendClientMessage(playerid, COLOR_GREEN, "Du hast das Fahrzeug aufgebrochen");
}
}
return SendClientMessage(playerid, COLOR_RED, "Es befindet sich kein Fahrzeug in der Nähe!");
}Habe die Distanz etwas erhöht und in der Schleife was verbessert. Wenn es geht, dann kannst du ja versuchen, die Distanz wieder anzupassen.
-
Könntest du das bitte so posten, dass nicht alles in einer Zeile steht?
-
Dein Query geht auf QuerySelectAllHouse, das Create3DTextLabel ist aber im case-Teil von QueryCallHouse. Möglicherweise ist das das Problem, falls das nicht so gewollt ist. Ansonsten müsstest du mal den entsprechenden case-Teil posten.