Beiträge von Jeffry

    Was wird dir so ausgegeben?
    new Float:Health;
    foreach(Player, i)
    {
    GetPlayerHealth(i, Health);
    printf("i: %d / Health: %f / pHealth: %f", i, Health, pHealth[i]);
    if(Health > pHealth[i] && Health > 0)
    {
    SetPlayerHealth(i, pHealth[i]);
    SendClientMessage(i,COLOR_RED, "Health Hacker");
    }
    else
    {
    pHealth[i] = Health;
    }
    }

    Wie fragt man am besten ab ob der Spieler zum Fahrzeug gedreht ist? Wie z.B. bei einem Kofferraum System.

    Da kannst du einen Trick anwenden und einfach prüfen ob der Spieler ungefähr die selbe ZAngle wie das Auto hat

    Das reicht nicht, da kann der Spieler auch vor dem Fahrzeug stehen, und von dem Fahrzeug weg schauen, dann schaut er laut deinem Code auch auf den Kofferraum.


    Hier die beiden Funktionen, die notwendig sind, um das korrekt zu überprüfen:
    Einmal um das nächste Fahrzeug zu finden:
    stock GetClosestVehicleID(playerid, Float:dist = 10000.0) //©Jeffry
    {
    new Float:tmp, Float:x, Float:y, Float:z, id = INVALID_VEHICLE_ID;
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    if(GetVehiclePos(i, x, y, z))
    {
    tmp = GetPlayerDistanceFromPoint(playerid, x, y, z);
    if(tmp <= dist)
    {
    dist = tmp;
    id = i;
    }
    }
    }
    return id;
    }


    Und dann die Funktion um zu prüfen, ob der Spieler hinter dem Fahrzeug ist, und auf den Kofferraum schaut.
    stock IsPlayerBehindVeh(playerid, vehicleid) //©Jeffry
    {
    new Float:a, Float:vx, Float:vy, Float:vz, Float:x, Float:y, Float:z, Float:pa, Float:px, Float:py, Float:pz;
    GetVehicleModelInfo(GetVehicleModel(vehicleid), VEHICLE_MODEL_INFO_SIZE, vx, vy, vz);
    GetVehicleZAngle(vehicleid, a);
    GetVehiclePos(vehicleid, x, y, z);
    GetPlayerPos(playerid, px, py, pz);
    x += (-vy/2.0 * floatsin(-a, degrees));
    y += (-vy/2.0 * floatcos(-a, degrees));
    if(IsPlayerInRangeOfPoint(playerid, vx/2.0, x, y, z) && pz <= (z+vz/2.0))
    {
    GetPlayerFacingAngle(playerid, pa);
    if(floatabs(pa-a) < 45 || floatabs(pa-a) > 315)
    {
    return true;
    }
    }
    return false;
    }


    Anbei ein Beispiel zur Nutzung:
    new vehicleid = GetClosestVehicleID(playerid);
    if(IsPlayerBehindVeh(playerid, vehicleid))
    {
    //Spieler ist am Kofferraum
    }
    else
    {
    //Spieler ist nicht am Kofferraum
    }

    Was wird dir beim Spawn so ausgegeben:
    pHealth[playerid] = PlayerInfo[playerid][pLive];
    zu:
    printf("1: %f", pHealth[playerid]);
    pHealth[playerid] = PlayerInfo[playerid][pLive];
    printf("2: %f", pHealth[playerid]);


    PS: Durch die Schleife in der Zeile drunter sendest du jedem Spieler, wenn irgendein Spieler spawnt, seinen aktuellen Health-Stand. Ist das gewollt?

    C:\Users\Marcel\Desktop\SAMP Projekt\Server\gamemodes\Script.pwn(390) : error 035: argument type mismatch (argument 2)

    Bitte die Zeile im Code markieren.



    if(inputtext<0||inputtext>(MAX_WERBETAFELN)-1)

    zu:
    if(strval(inputtext)<0||strval(inputtext)>=MAX_WERBETAFELN)


    Wie wende ich meine binaersuchfunktion an wenn ich beispielsweise nur in der ersten Dimension meines Arrays suchen will?

    stock binarysearch2(a[][],idx,key,l,r)
    {
    new k;
    while(r >=l)
    {
    k = (l+r)/2;
    if(key == a[k][idx])
    {
    return k;
    }
    if(key < a[k][idx])
    {
    r = k-1;
    }
    else
    {
    l= k+1;
    }
    }
    return -1;
    }
    Bei "idx" dann den Index mit geben, in dem Fall also die 0, für den ersten Index.


    Und wie kann ich bei nem Float beim printen die Nachkommastellen begrenzen?

    %0.2f
    = 2 Nachkommastellen

    @Jeffry, eine Frage?

    Natürlich, immer her damit!



    Das (-1) sagt aus, das i nur bei Bedarf angegeben werden braucht?

    Jein.
    Das große "i" (I) sagt aus, dass der zweite Eingabeparameter optional ist, aber eine Zahl sein muss, falls angegeben. Das -1 ist der Default-Wert.
    Wird er nicht eingegeben, so erhält in dem sscanf die Variable anzahl den Wert -1 (das in Klammer).
    Wird er eingegeben, dann bekommt anzahl den entsprechenden Wert.

    Viele Fehler waren in dem Code nicht.
    Dass die Einrückung zerschossen war hat eventuell der Pastebin gemacht.
    Einmal eingerückt sah das Ganze wieder leserlich aus. Die Kommentare zu den jeweiligen Klammern habe ich entfernt.


    Hier die verbesserten Codes, die Fehler jeweils als Kommentar markiert.
    if(strcmp("/robstore", cmdtext, true, 10) == 0)
    {
    new str[60];
    if(robtimerKill[playerid] == -1)
    {
    if(GetPlayerSkin(playerid) == 230)
    {
    for(new la=0; la<sizeof(LadenInfo); la++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 80, LadenInfo[la][b_ix], LadenInfo[la][b_iy], LadenInfo[la][b_iz]))
    {
    if(GetPlayerWeapon(playerid) != 0)
    {
    SendClientMessage(playerid, COLOR_RED, "Du hast einen Überfall gestartet!");
    SetPlayerWantedLevel(playerid, GetPlayerWantedLevel(playerid) + 1);
    robtimerKill[playerid] = SetTimerEx("robtimer", 60000, false, "i", playerid);
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerCop(i))
    {
    GetPlayerName(playerid, str, MAX_PLAYER_NAME);
    format(str, sizeof(str), "<< %s (%d) überfällt gerade einen Store! >>", str, playerid);
    SendClientMessage(i, COLOR_RED, str);
    }
    }
    format(string5, sizeof(string5), "Name: %s\nWANTED", GetName(playerid));
    Wanteds[playerid] = Create3DTextLabel(string5, COLOR_YELLOW, 0, 0, 0, 40.0, 0, 0);
    Attach3DTextLabelToPlayer(Wanteds[playerid], playerid, 0.0, 0.0, 0.7);
    }
    else
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du hast keine Waffe bei dir oder diese nicht in der Hand");
    }
    return 1; //Hat gefehlt
    }
    }
    return SendClientMessage(playerid, COLOR_WHITE, "Du bist an keinem Store!"); //Aus der Schleife gezogen.
    }
    else
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du bist ein Cop. Du kannst keinen Storerob starten!");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_WHITE, "Du kannst nur einen Raub gleichzeitig starten!");
    }
    return 1;
    }


    if(newkeys & KEY_SECONDARY_ATTACK) //Vorgezogen
    {
    new str[145];
    for(new la=0; la<sizeof(LadenInfo); la++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, LadenInfo[la][b_ix], LadenInfo[la][b_iy], LadenInfo[la][b_iz])) //BSN
    {
    if(robtimerKill[playerid] != -1)
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerCop(i))
    {
    GetPlayerName(playerid, str, MAX_PLAYER_NAME);
    format(str, sizeof(str), "<< Der Überfall von %s (%d) ist gescheitert! (Store verlassen) >>", str, playerid);
    SendClientMessage(i, COLOR_RED, str);
    }
    }
    //Code drunter aus der Schleife geholt
    KillTimer(robtimerKill[playerid]);
    robtimerKill[playerid] = -1;
    sInfo[playerid][robbedStores]++;
    sInfo[playerid][fRobbedStores]++;
    saveRobs(playerid);
    SetPlayerInterior(playerid,0);
    SetPlayerPos(playerid, LadenInfo[la][b_x], LadenInfo[la][b_y], LadenInfo[la][b_z]);
    SendClientMessage(playerid, COLOR_RED, "Dein Überfall ist gescheitert da du den Store verlassen hast");
    }
    else
    {
    SetPlayerInterior(playerid,0);
    SetPlayerPos(playerid, LadenInfo[la][b_x], LadenInfo[la][b_y], LadenInfo[la][b_z]);
    }
    return 1; //Hat gefehlt
    }
    }
    }


    Und ja, mir ist bewusst dass der Thread-Starter gesperrt ist.
    Nichtsdestotrotz kann die Hilfestellung jemandem weiterhelfen, eventuell auch @Dachdecker , der ja auch nachgefragt hatte.

    der Liebe @Jeffry hatte doch mal ein Stock Geschrieben um das Geburtsjahr auszulesen.
    Sprich, das man bei der Registration so ein Format nutzen musste: 01.01.1990, hat dies vielleicht noch einer oder kann mir die Funktion
    zukommen lassen?

    GetPlayerAge:
    Nützliche Codeschnipsel



    Wie macht man es, dass man beim Login/Register die Spawn Taste nicht benutzen kann... also da nix passiert?

    return 0 bei http://wiki.sa-mp.com/wiki/OnPlayerRequestSpawn

    ocmd:materials(playerid,params[])
    {
    if(PlayerInfo[playerid][pLoggedIn]==false) return 1;
    new ding[20], anzahl, string[145];
    if(sscanf(params, "sI(-1)", ding, anzahl)) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell] [opt:Anzahl]");

    if(!strcmp(ding, "deliver", true))
    {
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    //Mach was hier
    return 1;
    }
    else if(!strcmp(ding, "get", true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials get [Anzahl]");
    if(PlayerInfo[playerid][pJob] != 2) return SendClientMessage(playerid,COLOR_RED,"Du bist kein Waffendealer");
    //Mach was hier
    return 1;
    }
    else if(!strcmp(ding, "put", true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials put [Anzahl]");
    //Mach was hier
    return 1;
    }
    else if(strcmp(ding,"gtake",true))
    {
    if(anzahl == -1) return SendClientMessage(playerid,COLOR_RED,"Benutze /materials gtake [Anzahl]");
    //Mach was hier
    return 1;
    }
    return SendClientMessage(playerid,COLOR_RED,"Benutze /materials [get/deliver/put/gtake/sell]");
    }

    Wie kann ich am besten Scripten lernen?

    Ich gebe dir ein paar gute Tipps wie du dir es selbst sehr gut beibringen kannst, so habe ich es zumindest vor 7 1/2 Jahren gelernt (von null an, ohne Programmierkenntnisse aus anderen Sprachen).
    Du solltest auf jeden Fall, hinsichtlich der Lerneffizienz, vermeiden, einen vorhandenen Gamemode zu "vergewaltigen", dazu gehört zum einen ein größeres Grundwissen, welches man sich zuerst aufbauen muss, und zum anderen lernt man da nicht wirklich viel, wenn man nur in vorhandenen Codes herumspielt und nicht wirklich etwas selbst erstellt. Es ist zudem wesentlich einfacher Fehler an Dingen festzustellen, sofern vorhanden, die man selbst erstellt hat, als an Dingen, die man nicht gemacht hat und somit die Funktion nicht immer zu 100 Prozent nachvollziehen kann, bzw. auswendig kennt.


    Ob sich das PAWN-Lernen für dich lohnt musst du selbst entscheiden. Wenn du einen Lerneffekt haben möchtest, dann lohnt es sich auf jeden Fall, da die Sprache ziemlich einfach aufgebaut ist, und man ziemlich schnell Ergebnisse hat, wenn man ein paar Zeilen Code schreibt. Wissen schadet auf jeden Fall nie.
    Dass es weit fortgeschritten ist kann ich nicht ganz nachvollziehen. An PAWN bzw. den vorhandenen Funktionen selbst hat sich eigentlich nicht wirklich was verändert, es sind höchstens ein paar neue Funktionen dazu gekommen, das spielt aber keine wirkliche Rolle für das allgemeine Verständnis. PAWN wurde übrigens nicht für SA-MP erfunden, sondern wird nur von SA-MP genutzt.


    Ich erkläre dir mal wie du am besten selbst lernen kannst, damit du in Zukunft auch verstehst, was dein Code macht, und wann du welchen Code benutzen bzw. ändern musst.
    Also ich habe PAWN gelernt, indem ich mir den LAdmin4v2 (damals sehr neu) genommen habe, und versucht habe, die einzelnen Teile zu verstehen. Dann habe ich einfach losgelegt, und überlegt, welcher Teil das macht, was ich will. Wollte ich zum Beispiel einen Befehl machen, der den Spieler an eine andere Position setzt, dann habe ich mir zum Beispiel den /slap Befehl angeschaut, da der Spieler dort entsprechend seiner Position woanders hingesetzt wird. Den Code hab ich mir dann angeschaut, und so für den neuen Code verändert, dass er seinen Zweck erfüllt hat. Damit also teilweise Copy & Paste, und teilweise eigenständige Arbeit. So kann man sich immer mehr zusammenbasteln.
    Das Gute an so einem Admin-Filterscript ist, dass man schon mal das ganze User-System (auf Dateien) hat, und eine Admin-Verwaltung. Das hilft enorm. Darauf lässt sich dann ein Gamemode wesentlich einfacher aufbauen.


    Wichtig:
    Fange klein an, jeder macht das, nimm nicht gleich einen Gamemode und verunstalte den, denn du wirst nichts kapieren. Ich arbeite nun knapp 7 1/2 Jahre mit PAWN und mein Wissen ist noch lange nicht komplett, im Gegenteil. Auch ich lerne an und an neue Dinge dazu.
    Falls dir jemand sagt, du sollst dir die PAWN Doc durchlesen, lass es, genauso rate ich dir davon ab das Wiki in allen Einzelteilen durchzulesen. Du wirst es nicht verstehen. Das kannst du in 3 Jahren machen, wenn du es verstehst, und selbst dann wirst du den Großteil in der PAWN Documentation nicht auf Anhieb verstehen, je nach dem natürlich auch wie gut dein Englisch ist.


    Noch was:
    Ausprobieren. Du kannst nichts kaputt machen. Das einzige was passieren kann, ist dass du Errors bekommst. Na und? Für was gibt es STRG+Z. Einfach probieren, wenn du nicht weiter kommst, frage nach Hilfe, über die Scritping Base findet sich sicher schnell jemand, der dir dann weiterhelfen kann.
    Learning By Doing nennt sich das, wie du es auch schon angesprochen hast. Nicht aufgeben, einfach machen machen machen. Das muss nicht immer perfekt sein, und muss auch nicht immer Sinn ergeben, Hauptsache du machst etwas. Zum Anfang kannst du dir zum Beispiel vornehmen, einen Filterscript der hier im Forum veröffentlicht wurde (einen einfachen) nachzubauen. Du musst ihn ja nicht auch veröffentlichen, aber nur zur Übung einfach nachmachen. Wenn du hängst, kannst du ja nachsehen, was falsch ist, bzw. wie es dort gemacht wurde.
    Das ist meiner Meinung nach besser als alles andere.


    Wie machst du das?
    Du suchst dir einen Filterscript der irgendwas macht, sei es ein Auto Spawn Menu.
    Schau dir zuerst mal an, was der Filterscript denn macht (z.B. ein Auto-Menu, um Auto's zu spawnen). Dann überlegst du, was du denn alles dafür brauchst, suchst dir die Funktionen zusammen (Google, SAMP Wiki) und legst los so ein Menu zu erstellen. Wenn du irgendwo hängst, kannst du einen Blick in den Code werfen, und ein paar Zeilen, die du denkst zu verstehen abschreiben, dann siehst du ja was passiert.
    Am besten ist es aber, wenn du es ganz ohne in den Code zu schauen hin bekommst, deshalb fange mit leichten Dingen an.


    Alternativ kannst du natürlich auch Tutorials durcharbeiten und dadurch lernen, sofern diese gut erklärt sind. Ich kann dich selbstverständlich an meine Tutorials (siehe Profilbeschreibung) verweisen, die habe ich versucht so ausführlich wie möglich zu erklären, damit man es leicht versteht und auch für andere Dinge nutzen kann, aber es gibt auch sonst noch viele andere Tutorials, mit denen man sehr viel lernt.


    Bis du erst mal richtig rein findest vergehen mit Sicherheit 1-3 Monate! Also nicht verzagen, du wirst am Anfang ziemlich oft stecken bleiben und auf die Nase fallen (ist wie laufen lernen). Ich weiß das von mir. Wenn du einmal drinnen bist, dann geht es jeden Tag besser.


    PS: Ich hab es ganz alleine gelernt. Die einzige Hilfestellung die ich damals hatte war ein /kill Command aus 6 Zeilen Code, den mir jemand gemacht hat.
    Das Wichtigste ist: Immer dranbleiben!


    Viel Erfolg! :good:

    Das `Alter` kannst du so lassen, da du es in den Anführungszeichen hast, wird es korrekt erkannt.
    Der Fehler ist hier:
    `Leben`='%.0f',`Russi`='%0.f'
    zu:
    `Leben`='%0.f',`Russi`='%0.f'

    Ich und ( ich finde zur Zeit viele andere?) haben das selbe Problem zur Zeit.

    Das kannst du pauschal so nicht sagen.


    Der Fehler bei dir war ein komplett anderer. Nur zufälligerweise hattest du ein falsches Plugin gehabt.
    Wäre dies (je nach Code) das korrekte Plugin gewesen, könnte der Fehler nur mit Hilfe des Hosters behoben werden, da du als Mieter keine Libraries installieren kannst.



    Server Funktioniert nicht.(Auf Windows läuft der Server ohne Probleme)

    Poste bitte den ganzen Server Log vom Start an (vor Server-Start löschen).

    Der Fehler mit der Library liegt nicht am Code, sondern kommt vom MySQL Plugin.
    Die von dir verwendete Version (welche?) benötigt die fehlende Library. Ohne die startet es nicht und damit auch sein Server nicht.


    Einer der Hoster sollte das sicher gelöst bekommen.

    Habe mal die Inhalte von dem kleineren Array im grossen gesucht, und das einzige wo es immer ein match gibt, ist bei Pickupid 0, die ist in beiden drin, keine Ahnung warum

    Eventuell leere Indizes.
    Um Fehler mit der ID 0 zu vermeiden entweder alle Array-Indizes auf -1 setzen, oder ganz oben in OnGameModeInit ein Pickup im Nirgendwo erstellen, das hat dann die ID 0 und wird nie aufgerufen.



    Alle anderen sind nicht in den jeweils anderem Array enthalten

    Siehe Post #24.196.