Beiträge von Pluto

    Hallo liebe Brotfische. Ich habe folgendes problem.
    Ich habe ein Rennsystem erstellt, bei dem die Gang ingame Checkpoints saven kann und dann ein Rennen veranstalten kann.
    Gespeichert werden die Checkpoints richtig. also x,y und z stehen korrekt in den scriptfiles, wo ich sie haben will.
    Doch wenn ich dann ingame ein rennen starten möchte, werden die checkpoints auf die 0-Koordiante gesetzt. kann mir jemand helfen?


    //Speichern:
    dini_Create(ZoneDatei);
    dini_FloatSet(ZoneDatei,"cpx",cpx);
    dini_FloatSet(ZoneDatei,"cpy",cpy);
    dini_FloatSet(ZoneDatei,"cpz",cpz);
    format(string,sizeof(string),"Checkpoint %d für das Rennen mit der ID:%d wurde gespeichert.",checkid,Renn);
    SendClientMessage(playerid,COLOR_LIGHTBLUE,string);

    //laden


    cpx = dini_Float(ZoneDatei,"cpx");
    cpy = dini_Float(ZoneDatei,"cpy");
    cpz = dini_Float(ZoneDatei,"cpz");
    Rennen[i] = Rennid2;
    CP[i] = 1;
    SetPlayerCheckpoint(i,cpx,cpy,cpz,10);
    SendClientMessage(playerid,COLOR_WHITE,"Rennen gestartet.");


    lg Pluto

    ----------
    Loaded log file: "server_log.txt".
    ----------


    SA-MP Dedicated Server
    ----------------------
    v0.3c, (C)2005-2010 SA-MP Team


    [05:01:54]
    [05:01:54] Server Plugins
    [05:01:54] --------------
    [05:01:54] Loading plugin: streamer.so
    [05:01:54]
    *** Streamer Plugin v2.3.7 by Incognito loaded ***


    [05:01:54] Loaded.
    [05:01:54] Loaded 1 plugins.


    [05:01:54]
    [05:01:54] Filter Scripts
    [05:01:54] ---------------
    [05:01:54] Loaded 0 filter scripts.


    [05:01:54]
    ----------------------------------
    [05:01:54] Selfmade by RedFly, KEMPL
    [05:01:54] ----------------------------------


    [05:01:54] Number of vehicle models: 39

    Dazu musst du dir zuerst einmal ein "Mod" runterladen. am besten googelst du dafür mal nach "GTA San Andreas Car Mods".
    Wenn du einen passenden gefunden hast, lädst du ihn dir runter.
    Um das auto dann zu modden, lädst du dir ein "Mod-Programm" herunter. Ich empfehle dir >>Spark<<.


    Wenn du das hast, entpackst du den Mod(meist winrar). In diesem pack sind meistens nur 2 datein drin. eine .dff und einen .txd datei.
    Nun öffnest du das programm "spark" und öffnest damit deine GTA3.img (In deinem GTA-SA ordner/models). In der GTA3.img suchst du dir dann mittels der Suchfunktion das Auto aus, was du modden willst.


    Wenn du das auto gefunden hast, passt du deine heruntergeladenen Mod-dateinamen dem Autonamen an.


    hast du dies getan, dann ziehst du einfach die Mod-datein in Spark rein und drückst auf speichern.


    Dann hast du es fertig gemoddet.


    Ich empfehle dir aber zuvor eine kopie der gta3.img zu machen, da einige mods beschädigt sind und so dein Spiel immer abstürzen lassen.


    lg Pluto

    man kann selbst dann noch gern eine variable hinzufügen die beim einknasten auf 1 gesetzt wird und dann die variable abspeichern und bei onplayerconnect wieder abfragen.
    Dann befindet sich der Spieler nach einer Offlineflucht immernoch im Knast.

    Guten Tag liebe Brotfische.
    Ich möchte euch hier einmal zeigen, wie man ein Gangjail erstellt.


    Zur erklärung: Gangjail ist ein "Gefängnis", wo Gangs/Mafien User einsperren können.


    Also..Nun zum Tutorial ;)


    Fangen wir zuerst mit den Defines, Forwards und News an, die wir für das Gangjail brauchen.


    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1


    diese Zeile Brauchen wir, um die dcmd-funktion zu aktivieren.Dann brauchen wir folgende News:


    new timer1;


    Diesen Timer benötigen wir dann noch , um festzulegen wie lang der Spieler(der Befreier) dann am Gangjail stehen muss, um einen Spieler aus dem Jail zu befreien. zu guter letzt noch die forwards:


    zusätlich benötigt ihr in euren Spielerdatein noch die Variable "pGangJail". Die Brauchen wir, um den Spieler einzusperren bzw freizulassen.
    forward GANGJAIL(playerid);
    forward ProxDetectorS(Float:radi, playerid, targetid);


    Den ersten benötigen wir, um festzulegen, was passieren soll wenn der Spieler befreit wird.
    Den zweiten benötigen wir, um die Entfernung von 2 Spielern zu ermitteln. Dann legen wir mal los. Am anfang machen wir die "forwards zu publics".


    Fangen wir an mit dem ProxDetectorS. Bei dieser Funktion ermitteln wir durch abfragen der Position des 1.Spielers und der Position des 2.Spielers die Entfernung zwischen den beiden Spielern. Diese Funktion ist aus dem samp-wiki forum.


    public ProxDetectorS(Float:radi, playerid, targetid)
    {
    if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
    {
    new Float:posx, Float:posy, Float:posz;
    new Float:oldposx, Float:oldposy, Float:oldposz;
    new Float:tempposx, Float:tempposy, Float:tempposz;
    GetPlayerPos(playerid, oldposx, oldposy, oldposz);
    GetPlayerPos(targetid, posx, posy, posz);
    tempposx = (oldposx -posx);
    tempposy = (oldposy -posy);
    tempposz = (oldposz -posz);
    if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
    {
    return true;
    }
    }
    return false;
    } Als nächstes kümmern wir uns um den forward: Gangjail(playerid).
    //als erstes fangen wir damit an, das wir es auf alle Spieler beziehen.
    for(new i = 1; i < MAX_PLAYERS; i++)
    //nun fragen wir ab, in welchen Bereich sich der eine Spieler befinden muss, um den Spieler zu befreien.
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266))
    {
    if(SpielerInfo[i][pGangjail] == 1) // Nun Fragen wir ab, ob der gewählte Spieler überhaupt im Jail drin ist.
    {
    SetPlayerPos(i,-372.5778,-1428.0342,25.7266); // nachdem der Timer abgelaufen ist, wird die Position des gewünschten spieler auf die eingestellte Position geändert.
    SpielerInfo[i][pGangjail] = 0; // Der Spieler wird aus dem Jail entlassen
    KillTimer(timer1); // der Timer zum befreien wird beendet, da der Spieler ja befreit wurde.
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist nicht am Gangjail stehen geblieben.");//sollte er nicht in diesem Bereich stehen bleiben, bekommt er eine Fehlermeldung.
    KillTimer(timer1);
    return 1;
    }


    nun kümmern wir uns um die eigentlichen befehle, zum einsperren bzw zum rausholen den Spielers.
    Die dcmd Befehle könnt ihr unterm Script einfügen. Die Befehle werden wir im Format "dcmd" schreiben, da es so einfacher ist einen anderen Spieler abzufragen.


    //Fangen wir mal an
    dcmd_gangjail(playerid,params[])
    {
    new pID; // Das wird die Variable, mit der wir dann den anderen Spieler abfragen.
    if(sscanf(params,"u",pID)) // mit dieser Zeile legen wir fest, was der Spieler zusätzlich zum eigentlichen Befehl überhaupt eingeben muss. In diesem Fall wählen wir das "u", da wir eine SpielerID abfragen wollen.
    {
    return SendClientMessage(playerid,COLOR_WHITE,"Benutzung: /gangjail [playerid]."); //Diese fehlermeldung kommt dann, wenn er vergisst einen Teil des Befehls einzugeben.
    }
    if(SpielerInfo[playerid][Fraktion] > 0) //Hier müsst ihr das "SpielerInfo[playerid][Fraktion]" so verändern, das ihr eure Fraktionsabfrage drin habt.
    {
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266)) // In diesem Bereich muss der Spieler stehen, um einen anderen Spieler einsperren zu können. Ihr könnt die x,y,z Koordinate natürlich verändern.
    {
    if(ProxDetectorS(8.0, playerid, pID)) // Nun kommt unser Proxdetector zum Einsatz. Hier legen wir die Entfernung zwischen den beiden Spielern fest, in welcher der Befehl Funktioniert.
    {
    SetPlayerPos(pID,-368.0691,-1425.5498,25.7266); //Dort wird dann der gewählte Spieler hingesetzt.
    SpielerInfo[pID][pGangjail] = 1; // Der Spieler wird eingejailt.
    return 1;
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Der Spieler ist nicht in deiner Nähe.");
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist nicht am Gangjail.");
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist in keiner Fraktion.");
    }
    }


    dcmd_ungangjail(playerid,params[])
    {
    new pID; // Das wird die Variable, mit der wir dann den anderen Spieler abfragen.
    if (sscanf(params, "u", pID)) // mit dieser Zeile legen wir fest, was der Spieler zusätzlich zum eigentlichen Befehl überhaupt eingeben muss. In diesem Fall wählen wir das "u", da wir eine SpielerID abfragen wollen.
    {
    return SendClientMessage(playerid,COLOR_WHITE,"Benutzung: /ungangjail [playerid]."); //Diese fehlermeldung kommt dann, wenn er vergisst einen Teil des Befehls einzugeben.
    }
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266)) // In diesem Bereich muss der Spieler stehen, um einen anderen Spieler aus dem Gangjail befreien zu können. Ihr könnt die x,y,z Koordinate natürlich verändern.
    {
    timer1 = SetTimerEx("GANGJAIL",20000,0,"playerid",playerid); //Zeit für die Befreiung der Spieler
    return 1;
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Der Spieler ist nicht in deiner Nähe oder du bist nicht an den Zellen."); //Diese Fehlermeldung erscheint wenn der Spieler nicht in der nähe von IsPlayerInRangeOfPoint steht. (x,y,z Koordinate)
    }
    return 1;
    }
    return 1;
    }


    nun zu guter letzt, damit der Befehl auch funktioniert müssen wir den Befehl noch unter "public OnPlayerCommandText(playerid, cmdtext[])" eintragen.
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(gangjail,8,cmdtext); //einmal dcmd, da wir den Befehl im Format geschrieben haben. Dann der Befehl an sich. Mit der Zahl legen wir die länge des Befehl fest(Anzahl der zeichen).
    dcmd(ungangjail,10,cmdtext);
    return 0;
    }



    So vielen dank fürs durch lesen. Falls ihr diesen Befehl schonmal unerklärt von einer Person namens "Kempl" gesehen habt, dann nicht ans klauen denken, sondern ich habe einen Benutzernamenschange gemacht und hieß vorher Kempl und jetz Pluto^^


    //edit Schreibfehler und pwn Texte verbessert
    //edit Einzelne Beschreibungen verändert

    das Problem hatte ich auch,
    ich bin dann zum Icognitos streamer plugin
    gewechselt und dann funktioniert alles.
    Mit dem Streamer muss man dann nur statt CreateObject,
    CreateDynamicObject verwenden, aber damit funktionierts bei mir einwandfrei.

    1. Wie frag ich ab ob sich ein spieler in einer bestimmten zone befindet ?
    1.1 Wenn der spieler es nicht tut wie setzt ich ihn dann wieder in die Zone ?
    2. Wie können Autos NUR dann respawnen wenn sie kaputt sind ?

    So ich schätze mal du willst so eine Art Friedhof sag ich mal machen.
    Wo man sich dann nur in einem bestimmten Gebiet aufhalten kann und sobald man es verlässt, wird man zurückgeschubst?
    Wenn ja kannst du das wie folgt machen:


    SetPlayerWorldBounds(playerid,953.4990,807.4830,-1071.6556,-1129.9661);


    http://wiki.sa-mp.de/SetPlayerWorldBounds


    so und wegen deiner 2ten Frage, benutze statt CreateVehicle einfach AddStaticVehicleEx und dann machst du hinter den farben ein Komma und setzt eine -1 hinten dran,
    das bedeutet das die Respawnzeit abgeschaltet ist und das Auto nur respawnt wenn es kaputt ist.


    Kleines Beispiel:


    AddStaticVehicleEx(428,1558.5529,-1012.5476,24.0297,180.9372,11,11,-1);

    http://wiki.sa-mp.com/wiki/AddStaticVehicleEx</a>


    Gruß
    Kempl

    irgedendwo hast du ja die spielerdaten..


    da steht ja drin welches Level usw er hat.


    müsste ca so aussehen:


    enum spieler_daten
    {
    level,
    pgangjail
    };

    Hier bitte ;)


    Wenn du noch eine Map datei mit einem Gangjail brauchst sag bescheid ;)


    ///Defines///


    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1


    //////////////


    //=============================
    //=============================
    unter die Spielerdatein musst du noch eintragen:


    pGangjail


    //=============================
    //=============================



    /////NEWS/////
    new timer1;
    /////////////


    ////FORWARDs////
    forward GANGJAIL(playerid);
    forward ProxDetectorS(Float:radi, playerid, targetid);
    ///////////////


    ganz unten ,unters script machst du die dcmds


    dcmd_gangjail(playerid,params[])
    {
    new pID;
    if (sscanf(params, "u", pID))
    {
    return SendClientMessage(playerid,COLOR_WHITE,"Benutzung: /gangjail [playerid].");
    }
    if(SpielerInfo[playerid][Fraktion] == 2) // Deine Abfrage für die Fraktion
    {
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266)) // position vom Gangjail
    {
    if(ProxDetectorS(8.0, playerid, pID)) // entfernung zwiscehn beiden Spielern
    {
    SetPlayerPos(pID,-368.0691,-1425.5498,25.7266);
    SpielerInfo[pID][pGangjail] = 1;
    SpielerSpeichern(pID);
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Der Spieler ist nicht in deiner Nähe oder du bist nicht an den Zellen.");
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist nicht in einer Gang!");
    }
    return 1;
    }
    dcmd_ungangjail(playerid,params[])
    {
    new pID;
    if (sscanf(params, "u", pID))
    {
    return SendClientMessage(playerid,COLOR_WHITE,"Benutzung: /ungangjail [playerid].");
    }
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266))
    {
    timer1 = SetTimerEx("GANGJAIL",20000,0,"playerid",playerid); //Zeit für die Befreiung der Spieler
    return 1;
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Der Spieler ist nicht in deiner Nähe oder du bist nicht an den Zellen.");
    }
    return 1;
    }



    public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(gangjail,8,cmdtext);
    dcmd(ungangjail,10,cmdtext);
    return 0;
    }


    public GANGJAIL(playerid)
    {
    for(new i = 1; i < MAX_PLAYERS; i++)
    if(IsPlayerInRangeOfPoint(playerid,1.5,-372.5778,-1428.0342,25.7266))
    {
    if(SpielerInfo[i][pGangjail] == 1)
    {
    SetPlayerPos(i,-372.5778,-1428.0342,25.7266);
    SpielerInfo[i][pGangjail] = 0;
    KillTimer(timer1);
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_WHITE,"Du bist nicht am Gangjail stehen geblieben.");
    return 1;
    }
    return 1;
    }
    public ProxDetectorS(Float:radi, playerid, targetid)
    {
    if(IsPlayerConnected(playerid)&&IsPlayerConnected(targetid))
    {
    new Float:posx, Float:posy, Float:posz;
    new Float:oldposx, Float:oldposy, Float:oldposz;
    new Float:tempposx, Float:tempposy, Float:tempposz;
    GetPlayerPos(playerid, oldposx, oldposy, oldposz);
    GetPlayerPos(targetid, posx, posy, posz);
    tempposx = (oldposx -posx);
    tempposy = (oldposy -posy);
    tempposz = (oldposz -posz);
    if (((tempposx < radi) && (tempposx > -radi)) && ((tempposy < radi) && (tempposy > -radi)) && ((tempposz < radi) && (tempposz > -radi)))
    {
    return true;
    }
    }
    return false;
    }


    lg Kempl

    Hmm ich verstehs eh nich so ganz, man ratet jedem Scripter der neu anfangen will, ein eigenes Selfmade zu machen.
    Weil man immer weiß wie, wo, was man gemacht hat, man hat einfach einen besseren Überblick. Wenn ein Bug entstehen sollte weiß man meist direkt woran es liegen wird etc.
    Bei einem GF einmal ein bugfix gemacht schiebt sich irgendwo an einer anderen Stelle ein Bug rein.


    Aber mal im ernst ich verstehs nich, wenn man so vielen Scriptern den Tipp gibt mit einem Selfmade anzufangen, gibt es doch noch so viele Godfather-Edits.
    Hier habe ich mal ein kleines Beweiß-Foto:



    Das sollte einem zu bedenken geben.
    Naja weiß ja nich wie eure Meinung zu sowas ist.


    Gruß
    Kempl

    Kleiner Tipp, ich denke du hast es schon oft genug gehlrt und stresst denk ich auch mittlerweile, aber ein Selfmade zu scripten ist viel einfacher, weil man weiß wie man etwas definiert hat etc. Und Godfather-Edits oder fertige Scripts zum donwload kommen auch nich wirklich gut an, nur als Tipp am Rande.
    Wegen Ravens Roleplay auf deutsch, weiß ich auch nur das es irgendwann mal ein Threat gab wo einer das vorgestellt hat, aber wann und wo du den findest kann ich dir leider nicht sagen :O

    #include <a_samp>
    #include <dini>
    #include <ocmd>
    #include <streamer>
    #include <a_objects>
    #include <bfx_imStream>
    #include <dudb>


    Diese Includes verwende ich im Selfmade.
    Das Streamer plugin ist eingetragen und wird ja auch geladen wie man aus dem Log entnehmen kann.


    Der root läuft über linux...