danke ging
Nützliche Codeschnipsel
- breadfish
- Geschlossen
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!
Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
-
-
einfaches savep. und loadp. also position speichern und laden.
new Float:PosX[MAX_PLAYERS], Float:PosY[MAX_PLAYERS], Float:PosZ[MAX_PLAYERS], Float:PosA[MAX_PLAYERS], PosI[MAX_PLAYERS];
if (strcmp(cmdtext, "/savep", true)==0)
{
GetPlayerPos(playerid, PosX[playerid], PosY[playerid], PosZ[playerid]);
GetPlayerFacingAngle(playerid, PosA[playerid]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, ".:SERVER:. Position gespeichert! Du kannst sie mit /loadp Laden.");
PosI[playerid] = (GetPlayerInterior(playerid));
PlayerPlaySound(playerid, 1137 , 0.0, 0.0, 0.0);
return 1;
}if (strcmp(cmdtext, "/loadp", true)==0)
{
if (!floatsqroot(PosX[playerid]+PosY[playerid]+PosZ[playerid]))
{
return SendClientMessage(playerid, COLOR_RED, "[ERROR:] Benutze /savep Als erstes!");
}
else
{
ResetPlayerWeapons(playerid);
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
{
SetVehiclePos(GetPlayerVehicleID(playerid), PosX[playerid], PosY[playerid], PosZ[playerid]);
SetVehicleZAngle(GetPlayerVehicleID(playerid), PosA[playerid]);
SetCameraBehindPlayer(playerid);
LinkVehicleToInterior(GetPlayerVehicleID(playerid), PosI[playerid]);
}
else
{
InCar[playerid] = false;
SetPlayerPos(playerid, PosX[playerid], PosY[playerid], PosZ[playerid]);
SetPlayerFacingAngle(playerid, PosA[playerid]);
SetCameraBehindPlayer(playerid);
}
PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
SetPlayerInterior(playerid, PosI[playerid]);
SendClientMessage(playerid, COLOR_LIGHTBLUE, ".:SERVER:. Gespeicherte Position Geladen!");
}
return 1;
} -
Sicher kennt Ihr doch den verheerenden Glitch (NICHT C-BUG), der auftretet, wenn man mit der Faust 1x zuschlägt und dann RENN & DUCK Taste (oder RENN danach DUCK Taste oder DUCK Taste und danach RENN) drückt? Wer nicht: Wenn das erfolgreich und richtig ausgeführt wird, duckt sich der Spieler und ist gefreezed und kann sich nicht bewegen aber dennoch Waffe wählen. Außerdem ist es dem Spieler möglich mit unendlich Munition zu schießen und ohne nachzuladen. Das schlimmste dazu, es geht mit jeder Waffe! (Ja sogar Minigun und andere schwere Waffen lassen sich geduckt schießen!)
Anti-Reload Glitch:
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(oldkeys & KEY_CROUCH && newkeys & KEY_SPRINT) {
GetPlayerPos(playerid, X, Y, Z);
SetPlayerPos(playerid, X, Y, Z);
}
else
if(oldkeys & KEY_SPRINT && newkeys & KEY_CROUCH) {
GetPlayerPos(playerid, X, Y, Z);
SetPlayerPos(playerid, X, Y, Z);
}
else
if(oldkeys & KEY_SPRINT && oldkeys & KEY_CROUCH) {
GetPlayerPos(playerid, X, Y, Z);
SetPlayerPos(playerid, X, Y, Z);
}
}
Damit lässt es sich verhindern. -
getTopScore(startid,list[])
{
new maximal_id = startid,counter = -1;
for(new j = 0;j<MAX_PLAYERS;j++)
{
if(!IsPlayerConnected(j) || IsPlayerNPC(j) || j = startid)continue;
if(GetPlayerScore(maximal_id) < GetPlayerScore(j))
{
counter++;
list[counter] = j;
maximal_id = j;
}
}
return 1;
}- Liste mit dem Spielern wiedergeben die den meisten Score haben ( Nach Reihenfolge )
-
Warum macht ihr denn immer new j oder new i. Das ist eigentlich richig richtig schrecklich.
Man sollte schon entweder playerid oder index schreiben können.
Ich hab immer Strafe bekommen, als mein Scriptlehrer das gesehen hat. -
Weil scripten ist wie lesen und schreiben. Wenn du etwas schreibst, dann soll jemand anderes es lesen.
Irgendwann hast du alles voller ies, jöts, as, has, pees, dees und der Leser kommt nicht klar.
Wenn da aber steht: SpielerID, ZielID, AutoID,... etc dann weiß er bescheid.Stell dir vor, ich würde dir sowas schreiben:
s d v, i w d s s.Ich weiß was es heißt, weißt du es auch? Du musstdann nochmal genau hingucken um rauszufinden, was ich jetzt genau damit meine.
-
i = Integer
j = sieht ähnlich ausdaher sehe ich das immer als Zahlenbezeichner
Ist so eine Angewohnheit, als Programmierer oder auch Scripter sollte man alles Möglichst knapp halten , hängt aber auch mit dem Style desjenigen ab , wie
er seinen Code Strukturiert.Aso und um das wiederfinden mache ich mir keine Sorgen, versteht man die Logik des Codes & der Sprache, kann man das locker zurückverfolgen
-
Ich habs eigentlich so übernommen, da ich es damals so bei Blaggy gesehen hatte
Hinterfragt hatte ich es eigentlich nie und darum, dass es ein anderer nicht lesen kann, mach ich mir keine Sorgen, da ich lediglich Scripte für den Eigengebrauch scripte. Sollte kein anderer bekommen.
Die gleiche Angewohnheit mit dem so kurz wie möglich hab ich auch, z.B. wird bei mir aus PlayerInfo pInfo das enum heißt pEnum, bei Vehikeln wirds vInfo und vEnum und so weiter..;) So weiß ICH was gemeint ist und jeder andere muss es sich zwar erdenken, aber so kompliziert ist es ja auch nicht. -
new sendfstring[128];
#define SendFormattedText(%1,%2,%3,%4) format(sendfstring,128,(%3),%4); SendClientMessage((%1), (%2) ,sendfstring)
#define SendFormattedTextToAll(%1,%2,%3) format(sendfstring,128,(%2),%3); SendClientMessageToAll((%1),sendfstring)new i = 12;
SendFormattedText(playerid, 0xffffffff, "Text: integer = %d", i); -
new sendfstring[128];
#define SendFormattedText(%1,%2,%3,%4) format(sendfstring,128,(%3),%4); SendClientMessage((%1), (%2) ,sendfstring)
#define SendFormattedTextToAll(%1,%2,%3) format(sendfstring,128,(%2),%3); SendClientMessageToAll((%1),sendfstring)new i = 12;
SendFormattedText(playerid, 0xffffffff, "Text: integer = %d", i);Ist zwar nicht von mir aber das ist ne dynamischere Variante
stock SendFormatedMessage(playerid, color, message[], {Float,_}:...)
{
new args = numargs();
#define MAX_NUMARGS 10
new string[MAX_NUMARGS][256];
for(new i = 3; i < args+1; i++)
{
new gchar = 0;
for(new a = 0; a < 256; a++)
{
string[i][a] = getarg(i, gchar);
gchar++;
}
}
for(new i = 3; i <= args; i++)
{
new bstring[256];
for(new a = 0; a <= 256; a++)
{
bstring[a] = string[i][a];
}
format(message, 256, message, bstring);
}
SendClientMessage(playerid, color, message);
}// Bsp.:
SendFormatedMessage(playerid, color, "%d, %s, %f..", 1, "Eins, 1.0); -
forward languageMessage(userid, color, string1[], string2[]);
new language[MAX_PLAYERS];OnPlayerConnect(playerid) language[playerid]= 0;
stock languageMessage(userid, color, string1[], string2[])
{
if(language[userid]==0){SendClientMessage(userid, color, string1); }else {SendClientMessage(userid, color, string2); }
}Verwendungsbeispiel:
languageMessage(playerid, COLOR_01, "deutsch","german");Oder noch eine andere Version
forward languageMessage(userid, color, string1[], string2[], germanenglish)stock languageMessage(userid, color, string1[], string2[], germanenglish)
{
if(germanenglish == 0) { SendClientMessage(userid, color, string1);}
if(germanenglish == 1) { SendClientMessage(userid, color, string2); }
else { SendClientMessage(userid, color, "Error, wende dich an einen Administrator."); }
}Anwendungsbeispiel:
languageMessage(playerid, COLOR_01, "deutsch", "german", 0); -
Frage: Seitwann forwardet man ein stock? lol.
-
forward languageMessage(userid, color, string1[], string2[]);
new language[MAX_PLAYERS];OnPlayerConnect(playerid) language[playerid]= 0;
stock languageMessage(userid, color, string1[], string2[])
{
if(language[userid]==0){SendClientMessage(userid, color, string1); }else {SendClientMessage(userid, color, string2); }
}[...]
Etwas sauberere Lösung:
stock SendMultiMessage(playerid,color,lang1[],lang2[],lang3[])
{
switch(GetPVarInt(playerid,"Language"))
{
case 0: SendClientMessage(playerid,color,lang1);
case 1: SendClientMessage(playerid,color,lang2);
case 2: SendClientMessage(playerid,color,lang3);
default: SendClientMessage(playerid,0xA10000AA," Error, bitte melde dies einem Admin!"); //Könnte man dann auch auf English oder so machen
}
}public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(language,8,cmdtext);
return 1;
}dcmd_language(playerid,params[])
{
#pragma unused params
switch(GetPVarInt(playerid,"Language"))
{
case 0: SetPVarInt(playerid,"Language",1);
case 1: SetPVarInt(playerid,"Language",2);
case 2: SetPVarInt(playerid,"Language",0);
}
SendMultiMessage(playerid,0xFFFF00AA,"Sprache geändert","Language Changed","Langue changé");
return 1;
}Nutzt die neuen 0.3 Funktionen, sowie das schnellere Dcmd.
Außerdem kann man schnell neue Sprachen hinzufügen. -
stock ReturnWeaponName(waffenid)
{
new WaffenName[32];
GetWeaponName(waffenid,WaffenName,32);
return WaffenName;
} -
Einfach nur eine simple Mathematikfunktion um die Fakultät einer Zahl auszurechnen:
Wers auch immer braucht..
Wer nicht weiß was Fakultät ist:
Fakultät von 5 z.B. ist: 1*2*3*4*5 = 120
Fakultät von 7 ist dann: 1*2*3*4*5*6*7 = 5040stock faculty(number)
{
new returnvar = 1;
for(new a=1; a<=number; a++)
{
returnvar = returnvar*a;
}
return returnvar;
} -
Gab es schon von "KleinerOpa"
Zitat
stock factorial(ma_x)
{
new ma_r=1;
for(new ma_i=1;ma_i<=ma_x;ma_i++)
{
ma_r=ma_r*ma_i;
}
return ma_r;
} -
Schnelle & sichere Methode um Kommando und Parameter zu trennen...
Also wer noch vor hat Kommando Formate zu bauen wie das unsinnige dcmd und zcmd ...if(strlen(cmdtext) < 1)return 1;
new cmd[32],parameter[255],bool:switcher,cnt = -1;
for(new i = 1;i<stlren(cmdtext);i++)
{
if(cmdtext[i] == ' ')
{
switcher = true;
cnt = -1;
}
if(!switcher)
{
cnt++;
cmd[cnt] = tolower(cmdtext[i]);
}
else
{
cnt++;
parameter[cnt] = cmdtext[i];
}
} -
stock ErmittleGeschwindigkeit(playerid,bool:kmh)
{
new
Float:x,
Float:y,
Float:z,
Float:rtn;
if(IsPlayerInAnyVehicle(playerid)) {
GetVehicleVelocity(GetPlayerVehicleID(playerid),x,y,z);
}
else {
GetPlayerVelocity(playerid,x,y,z);
}
rtn = floatsqroot(x*x+y*y+z*z);
if(kmh) {
return floatround(rtn * 100 * 2.0);
}
else {
return floatround(rtn * 100);
}
}Benutzung:
new Variable = ErmittleGeschwindigkeit(playerid,true);
by Goldkiller -
RegEx(string[],pattern[])
{
new brc;
new regex_p[50],mx,s,bool:trues,
offset,cnt_tr = 0;
do
{
brc = strfind(pattern,"[",false,brc);
if(brc!=-1)
{
brc++;
while(pattern[brc]!=']' && pattern[brc])
{
regex_p[mx] = pattern[brc];
brc++;
mx++;
}
while(string[s])
{
if(regex_p[0] == '!')
{
for(new j = 1;j<strlen(regex_p);j++)
{
if(regex_p[j] == string[s])
{
trues = true;
break;
}
}
}
else if(regex_p[0] == ':')
{
new other_one;
do
{
other_one = strfind(regex_p,":",false,other_one);
if(other_one!=-1)
{
other_one++;
if(string[s] >= regex_p[other_one] && string[s] <= regex_p[other_one+1])
{
trues = true;
break;
}
}
}
while(other_one!=-1);
}
else if(regex_p[0] == ';')
{
for(new j = 1;j<strlen(regex_p);j++)
{
if(regex_p[j] == string[s])
{
offset++;
cnt_tr--;
trues = true;
break;
}
}
}
if(!trues)break;
trues = false;
cnt_tr++;
s++;
}
regex_p[0] = '\0';
mx = 0;
}
}
while(brc!=-1);
return (cnt_tr == (strlen(string)-offset)) ? (1) : (0);
}Jeder kennt RegEx , Reguläre Ausdrücke , diese Funktion überprüft nicht Exakt sondern nach Format Muster,
als Beispiel :RegEx("3.14","[:09][!.][:09]");
RegEx("C.12","[:09:AZ][!.][:09]");Wie ihr seht ganz einfach ...
: = ( Von bis )
Diese Anweisung überprüft ob Bestimmte Zeichen von einem Zeichen
bis zu einem anderen Zeichen vorhanden sind,
z.b. [:AZ] , alle Zeichen von A bis Z , es geht von A bis T , 0 bis 2 usw...
Es können mehrere von bis Werte gestellt werden [:AZ:09] darf von A bis Z oder 0 bis 9 sein.! = ( Exakt )
Diese Anweisung überprüft Exakt sprich , eine Exakte Reihenfolge von Zeichen
[!tzuü] , nun dürfen an der Stelle nur t,z,u oder ü sein sonst nichts; = ( Kann sein , muss nicht )
Werte die nicht sein müssen aber können ,
können so bestimmt werden :
[;+%&] , so darf an der Stelle + % oder & stehen,
wenn es dort nicht steht ist es auch nicht schlimm
Weil es sein kann.Ich wünsche viel Spaß damit, ich werde die Funktion bei bedarf verbessern.
-
Hab mehrere Funktionen gemacht, um ein bestimmten Teil von einen String (ähnlich strtok) zu bekommen:
stock GetFieldString(field, string[], dest[], bool:end=false)
{
new result[256], index = 0;
for(new i=1; i<field; i++) if(field != 1) { index = strfind(string, " ", true, index+1); }
if(field == 1) strmid(result, string, 0, strfind(string, " ", true, 0), 64);
else if(end) strmid(result, string, index+1, strlen(string), sizeof(result));
else strmid(result, string, index+1, strfind(string, " ", true, index+1), 64);
return format(dest, 64, "%s", result);
}stock GetFieldInt(field, string[], &dest, bool:end=false)
{
new result[64], index = 0;
for(new i=1; i<field; i++) if(field != 1) { index = strfind(string, " ", true, index+1); }
if(field == 1) strmid(result, string, 0, strfind(string, " ", true, 0), 64);
else if(end) strmid(result, string, index+1, strlen(string), sizeof(result));
else strmid(result, string, index+1, strfind(string, " ", true, index+1), 64);
return dest = strval(result);
}stock GetFieldFloat(field, string[], &Float:dest, bool:end=false)
{
new result[64], index = 0;
for(new i=1; i<field; i++) if(field != 1) { index = strfind(string, " ", true, index+1); }
if(field == 1) strmid(result, string, 0, strfind(string, " ", true, 0), 64);
else if(end) strmid(result, string, index+1, strlen(string), sizeof(result));
else strmid(result, string, index+1, strfind(string, " ", true, index+1), 64);
return dest = floatstr(result);
}new cmdtext[256] = "/kick 6 15 Wir wollen keine Cheater";
new player, grund[64], dauer;
GetFieldInt(2, cmdtext, player);
GetFieldInt(3, cmdtext, dauer);
GetFieldString(4, cmdtext, grund, true);
printf("%d, %s, %d Minuten", player, grund, dauer);