Bestimmte Spieler moven/joinen [Dringend]

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
  • habe es so: @Simon2202


  • NPCs laufen/fahren einen aufgezeichneten Record ab, deren Position kann eigentlich nicht mit SetPlayerPos verändert werden.
    Wenn du aber ganz auf Nummer Sicher gehen willst, dann mache es so:
    forward PaintBallTimer();
    public PaintBallTimer()
    {
    gamestartet = 1;
    for(new i=0;i<MAX_PLAYERS;i++)
    {
    if(!IsPlayerConnected(i) || IsPlayerNPC(i)) continue;
    if(playerready[i] == 0) continue;
    playerready[i] = 0;
    SetPlayerPos(i, 3780,-2663,8);
    }
    return 1;
    }


    Prinzipiell ist der Code aber sonst soweit richtig.
    Wenn es bei dir trotzdem nicht geht, poste bitte deine Version von Befehl und Timer nochmal komplett hier, und beschreibe ganz genau was du und der andere Spieler Schritt für Schritt machen.

  • @Simon2202 @Jeffry


    mir ist aufgefallen dass:


    Wenn Spieler 1 in der pb ist und bereit macht und dann Spieler 2 aber NICHT in der Pb ist und auch bereit macht dass dann steht NACHDEM Spieler 1 bereit gemacht hat das bei Spieler 2 auch steht er wäre bereits bereit anstatt du bist nicht in der nähe.....


    • if(strcmp(cmd, "/bereit",true) == 0)
    • {
    • //Abfragen
    • /// if(playerready[playerid] == 1) return SendClientMessage(playerid,COLOR_YELLOW,"Du bist bereits bereit!");
    • // if(paintball[playerid] == 0) /*wenn er nicht in der arena ist ist (0) dann*/ return SendClientMessage(playerid,COLOR_YELLOW,"Du bist nicht in der Paintball Arena!");
    • // if(gamestartet == 1)/*wenn das spiel bereits läuft dann*/ return SendClientMessage(playerid,COLOR_RED,"Das Spiel hat schon begonnen!");
    • if(PlayerInfo[playerid][pReady] == 1)
    • {
    • SendClientMessage(playerid, 0xCDFF00FF, "Du bist bereits bereit!");
    • return 1;
    • }
    • if(paintball[playerid] == 0)
    • {
    • SendClientMessage(playerid, 0xCDFF00FF, "Du bist nicht in der Paintballarena");
    • return 1;
    • }
    • if(gamestartet == 1)
    • {
    • SendClientMessage(playerid, 0xCDFF00FF, "Das spiel hat bereits begonnen!");
    • return 1;
    • }



    • PlayerInfo[playerid][pReady] = 1; //Spieler macht sich bereit
    • paintballplayers += 2; //Die Spieler in der PB Arena werden um 1 erhöht
    • SendClientMessage(playerid,COLOR_YELLOW,"Du bist nun bereit! Solltest du die Arena verlassen musst du dich erneut bereitmachen!");
    • if(paintballplayers == 2)//Wenn es 2 Spieler sind, wird ein Timer von 10 Sekunden (10.000 Millisekunden) gestartet
    • {
    • SetTimer("PaintBallTimer",45000,0);
    • for(new i=0;i<MAX_PLAYERS;i++)
    • {
    • if(!IsPlayerConnected(i))continue;
    • if(PlayerInfo[i][pReady] = 1)continue;
    • SendClientMessage(i,COLOR_RED,"Das spiel startet in 45Sekunden! Macht euch bereit!!!");
    • }
    • return 1;
    • }
    • return 1;
    • }



    Habe das mal so probiert


    @Jeffry

  • Schreib das ganze so, ist bisschen übersichtlicher und so sollte es gehen:


    Einmal editiert, zuletzt von Simon2202 ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Das Problem liegt hier:
    if(PlayerInfo[i][pReady] = 1)continue;


    Das müsste dir auch eine Warnung 211 geben (possibly unintended assignment) [=Möglicherweise ungewollte Zuweisung].


    Ändere das zu:


    if(PlayerInfo[i][pReady] == 1) continue;


    Das war somit auch das Problem, dass alle Spieler immer bereit waren.

  • Bei OnPlayerDeath:



    if(killerid != INVALID_PLAYER_ID) //If-Abfrage halt noch erweitern prüfen ob er in der Arena ist
    {
    new name[MAX_PLAYER_NAME],string[128];
    GetPlayerName(playerid,name,MAX_PLAYER_NAME);
    GetPlayerName(killerid,string,MAX_PLAYER_NAME);
    format(string,128,"* Spieler %s hat %s getötet!",string,name);
    SendClientMessageToAll(-1,string); //ggf Anpassen, an wen es gesendet werden soll
    }

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • @Jeffry @Kaliber habe es mal so gemacht aber so geht es nicht...:



    if(impb[killerid] == 1)//ob killerid ingame ist also im match
    {


    if(pbrang[killerid] == 1)//ob der waffenrang 1 2 3 4 oder sonstwas hat aber hier nur 1er...
    {
    ResetPlayerWeapons(killerid);
    pbrang[killerid] = 2;
    GivePlayerWeapon(killerid, 25, 500);
    GameTextForPlayer(killerid, "~r~>>>Waffenbeförderung<<<", 1000,4);
    }



    return 1;
    }


    es kommt werder der gametext noch sonst etwas bei dem killer


  • Function OnPlayerDeath(playerid, killerid, reason)
    {
    M_OnPlayerDeath(playerid,killerid,reason);


    if(impb[playerid] == 1)
    {
    SetTimerEx("pbweiter", 4000, false, "i", playerid);
    if(pbrang[playerid] == 1)
    {
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid, 24, 500);
    SetPlayerHealth(playerid,100);
    SetPlayerArmour(playerid,100);
    }
    if(pbrang[playerid] == 2)
    {
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid, 25, 500);
    SetPlayerHealth(playerid,100);
    SetPlayerArmour(playerid,100);
    }
    return 1;
    }






    if(impb[killerid] == 1)
    {


    if(pbrang[killerid] == 1)
    {
    ResetPlayerWeapons(killerid);
    pbrang[killerid] = 2;
    GivePlayerWeapon(killerid, 25, 500);
    GameTextForPlayer(killerid, "~r~>>>Waffenbeförderung<<<", 1000,4);
    }



    return 1;
    }


  • Versuche es so:
    Function OnPlayerDeath(playerid, killerid, reason)
    {
    M_OnPlayerDeath(playerid,killerid,reason);
    if(impb[playerid] == 1)
    {
    SetTimerEx("pbweiter", 4000, false, "i", playerid);
    if(pbrang[playerid] == 1)
    {
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid, 24, 500);
    SetPlayerHealth(playerid,100);
    SetPlayerArmour(playerid,100);
    }
    else if(pbrang[playerid] == 2)
    {
    ResetPlayerWeapons(playerid);
    GivePlayerWeapon(playerid, 25, 500);
    SetPlayerHealth(playerid,100);
    SetPlayerArmour(playerid,100);
    }
    }
    if(killerid != INVALID_PLAYER_ID)
    {
    if(impb[killerid] == 1)
    {
    if(pbrang[killerid] == 1)
    {
    ResetPlayerWeapons(killerid);
    pbrang[killerid] = 2;
    GivePlayerWeapon(killerid, 25, 500);
    GameTextForPlayer(killerid, "~r~>>>Waffenbeförderung<<<", 1000,4);
    }
    }
    }
    return 1;
    }

  • 26errors aber habe vor dem return 1; noch ne klammer weg gemacht dann kamen keine errors.
    @Jeffry


    gibt es noch ne bessere version den getöteten spieler wieder in die arena zu moven als ich es jz gemacht habe mit diesem timer? also bei dem timer ist einfach nur setplayerpos....
    aber davor kommt ja noch dieses typische nach unten schwenken mit diesem drehen also dieser "Standerd tot" danach wird man am normalen spawn gemacht und wegen dem timer in die arene gemovt

  • 26errors aber habe vor dem return 1; noch ne klammer weg gemacht dann kamen keine errors.

    Dann hast du vergessen eine Klammer am Ende zu ersetzen, so wie beim Post, da hat nämlich auch eine gefehlt.



    gibt es noch ne bessere version den getöteten spieler wieder in die arena zu moven

    Ja, bei OnPlayerSpawn abfragen, ob der Spieler in der Arena ist, wenn ja, SetPlayerPos.
    Dann ist er direkt wieder drin, wenn die Tot-Kamera vorbei ist.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen