Nützliche Codeschnipsel

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
  • stock GetClosestVehicle(playerid,&Float:distance=0.0){
    new p,v,Float:Pos[5]={10000.0,...},cveh=-1,bool:no;
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    for(; v < MAX_VEHICLES; ++v){
    if(!IsValidVehicle(v))continue;
    for(p=0; p < MAX_PLAYERS; ++p){
    if(!IsPlayerInVehicle(p, v))continue;
    no=true;
    break;
    }
    if(!no){
    Pos[3] = GetVehicleDistanceFromPoint(v, Pos[0],Pos[1],Pos[2]);
    if(Pos[4] > Pos[3]){
    Pos[4] = Pos[3];
    cveh = v;
    no=false;
    }
    }
    }
    distance = Pos[4];
    return cveh;
    }



    stock GetClosestVehicle(playerid,&Float:distance=0.0){
    new v,Float:Pos[5]={10000.0,...},cveh=-1;
    GetPlayerPos(playerid,Pos[0],Pos[1],Pos[2]);
    for(; v < MAX_VEHICLES; ++v){
    if(!IsValidVehicle(v))continue;
    Pos[3] = GetVehicleDistanceFromPoint(v, Pos[0],Pos[1],Pos[2]);
    if(Pos[4] > Pos[3]){
    Pos[4] = Pos[3];
    cveh = v;
    no=false;
    }
    }
    distance = Pos[4];
    return cveh;
    }


    Da jemand solch eine funktion gepostet hatte habe ich diese mal neu geschrieben und erweitert
    damit ist es möglich die id des nächsten zu einem spieler sich befindeten autos zu bekommen als auch die distance in zwei versionen einmal jedes auto und einmal nur leere
    Autos.


    Was wichtig ist das ihr dies oben benutzt
    native IsValidVehicle(vehicleid);


    da sich dieses native sich nicht in der a_samp include befindet aus einem mir nicht ersichtlichen grund warum überhaupt.

  • Dort wo man hinschaut mit der Kamera von dort wird die jeweilige rotation genommen


    Nicht ganz es ging um die rotation im auto wo der spieler hinschaut also ganz genau geht das leider nicht was du damit geplant hast ich hab dazu jedoch auch auf den vorherigen Seiten mal eine berechnung gemacht um den jeweiligen punkt zu ermitteln.


    stock IsViewInRangeOfPointa(playerid, Float: r, Float: x, Float: y, Float: z){
    new Float:GP[3], Float:GPCFV[3], Float: Output[3], Float: fcarpos[3], fcar;
    fcar = GetPlayerVehicleID(playerid);
    const Float: weite = 30.0; //4.0, 5.0
    GetVehiclePos(fcar,fcarpos[0],fcarpos[1],fcarpos[2]);
    GetPlayerCameraPos(playerid, GP[0], GP[1], GP[2]);
    GetPlayerCameraFrontVector(playerid, GPCFV[0], GPCFV[1], GPCFV[2]);
    Output[0] = GP[0] + floatmul(GPCFV[0], weite);
    Output[1] = GP[1] + floatmul(GPCFV[1], weite);
    Output[2] = fcarpos[2];
    if(FKInfo[Aim_Feuerwehrauto] == 1){ SetPlayerCheckpoint(playerid, Output[0], Output[1], Output[2], r);}
    if((Output[0] - x)*(Output[0] - x) + (Output[1] - y)*(Output[1] - y) <= r*r && Output[2] <= z) return 1;
    else return 0;
    }


    musst den konstanten wert anpassen und das untere :D

  • ocmd:veh(playerid,params[])
    {
    new Float:vehx,Float:vehy,Float:vehz;
    new vehid,cc1,cc2,string[128];
    if(sscanf(params,"iii",vehid,cc1,cc2))return SendClientMessage(playerid, rot,"Benutzung: /veh [Vehicle ID] [Farbe 1] [Farbe 2]");
    GetPlayerPos(playerid,vehx,vehy,vehz);
    new carid = CreateVehicle(vehid,vehx,vehy,vehz,3,cc1,cc2,-1);
    SetVehicleNumberPlate(carid,"~>Admin<~");
    PutPlayerInVehicle(playerid, carid, 0);
    format(string,sizeof(string),"[AdmCmd] Du hast ein Admincar gespawnt! (FahrzeugID :%d)",GetVehicleModel(GetPlayerVehicleID(playerid)));
    SendClientMessage(playerid,rot,string);
    return 1;
    }


  • Wieso redundant?


    Der Source-Code ist für manche vielleicht hilfreich? :huh:


    Da unser lieber Schwabbel mein einen code getestet hat SetArrowPos(playerid,vehicleid,objectid,Float:X, Float:Y)
    welche leider falsch war von der berechnung naja trollbeit bringt unterschwellig nicht alles zum laufen.



    Poste ich den Code nochmal welche diesmal Perfekt funktioniert


    stock SetArrowPos(playerid,vehicleid,objectid,Float:X, Float:Y){
    new Float: Pos[4];
    GetVehiclePos(vehicleid, Pos[0], Pos[1],Pos[2]);
    GetVehicleZAngle(vehicleid,Pos[3]);
    AttachPlayerObjectToVehicle(playerid,objectid, vehicleid, 0.0, 0.0, 1.5, 0.0, 90.0,atan2(Pos[1] - Y,Pos[0] - X)-Pos[3]);
    return 1;
    }

  • Poste ich den Code nochmal welche diesmal Perfekt funktioniert


    Bei dir hat das funktioniert?


    Bei war das immer in der falschen Richtung, bei mir klappt es jetzt, aber nur so:



    new Float: Pos[4];
    GetVehiclePos(vehicleid, Pos[0], Pos[1],Pos[2]);
    GetVehicleZAngle(vehicleid,Pos[3]);


    (atan2(Pos[1] - Y,Pos[0] - X)-Pos[3])-180
    Aber trotzdem, vielen Dank :love:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Bezüglich des pfeiles ja was anderes habe ich nicht getestet kann jedoch wie bei dir vllt nicht ganz richtig sein (seitenverkehrt)



    if (strcmp("/test", cmdtext, true, 10) == 0){
    an = true;
    var = CreatePlayerObject(playerid,1318,0.0,0.0,0.0,0.0,0.0,0.0);
    return 1;
    }

    public OnPlayerUpdate(playerid)
    {
    if(an)SetArrowPos(playerid,GetPlayerVehicleID(playerid),var,0.0,0.0);
    return 1;
    }

  • ::


    ocmd:goto(playerid,params[])
    {
    new pID,string[128];
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,weis,"Benutze: /goto [id]");
    if(IsPlayerAdmin(playerid))
    {
    if(IsPlayerConnected(pID))
    {
    new Float:x,Float:y,Float:z,Float:a;
    GetPlayerPos(pID,x,y,z);
    GetPlayerFacingAngle(pID,a);
    SetPlayerPos(playerid,x+2,y,z);
    SetPlayerFacingAngle(playerid,a);
    format(string,sizeof(string)," %s hat sich zu dem Spieler %s teleportiert",Spielername(playerid),Spielername(pID));
    SendClientMessageToAll(weis,string);
    }
    else
    {
    SendClientMessage(playerid,weis,"Der Spieler wurde nicht gefunden");
    }
    }
    else
    {
    SendClientMessage(playerid,weis,"Du bist kein Admin");
    }
    return 1;
    }


    ocmd:gethere(playerid,params[])
    {
    new pID,string[128];
    if(sscanf(params,"u",pID))return SendClientMessage(playerid,weis,"Benutze: /gethere [id]");
    if(IsPlayerAdmin(playerid))
    {
    if(IsPlayerConnected(pID))
    {
    new Float:x,Float:y,Float:z,Float:a;
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid,a);
    SetPlayerPos(pID,x+2,y,z);
    SetPlayerFacingAngle(pID,a);
    format(string,sizeof(string)," Der Administrator %s hat den Spieler %s zu sich Teleportiert",Spielername(playerid),Spielername(pID));
    SendClientMessageToAll(weis,string);
    }
    else
    {
    SendClientMessage(playerid,weis,"Der Spieler wurde nicht gefunden");
    }
    }
    else
    {
    SendClientMessage(playerid,weis,"Du bist kein Admin");
    }
    return 1;
    }


  • forward ARGB(alpha, red, green, blue);
    public ARGB(alpha, red, green, blue)
    {
    return alpha + (red * 16777216) + (green * 65536) + (blue * 256);
    }


    Denke mal das kann sich jeder Selbst erklären?

    76ul4ppd4lmb.png

    Einmal editiert, zuletzt von Mr.Soap () aus folgendem Grund: Hinterm forward das ; vergessn :S


  • Ich finde es persönlich unnötid dafür eine extra funktion zu schreiben die noch aufgerufen wird mach das doch via #define
    #define ARGB(%0,%1,%2,%3) (%3 + (%2 * 0x1000000) + (%1 * 0x10000) + (%0 * 0x100))

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • http://pastebin.com/mKtTuuKK


    falls wer die zonen der Map braucht


    ocmd:tow(playerid, params[])
    {
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, COLOR_RED, "Du bist nicht der Fahrer eines Fahrzeuges!");
    new vehicleid = GetPlayerVehicleID(playerid);
    if(IsTrailerAttachedToVehicle(vehicleid))
    {
    DetachTrailerFromVehicle(vehicleid);
    SendClientMessage(playerid, COLOR_WHITE, "Du ziehst nun nichtmehr!");
    return 1;
    }
    new Float:x, Float:y, Float:z;
    new Float:dist, Float:closedist=8, closeveh;
    for(new i=1; i < MAX_VEHICLES; i++)
    {
    if(i != vehicleid && GetVehiclePos(i, x, y, z))
    {
    dist = GetPlayerDistanceFromPoint(playerid, x, y, z);
    if(dist < closedist)
    {
    closedist = dist;
    closeveh = i;
    }
    }
    }
    if(!closeveh) return SendClientMessage(playerid, COLOR_RED, "Du bist nicht nah genug am Auto!");
    AttachTrailerToVehicle(closeveh, vehicleid);
    SendClientMessage(playerid, COLOR_WHITE, "Du ziehst nun nichtmehr");
    return 1;
    }
    um ein auto abzuschleppen

  • Ich finde es persönlich unnötid dafür eine extra funktion zu schreiben die noch aufgerufen wird mach das doch via #define
    #define ARGB(%0,%1,%2,%3) (%3 + (%2 * 0x1000000) + (%1 * 0x10000) + (%0 * 0x100))


    wenn man schon makros verwendet, dann sollte man sie aber auch sicher verwenden können ;)
    bei makros sollte man immer klammern um die einzelnen werte setzen, da die werte eins zu eins ersetzt werden und nicht vorher ausgerechnet werden
    ARGB(20+20,20+20,20+20,20+20)
    wird dann zu:
    (20+20 + (20+20 * 0x1000000) + (20+20 * 0x10000) + (20+20 * 0x100))
    da das * vor dem + ausgeführt wird ergibt sich dann eine falsche Berechnung und somit auch falsche Farbe ;)


    so sollte es aussehen:
    #define ARGB(%0,%1,%2,%3) ((%3) + ((%2) * 0x1000000) + ((%1) * 0x10000) + ((%0) * 0x100))

    <3

    Einmal editiert, zuletzt von d0. ()

  • Habe auch mal was lustiges, also mir war langweilig und ich habe ein kleines Makro geschrieben, damit man strings und char-Arrays verwenden kann.


    Sieht so aus:


    new char_buffer[64];
    #define insert(%0,%1,%2,%3); \
    format(char_buffer,%1,%2,%3); \
    strunpack(%0,char_buffer,%1);


    //Anwendungsbeispiel:
    new string[128 char],name[]="Kaliber";
    insert(string,sizeof(string),"Mein Name ist: %s",name);
    printf("%s",string); //-> printet "Mein Name ist: Kaliber"


    mfg. :thumbup:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • sieh dir mal genau meinen Beitrag über deinem an: http://forum.sa-mp.de/san-andr…eschnipsel-46#post1529212
    :whistling:
    Edit: wobei das in deinem Makro eigentlich fast nicht zutrifft, da alles mit Komma abgetrennt ist. Ist nur Gewohnheit das zu machen

  • Kaliber: wäre doch so viel schlauer das zu machen
    #define insert(%0,%1,%2,%3); \
    new char_buffer[(%1) + 1]; \
    format(char_buffer,%1,%2,%3); \
    strunpack(%0,char_buffer,%1);


    Denn du darfst nicht vergessen, dass sizeof bei einem gepackten string, anders fungiert und dir nicht den direkten wert wiedergibt, den du vermuten würdest und somit bei format, rumspackt.
    Irgendwie stört mich auch dein vorgegebener Wert, der mMn da irgendwie falsch ist.
    Schlauer wäre es, wie in meinem Beispiel den von Coder entscheiden zulassen, denn als buffer braucht man nicht zwingend 64 cells.
    Hierbei ist allerdings zu beachten, dass sizeof nicht mehr funktioniert :thumbup:

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Denn du darfst nicht vergessen, dass sizeof bei einem gepackten string, anders fungiert und dir nicht den direkten wert wiedergibt, den du vermuten würdest und somit bei format, rumspackt.
    Irgendwie stört mich auch dein vorgegebener Wert, der mMn da irgendwie falsch ist.
    Schlauer wäre es, wie in meinem Beispiel den von Coder entscheiden zulassen, denn als buffer braucht man nicht zwingend 64 cells.
    Hierbei ist allerdings zu beachten, dass sizeof nicht mehr funktioniert


    Ja...naja das ist so eine Sache :D


    Also, ich finde man sollte das eh nicht verwenden, weil man es nicht brauch, da wirklich im Prinzip die selbe Länge verwendet wird :rolleyes:

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S


  • Ja...naja das ist so eine Sache :D


    Also, ich finde man sollte das eh nicht verwenden, weil man es nicht brauch, da wirklich im Prinzip die selbe Länge verwendet wird :rolleyes:


    Mit format hat man auch so gesehen die möglichkeit die string zu packen
    beispiel:


    format(string,20,!"Hallo wie");


    was ich persönlich auch sehr interessant finde ist das man ohne warning einem string der mit dem datentyp char deklariert wurde mehr zeichen zuweisen kann als
    angegeben. Dies kann man mit print ausgeben lassen. Bei printf wird das wieder verfälscht.
    beispiel



    new string[10 char] =!"hallo123456";
    print(string);

  • Bei printf wird das wieder verfälscht.
    beispiel


    printf gibt es ja in PAWN eigentlich nicht, bzw in der verwendeten libary, diese wurde ja erst von Kalcor, damals Kyeman, "entwickelt".
    Print gabs es hingegen schon deswegen geht das ja auch :D


    Zu deinem "Phänomen":
    bei einem char Array speicherst du 4 Zeichen in einem cell statt ein Zeichen pro cell ;)

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski


  • Zu deinem "Phänomen":
    bei einem char Array speicherst du 4 Zeichen in einem cell statt ein Zeichen pro cell ;)


    Jo macht sinn ^^ ich hab gerade den orginal post von Y_Less gefunden und in der pawn-lang.pdf soll es ja anscheinend auch gut dokumentiert sein


    //edit


    Anfangs hat mich das irritiert aufgrund dessen das man in einer char array nur werte von 0 - 255 speichern kann aufgrund das nur 1 byte pro zelle genutzt wird

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen