Sieht recht gut aus, und schön räumig. Fehler kann ich jetzt keine entdecken.
Du hast dir 8/10 Fischen verdient.
MfG
Sieht recht gut aus, und schön räumig. Fehler kann ich jetzt keine entdecken.
Du hast dir 8/10 Fischen verdient.
MfG
Sieht eigentlich ganz gut aus.
Vernünftig erklärt & ich gehe einfach mal davon aus das es auch funktioniert.
Supi
Danke, ich achte immer drauf alles richtig zu machen
MfG
Hab ich doch gesagt -.-
oder auch, dass der gekickte Spieler die Nachricht lesen kann. Das würde man dann mit einem Timer machen und ihn dann nach z.B. 1 Sekunde kicken.
MfG
Hallo liebe Brotfische,
Ich hab mich entschlossen wieder ein Tutorial zu machen. Dieses mal zeige ich euch einen /kick Befehl der aber auf ocmd & sscanf basiert.
So, erstmal was ihr braucht:
- ocmd.inc
- sscanf Plugin (ihr könnt auch den sscanf stock nutzen)
- bisschen Geduld
- Grundwissen
(Links für die inc bzw. Plugins findet ihr ganz unten im Thread!)
=========================================================================================================================
Kommen wir jetzt zum Script Teil:
Als erstes damit unser Kick Befehl auch funktioniert müsst ihr ganz oben folgendes einfügen:
#include <ocmd>
und
#include <sscanf>
Wenn ihr aber den sscanf stock benutzen wollt müsst ihr den ganzen stock ganz unten ins Script einfügen
(Link zum stock ist unten im Thread!)
So nun haben wir die beiden wichtigen Sachen um den Befehl zu erstellen, also gehen wir nun zu OnPlayerCommandText und fügen unter der Klammer die das
Callback schließt folgendes ein:
ocmd:kick(playerid,params[])
{
So, nun heißt der Befehl /kick. Der nächste Schritt wäre erstmal alles zu definieren was wir für den Befehl brauchen. Das wäre:
new pID,reason[20],givename[MAX_PLAYER_NAME],name[MAX_PLAYER_NAME],str[128];
Zur Erklärung:
pID = Der Spieler den wir kicken wollen
reason[20] = Der Grund, der nur maximal 20 Buchstaben/Zahlen/Zeichen lang sein kann
givename = Der Name des gekickten Spielers
name = Unser Name
str[128] = Der String den wir später für die Nachricht brauchen und die Länge
Ales nächstes Fragen wir ab, ob der Spieler der den Befehl eingibt auch ein Admin ist:
if(SpielerInfo[playerid][pAdmin] <= 1)return SendClientMessage(playerid,GRAU,"Du besitzt nicht die benötigten Rechte dafür!");
Dieser Code heißt nicht anderes als:
Ist der Spieler kleiner als Admin 1, wird ihm die Nachricht gesendet: "Du hast keine Rechte dafür!"
Ihr könnt natürlich euren beliebigen Admin Rang dort einfügen.
Als nächstes kommt jetzt die sscanf Abfrage, ob der Spieler auch "ID" und "Grund" eingibt. Die sieht dann so aus:
if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,GRAU,"Tippe: /kick [ID] [Grund]");
Zur Erklärung:
sscanf = Ist unser Programm
params = Sind die Parameter die wir danach setzen/auswählen
"us" = Das "u" steht für die Spieler ID (u = Userid) und "s" für die Nachricht die wir dann schreiben also den Grund.
pID = Die Userid vom ausgwählten Spieler
reason = Den Grund den wir eingeben
Also: Sollte der Spieler "ID" (pID) und "Grund" (reason) nicht angeben, kommt die nachricht:" Tippe: /kick ........."
Das hätten wir dann auch, jetzt muss nur noch was passieren wenn der Spieler das eingibt.
Wir wollen erstmal die Namen vom Spieler sowie vom Spieler der gekickt wird, deswegen fügen wir noch folgendes hinzu:
GetPlayerName(playerid,name,sizeof(name)),GetPlayerName(pID,givename,sizeof(givename));
Nun haben wir auch die Namen aller beiden. Doch bevor der Spieler gekickt wird, müssen wir eine Nachricht senden.
Und das machen wir so:
format(str,sizeof(str),"[Server]: %s hat den Spieler %s vom Server gekickt! Grund: %s",name,givename,reason);
Und damit auch jeder Spieler die Nachricht lesen kann, setzen wir dadrunter noch eine:
SendClientMessageToAll(ROT,str);
Jetzt kann jeder auf dem Server diese Nachricht lesen, nun fehlt nur noch das was den Befehl ausmacht:
Kick(pID);
Dann noch das return 1; und die geschlossene Klammer nicht vergessen und fertig ist der Befehl.
Ihr könnt natürlich noch ein paar Extras einfügen wie:
- man darf keine höheren Admin kicken also zum Beispiel so:
if(SpielerInfo[pID][pAdmin] > SpielerInfo[playerid][pAdmin])return SendClientMessage(playerid,ROT,""ADMINERROR"");
- oder auch, dass der gekickte Spieler die Nachricht lesen kann. Das würde man dann mit einem Timer machen und ihn dann nach z.B. 1 Sekunde kicken.
Wenn jemand durcheinander gekommen ist habe ich euch nochmal den ganzen Befehl hier eingefügt:
ocmd:kick(playerid,params[])
{
new pID,reason[128],name[MAX_PLAYER_NAME],givename[MAX_PLAYER_NAME],str[128];
if(SpielerInfo[playerid][pAdmin] <= 1)return SendClientMessage(playerid,GRAU,"Du besitzt nicht die benötigten Rechte dafür!");
if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid,GRAU,"Tippe: /kick [ID] [Grund]");
GetPlayerName(playerid,name,sizeof(name)),GetPlayerName(pID,givename,sizeof(givename));
format(str,sizeof(str),"[Server]: %s hat den Spieler %s vom Server gekickt! Grund: %s",name,givename,reason);
SendClientMessageToAll(ROT,str);
Kick(pID);
return 1;
}
=============================================================================================================================
Das wars auch schon, falls ihr Fehler entdeckt und welche habt, könnt ihr mir gerne schreiben. Ich würde mich auch über positive Rückmeldungen freuen.
Hier noch die Download Links:
Ich hoffe mein 2 Tutorial hat euch gefallen.
MfG
Advanced
Nein, weil du die Fraktions Ränge nur oben definiert hast, das was du da eingefügt hast, würde zum Beispiel gehen wenn du das unter dem enum einfügst wo die ganzen Spieler Daten sind.
MfG
Echt gute Vorstellung auch vom Aufbau her und vom Design und und und.....
Ganz einfach 9,5/10 Fischen. Viel Glück!
MfG
oh mein gott wirklich so schwer? -.-
if(PlayerInfo[playerid][pCarlic] == 0 || !IsPlayerInFrac(playerid) == 11)
{
//Schmeißt ihn aus dem Auto
return 1;
}
Du musst das dann halt für dich noch umstellen. Den Rest kannst du auch selber.
MfG
Vielleicht hilft dir das ja weiter:
http://wiki.sa-mp.com/wiki/RemovePlayerFromVehicle
Wo du das einsetzen musst finde mal selber heraus, so lernt man auch besser Scripten.
MfG
Also ich arbeite auch mit Mysql, und mein stock für den Speicher Befehl sieht so aus:
stock SavePlayer(playerid)
{
if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
{
if(GetPVarInt(playerid,"Eingeloggt") == 1)
{
mysql_SetInt("accounts", "Level", SpielerInfo[playerid][pLevel], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Geld", GetPlayerMoney(playerid), "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Kills", SpielerInfo[playerid][pKills], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Tode", SpielerInfo[playerid][pTode], "Name", SpielerInfo[playerid][pName]);
mysql_SetFloat("accounts", "Health", SpielerInfo[playerid][pHealth], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Perso", SpielerInfo[playerid][pPerso], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Geschlecht", SpielerInfo[playerid][pGeschlecht], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Age", SpielerInfo[playerid][pAge], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "National", SpielerInfo[playerid][pNational], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Admin", SpielerInfo[playerid][pAdmin], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "Konto", SpielerInfo[playerid][pKonto], "Name", SpielerInfo[playerid][pName]);
mysql_SetInt("accounts", "PIN", SpielerInfo[playerid][pPIN], "Name", SpielerInfo[playerid][pName]);
}
}
return 1;
}
Und meine Lade Befehl so:
stock LoadPlayer(playerid)
{
if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
{
GetPlayerName(playerid, SpielerInfo[playerid][pName], MAX_PLAYER_NAME);
SpielerInfo[playerid][pLevel] = mysql_GetInt("accounts", "Level", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pGeld] = mysql_GetInt("accounts", "Geld", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pKills] = mysql_GetInt("accounts", "Kills", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pTode] = mysql_GetInt("accounts", "Tode", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pPerso] = mysql_GetInt("accounts", "Perso", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pGeschlecht] = mysql_GetInt("accounts", "Geschlecht", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pAge] = mysql_GetInt("accounts", "Age", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pNational] = mysql_GetInt("accounts", "National", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pAdmin] = mysql_GetInt("accounts", "Admin", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pKonto] = mysql_GetInt("accounts", "Konto", "Name", SpielerInfo[playerid][pName]);
SpielerInfo[playerid][pPIN] = mysql_GetInt("accounts", "PIN", "Name", SpielerInfo[playerid][pName]);
}
return 1;
}
MfG
Nice gemacht ich schau mal später vorbei! Echt geile Features und etc. Die Vorstellung ist euch auch gelungen.
Gesamt: 9,5/10
MfG
Ein bisschen kurz oder? Ein paar Bilder wären auch nicht schlecht. Naja so ganz Perfekt ist es nicht, ich kann es auch nicht so recht bewerten. Deswegen
gebe ich euch: 5/10 Fischen
MfG
Ich empfehle die auf jeden Fall den SAMP Map Construction. Mit dem kannst auf mm Genau arbeiten, und bietet sonst noch andere Vorteile.
PS: Ich Mappe Persönlich auch mit dem Map Constructor, und das schon seit Anfang.
MfG
Ich finde das eher schlecht gemappt...
Da muss ich ihm zustimmen, die Textur ist einfach nur langweilig, und ob dort wirklich eine Base hinpasst? Naja, versuch mal einen anderen Ort zu finden andere Texturen zu benutzen
und versuch keinen Kasten ohne Fenster etc zu Mappen.
MfG
Ich habs raus genommen jetzt gehts einiger maßen. Nur wenn ich jetzt z.B. /makeadmin 0 6 eingebe setzt er ID 0 auf Adminlevel 0
Aber das Adminlevel wird auch nicht gesetzt deswegen versteht ich das nicht
//EDIT
Hat sich schon gelöst, ich hab einfach #include <sscanf> raus genommen und den stock hier eingefügt.
http://wiki.sa-mp.com/wiki/Sscanf_code
MfG
Hast du auch unter "include" ----> "m_bot" die Waffe ausgeklammert?
Hast du noch auf dem Server eine "pawno" Datei? Denn dort drinne ist die "m_bot" ebenfalls erhalten.
MfG
Hey Leute,
ich folgendes Problem, ich hab jetzt angefangen mit sscanf zu arbeiten, ich hab mal gleich ein Makeadmin Befehl versucht zu scripten.
Keine Copy und Paste sondern auf eigene Faust. Mein Problem ist jetzt wenn ich /makeadmin eingebe kommt immer im Chat:
"Benutze: /makeadmin [ID] [Level]"
auch wenn ich die Bedingungen für den Befehl erfülle. Kommt immer diese nachricht ich hoffe ihr könnt helfen.
Auch wenn ich die richtigen Sachen eingebe also: /makeadmin 0 6 kommt die Nachricht.
Hier der Code:
ocmd:makeadmin(playerid,params[])
{
new pID,adlevel,name[MAX_PLAYER_NAME],givename[MAX_PLAYER_NAME],str[128];
if((GetPVarInt(playerid,"Eingeloggt") == 0))return SendClientMessage(playerid,WEIS,"Logge dich bitte zuerst ein!");
if(SpielerInfo[playerid][pAdmin] <=5)return SendClientMessage(playerid,GRAU,"Du besitzt nicht die benötigten Rechte dafür!");
if(sscanf(params,"ui",pID,adlevel))return SendClientMessage(playerid,GRAU,"Benutze: /makeadmin [ID] [Level]");
GetPlayerName(playerid,name,sizeof(name)),GetPlayerName(pID,givename,sizeof(givename));
format(str,sizeof(str),"[Info]: Du hast den Spieler %s den Adminrang %i gegeben!",givename,adlevel);
SendClientMessage(playerid,HELLBLAU,str);
format(str,sizeof(str),"[Info]: Administrator %s hat dir den Adminrang %i gegeben!",name,adlevel);
SendClientMessage(pID,HELLBLAU,str);
SpielerInfo[pID][pAdmin] = adlevel;
SavePlayer(pID);
return 1;
}
Zeig mal deine OnPlayerKeyStateChange.
MfG
Anscheinend hat er Probleme mit "OnGameModeInit" und mit "OnVehicleSpawn". Allgemein mit der ganzen .amx Datei. Schau mal unter den Punkten nach.
Was mir sonst noch einfällt: Hol dir den neusten Streamer.
MfG
Nicht schlecht nicht schlecht, sieht recht gut aus.
8/10 Fischen
MfG
Naja die Texturen gefallen mir gar nicht, und die Garage ist zu leer, aber das wird noch hoffe ich
Sorry aber 4/10 Fischen.
MfG