Wenn da jetzt noch Code hinter ist, kommts blöd
(Cant reach code)
Stimmt, war zu lange nichtmehr im Pawnbereich, danke die erklären hättest weglassen können war ma wieder nen denkfehler
Wenn da jetzt noch Code hinter ist, kommts blöd
(Cant reach code)
Stimmt, war zu lange nichtmehr im Pawnbereich, danke die erklären hättest weglassen können war ma wieder nen denkfehler
Ich hab mal wieder zwei neue Codeschnipsel:
Textdrawfix für PlayerTextdraws eine ergänzung wäre noch notwendig für die Funktion CreatePlayerTexdraw und natürlich für die normalen(Speziell ausgeleget auf die deutsche Rechtschreibung)
native __PlayerTextDrawSetString(playerid, PlayerText:playertextdraw, string[], font=2) = PlayerTextDrawSetString;
stock _PlayerTextDrawSetString(playerid, PlayerText:playertextdraw, string[], font=2) {
_encoding(string,font);
return __PlayerTextDrawSetString(playerid,playertextdraw,string);
}
#if defined _ALS_PlayerTextDrawSetString
#undef PlayerTextDrawSetString
#else
#define _ALS_PlayerTextDrawSetString
#endif
#define PlayerTextDrawSetString _PlayerTextDrawSetString
stock _encoding(string[],font)
{
switch(font){
case 0,1:{
for(new i;;++i){
switch(string[i]){
case EOS: break;
case 'Ä':string[i] = '\131;';
case 'Ö':string[i] = '\145;';
case 'Ü':string[i] = '\149;';
case 'ä':string[i] = '\154;';
case 'ö':string[i] = '\168;';
case 'ü':string[i] = '\172;';
}
}
}case 2,3:{
for(new i;;++i){
switch(string[i]){
case EOS: break;
case 'Ä','ä':string[i] = '\216;';
case 'Ö','ö':string[i] = '\230;';
case 'Ü','ü':string[i] = '\234;';
}
}
}
}
}
Musik über Youtube streamen:
stock static bool:PlayYouTubeStream(playerid,str[]){
static stream[200] = "YoutubeInMP3.com/fetch/?api=advanced&video=";
strcat(stream,str);
return !!HTTP(playerid,HTTP_GET,stream,"","@PlayAudioStream");
}
forward @PlayAudioStream(playerid, response_code, data[]);
@PlayAudioStream(playerid, response_code, data[])
{
if(response_code != 200)return print("Link konnte nicht abgespielt werden!");
strdel(data,EOF,strfind(data, "Link: ", true, -1)+5);
return PlayAudioStreamForPlayer(playerid,data);
}
#define GetUserIP(%0) l_ip[%0]//Oben im Script unter Includes
static l_ip[MAX_PLAYERS][16];//Global
GetPlayerIp(playerid,l_ip[playerid],16);//OnPlayerConnect
//Verwendung #1:
new string[128];
format(string,sizeof string,"Deine IP-Adresse: %s",l_ip[playerid]);
SendClientMessage(playerid,-1,string);
//Verwendung #2:
new string[128];
format(string,sizeof string,"Deine IP-Adresse: %s",GetUserIP(playerid));
SendClientMessage(playerid,-1,string);
oder
stock GetUserIP(playerid){
static l_ip[16];
return (GetPlayerIp(playerid,l_ip,16)),l_ip;
}
Bei beiden Möglichkeiten geht es schnell und einfach die IP-Adresse auszulesen.
Bei der 1. Methode muss man im gesamten Script nur einmal die IP-Adresse in einem Array speichern, beim 2. mal wird es immer wieder ausgelesen.
Ich veröffentliche hier mal meine strtok-Version, die ich vor langer Zeit erstellt habe. Diese macht 1:1 das Gleiche wie die originale strtok-Funktion, nur mit dem Unterschied, dass sie mehr als doppelt so schnell ist.
Original: http://wiki.sa-mp.com/wiki/Strtok
v2.0 by Jeffry:
stock strtok(const string[], &index) //©Jeffry
{
new result[20], length = strlen(string), i = index;
while ((i < length) && (string[i] == ' ')) i++;
strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
index++;
return result;
}
Man kann einfach die alte strtok Funktion mit der Meinen ersetzen, mehr ist nicht notwendig.
ZitatZeit-Tests [07/09/2014 15:22:34] Original: 3233ms
[07/09/2014 15:22:36] Jeffry: 1455ms
Keywords: strtok
Ich hatte gerade eben ein Codeschnipsel geschrieben womit man bestimmen kann abhängig von der Rotation des fahrzeugs ob sich der Spieler vor, neben oder hinter
dem Auto befindet
stock GetPlayerPositionNextToACar(playerid,carid){
if(!GetPlayerVehicleID(playerid))return 0;
new Float:Pos[7];
GetVehiclePos(carid,Pos[0],Pos[1],Pos[2]);
GetVehicleZAngle(carid,Pos[3]);
GetPlayerPos(playerid,Pos[4],Pos[5],Pos[6]);
Pos[6] = ((Pos[4] - Pos[0])*floatcos(Pos[3],degrees)+(Pos[5] - Pos[1])*floatsin(Pos[3],degrees));
Pos[3] = ((-(Pos[4] - Pos[0]))*floatsin(Pos[3],degrees)+(Pos[5] - Pos[1])*floatcos(Pos[3],degrees));
GetVehicleModelInfo(GetVehicleModel(carid), VEHICLE_MODEL_INFO_SIZE, Pos[0],Pos[1],Pos[2]);
if(Pos[6] >= 0 && Pos[3] <= (Pos[1]/2) && Pos[3] >= (-Pos[1]/2))return 1; //Rechts
else if(Pos[6] <= 0 && Pos[3] <= Pos[1]/2 && Pos[3] >= -Pos[1]/2)return 2; //Links
else if(Pos[3] >= 0 && Pos[6] <= Pos[0]/2 && Pos[6] >= -Pos[0]/2)return 3; // Vorne
else if(Pos[3] <= 0 && Pos[6] <= Pos[0]/2 && Pos[6] >= -Pos[0]/2)return 4; // Dahinter
return 0;
}
Anwendungsbeispiel:
if (strcmp("/mycommand", cmdtext, true, 10) == 0)
{
switch(GetPlayerPositionNextACar(playerid,1)){
case 1:SendClientMessage(playerid,-1,"Rechts");
case 2:SendClientMessage(playerid,-1,"Links");
case 3:SendClientMessage(playerid,-1,"Vorne");
case 4:SendClientMessage(playerid,-1,"Hinter");
}
return 1;
}
Keywords: Spieler neben dem Fahrzeug, Spieler vor dem Fahrzeug
//Edit:
Ich habe mal einen Fix geschrieben für den normalen Chat.
Ihr kennt das Problem alle, ihr wollt ein % Zeichen schreiben und es kommt nur ein #...
Das behebt ihr nun so:
stock _Fix(const string[],bool:chat=false) {
new tmp[145],pos = strfind(string,"#");
strcat(tmp,string);
if(pos == -1) return tmp;
for(;;) {
if(tmp[((pos-1) < 0)?0:(pos-1)] != '\\') {
strdel(tmp,pos,pos+1),strins(tmp,(!chat)?("%%"):("%%%%"),pos,sizeof tmp);
pos = strfind(tmp,"#",false,pos+((!chat)?(2):(4)));
}
else {
strdel(tmp,pos-1,pos);
pos = strfind(tmp,"#",false,pos);
}
if(pos == -1) break;
}
return tmp;
}
//Und unter OnPlayerText:
public OnPlayerText(playerid,text[]) {
format(text,146,_Fix(text)); //Das muss die 1. Zeile hier sein:
return 1;
}
//Wenn ihr allerdings mit einer eigenen Message arbeitet, dann so:
public OnPlayerText(playerid,text[]) {
format(text,146,_Fix(text,true)); //Das muss die 1. Zeile hier sein:
//Halt unten der Rest
SendClientMessage(playerid,-1,text);
return 0;
}
Dadurch wird aus dem # ein %...wenn ihr jetzt aber ein normales # inGame schreiben wollt, müsst ihr \# eingeben
//Fakultät:
Also, mir ist keine Funktion bekannt und habe auch noch keine gesehen (nicht mal im Englischen Forum), dass man die Fakultät berechnen kann.
Also, hier eine Funktion, mit der das möglich ist:
stock fac(x) {
if(x < 0) return 0;
if(0 <= x <= 1) return 1;
if(x==2) return x;
new y=1,i=x;
for(; i!=0; i--) y *= i;
return y;
}
//Anwendung:
new x = 5;
printf("Die Fakultät von %d ist: %d",x,fac(x));
//->: Die Fakultät von 5 ist: 120
Keywords: Fakultät, Factorial
mfg.
//Edit: Umbenannt wegen Pille...wobei das völlig egal ist, da man das eh selber kann <(^.^)>
//Edit²: Prozent-Fix
Hier eine nützliche Funktion, wenn ihr prüfen wollt, ob eine Zahl eine Primzahl ist.
stock IstPrimzahl(zahl) //©Jeffry
{
if(zahl < 0) zahl *= -1;
if(zahl < 2) return false;
for(new i = 2; i <= zahl / 2; i++)
{
if(zahl % i == 0) return false;
}
return true;
}
Beispiel zur Nutzung:
for(new i=0; i<100; i++) if(IstPrimzahl(i)) printf("%d ist eine Primzahl", i);
Ausgabe:
ZitatAlles anzeigenSpoiler anzeigen [07/10/2014 19:12:23] 2 ist eine Primzahl
[07/10/2014 19:12:23] 3 ist eine Primzahl
[07/10/2014 19:12:23] 5 ist eine Primzahl
[07/10/2014 19:12:23] 7 ist eine Primzahl
[07/10/2014 19:12:23] 11 ist eine Primzahl
[07/10/2014 19:12:23] 13 ist eine Primzahl
[07/10/2014 19:12:23] 17 ist eine Primzahl
[07/10/2014 19:12:23] 19 ist eine Primzahl
[07/10/2014 19:12:23] 23 ist eine Primzahl
[07/10/2014 19:12:23] 29 ist eine Primzahl
[07/10/2014 19:12:23] 31 ist eine Primzahl
[07/10/2014 19:12:23] 37 ist eine Primzahl
[07/10/2014 19:12:23] 41 ist eine Primzahl
[07/10/2014 19:12:23] 43 ist eine Primzahl
[07/10/2014 19:12:23] 47 ist eine Primzahl
[07/10/2014 19:12:23] 53 ist eine Primzahl
[07/10/2014 19:12:23] 59 ist eine Primzahl
[07/10/2014 19:12:23] 61 ist eine Primzahl
[07/10/2014 19:12:23] 67 ist eine Primzahl
[07/10/2014 19:12:23] 71 ist eine Primzahl
[07/10/2014 19:12:23] 73 ist eine Primzahl
[07/10/2014 19:12:23] 79 ist eine Primzahl
[07/10/2014 19:12:23] 83 ist eine Primzahl
[07/10/2014 19:12:23] 89 ist eine Primzahl
[07/10/2014 19:12:23] 97 ist eine Primzahl
Extra Info:
http://www.spiegel.de/wissensc…ne-primzahl-a-882646.html
http://www.wissenschaft-aktuel…r_Zeiten___bisher___.html
Keywords: IstPrimzahl, IsPrimeNumber, Primzahlen, Primenumbers, CheckPrimzahl, CheckPrime, CheckPrimenumber, auf Primzahl prüfen, ist Zahl Primzahl.
Also, das hier ist ein schnellerer Weg etwas in eine Variable zu schreiben, als format:
#define Push(%0,%1) %0[0]='\0',strcat(%0,%1,0x80)
//Das schreibt oben in euer Skript und so wendet ihr es an:
new string[] = "Hallo";
//Um jetzt etwas anderes in den String zu schreiben als Hallo...nutzen die meisten format:
format(string, sizeof string,"Test"); //jetzt würde Test in string stehen
//Schneller wäre aber jetzt das hier:
Push(string,"Test"); //hier würde jetzt auch Test in der Variable stehen
Um euch zu beweisen, dass ich recht habe hier ein kleiner Speedtest (1.000.000 Durchläufe):
Viel Spaß damit
mfg.
//Edit: Danke Goldkiller
Welchen Sinn soll das haben ?
Wenn ich einen Text irgendwo in eine Variable "pushen" will, dann benutze ich die direkte Zuweisung.
ZitatAlles anzeigen[14:39:13] Timing "format"...
[14:39:19] Mean = 611.00ns << 4
Mode = 606.00ns
Median = 612.00ns
Range = 12.00ns
[14:39:19] Timing "Push"...
[14:39:22] Mean = 247.00ns << 3
Mode = 247.00ns
Median = 247.00ns
Range = 8.00ns
[14:39:22] Timing "zuweisung"...
[14:39:22] Mean = 46.00ns << 1
Mode = 47.00ns
Median = 47.00ns
Range = 3.00ns
[14:39:22] Timing "strcat"...
[14:39:23] Mean = 132.00ns << 2
Mode = 132.00ns
Median = 132.00ns
Range = 4.00ns
Selbst wenn deine Funktion toll ist,sollte man lieber direkt strcat nutzen.
sollte man lieber direkt strcat nutzen.
Es geht ja darum, dass die Variable bereits einen Wert hat und man einen völlig neuen Wert haben will
new string[] = "Hallo";
Wenn ich jetzt nur mit strcat arbeiten würde, dann würde da ja Halloxxx stehen ich will aber, dass nur xxx darin steht.
mfg.
Wenn ich jetzt nur mit strcat arbeiten würde, dann würde da ja Halloxxx stehen ich will aber, dass nur xxx darin steht.
dann mache ich string = "neuer wert"; ??
Sieht aber gut aus
ZitatEs geht ja darum, dass die Variable bereits einen Wert hat und man einen völlig neuen Wert haben will
Schon klar, funktioniert ja auch mit beiden Alternativen Funktion:
http://pastebin.com/k4xmx87s
dann mache ich string = "neuer wert"; ??
Das geht in Pawn ja nicht immer
Zum Beispiel hier:
main() {
new string[] = "blub";
func(string);
}
func(string[]) {
string = "Hallo";
print(string);
}
Das geht nicht, aber da kannst du z.B. Push jetzt verwenden, anstatt format
Schon klar, funktioniert ja auch mit beiden Alternativen Funktion:
Hmm...ja stimmt, es wäre noch schneller anstatt dem strdel einfach den Null-Char zu verwenden
Danke, werde das mal anpassen
mfg.
Da kürzlich in einem Thread angesprochen, hier einen für alle User funktionsfähigen "Mixer".
stock MixString(string[]) //©Jeffry
{
new mixed[256], len = strlen(string), rand;
for(new i=0; i<len; i++)
{
rand = random(len-i);
mixed[i] = string[rand];
strdel(string, rand, rand+1);
}
return mixed;
}
Beispiel zur Nutzung:
ZitatSpoiler anzeigen [13/10/2014 19:33:22] hlaobizfyptqjdkgnrxvcmmesu
[13/10/2014 19:33:22] cugdfkjpanmhrzeoivmtsxbyql
[13/10/2014 19:33:22] drftmqoixklhzsbuanjmgyecpv
[13/10/2014 19:33:22] gfkusdpryaneojbmqzmiclhxtv
[13/10/2014 19:33:22] ckpyidtnvfrahejzmlgxmqbsou
Keywords: MixString, StringMix, Mixer, durcheinander, mischen, mix, random, zufällige Reihenfolge, Buchstabensalat.
stock ZahlNaeherNull(zahl1, zahl2){
new z1tmp, z2tmp;
if(zahl1 < 0){z1tmp = zahl1 * (-1);}
else{z1tmp = zahl1;}
if(zahl2 < 0){z2tmp = zahl2 * (-1);}
else{z2tmp = zahl2;}
if(z1tmp < z2tmp)return 1;
else if(z1tmp == z2tmp)return 0;
return 2;
}
Beispiel zur Nutzung:
Rückgabewerte:
Nemesus Jr.:
Das wird so nicht funktionieren. Du machst einmal *-1 und einmal +-1.
Außerdem brauchst du die beiden Hilfsvariablen nicht unbedingt:
stock ZahlNaeherNull(zahl1, zahl2)
{
if(zahl1 < 0) zahl1 *= -1;
if(zahl2 < 0) zahl2 *= -1;
if(zahl1 < zahl2) return 1;
else if(zahl1 == zahl2) return 0;
else return 2;
}
So wäre es korrekt.
Enum welches man nutzen kann für Map Icons anstatt umständlich immer die ID aus dem Wiki suchen zu müssen. MapIcon_4Dragons wird im Wiki als triads bezeichnet was ich etwas unpassend finde und deswegen 4Dragons genannt habe
enum
{
MapIcon_ColoredSquare, // 0
MapIcon_WhiteSquare,
MapIcon_PlayerPosition,
MapIcon_PlayerIcon,
MapIcon_North,
MapIcon_AirYard, // 5
MapIcon_Ammunation,
MapIcon_Barber,
MapIcon_BigSmoke,
MapIcon_BoatYard,
MapIcon_BurgerShot, // 10
MapIcon_Quarry,
MapIcon_Catalina,
MapIcon_Cesar,
MapIcon_CluckinBell,
MapIcon_CJ, // 15
MapIcon_CRASH,
MapIcon_Diner,
MapIcon_Emmet,
MapIcon_EnemyAttack,
MapIcon_Fire, // 20
MapIcon_GirlFriend,
MapIcon_Hospital,
MapIcon_Loco,
MapIcon_MaddDogg,
MapIcon_Caligulas, // 25
MapIcon_OGLoc,
MapIcon_ModGarage,
MapIcon_OGLoc2,
MapIcon_WellStacked,
MapIcon_Police, // 30
MapIcon_Property,
MapIcon_PropertyLocked,
MapIcon_RaceTrophy,
MapIcon_Ryder,
MapIcon_SaveGameDisk, // 35
MapIcon_School,
MapIcon_Unknown,
MapIcon_Sweet,
MapIcon_Tattoo,
MapIcon_TheTruth, // 40
MapIcon_Waypoint,
MapIcon_Toreno,
MapIcon_4Dragons,
MapIcon_TraidsCasino,
MapIcon_Clothes, // 45
MapIcon_Woozie,
MapIcon_Zero,
MapIcon_Club,
MapIcon_Bar,
MapIcon_Restaurant, // 50
MapIcon_Truck,
MapIcon_Robbery,
MapIcon_RaceFinish,
MapIcon_Gym,
MapIcon_Car, // 55
MapIcon_Light,
MapIcon_ClosestAirport,
MapIcon_LosAztecas,
MapIcon_Ballas,
MapIcon_LSVagos, // 60
MapIcon_SFRifa,
MapIcon_GroveStreet,
MapIcon_PayNSpray // 63
}
Eine kleine Funktion um explosive Munition zu ermöglichen.
Für welche Waffen das verfügbar sein soll müsst ihr dann selber entscheiden,
so wie es gerade ist:
Sämtliche Waffen sind explosiv.
/explosionsmunition um zu de/aktivieren.
Grundlegenes
new ExplosionsMunition[MAX_PLAYERS];
public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
{
if(ExplosionsMunition[playerid] == 1) {
new Float:fxX,Float:fyY,Float:fzZ;
if(hittype == 1)/*Spieler*/ { GetPlayerPos(hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
else if(hittype == 2)/*Auto*/ { GetVehiclePos(hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
else if(hittype == 3)/*Objekt*/ { GetObjectPos(hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
else if(hittype == 4)/*Spielerobjekt*/ { GetPlayerObjectPos(playerid,hitid,fxX,fyY,fzZ), CreateExplosion(fxX, fyY, fzZ, 12, 10.0); }
else /*Normale Map*/{ CreateExplosion(fX, fY, fZ, 12, 10.0); }
}
return 1;
}
Aktivierungsbefehl
CMD:exmu(playerid, params[]) {
if(ExplosionsMunition[playerid] == 1) { ExplosionsMunition[playerid] = 0, SendClientMessage(playerid, 0xFFFFFFFF, "Explosionsmunition {FF0000}deaktiviert{FFFFFF}."); }
else { ExplosionsMunition[playerid] = 1, SendClientMessage(playerid, 0xFFFFFFFF, "Explosionsmunition {00FF00}aktiviert{FFFFFF}."); }
return 1;
}