Hilfe beim Wanted System

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
  • heyho


    ne kleine frage
    undzwar wie kann ich machen das cops keine wanteds kriegen wenn sie jemanden killen ich habe 2 cop fraktionen und achja wie kann ich machen das man mehr als 6 wanteds sieht? weil man kann ja nur die standart 6 wanteds sehen wie im singleplayer aber ich habe mal auf einem server gesehen das da ein wanted stern war und daneben die zahl also die anzahl der wanteds


    hier meine codes

    Code
    public OnPlayerDeath(playerid, killerid, reason)
    
    
    {
    	SetPlayerWantedLevel(killerid, GetPlayerWantedLevel(killerid)+1);
    	SendClientMessage(killerid, 0xFFFF00FF, "Du hast jemanden erfolgreich umgebracht");
    	GivePlayerMoney(killerid, 2000);
    return 1;
    }


    @Jeffry

  • public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    if(gTeam[killerid] != Team_LSPD && gTeam[killerid] != Team_LVPD)
    {
    SetPlayerWantedLevel(killerid, GetPlayerWantedLevel(killerid)+1);
    SendClientMessage(killerid, 0xFFFF00FF, "Du hast jemanden erfolgreich umgebracht");
    GivePlayerMoney(killerid, 2000);
    }
    }
    return 1;
    }


    Zwecks der Zahl:
    Da musst du ein Textdraw an die entsprechende Stelle setzen, das die Zahl des Wanted Levels beinhaltet (mit TextDrawSetString updaten).

  • Teile es in kleine Teile, dann geht das leichter. Was musst du tun:


    1. Bei "OnPlayerDeath" abfragen ob er Wanteds hatte. Wenn ja -> Gefängnis


    2. Das mit der Zeit kannst du über 2 arten machen:


    2.1: Du nimmst dir nen Timer der Global jede Sekunde aufgerufen wird (falls du noch keinen im Script erstellt hast). Setzt wenn er stirbt seine Wanted Anzahl auf die Wanteds * 10 und lässt jedes mal wenn der Timer aufgerufen wird die Anzahl bis 0 runter zählen, wenn es 0 ist -> SpawnPlayer()


    2.2: Du erstellst eine globale Variable (z.B: pJailTime[MAX_PLAYERS]) und wenn er stirbt/in den Knast kommt: pJailTime[playerid] = gettime()+(wantedanzahl)*10
    Dann fragst du wieder in einem Sekunden Timer ab ob "gettime()" gleich pJailTime[playerid] ist.



    Vielleicht gibt es noch eine dritte, die weiß sicher Jeffry.

  • oki ?( ich habe nur das mit wanteds


    @Simon2202

  • Ouuh oke^^...


    Du erstellst eine Globale Variable (irgendwo ganz oben im Script)

    Code
    new pJailTime[MAX_PLAYERS];



    Dann fragst du unter OnPlayerDeath ab ob er Wanteds hat und teleportierst ihn in dein Gefängnis:


    Code
    if(GetPlayerWantedLevel(playerid) > 0)
    					    {
    					        pJailTime[playerid] = GetPlayerWantedLevel(playerid) * 10;
    					        SetPlayerWantedLevel(playerid,0);
    					        //Spieler ins Gefängnis teleportieren
    					    }


    Dann erstellst du (WENN du noch keinen hast) unter OnGameModeInit einen Timer der jede Sekunde aufgerufen wird:


    Code
    SetTimer("sekundentimer",1000,1);

    Und unten ins Script kommt dann das rein:



    Sollte passen, bei Fragen oder wenn was nicht funktioniert einfach sagen.

  • ok ich hab alles so gemacht wie du meintest und ich hab da wo steht //spieler ins gefängnis teleportieren hab ich SetPlayerPos(playerid, und dann die koordinaten aber ich spawne einfach neu und hab die wtds noch
    kann es sein das es daran liegt das ich mich mit einem befehl /killme selber gekillt habe?


    der kill befehl


    Code
    if(strcmp("/killme", cmdtext, true) == 0)
     {
    	SetPlayerHealth(playerid, 0);
    	return 1;
    	}

    @Simon2202

  • Du hattest bei OnPlayerDeath ein return 1 wo es nicht hingehört, da hättest du eigentliche eine Warnung haben müssen (Unreachable Code).
    Mache es so:


    public OnPlayerDeath(playerid, killerid, reason)
    {
    if(killerid != INVALID_PLAYER_ID)
    {
    if(gTeam[killerid] != Team_LSPD && gTeam[killerid] != Team_LVPD)
    {
    SetPlayerWantedLevel(killerid, GetPlayerWantedLevel(killerid)+1);
    SendClientMessage(killerid, 0xFFFF00FF, "Du hast jemanden erfolgreich umgebracht");
    GivePlayerMoney(killerid, 2000);
    }
    }
    if(GetPlayerWantedLevel(playerid) > 0)
    {
    pJailTime[playerid] = GetPlayerWantedLevel(playerid) * 10;
    SetPlayerWantedLevel(playerid,0);
    SetPlayerPos(playerid,1742.9695,535.2896,27.1266);
    }
    return 1;
    }


    Dann erstelle bei OnGameModeInit einen Timer:
    SetTimer("CheckJail", 850, true);


    Und ganz unten im Gamemode:
    forward CheckJail(); //Wird jede Sekunde aufgerufen
    public CheckJail()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    if(pJailTime[i] > 0)
    {
    pJailTime[i]--;
    }
    else if(pJailTime[i] == 0)
    {
    //Spieler aus dem Jail lassen.
    pJailTime[i] = -1;
    //SetPlayerPos(i, x, y, z); //Koordinaten hier einfügen.
    }
    }
    return 1;
    }


    ----


    Das Textdraw kannst du mit einem Textdraw Editor erstellen:
    http://forum.sa-mp.com/showthread.php?t=406833

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Fehler behoben (-1).

  • Du fragst anstelle des Kommentars die Fraktion vom Spieler ab und je nach dem in welcher Fraktion sich der Spieler befindet setzt du ihn an den Spawnpunkt der Fraktion:



    forward CheckJail(); //Wird jede Sekunde aufgerufen
    public CheckJail()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    if(pJailTime[i] > 0)
    {
    pJailTime[i]--;
    }
    else if(pJailTime[i] == 0)
    {
    switch (gTeam[i])
    {
    case Team_Grove:
    {
    SetPlayerPos(i, [X-Koordinate vom Grove Spawn], [Y-Koordinate vom Grove Spawn], [Z-Koordinate vom Grove Spawn]);
    }
    case Team_Ballas:
    {
    SetPlayerPos(i, [X-Koordinate vom Ballas Spawn], [Y-Koordinate vom Ballas Spawn], [Z-Koordinate vom Ballas Spawn]);
    }
    // usw usw usw
    }
    }
    }
    return 1;
    }

  • Alternativ kannst du, wenn du die ganzen SetPlayerPos' schon bei OnPlayerSpawn drin hast, auch einfach bei
    //Spieler aus dem Jail lassen.
    das machen:
    SpawnPlayer(i);


    Das würde dann auf's gleiche raus kommen, hättest den Code halt dann nicht doppelt da stehen.

  • Das liegt daran dass pJailTime[] noch auf 0 gesetzt ist.
    Setz den Wert am besten auf -1 oder ähnliches wenn der Spieler entlassen und gespawnt wird. Also:

    forward CheckJail(); //Wird jede Sekunde aufgerufen
    public CheckJail()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    if(pJailTime[i] > 0)
    {
    pJailTime[i]--;
    }
    else if(pJailTime[i] == 0)
    {
    pJailTime[i] = -1;
    SpawnPlayer(i);
    }
    }
    return 1;
    }