Was fehlt da? Die Admin-Befehle wirst du schon selbst machen müssen, oder du lädst dir ein System runter.
Ein Beispielsystem, das das R5 benutzt ist hier: http://forum.sa-mp.com/showthread.php?t=386118
Beiträge von Jeffry
-
-
Das bekannteste Tutorial für das R5:
[ SCRIPTING ] MySQL (Installation, Zugriff, Einstellungen, Login & Register Beispiel)Es wird auch das Level (Admin Level) beschrieben.
-
Ich verstehe nicht warum man das return 1; weglassen soll. Manchmal bleibt es und manchmal kann man es weglassen
Ein "return" beendet das Callback bzw. die Funktion genau an der Stelle und zwar immer dann, wenn es aufgerufen wird.Als hier in Kurzform dein OnPlayerSpawn:
public ...
Code...
Code...
return 1;
Code... //wird NIEMALS erreicht.
return 1;Nach dem ersten return ist schon Ende, das heißt der Code darunter wird NIE aufgerufen, daher die Warnung "unreachable Code" (unerreichbarer Code).
Anders hier:
public ...
Code...
if(irgendwas) return 1;
Code... //Wir erreicht, wenn "irgendwas" nicht eintrifft.
return 1;Hier bekommst du keine Warnung, da der Code unter dem IF nur dann nicht aufgerufen wird, wenn "irgendwas" eintrifft, wenn nicht, führt er den Code unter dem IF aus.
=> Du hast als einen Code wie im ersten Beispiel, der unter keinen Umständen aufgerufen wird, daher macht das für den Compiler keinen Sinn.
Entferne das return 1, das da mittendrin steht, oder setze es in eine IF-Verschachtelung in der du es wirklich haben willst.
-
Zu deinem ersten Problem, du musst den Code aus der Schleife holen:
public Pfandadd()
{
new str[3], count, query[128];
for(new i=1;i<MAX_TONNEN;i++)
{
format(str, 3, "%i", i);
if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
count ++;
}
new rand = 1 + random(count);
format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
mysql_query(query);
mysql_store_result();
if(!mysql_num_rows())
{
KillTimer(Tonnentimer);
Tonnentimer = SetTimer("Pfandadd", 1000, false);
printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
}
else
{
KillTimer(Tonnentimer);
format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+12 WHERE id=%i", rand);
mysql_query(query);
Tonnentimer = SetTimer("Pfandadd", 60*1000*10, true);
printf("Es wurden 12 Pfandflaschenan ID: %i übermittelt!",rand);
}
mysql_free_result();
return 1;
}Zum zweiten Problem: Hier genau andersrum, du musst den Code in die Schleife Packen:
ocmd:pfandsuchen(playerid)
{
new str[3], Float:X, Float:Y, Float:Z, query[128], string[256], rand = 1 + random(12);
for(new i;i<MAX_TONNEN;i++)
{
format(str, 3, "%i", i);
format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", i);
mysql_query(query);
mysql_store_result();
if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
X = mysql_GetFloat("nlr_tonne", "X", "id", str), Y = mysql_GetFloat("nlr_tonne", "Y", "id", str), Z = mysql_GetFloat("nlr_tonne", "Z", "id", str);
if(!IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))continue;
mysql_free_result();
format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen-%i WHERE id=%i",rand, i);
mysql_query(query);
uInfo[playerid][sPfandflaschen] += rand;
format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast %i {EBFF00}Pfandflaschen{FFFFFF} aus der {EBFF00}Mülltonne{FFFFFF} gekramt!", rand);
SendClientMessage(playerid, COLOR_GREEN, string);
return 1;
}
return SendClientMessage(playerid, COLOR_RED, "Keine Tonne hier.");
}Ich habe dir mal deine MySQL Queries gelassen wie sie sind, da ich nicht weiß wie du die Funktionen (mysql_GetFloat) hast, aber unter Umständen ist das recht Ressourcenlastig geschrieben. Aber in erster Linie schauen wir mal, dass es überhaupt geht.
-
Naja, ist es nicht möglich einfach eine Schleife in 'n Timer zu setzten die abfragt ob sich die Spieler (die in Fahrzeugen befinden) sich nah sind (IsPlayerInRangeOfPoint) und das Fahrzeug einfach ein paar (SA-) Meter weg zu setzten ?
Klar, das geht.Schleife durch alle Spieler deren GetPlayerState = PLAYER_STATE_DRIVER ist, wenn ja, dann die selbe Schleife nochmal die prüft ob der Spieler irgend einem anderen Spieler der im Auto ist zu nahe ist, wenn ja, setze X Meter zur Seite/nach Vorne/nach Hinten.
-
Sorry, vertippt.
Es heißt OnPlayerCommandText.EDIT: Nein, nicht bei OnPlayerText reinmachen, es gehört zu OnPlayerCommandText.
-
Ändere mal:
GetPlayerWeaponData(playerid, i, Waffen, Muni);
zu:
GetPlayerWeaponData(playerid, i, Waffen, Muni);
printf("%d > %d (i: %d - Waffen: %d)", Muni, BuyedWeapons[playerid][Waffen], i, Waffen);Was kommt im Server Log wenn du gebannt wirst?
PS: Probiere das mal mit dem pwn Code, wenn du den Script den du posten willst zuerst in Editor einfügst, dann alles markierst und ausschneidest, und dann hier einfügst. Funktioniert es dann?
-
Steht doch alles da.
Include passt nicht mit dem Plugin zusammen.Lade dir das neuste nochmal komplett runter und füge es richtig in deinen Server-Ordner ein (plugins zu plugins, includes zu /pawno/includes): http://forum.sa-mp.com/showthread.php?t=56564
-
Meep, jetzt mach ich dir ja alles, eigentlich solltest du das selbst machen.
Aber naja, das ist nichts weltbewegendes an Code, zwei Minuten.public OnPlayerCommandText(playerid, cmdtext[])
{
new eingabe[128];
format(eingabe, sizeof(eingabe), "cmd:%s(playerid,params[])", cmdtext[1]);
new File:hFile, i, string[128];
if(fexist("TestScript.txt"))
{
hFile = fopen("TestScript.txt", io_read);
while(fread(hFile, string))
{
i++;
if(strfind(string, eingabe, true) != -1) format(string, sizeof(string), "Zeile ben. %d: %s", i, string), SendClientMessage(playerid, FARBE, string);
}
}
return 0;
}Ich nutze strfind, weil es ja sein kann, dass du dahinter noch einen Kommentar hast.
-
Bei 99.9% der Nutzer hier muss man zehn mal sagen, sie sollen doch mehr Informationen posten, du überschüttest einen mit Informationen.
Wobei das natürlich eine lange Rede mit kurzem Sinn ist, du willst einen Befehl: /zeile [Nummer]dcmd_zeile(playerid, params[])
{
if(strval(params) < 1) return SendClientMessage(playerid, ROT, "Error: Ungültige Zeile");
new File:hFile, i, string[128], found;
new zahl = strval(params);
if(fexist("TestScript.txt"))
{
hFile = fopen("TestScript.txt", io_read);
while(fread(hFile, string))
{
i++;
if(i==zahl) format(string, sizeof(string), "Zeile %d: %s", i, string), SendClientMessage(playerid, FARBE, string), found = 1;
}
}
if(found != 1) return SendClientMessage(playerid, ROT, "Error: Ungültige Zeile (nicht gefunden)");
return 1;
}Das sollte passen.
-
Ich glaube nicht, dass der Spieler bei OnPlayerConnect den Server verlässt...
Wie auch immer, beginne dein OnPlayerConnect so:
public OnPlayerConnect(playerid)
{
printf("Called OnPlayerConnect for ID %d", playerid);
if(playerid >= MXP)
MXP = playerid+1;
//...Wenn du das so einfügst, steht das dann im Server Log?
Wenn ja, führe diese Art von printf durch das gesamte OnPlayerConnect fort.
Wenn nein, hast du FilterScripts? -
Ja, setze dich damit mal auseinander.
Code
new File:hFile, i, string[128];
new zahl = 1000;
if(fexist("TestScript.txt"))
{
hFile = fopen("TestScript.txt", io_read);
while(fread(hFile, string))
{
i++;
if(i==zahl) format(string, sizeof(string), "Zeile %d: %s", i, string), SendClientMessage(playerid, FARBE, string);
}
}#Handy
-
Ja, das kann man als Funktion machen, wobei das eher nicht empfehlenswert ist, nur eine Zeile in der Funktion auszugeben.
Ich würde dir raten, das mit einer Variable zu machen, oder direkt. Wenn du dir meinen Post oben nochmal ansiehst, dann siehst du warum es nicht sinnvoll ist, eine einzelne Zeile per Funktion ausgegeben zu lassen, da man bei drei Zeilen die ganze Datei drei mal durchlesen würde.
Übrigens ist in deinem Code eine Klammer zu viel bei fOpen.
EDIT: Weil du einen Editor mit einem anderen Zeilenumbruch benutzt.
-
Öffnen und schließen hast du ja schon. Lesen geht so, in dem Fall Zeile 1000-1005.
while(fread(hFile, string))
{
i++;
if(i>=1000 && i<1006) print(string);
}Mit fexist fragst du ab ob eine Datei existiert.
-
Versuch es doch erst mal mit einer Kopie des Codes im Scriptfiles Ordner. Wenn du das funktionsfähig hast, kannst du dich immer noch an das Plugin machen, falls dir das den Mehraufwand wert ist.
Oder du schaust Dir einfach mal den Beispiel Code an der dabei ist, das sollte eigentlich alle Fragen klären.
-
Wir können dir nur helfen wenn du uns Informationen gibst. Was für eine Fehlermeldung kommt denn auf deinem Server?
Wenn du den Code dazu postest, wäre das sicher auch nicht schlecht.Außerdem: Bei Überschriften mit HILFE DRINGEND meint man immer jemand sei in Lebensgefahr...
-
Machbar ist das sicherlich, wenn du mit dem Plugin:
http://forum.sa-mp.com/showthread.php?t=92246Den Code öffnest und durchliest. Die Zeilen vergleichst du dann, ob dort zum Beispiel der Beginn des Befehls ist, wenn ja, gibst du die Zeilen bis zur letzten Klammer zu aus.
Letztlich ist es nur eine Frage von string-comparing, also dem vergleichen von Strings.
Du kannst auch auf das Plugin verzichten, wenn du eine Kopie von der pwn Datei in dem Scriptfiles Ordner hast.
-
Dann poste bitte den Code wie du ihn hast, wenn du den Code vor mir benutzt.
-
Hmm.. Aber wenn ich es genau so mache, wie du es mir gegeben hast, dann wird "Speed" mit dem Wert 0 ausgegeben.
Die Funktion "GetPlayerSpeed" hat nur einen Parameter, nämlich den, für die Player-ID.
Wie ich schon sagte, mit der GetPlayerSpeed Funktion die ich dir gegeben habe, benenn die von mit aus um, zu GetPlayerSpeed2, wenn du schon eine GetPlayerSpeed Funktion hast. Dann wirst du sehen, dass es geht. Ich weiß ja nicht was für Werte deine GetPlayerSpeed-Funktion zurück gibt. -
Ja, und? Ist doch auch richtig so.
Zum eigentlichen Problem: Das liegt daran, dass bei jedem OnPlayerUpdate die Geschwindigkeit wieder runtergesetzt wird, da der Spieler ja eigentlich nicht so schnell laufen kann. Wenn du es GENAU so machst wie ich es dir gegeben habe, auch mit der GetPlayerSpeed Funktion, dann geht es, mit kleinen Rucklern, aber er ist merklich schneller.