Beiträge von Mann im Mond

    Ein Array löst das Problem
    new
    CreatedCar[MAX_PLAYERS];
    Dann enstprechend in deinem Befehl
    CreatedCar[playerid] = CreateVehicle(...);
    Damit kann man dann auch einfach überprüfen, ob der Spieler ein Auto gepsawnt hat
    if(CreatedCar[playerid] > 0)
    {
    // Er hat bereits eins gespawnt
    }
    Dann entprechend natürlich
    DestroyCar(CreatedCar[playerid]);
    CreatedCar[playerid] = 0; // keines gespawnt
    Und den Timer musst du dann natürlich mit SetTimerEx und nicht mehr mit SetTimer machen, da du ja die playerid mit übertragen musst...
    Eine Schleife benötigst du nicht, außer du willst alle gespawntenCars auf einmal löschen.

    Naja mach am besten einen Array draus, in dem du gleich alle gTeams abspeicherst:
    //Oben
    #define MAX_TEAMS 20
    #define MAX_MEMBERS 20


    new
    gTeamFull[MAX_TEAMS];


    // Bei deiner ClassSelection
    if(gTeamFull[TEAM_WIEAUCHIMMER] > MAX_MEMBERS)
    {
    // Was passiert wenns voll ist?
    }
    gTeamFull[TEAM_WIEAUCHIMMER]++;
    gTeam[playerid] = TEAM_WIEAUCHIMMER;

    Du musst einen Array für alle Spieler erstellen. Irgendwas mit

    // Ganz oben
    new pAdmin[MAX_PLAYERS];


    // OnPlayerConnect
    pAdmin[playerid] = 0;


    // bei deinem /makeadmin Befehl oder wie auch immer
    pAdmin[playerid] = ADMINLVL;

    Dann kannst du bei deinen Adminbefehlen dies überprüfen ob er ein entsprechender Admin ist.
    if(pAdmin[playerid] > MINADMINLEVEL)


    Da dann dein Admin nicht gespeichert wird, musst du natürlich noch die ganzen Daten (dazu gehört auch pAdmin) in einer. ini speichern oder in einer SQL Datenbank, je nachdem was du bevorzugst. Wenn dus selber nicht weisst wies geht, findest du was unter "Login Register System" oder so ähnlich...

    Schreiben musst dus selber, ich kann dir allerdings einige Anregungen geben.
    Tazern:
    Um den Spieler zu freezen, benutze
    TogglePlayerControllable(playerid, 0); zum unfreezen wieder
    TogglePlayerControllable(playerid,1);.
    Damit du die Nachricht "ist bereits getazert" senden kannst, musst du beim freezen/unfreezen eine Variable setzen wie z.B.
    pTazed[playerid] = 1; beim freezen und pTazed[playerid] = 0; beim Unfreezen. Bei deinem /tazer Command kannst du dann die Variable des Spielern, der getazert wird abfragen, sollte die auf 1 stehen, dann sende die Nachricht.
    Damit der Spieler wieder unfreezt wird nach einer gewissen Zeit musst du einen Timer benutzen, welche den Spieler wieder laufen lässt (unfreeze).


    Bombenlegen:
    Ja das ist noch einfacher, einfach bei deinem /plant Befehl einen Timer setzen auf 60 Sekunden welcher dann einfach CreateExplosion auslöst. Um dabei die Position nach 60 Sekunden wieder herauszufinden, kannst du bei /plant einfach CreateObject benutzen (ein Bombenobjekt gibt es sicherlich) und dann in deinem Callback, der nach 60s ausgeführt wird (da wo auch dein CreateExplosion drin ist) einfach GetObjectPos und die CreateExplosion dann da ausführen wo das Objekt lag. Ach ja DestroyObject nicht vergessen am Ende.

    OnGameModeInit()
    {
    // Hier deine Objekte
    CreateObject(980, -2059.239746, -81.311386, 37.093704, 0.0000, 0.0000, 0.0000);
    CreateObject(980, -2047.269897, -81.230782, 36.937454, 0.0000, 0.0000, 0.0000);
    //dein anderer Code
    }

    Wenn euer Script die gleichen Variablen (die in der Datenbank gespeichert werden sollen) wie Moderntopia benutzt, könnt ihr es theoretisch kopieren. Da ich das allerdings beweifle müsst ihr die Variablen natürlich umändern ensprechend zu euren und ggf. auch die Reihenfolge, je nachdem wie ihr es anstellt. Das sowohl im Script beim Laden der Variablen (ich schätze mal bei /login) und natürlich beim Abspreichern der Variablen und nicht zu vergessen in der Tabelle eurer Datenbank.

    Ehm ja was willst du damit erreichen? Mit deinem Code sendest du eine Nachricht an alle... Schaus nochmal durch, da du zuerst GetPlayerPos(i,...) verwendest und dann kontrollierst ob der Spieler an SEINER Position steht. Wo sollte er sonst stehen?

    public Defuse() // Das wird aufgerufen vom Timer
    {
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(gTeam[i] == TEAM_GROVE)
    {
    SendClientMessage(i,FARBE,"Text");
    }
    }
    }
    }


    Da du den Text nur an die Mitglieder von Grove sendest benötigst du keine playerid. Wenn du die Defuse(playerid) aufrufen willst, dann musst du auch mit
    SetTimerEx arbeiten und nicht mit SetTimer

    Wenn dus so machen willst wie Black Fox es vorgeschlagen hat mit PlayerToPoint benötigst du eine Schleife:
    new
    Float:pX,
    Float:pY,
    Float:pZ;
    GetPlayerPos(playerid, pX, pY, pZ);
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerToPoint(10.0,i,pX,pY,pZ)) // Hier natürlich dein Radius
    {
    SendClientMessage(i,FARBE,"Text");
    }
    }
    }

    Das kannst du z.B. mit dem MTA Map Editor machen, welcher im MTA Download Packet mitgeliefert wird. Einfach dann bei der Installation von MTA den Map Editor ankreuzen. Danach MTA starten und du kannst im Menü den Map Editor starten

    Dann benutze printf bzw. Print in deinem Befehlen (wie. z.B. /givemoney).


    Bsp:
    new
    sendername[MAX_PLAYER_NAME];
    GetPlayerName(playerid, sendername, sizeof(sendername));
    printf("Admin %s benutzt den Befehl /givemoney", sendername);
    Natürlich kannst du noch weitere Parameter außer dem Namen anhängen, wie z.B. das Geld bzw den Empfänger usw.