Beiträge von Kaliber

    Ja, mehrere Sachen, schreib das so:


    Tore[0][TorID][0] = CreateObject(987, -1522.80005, 482.5, 6.2, 0, 0, 180);//Army Oben
    Tore[1][TorID][1] = CreateObject(980, -1631.7, 688.20001, 8.5, 0, 0, 0); //SFPD


    //Dann das so schreiben:
    if(newkeys & KEY_CROUCH) {
    for(new Gateid = 0; Gateid < sizeof(Tore); Gateid++) {
    if(!IsPlayerInRangeOfPoint(playerid,20.0, Tore[Gateid][CloseX],Tore[Gateid][CloseY],Tore[Gateid][CloseZ])) continue;
    if(SpielerInfo[playerid][pTeam] != Tore[Gateid][Gateteam]) break;
    MoveObject(Tore[Gateid][TorID], Tore[Gateid][OpenX], Tore[Gateid][OpenY], Tore[Gateid][OpenZ], 5);
    SendClientMessage(playerid,tortext, Tore[Gateid][Text]);
    SetTimer("CloseTor", 8000, 0);
    }
    }


    mfg. :thumbup:

    Muss ich da nicht noch was machen?


    Ja, einfach so:


    public OnPlayerEnterDynamicArea(playerid, areaid) {
    if(areaid == ADAC[0])
    {
    SendClientMessage(playerid,-1,"Zone betreten");
    }
    return 1;
    }


    Solange du nur 1ne Zone hast, kannst du es lassen, aber wenn du mehrere Zonen hast wo unterschiedliche Regeln gelten, dann so :)


    mfg. :thumbup:

    Welches Speicherungssystem du verwendest ist eigentlich irrelevant.


    Schau mal, wenn du willst, dass ein PayDay jede Stunde (nicht volle) stattfindet:


    //Unter OnGameModeInit
    SetTimer("PayDay",1000*60*60,1);


    forward PayDay();
    public PayDay() {
    for(new playerid; playerid<MAX_PLAYERS; playerid++) {
    if(!IsPlayerConnected(playerid)) continue;
    GivePlayerMoney(playerid, 1000);
    SpielerInfo[playerid][Respektpunkt] += 1; // (ein Beispiel)
    /* Hier kommt alles zum PayDay rein */
    }
    return 1;
    }


    Und da du auf vorhandene Variablen für den Spieler zugreifst, speichert er diese doch eh schon ;)


    mfg. :thumbup:

    Du musst das erstmal in einer Variable erstellen und dann alles auf einmal anzeigen lassen:



    //Edit:
    PS: Lass die Schleife bei 0 anfangen und erhöhe lieber da wo du es brauchst den Wert um +1 ;)


    mfg. :thumbup:

    Wusste gar nicht, dass es so schwer ist Code zu kopieren :|


    So schreiben:


    ocmd:roller(playerid, params[])
    {
    if(GetPlayerScore(playerid) != 1) return SendClientMessage(playerid,-1,"Sie sind nicht Level 1!");
    if(!roller[playerid])
    {
    new Float:p[4];
    GetPlayerPos(playerid,p[0],p[1],p[2]),GetPlayerFacingAngle(playerid,p[3]);
    roller[playerid] = CreateVehicle(462,p[0],p[1],p[2],p[3],146,146,-1);
    return PutPlayerInVehicle(playerid,roller[playerid],0);
    }
    DestroyVehicle(roller[playerid]),roller[playerid]=0;
    return SendClientMessage(playerid, COLOR_RED, "Du hast dein Roller zerstört");
    }


    mfg. :rolleyes:

    Ich will ein Befehl erstellen. /roller für den Neuling (Level 1)


    Wenn er /roller eingibt soll ein Pinker Faggio mit dem Kennzeichen >Neuling< Spawnen wo er direkt draufsitzt.
    Ebenfalls soll man den Roller mit /roller wieder löschen.


    Naja hier mal paar Ansätze:


    new roller[MAX_PLAYERS];


    //unter OnPlayerDisconnect
    if(roller[playerid]) DestroyVehicle(roller[playerid]),roller[playerid]=0;


    //Beim Roller mieten
    if(GetPlayerScore(playerid) != 1) return SendClientMessage(playerid,-1,"Sie sind nicht Level 1!");
    if(roller[playerid]) return SendClientMessage(playerid,-1,"Sie haben bereits einen Roller erstellt!");
    new Float:p[4];
    GetPlayerPos(playerid,p[0],p[1],p[2]),GetPlayerFacingAngle(playerid,p[3]);
    roller[playerid] = CreateVehicle(462,p[0],p[1],p[2],p[3],146,146,-1);
    PutPlayerInVehicle(playerid,roller[playerid],0);


    //Beim Roller zerstören
    if(!roller[playerid]) return SendClientMessage(playerid,-1,"Sie besitzen keinen Roller!");
    return DestroyVehicle(roller[playerid]),roller[playerid]=0;


    mfg. :thumbup:

    Da mir aufgefallen ist, dass diese Funktion nicht existiert und dies sehr schade ist, habe ich mal eine Include geschrieben, die diese Funktion implementiert.


    Allgemeines:
    Folgende Funktionen werden durch das Include geliefert:


    native Attach3DTextLabelToObject(Text3D:id, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ);
    native Detach3DTextLabel(Text3D:id);

    native AttachPlayer3DTextLabelToObject(playerid, PlayerText3D:id, objectid, Float:OffsetX, Float:OffsetY, Float:OffsetZ);
    native DetachPlayer3DTextLabel(PlayerText3D:id);


    Ich denke mal, die Attach Funktionen erklären sich von selbst :)
    Was zu dem Detach zu sagen ist, falls ihr zuerst das Label an ein Objekt und dann z.B. an ein Auto attacht, müsst ihr es zuerst mit Detach lösen, sonst funktioniert das nicht! :)


    Ich nutze einen Streamer:
    Falls ihr einen Streamer nutzt, müsst ihr die Include unter der streamer Include einfügen (sprich so):


    #include <streamer>
    #include <attach> //<< muss unter der Streamer-Include stehen


    Dann erkennt die Include das und verwendet andere Funktionen :)


    Speed:
    Also, wenn ihr 1000 3DTextLabeles erstellt und diese an 1000 Objekte attacht und sich dann alle in unterschiedliche Richtungen bewegen, selbst dann dauert ein Update aller Labels nur ~9ms!


    Ich nutze ein Filterscript?
    Wenn ihr die Include in einem Filterscript nutzt, müsst ihr das angeben und zwar so:


    #define FILTERSCRIPT
    #include <attach>


    Download:
    Source-Code: Pastebin
    Direkter-Download: MediaFire


    Schlusswort:
    Ich hoffe einige von euch werden es mal brauchen :)


    Falls ihr Fragen zu dem System oder der Anwendung hat, wenn Probleme auftreten oder ihr einen Kommentar abgeben wollt, einfach posten :)


    mfg. :thumbup:


    //Edit: Pastebin