Beiträge von Jeffry

    Hast du den .pwn Code des Editors den ich zuerst verlinkt hatte mal kompiliert?
    Möglicherweise zeigt das den Fehler schon auf.


    Alternativ, starte den Code mal auf einem leeren Server (grandlarc Gamemode). Geht es dann?

    Wieso entwirfst du denn Funktionen für alte SA:MP Versionen.


    Abwärtskompatibilität, aus genanntem Grund. Dass es nichts zur Optimierung tut war mir klar, darum ging es auch in der ursprünglichen Funktion gar nicht.


    Hier, nochmal 10% schneller:
    stock IsPlayerLookingAtPos(playerid, Float:x, Float:y, Float:z, Float:radius = 3.0, Float:maxdist = 100.0)
    {
    static Float:cx, Float:cy, Float:cz, Float:vx, Float:vy, Float:vz, Float:dist;
    GetPlayerCameraPos(playerid, cx, cy, cz);
    GetPlayerCameraFrontVector(playerid, vx, vy, vz);
    cx-=x;
    cy-=y;
    cz-=z;
    dist = VectorSize(cx, cy, cz);
    return (dist > maxdist) ? 0 : _:(radius >= VectorSize(vx * dist + cx, vy * dist + cy, vz * dist + cz)); //<- Nur übernommen aus Geschwindigkeitsgründen, keineswegs befürwortet!
    }


    Hast noch einen auf Lager?

    Mit der Funktion VectorSize kannst du das schneller berechnen



    Quelle: https://wiki.sa-mp.com/wiki/VectorSize
    Ich habe die Funktion absichtlich nicht verwendet, da sie nicht mit den früheren Versionen kompatibel ist, in denen die Camera-Funktionen schon existieren.


    Zwecks dem return sagte ich ja bereits, dass ich meine Codes lieber übersichtlich und verständlich halte, sofern es nur ein paar Nanosekunden ausmacht, aber wenn du es so willst, an mir soll es nicht liegen.

    Spoiler anzeigen
    stock IsPlayerLookingAtPos(playerid, Float:x, Float:y, Float:z, Float:radius = 3.0, Float:maxdist = 100.0)
    {
    new Float:cx, Float:cy, Float:cz, Float:vx, Float:vy, Float:vz, Float:dist;
    GetPlayerCameraPos(playerid, cx, cy, cz);
    GetPlayerCameraFrontVector(playerid, vx, vy, vz);
    if((dist = floatsqroot(floatpower((cx = cx - x), 2) + floatpower((cy = cy - y), 2) + floatpower((cz = cz - z), 2))) > maxdist) return 0;
    return (radius >= floatsqroot(floatpower((vx * dist + cx), 2) + floatpower((vy * dist + cy), 2) + floatpower((vz * dist + cz), 2)));
    }

    7 Millisekunden auf 100.000 Durchläufe schneller (~5%).


    Bzw, wer will, mit VectorSize:

    Spoiler anzeigen
    stock IsPlayerLookingAtPos(playerid, Float:x, Float:y, Float:z, Float:radius = 3.0, Float:maxdist = 100.0)
    {
    new Float:cx, Float:cy, Float:cz, Float:vx, Float:vy, Float:vz, Float:dist;
    GetPlayerCameraPos(playerid, cx, cy, cz);
    GetPlayerCameraFrontVector(playerid, vx, vy, vz);
    if((dist = VectorSize((cx = cx - x), (cy = cy - y), (cz = cz - z))) > maxdist) return 0;
    return (radius >= VectorSize((vx * dist + cx), (vy * dist + cy), (vz * dist + cz)));
    }


    Nur versteht den Code wohl kaum einer noch.


    Das hier ist nicht der Code-Optimierungs Thread

    :rolleyes:

    Natürlich, in deinem Fall bringt dir die Funktion nicht direkt etwas, das ist klar. Da ist es effizienter so wie du es machst.
    Ja, man kann einen Punkt auf einer Gerade berechnen, das geht schon, nur dazu muss man den Punkt ja kennen, um zu schauen ob er auf der Geraden liegt.



    EDIT:
    @Jack_Bauer:
    Das dürfte das sein, was du benötigst bzw. meinst:



    stock IsPlayerLookingAtPos(playerid, Float:x, Float:y, Float:z, Float:radius = 3.0, Float:maxdist = 100.0)
    {
    new Float:cx, Float:cy, Float:cz, Float:vx, Float:vy, Float:vz, Float:dist;
    GetPlayerCameraPos(playerid, cx, cy, cz);
    GetPlayerCameraFrontVector(playerid, vx, vy, vz);
    dist = floatsqroot((cx-x)*(cx-x) + (cy-y)*(cy-y) + (cz-z)*(cz-z));
    if(dist > maxdist) return 0;
    vx = vx * dist + cx;
    vy = vy * dist + cy;
    vz = vz * dist + cz;
    dist = floatsqroot((vx-x)*(vx-x) + (vy-y)*(vy-y) + (vz-z)*(vz-z));
    if(dist > radius) return 0;
    return 1;
    }


    Bei x, y, z gibst du die Position ein, die du abfragen willst, ob der Spieler diese anschaut, bei radius gibst du die erlaubte Abweichung ein (man schaut ja nie direkt auf genau einen Punkt, es kann ja auch ein paar Zentimeter daneben sein) und bei maxdist gibst du die maximale Distanz zu dem Punkt ein (rein theoretisch kann man von jedem Punkt aus jeden Punkt anschauen, aber das macht ja keinen Sinn, wenn man in LV irgendwo steht, dass man dann einen Punkt in LS anschaut, theoretisch schaut man ihn zwar an, praktisch sieht man ihn aber gar nicht, das ist eben weil Geraden ja in beide Richtungen unendlich lang sind).


    Somit könnte man auch abfragen, ob man ein Fahrzeug oder ein Objekt anschaut, oder gegebenenfalls sogar einen anderen Spieler.


    Beispiele zur Nutzung:

    Spoiler anzeigen
    1.)
    if(IsPlayerLookingAtPos(playerid, 1234.5, 987.6, 12.34)) printf("Spieler %d schaut Position an.", playerid);

    Spoiler anzeigen
    2.)
    new Float:x, Float:y, Float:z;
    GetVehiclePos(myVeh, x, y, z);
    if(IsPlayerLookingAtPos(playerid, x, y, z, 5.0, 20.0)) printf("Spieler %d schaut myVeh an und ist in der Nähe (20m)", playerid);

    Spoiler anzeigen
    3.)
    new Float:x, Float:y, Float:z;
    GetPlayerPos(pID, x, y, z);
    if(IsPlayerLookingAtPos(playerid, x, y, z, 1.0, 5.0)) printf("Spieler %d schaut Spieler %d an.", playerid, pID);



    Keywords: IsPlayerLookingAtPos, IsPlayerLookingAtObject, IsPlayerLookingAtVehicle, IsPlayerLookingAtPlayer, LookAtPos, PlayerFacePlayer, PlayerLookAtObject, SpielerSchautAufPos, SpielerSchautAufSpieler, SpielerSchautAufObjekt, SpielerSchautAufFahrzeug

    Naja, wie gesagt, das Problem ist bei dem Code der Speicher, aus irgendeinem Grund kann er da nicht richtig drauf zugreifen.


    Den Code, von dem pastebin, den du gepostet hast, setze den mal in einen Kommentar, damit er praktisch entfernt ist:
    /*
    Code hier
    */


    Dann kompiliere den Code. Kommt der Fehler mit dem Invalid memory access dann noch immer?


    Falls der Fehler aus dem Teil dann weg ist, dann lösche dort das
    new banstring[128];
    aus dem Code und überall im Code (also der Include) wo das noch vorkommt (new banstring). Anschließend schreibe das
    new banstring[128];
    ganz oben in die erste Zeile der Include und kompiliere den Code neu.

    Schau dir das Tutorial zu den dynamischen Fraktions Fahrzeugen an:
    [ SCRIPTING ] [jTuT] Fraktions-Fahrzeug-System mit MySQL R39-2


    Mit kleinen Änderungen bekommst du so auch ein Autohaus System hin, vom Grundgerüst, also speichern und laden, ist es prinzipiell genau gleich, du musst eben die eine oder andere Spalte hinzufügen.


    Alternativ kannst du dir anschauen wie andere es gemacht haben:
    http://forum.sa-mp.com/showthread.php?t=276887
    http://forum.sa-mp.com/showthread.php?t=405408

    Das passt nicht ganz, die Array Größe ist zu klein und die Abfrage ob der Spieler genug Geld hat passt nicht, da du es negativ speicherst.


    // Waffe, Munition, Preis
    new PWEAPON_LIST[ 3 ][ 3 ] = {
    { WEAPON_PISTOL, 50, 700 },
    { WEAPON_M4, 200, 400 },
    { WEAPON_AK, 180, 350 }
    };


    public OnDialogResponse( playerid, dialogid, response, listitem, inputtext[ ] )
    {
    if( dialogid == DIALOG_PWEAPON && response )
    {
    new result[ 3 ] = PWEAPON_LIST[ listitem ];
    if( result[ 2 ] <= GetPlayerMoney( playerid ) )
    {
    GivePlayerMoney( playerid, -result[ 2 ] );
    GivePlayerWeapon( playerid, result[ 0 ], result[ 1 ] );
    SendClientMessage( playerid, COLOR_HELP, "Viel spaß mit deiner Waffe." );
    return 1;
    }
    SendClientMessage( playerid, COLOR_HELP, "Du hast nicht genügend Geld dabei." );
    return 1;
    }
    return 1;
    }

    Solange das Directive leer ist...wird dieser gesamte Code nicht funktionieren... :rolleyes:


    Natürlich, da muss ja auch seine Variable rein, die den Spieler als Cop identifiziert. Ich kann allerdings schlecht erraten wie er seine Variablen genannt hat. :huh:


    Aber gut, ein Beispiel wäre:
    #define IsACop(%0) SpielerInfo[%0][Cop]

    Klar, mach den Anfang einfach so:
    #include <a_samp>


    //TransporterKlau
    new CarRob[MAX_PLAYERS];
    new Transporter[5];


    #define TEAM_BLUE_COLOR 0x8D8DFF00
    #define COLOR_RED 0xAA3333AA
    #define IsACop
    //^Ausfüllen, z.B: #define IsACop(%0) SpielerInfo[%0][Cop]


    public OnFilterScriptInit()
    {
    Transporter[1] = AddStaticVehicleEx(428,1531.46948242,-1006.67529297,24.32791519,195.99908447,7,7,15); //Securicar
    Transporter[2] = AddStaticVehicleEx(428,1527.69299316,-1009.80389404,24.32791519,223.99908447,7,7,15); //Securicar
    Transporter[3] = AddStaticVehicleEx(428,1536.12683105,-1005.45129395,24.32012558,177.99597168,7,7,15); //Securicar
    Transporter[4] = AddStaticVehicleEx(428,1540.00598145,-1005.41644287,24.32012558,177.99597168,7,7,15); //Securicar


    CreateObject(3881,1531.77624512,-1028.67895508,24.84796333,0.00000000,0.00000000,336.00000000); //object(airsecbooth_sfse) (1)
    CreateObject(2933,1524.44018555,-1028.68688965,24.55014801,0.00000000,0.00000000,336.00000000); //object(pol_comp_gate) (1)
    CreateObject(3852,1520.82092285,-1015.57202148,24.75112915,0.00000000,0.00000000,0.00000000); //object(sf_jump) (1)
    CreateObject(3666,1517.84216309,-1031.71252441,23.30518532,0.00000000,0.00000000,0.00000000); //object(airuntest_las) (1)
    CreateObject(3666,1528.67578125,-1036.61425781,23.30782890,0.00000000,0.00000000,0.00000000); //object(airuntest_las) (2)
    CreateObject(9241,1434.68164062,-988.94183350,58.57452393,0.00000000,0.00000000,268.00000000); //object(copbits_sfn) (1)
    CreateObject(8132,1503.36340332,-1024.02246094,25.41958618,0.00000000,0.00000000,276.00000000); //object(vgschurch03_lvs) (1)
    CreateObject(987,1535.78820801,-1025.68835449,23.07812500,0.00000000,0.00000000,66.00000000); //object(elecfence_bar) (1)
    CreateObject(987,1543.14392090,-1009.20489502,23.07812500,0.00000000,0.00000000,65.99487305); //object(elecfence_bar) (3)
    CreateObject(1411,1519.94177246,-1024.83801270,24.43064117,0.00000000,0.00000000,280.00000000); //object(dyn_mesh_1) (1)
    CreateObject(1411,1519.70825195,-1023.70733643,24.43012428,0.00000000,0.00000000,279.99755859); //object(dyn_mesh_1) (2)
    CreateObject(987,1539.56542969,-1017.34942627,23.07812500,0.00000000,0.00000000,65.99487305); //object(elecfence_bar) (6)


    return 1;
    }