CMD:ashow(playerid,params[])
{
if(!IstSpielerAdmin(playerid,3)) return SCM(playerid,weiss,"Sie haben keine Berechtigung.");
if(!strlen(params)) return SCM(playerid,weiss,"Nutze /ashow [Text]");
new text[128];
format(text,sizeof(text),"Admin Ankündigung: ''%s''",params);
InfoTextForAll(text,5000);
return 1;
}
Beiträge von Jeffry
-
-
new unsichbarewand1 = CreateDynamicObject(8661,119.5000000,11.2998050,707.2999900,90.0000000,90.0000000,7.9925537); //object(gnhtelgrnd_lvs) (1)
for(new i; i < 25; i ++) { SetDynamicObjectMaterial(unsichbarewand1, i,18072, "gap_window", "cj_white_wall", 0x00000000); } -
[jTool] Alle Befehle auslesen
Hallo,ich veröffentliche hiermit ein kleines aber effizientes Tool, welches alle verwendbaren Befehle aus einem Filterscript bzw. einem Gamemode auslesen und ausgeben kann, das spart durchaus mehrere Stunden Sucharbeit im Code. Die Idee stammt aus diesem Thread: Frage zu OCMD
Verzichtserklärung:
Der Code wird veröffentlicht "wie er ist". Es wird dringendst empfohlen vor Benutzung ein Backup der Serverfiles zu machen. Für Schäden jeglicher Art übernehme ich keine Haftung, die Benutzung erfolgt auf eigene Verantwortung.
Der Code darf jederzeit von jedem verändert werden, solange die Namensnennung nicht aus dem Code entfernt wird.
Der Code darf nicht unter eigenem Name veröffentlicht werden, weder frei noch kommerziell.Vorführung
Das Tool ist nicht mehr als eine kleine ausführbare Datei bzw. ein Visual Basic Code (.vbs) um es beim Namen zu nennen. Im richtigen Verzeichnis abgelegt und gestartet macht der Code in Sekundenschnelle die Arbeit für die man selbst mehrere Stunden bräuchte.
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.Anleitung
Die folgenden Schritte sollen zeigen wie der Code verwendet werden kann, um die Befehle aus der jeweiligen .pwn Datei auszulesen.
Ich weise nochmals darauf hin, vor Benutzung ein Backup des Servers, bzw. der Dateien darin, anzulegen. Der Code wurde nach bestem Wissen und Gewissen getestet, dennoch können unvorhergesehene Ereignisse (z.B. Stromausfall) möglicherweise zu Fehlern führen. Ebenfalls weise ich nochmals darauf hin, dass die Benutzung auf eigene Gefahr geschieht.1. Code herunterladen
Um den Code auf den Rechner zu bekommen gibt es zwei Möglichkeiten:- Die erste und einfachste Variante ist der direkte Download. Im Anhang befindet sich ein ZIP-Ordner der die ausführbare Datei enthält.
1) ZIP Ordner auf den Windows-PC herunterladen
2) Datei entpacken - Die zweite Variante ist die manuelle Erstellung der Datei:
1) Kopiere folgenden Quellcode:C
Alles anzeigen'-------------------------------------------------------------------------' ' ' ' [jTool] - Alle Befehle auslesen ' ' j_cmdsAusgeben.vbs ' ' ' ' Version 1.1 - 11.12.2014 ' ' ' ' © Jeffry ' ' ' '-------------------------------------------------------------------------' Set fs = CreateObject("Scripting.FileSystemObject") pfad = fs.GetParentFolderName(Wscript.ScriptFullName) If(fs.FileExists(pfad & "\AlleBefehle.txt")) Then Set wFile = fs.OpenTextFile(pfad & "\AlleBefehle.txt", 8) wFile.WriteLine "" wFile.WriteLine "" Else Set wFile = fs.CreateTextFile(pfad & "\AlleBefehle.txt", True) End If wFile.WriteLine "----" & CStr(Now) & "----" cmds = 0 Set sDir = fs.getfolder(pfad) For Each file In sDir.Files If(LCase(Right(file.path, 4)) = ".pwn") Then Set rFile = fs.OpenTextFile(file.path, 1) blockcomment = false Do While rFile.AtEndOfStream <> true str = "" str = rFile.ReadLine If(InStr(str, "*/") And blockcomment = true) Then blockcomment = false If(blockcomment = false) Then comment = InStr(str, "//") bcomment = InStr(str, "/*") ccomment = InStr(str, "*/") If(bcomment <> 0 And ccomment = 0) Then comment = bcomment tmp = InStr(str, "dcmd_") If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then If(InStr(tmp, str, "),") = 0 And InStr(tmp, str, ");") = 0 And InStr(str, "#define") = 0) Then tmpstr = Mid(str, tmp+5, InStr(tmp, str, "(")-(tmp+5)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 End If End If tmp = InStr(str, "ocmd:") If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then tmpstr = Mid(str, tmp+5, InStr(tmp, str, "(")-(tmp+5)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 End If tmp = InStr(str, "ocmd@") If(tmp And InStr(tmp+1, str, ":") = (tmp+6)) Then again = true start = InStr(tmp+1, str, ":") Do While again <> false again = false If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then If(start And InStr(start+1, str, ",") < InStr(start+1, str, "(")) Then tmpstr = Mid(str, start+1, InStr(start+1, str, ",")-(start+1)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 again = true Else If(start) Then tmpstr = Mid(str, start+1, InStr(start+1, str, "(")-(start+1)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 End If End If End If start = InStr(start+1, str, ",") Loop End If tmp = InStr(str, "YCMD:") If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then tmpstr = Mid(str, tmp+5, InStr(tmp, str, "(")-(tmp+5)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 End If if(tmp = 0) Then tmp = InStr(str, "CMD:") Else tmp = 0 End If If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then tmpstr = Mid(str, tmp+4, InStr(tmp, str, "(")-(tmp+4)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 End If tmp = 0 again = true Do While again <> false tmp = InStr(tmp+1, str, "strcmp(cmd") If(tmp) Then start = InStr(tmp, str, """") again = false If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then If(InStr(tmp, str, "/") = (start+1)) Then tmpstr = Mid(str, start+2, InStr(start+1, str, """")-(start+2)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 again = true End If End If Loop tmp = 0 again = true Do While again <> false tmp = InStr(tmp+1, str, "strcmp(""/") If(tmp And InStr(tmp+1, str, "cmd")) Then start = InStr(tmp, str, """") again = false If(tmp And (comment > tmp Or comment = 0) And (ccomment < tmp Or bcomment > tmp) And (bcomment > tmp Or bcomment = 0)) Then If(InStr(tmp, str, "/") = (start+1)) Then tmpstr = Mid(str, start+2, InStr(start+1, str, """")-(start+2)) wFile.WriteLine "/" & tmpstr cmds = cmds + 1 again = true End If End If Loop If(InStr(str, "/*") And InStr(str, "*/") = 0 And blockcomment = false) Then blockcomment = true End If Loop rFile.Close() End If Next wFile.close() If(cmds > 0) Then MsgBox "Es wurden " & cmds & " Befehle gefunden und gespeichert." Else MsgBox "Es wurden keine Befehle gefunden." End If
2) Erstelle eine leere Textdatei (.txt) und öffne diese mit einem Editor.
3) Füge den kopierten Code ein.
4) Speichere die Datei mit "Speichern unter..." als "j_cmdsAuslesen.vbs"
2. Code ausführen
Der Code durchsucht das gesamte Verzeichnis (den gesamten Ordner) in dem die Datei liegt. Die "j_cmdsAuslesen.vbs" muss nun in das entsprechende Verzeichnis gelegt werden.
1) Verschiebe die Datei in den "gamemodes" Ordner deines Servers wenn Du die Befehle aus Deinem Gamemode auslesen willst, in den "filterscripts" Ordner, wenn Du die Befehle aus allen Filterscripts auslesen willst.
2) Klicke doppelt auf die Datei "j_cmdsAuslesen.vbs" und warte. Je nach Größe der pwn-Codes und Prozessorgeschwindigkeit kann der Vorgang einige Minuten dauern.
3) Sobald der Prozess zu Ende ist, bekommst Du eine Ergebnismeldung.3. Ergebnis ansehen
In dem Verzeichnis in welchem die "j_cmdsAuslesen.vbs" Datei liegt wurde eine Textdatei erstellt, die alle Befehle beinhaltet, die gefunden worden sind.
1) Öffne die Textdatei mit einem Editor.
2) Nun siehst Du alle Befehle, die gefunden worden sind.Kompatibilität
In der aktuellen Version (v1.1) werden folgende Command-Prozessoren erkannt und ausgegeben:
- strcmp [strcmp]
- dcmd [dcmd_]
- ocmd [ocmd:]
- ycmd [YCMD:]
- zcmd [CMD:]
Sollten weitere Command-Prozessoren gewünscht sein, können diese mir gerne bekannt gegeben werden, diese können dann in einer neueren Veröffentlichung aufgenommen werden.
Fragen/Probleme/Anregungen/Rückmeldungen
Bei Fragen und Problemen jeglicher Art bitte ich um die Benutzung der "Antworten" Funktion. Sollte ich binnen 48 Stunden nicht geantwortet haben, kann mir gerne eine Private Nachricht (PN) geschickt werden.
Für Anregungen betreffend Vorschlägen oder Verbesserungen bin ich jederzeit offen. Ich bitte darum, diese ebenfalls über die "Antworten" Funktion zu posten.Über Rückmeldungen würde ich mich freuen.
Changelog
- 11.09.2014: [v1.0] Erste Veröffentlichung
- 14.09.2014: [v1.0.1] Bug behoben: Der define von dcmd wurde als Befehl erkannt.
- 11.12.2014: [v1.1] ocmd wird nun auch mit mehreren Befehlen erkannt & strcmp wird nun auch in umgekehrter Reihenfolge erkannt.
- 18.04.2015: [v1.1] Tippfehler im Thread behoben.
- 22.06.2015: [v1.1] Download-Bilder repariert
- 08.11.2015: [v1.1] Code-Formatierung an WBB4 angepasst
Download
Viel Spaß mit dem Tool, ich hoffe es erspart dem einen oder anderen etwas Zeit.
Beste Grüße,
Jeffry - Die erste und einfachste Variante ist der direkte Download. Im Anhang befindet sich ein ZIP-Ordner der die ausführbare Datei enthält.
-
Wenn du DynamicObjects nimmst, musst du die Include natürlich ändern.
SetObjectMaterial
zu:
SetDynamicObjectMaterial -
-
-
Was dir lieber ist, und vor allem das was du verstehst, bzw am ehesten verstehen könntest.
Die Variante von mir ist auf jeden Fall ressourcenschonender, falls du darauf Wert legst.
Edit:
LeijaT: Ja. Das wird in letzter Zeit hier leider von immer mehr Usern vergessen oder ignoriert, dass ein Code auch übersichtlich und leserlich sein sollte. -
Kein Ding.
Ich hasse diese Schreibweise, um unnötig einen Doppelbruch zu schreiben. Da liebe ich die normale Schreibweise mit nur einem Bruch.
Wenn man auf den Doppelbruch verzichten will kann man es so machen:
switch( (inhalt*10) / gesamt )
Die Klammer dient hierbei nur zur Übersichtlichkeit. Wobei ich das nicht gerne mache, denn wenn man mit großen Werten arbeitet (im 3 stelligen Millionenbereich, geht das auf Grund des 32 Bit Limits nicht mehr, bei dem Tank ist es natürlich irrelevant). -
Ach gott. Jefrry schreib mir mal bitte, wann bei einer Rechnung von (inhalt / gesamt) es jemals mehr als 1 wird?
inhalt/(gesamt/10)
Beispiel:
Inhalt ist 95 gesamt ist 100.95/(100/10) = 95/10 = 9 (da Integer)
Simple Mathematik.
Wo ist dein Problem? Ich sehe keins.Dein Code ist zwar "lustig", aber wirklich ressourcenschonend ist er nicht.
-
switch(inhalt/(gesamt/10))
{
case 10: //10 grüne I
case 9: // 9 grüne I und 1 rotes I
//usw bis 0
} -
Ja.
Aber vorerst lass es mal so laufen:
value = GetPlayerSpeed(playerid);
printf("Model: %d == 520 && %d >= 250", GetVehicleModel(GetPlayerVehicleID(playerid)), value);
if(GetVehicleModel(GetPlayerVehicleID(playerid)) == 520 && value >= 250)
{
printf("Ban wegen %d km/h", value);
printf("%d", value);
mysql_format(dbhandle, query, sizeof(query), "INSERT INTO `Bans` (`Datum`,`Uhrzeit`,`Benutzername`,`Grund`,`Verantwortlicher`,`active`) VALUES ('%e','%e','%e','Speedhack','Anti-Cheat System',1)",gDate(), gTime(), GetName(playerid));
mysql_pquery(dbhandle, query, "", "");
format(string, sizeof(string), "Ban: {FFFFFF}%s wurde vom Anti - Cheat gebannt. Grund: Speedhack (Geschwindigkeit: %d)", GetName(playerid), value);
SendClientMessageToAll(Orange, string);
KickEx(playerid);
return 1;
}Und poste dann was im Log steht.
Dann poste dazu den gesamten, aktualisierten, Timer.
-
Yup, da er ja erst mit dem nächsten Timer-Aufruf (wenn er 0 hat) aus dem Knast kommt. Ist zwar unwahrscheinlich, aber wer hat schon was gegen einen guten, immer fehlerfreien, Code.
Also, ja, mach das.
-
LeijaT:
if (GetVehicleModel(GetPlayerVehicleID(playerid)) == 250 && mySpeed >= 250)zu:
if (GetVehicleModel(GetPlayerVehicleID(playerid)) == 520 && mySpeed >= 250)
Sonst geht's wieder nicht.
EDIT:
Du musst alle GetPlayerSpeed in dem Abschnitt mit mySpeed ersetzen. Warum? Liegt am Lag, da du 3 mal die Funktion aufrufst = 3 verschiedene Werte.EDIT2:
/// Hier war niemals ein Zahlendreher vorhanden, alles üble Nachrede!
-
Spieler connected => Variablen werden zurückgesetzt (-1) => Daten werden geladen => Neue Werte gesetzt (nicht mehr -1, nur für nicht registrierte bleibt es -1).
Machst du es nach dem Login, setzt er den Wert wieder zu -1, egal was in der Datei stand.
-
public OnPlayerPickUpPickup(playerid, pickupid)
{
new string[100];
if(pickupid == uuu)
{
printf("ID %d in Pickup uuu", playerid);
format(string,sizeof(string),"~b~Drueck:~w~ 'Enter'~n~~b~Timer:~w~ %i Minuten",Biz[g1]);
print(string);
GameTextForPlayer(playerid, string, 5000, 5);
}Bekommst du die beiden prints?
Wenn ja, ändere den string zu:
format(string,sizeof(string),"~b~Drueck:~w~ Enter~n~~b~Timer:~w~ %i Minuten",Biz[g1]);Wenn das auch nicht hilft, poste wie du dein Pickup erstellst.
Kaliber: Er will die Zeit per Befehl (funktioniert), und per Pickup (geht nicht) abfragen. Es liegt also entweder an einem falsch erstellten Pickup, oder an dem GameText der nicht geht.
-
Da du keine zweite Variable verwendest, die prüft ob er im Knast ist, muss es etwas anders aussehen, als ich es dir vorhin gegeben habe:
public CheckUnjail()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(GetPVarInt(i,"Prisonzeit") == 0)
{
Unprison(i);
SetPVarInt(i,"Prisonzeit",-1); //Beachte das -1! Setze das bei OnPlayerConnect auch zu -1, VOR dem Login.
}
else if(GetPVarInt(i,"Prisonzeit") > 0) SetPVarInt(i,"Prisonzeit", GetPVarInt(i,"Prisonzeit")-1);
}
return 1;
} -
Zitat
[21:00:39] >> plugin.mysql: R34 successfully loaded.
Du sollst das R5 Plugin herunterladen.
Welchen Link hast du benutzt? Hast du die anderen (aus den Threads die ich dazugeschrieben habe) versucht?Es muss dort stehen: R5 successfully loaded.
-
Mach das public zu:
forward WAUpdater();
public WAUpdated()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
new wantedlevel;
wantedlevel=GetPVarInt(i,"PVarWanteds");
new wtdstring[10];
format(wtdstring, sizeof(wtdstring), "%d", wantedlevel);
TextDrawSetString(wantedzahl[i],wtdstring);
if(wantedlevel==1 || wantedlevel>1)
{
TextDrawShowForPlayer(i, wantedstern);
TextDrawShowForPlayer(i, wantedzahl[i]);
}
if(wantedlevel==0)
{
TextDrawHideForPlayer(i, wantedstern);
TextDrawHideForPlayer(i, wantedzahl[i]);
}
}
return 1;
}Und OnGameModeInit:
for (new i=0; i< MAX_PLAYERS; i++)
{
SetTimerEx("WAUpdater", 1000, 1,"d",i);
}
zu
SetTimer("WAUpdater", 1000, 1);Ein Timer ist besser als so viele.
-
Genau. Und so wie du die anderen Sachen lädst, auch die Zeit wieder laden.
Wenn es größer als 0 beim Spawn ist, setzt du ihn wieder in den Knast.Bei OnGameModeInit machst du einen globalen Timer:
SetTimer("CheckUnjail", 30000, 1);forward CheckUnjail();
public CheckUnjail()
{
for(new i=0; i<MAX_PLAYERS; i++)
{
if(GetPVarInt(i,"Prisonzeit") <= 0)
{
//unjail hier (playerid ist i)
}
else SetPVarInt(i,"Prisonzeit", GetPVarInt(i,"Prisonzeit")-1);
}
return 1;
} -
SetPVarInt(pID, "Prisonzeit", 0+Zeit);
kannst du zu
SetPVarInt(pID, "Prisonzeit", Zeit);
machen.Wie speicherst du denn allgemein deine Statistiken? Post das mal.
Aus dem Gefängnis kannst du ihn am besten über einen globalen Timer holen, der alle Spieler prüft.