Command erstellen, wenn ein Spieler in einer NRG-500 ist soll er unbesiegbar sein...

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hi,
    ich möchte gerne einen Command erstellen weiß aber nicht wie das geht, ich möchte das wenn ein Spieler in einer NRG-500 ist (Carid 522) das er unbesiegbar ist. Und ich will gerne wenn jemand den Command macht:



    if (strcmp(cmdtext, "/skyroad", true)==0)
    {
    SetPlayerPos(playerid,1497.257324, -5223.700195, 1842.204224);
    return 1;
    }


    Das man da noch einbaut das man für 3 Minuten unbesigebar ist.
    Wie mache ic hdas am besten?
    Kann mit bitte jemand helfen?


    MfG ~LuKa~ :thumbup:

    Einmal editiert, zuletzt von Markus ()

  • Es gibt im Prinzip 2 verschiedene Möglichkeiten dies umzusetzen. Beide haben ihre Vor- und Nachteile.


    Möglichkeit 1 (leichter, effektiver ABER nur "begrenzt" unbesiegbar):


    SetPlayerHealth(playerid,9999999); /* Eine möglichst hohe Zahl benutzen als Energie, wenn man den mit einer Mingun abschiesst für eine längere Zeit, dann wäre er früher oder später tot */


    Möglichkeit 2 (im Prinzip richtig unbesiegbar ABER schwerer, weniger effektiv)


    Man benutzt einen Timer, der z.B. jede Sekunde einen public aufruft. Dieser public setzt dann die Energie dauerhaft hoch.


    Ganz oben
    new godmode[MAX_PLAYERS];
    forward Godmode() /* nicht zwingend, siehe unten */


    in OnPlayerConnect
    godmode[playerid] = 0;


    in OnGameModeInit


    SetTimer("Godmode",1000,1); /* Anstatt eines eigenen Timers, der jede Sekunde aufgrufen wird, rate ich dir den Code des publics "Godmode" in einer anderen public einzubauen, welcher bereits jede Sekunde aufgerufen wird (und möglicherweise bereits eine Schleife ausführt ) */


    Der public


    public Godmode()
    {
    for(new i = 0; i < GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    { /* Ab hier kann man es in eine bestende Schleife eingebaut werden, die jede Sekunde aufgrufen wird */
    if(godmode[i] == 1)
    {
    SetPlayerHealth(i,999);
    }
    }/* Bis hier */
    }
    }


    So nun ist jeder Spieler unbesiegbar, bei dem die Variable godmode auf 1 ist, z.B.


    in OnPlayerStateChange
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new
    carid = GetPlayerVehicleID(playerid);

    if(GetVehicleModel(carid) == 522) /* NRG */
    {
    godmode[playerid] = 1; /* Macht den Spieler unbesiegbar */
    }
    }



    Ich empfele dir aber die erstere Variante, bei der 2. lohnt es sich nicht, extra einen eigenen Timer laufen zu lassen nur wegen Godmode. Wenn du allerdings bereits einen Timer benutzt, der jede Sekunde aufgerufen wird und in dem public (welcher vom Timer aufgerufen wird) bereits einen Schleife drin ist, kann du innerhalb dieser Schleife ( for(new ...) ) einfach folgendes hinzufügen:
    if(godmode[i] == 1)
    {
    SetPlayerHealth(i,999);
    }

  • SetTimerEx wäre auch sinnvoll.
    Oben:

    new GMStatus[MAX_PLAYERS];
    new GMTimer[MAX_PLAYERS];
    forward Unbesiegbar(playerid);


    OnPlayerStateChange:
    public OnPlayerStateChange(playerid,newstate,oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    if(GetPlayerVehicleID(playerid) == 522)
    {
    GMTimer[playerid] = SetTimerEx("Unbesiegbar",1000,1,"i",playerid);
    GMStatus[playerid] = 1;
    }
    }
    if(newstate == PLAYER_STATE_ONFOOT)
    {
    if(GMStatus == 1)
    {
    KillTimer(GMTimer[playerid]);
    GMStatus = 0;
    }
    }
    }


    Ausserhalb jeden Callbacks:
    public Unbesiegbar(playerid)
    {
    SetPlayerHealth(playerid,999);
    }


    Ungetestet, dürfte aber funktionieren ;)