Da hier jeder der Meinung ist die Bilder als Hotlink einzufügen:
Ab jetzt nur noch mit Thumbnails oder Link. Der Rest wird gelöscht.
Da hier jeder der Meinung ist die Bilder als Hotlink einzufügen:
Ab jetzt nur noch mit Thumbnails oder Link. Der Rest wird gelöscht.
ZitatAlles anzeigenUpdates:
SA-MP 0.3.7 RC4 Client/Server update
- Fixes texture loading 'memory leak' which effected object text material replacements and material replacements where the texture was set to full alpha.
- Fixes weapon changing bullet ID/weapon ID desync (aka spraybug).
- Adds audio siren capability to all cars. There is a new default parameter at the end of CreateVehicle/AddStaticVehicleEx for enabling the audio siren instead of the normal horn.
- Adds vehicle door open/close ability to the server script.
- Adds vehicle windows open/close ability to the server script.
- Cuffed animation issues (SPECIAL_ACTION_CUFFED): There were still problems with this animation on certain skins where the arms would poke through the back of the model. Any existing handcuff attachments will probably need their positions updated again. There is a new handcuff model (11749) that are based on the ones from the game's opening cutscene.
- The mouse cursor will be disabled when the GTA:SA window is activated (returning from alt-tab etc).
- The LS BeachSide building is now replaced by SA-MP's one by default (similar to the LS Office Floors building). This was done because it works better with the game's existing LODs and has less problems with camera collisions.
Adds 61 new object IDs from Matite.
Audio siren related functions:
native CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawndelay, addsiren=0);
native AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, color1, color2, respawn_delay, addsiren=0);
forward OnVehicleSirenStateChange(playerid, vehicleid, newstate);
native GetVehicleParamsSirenState(vehicleid);
Important: Since there are changes to the parameters for CreateVehicle and AddStaticVehicleEx, all scripts using these functions should be compiled for 0.3.7. The code does not need to be updated however since the parameters have default values.
Car door/window functions:
native SetVehicleParamsCarDoors(vehicleid, driver, passenger, backleft, backright);
native GetVehicleParamsCarDoors(vehicleid, &driver, &passenger, &backleft, &backright);
native SetVehicleParamsCarWindows(vehicleid, driver, passenger, backleft, backright);
native GetVehicleParamsCarWindows(vehicleid, &driver, &passenger, &backleft, &backright);
Quelle: http://forum.sa-mp.com/showpost.php?p=3342927&postcount=1
Wie bereits geschrieben wurde, warte auf Antwort des Supports.
Das ist aber nicht richtig.
Mal als Beispiel:
ZitatPartInfo[0][ParteiCreatet] = 0
PartInfo[1][ParteiCreatet] = 0
PartInfo[2][ParteiCreatet] = 1
PartInfo[3][ParteiCreatet] = 1
Jetzt klickst du im Dialog zwar auf PartInfo[2], in listitem ist es aber 0 bzw durch deine +1 Rechnung 1. 1 ist aber nicht richtig, der Index wäre 2.
Gleiches für PartInfo[3]. Für diesen Wert ist listitem 1, dann +1 und wir haben 2 als Index. Richtig wäre aber 3.
Die Schleife ist daher nicht unbedingt falsch. Man sollte schon eine benutzen, um vom listitem auf den korrekten Index zu schließen.
Siehst du jetzt den Fehler:
new name[MAX_PLAYER_NAME];
// [..]
/* .. */, WantedLevel[name]
Der Name (name) ist bestimmt keine SpielerId (playerid).
Die Schleife mit p bei DIALOG_PARTEIWAEHLEN ist nicht richtig.
Du drückst doch die Partei, die sich in listitem befindet. Also musst du zumindest schon mal damit arbeiten, nicht mit irgendeiner Schleife ohne Bezug auf listitem.
Ist listitem = 2, dann brauchst du die 3 Partei aus der folgenden Schleife (von deinem Code kopiert):
for(new p=1;p<MAX_PARTEI;p++)
{
if(PartInfo[p][ParteiCreatet] != 0 && PartInfo[p][ParteiAusgeschlossen] == 0)
{
// wenn listitem = count, haben wir mit p die gewählte Partei. Mit if prüfen, in Variable speichern (außerhalb der Schleife) und mit break raus.
/* Hier muss dein Code rein :] */
// count muss jetzt erst kommen
count++;
}
}
Warum immer Partei 1:
Die 1. Partei wird immer gewählt, weil du in der Schleife unter DIALOG_PARTEIWAEHLEN am Ende ein return hast und somit nur der erste Wert der Schleife (p=1) durchläuft.
ZitatAlles anzeigenif(strfind(BetaServerTester[i],playrname,true) != -1) // <-- Die Bedingung prüft, ob playrname in BetaServerTester[i] steckt. Ist der Name dabei, wird er aber entfernt (SpielerEntfernen).
{
Nachricht(playerid,Rot,"Sie wurden vom Server gekickt,da Sie einen nicht in der BetaServerTester Gruppe des Servers sind.");
SetTimerEx("SpielerEntfernen",1000,false,"i",playerid);
format(BetaString, sizeof(BetaString), "%s wurde vom Server gekickt.", playrname);
NachrichtAnAlle(Rot,BetaString);
return 0;
}
Die Bedingung bzw Aufmachung des Codes passt nicht zu dem,was du möchtest.
Du musst durch alle Werte von BetaServerTester gehen und prüfen, ob der Spielername irgendwo in dem Array vorhanden ist (zB Variable gefunden=true setzen). Nachdem du alle BetaServerTester durchgegangen bist, prüfst du anschließend, ob gefunden true oder false ist. Ist gefunden false, dann kickst du den Spieler. Denn der Name kam nicht in BetaServerTester vor. Ist gefunden true, dann war der Name in BetaServerTester vor.
Ihr macht es aber schon kompliziert, dafür dass man auch einfach ein Passwort auf den Server setzen kann:
http://wiki.sa-mp.com/wiki/Server.cfg
Zitatpassword (p) Locking your server is another option that is available for the root server administrator. You can use this to lock unwanted visitors from the server. (p) symbolizes the password that will be used. By default your server will not have a password.
Das Tutorial ist echt schwach.
Dazu kommt mMn noch die Sache hinzu, dass es nicht gerade wie eine wirkliche Anleitung beschrieben ist. Es gibt unterschiedliche Schriftgrößen, die Überschrift "Anpassung auf das JobSystem" wird nirgendwo im Text erwähnt außer im Inhaltsverzeichnis und mal schreibst du "Schritt {2}" und mal lässt du es weg (Schritt {X}). Allgemein ist der Schreibstil nicht hilfreich. Satzzeichen oder Groß/Kleinschreibung fehlt sehr häufig.
TL;DR
Hier hast du eine Umfangreiche Kritik, bevor hier noch die 10/10 Wertungen reingeflogen kommen. Das Tutorial funktioniert so wie du es gepostet hast NICHT, es gibt Fehler beim kompilieren und selbst wenn man die behebt (sollte NIEMALS vorkommen in einer Anleitung, dass ich Fehler beheben muss), klappt es trotzdem nicht einwandfrei und schon gar nicht auf Dauer. Welche Punktewertung man dafür geben sollte, kannst dir ja selbst ausmalen.
Da du es ja anscheined 3Dimensional hinbekommen hast, kannst das Tutorial ja gerne schreiben.
Ist es ein Filterscript oder Gamemode?
Du veröffentlichst es im Filterscripts Bereich, der Code lässt aber auf ein Gamemode schließen. Zwar steht oben im Kommentar wiederrum etwas von einem Filterscriot, aber so nur weil es als Kommentar irgendwo steht, muss es ja nicht zwangsläufig genau so sein:
#if defined FILTERSCRIPT
public OnFilterScriptInit()
{
print("\n--------------------------------------");
print(" PNS-System by ExTaZZe");
print(" Alle Rechte liegen bei www.extazze.com");
print(" Die nutzung dieses Filterscriptes ist jedem gestatet");
print("--------------------------------------\n");
return 1;
}
public OnFilterScriptExit()
{
return 1;
}
#endif
public OnGameModeInit()
{
//Tore
PNS1 = CreateObject(980, 1024.75427, -1029.43445, 32.50388, 0.00000, 0.00000, 0.00000); //LS-Norden
PNS2 = CreateObject(980, 488.49481, -1735.63440, 12.85534, 0.00000, 0.00000, 352.07697); //LS-Westen
PNS3 = CreateObject(980, -1903.50757, 277.70166, 42.80104, 0.00000, 0.00000, 0.00000); //SF
PNS4 = CreateObject(980, 1968.67200, 2162.57275, 11.66726, 0.00000, 0.00000, 270.13461); //LV
//3D-Texte
Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, 1027.3616,-1030.1299,32.0721,15.0,0); //LS-Norden
Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, 485.3574,-1733.5873,11.0950,15.0,0); //LS-Westen
Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, -1908.8955,276.5127,41.0469,15.0,0); //SF
Create3DTextLabel("{FFFF99}PNS-System\n{FFFFFF}Besitzer: Unknown\nEintritt: 50$\nNutze '/openpns'", COLOR_WHITE, 1967.5160,2166.6807,10.8203,15.0,0); //LV
return 1;
}
Hast du dich denn beim Testen denn nie gefragt, wieso OnFilterScriptInit nie aufgerufen wurde? Vorausgesetzt, du hast es natürlich auch mal als eigenständiges Filterscript getestet. Das Problem liegt an o.g. Code in Zeile 1.
Außerdem ist es nicht gerade logisch (bin mir nicht mal sicher ob es überhaupt funktioniert), in einem Filterscript OnGameModeInit aufzurufen.
Ich weiss ja nicht, aber haben wir so eine Funktion hier nicht schon zig mal gepostet bekommen ?
Selbst ich hab dir schon mal geschrieben, dass du den Output des MySQL Plugins erhöhen musst.
hier
Man kann immer nur die ersten 64 Zeichen sehen des SQL Befehls, was in den meisten deiner Fälle einfach viel zu wenig ist.
Zitatformat(query, sizeof(query), "UPDATE wtafeln SET wtext='%i' WHERE wid='%i'", wInfo[id][wtext], id);
wtext='%i' ist übrigens falsch. Da muss %s hin.
Das musst du so auslesen:
cache_get_field_content(i,"Owner",PrivateVehicle[i][p_owner],Handle);
Hast es doch hier mal richtig als Fehler gefunden :-0.
Könnte teilweise richtig sind, Fehler sind aber trotzdem drin.
if(playercp == sizeof(brroutes))
Wird nicht klappen, außer es gibt nur 1 Route. Ich hatte im vorherigen Post dazu geschrieben, dass man ebend manuell durchzählen muss wann die Route endet oder wie viele CPs man durchfahren muss bei Route X.
SetPlayerCheckpoint(playerid,brroutes[playerid][b_x],brroutes[playerid][b_y],brroutes[playerid][b_z],brroutes[playerid][b_rad]);
playerid als Index schon mal gar nicht. Als Index muss der in CP gewählt werden, der in der Route als nächstes folgt. Im ursprünglichen Tutorial ist das Muellmann[playerid][pmi_Checkpoint] gewesen.
Sehe außerdem nicht, wo du die aktuelle Route des Spielers in einer Variable speicherst.
Zitathallo Goldkiller
Ist deaktiviert, bekomme bewusst keine Benachrichtigung.
Nur funktioniert sizeof bei dem Zugriff auf ein enum nicht. Liegt einfach daran, wie die enums wirklich (Variablen) funktionieren.
Ist ja nicht so, als würde dieses Problem nicht in der Dokumentation angemerkt werden.
ZitatYou have to provide the size (max_len) by yourself if you use an enum-array as destination.
Je nachdem welches MySQL Plugin du benutzt, wäre folgendes gemeint:
http://wiki.sa-mp.com/wiki/MySQL/R33#Log_types LOG_DEBUG/LOG_ALL
http://wiki.sa-mp.com/wiki/MySQL/R33#mysql_option LOG_TRUNCATE_DATA
Ging mir darum, dass du einfach mehr Informationen bekommst und dann auch die vollständige Ausgabe (Alles und ungekürzt).
Hast du dir auch mal die Ausgabe angeguckt die du gepostet hast?
Da man das komplette SQL Kommando nicht sehen kann, ist die Ausgabe nicht auszuwerten:
mysql_option (Ich denke du hast dieses Plugin)
Dort die Einstellung LOG_TRUNCATE_DATA, müsste wohl auf false damit man alles sieht.
Falls es nicht hilft, gib das SQL Kommando mit print(f) aus.
Rein von der Logik ist der Teil am eine deines SQL Statements auch Quatsch:
Zitat,UID = %d WHERE UID = '%d'
Heisst: Mach bei dem User, der die User ID 10 hat, den Wert der User ID auf 10.
Mach keinen Sinn. Denn der User mit der User ID 10 hat bereits den Wert der User ID auf 10 .
Ansonsten solltest du die Länge des Debug Ausgabe im MySQL Plugin erhöhen oder direkt den String query per print ausgeben und hier posten.
Zitatfor(new i = 0; i <= rows; i++)
Ist übrigens mit <= auch nicht richtig.
Angenommen du hast 1 Zeile, gehst du mir der schleife i = 0, i <= 1 gleich 2x durch. Mit dem Wert 0 und dem Wert 1.
//Edit:
Wenn UID wirklich dein Primärschlüssel ist,ist der Name auch schlecht gewählt. UID würde ich als UserID lesen. Wenn es um Garagen geht, würde ich wahrscheinlich GaragenID nehmen oder nur ID.