Beiträge von FACE

    Warum fangt ihr nicht erstmal an, alles mit Variablen zwischenzuspeichern und das File-System nachträglich einzufügen. (Das funktioniert dann auch reibungslos ;) )
    Ich persönlich schreibe anfänglich immer sämtliche Arrays, strings, etc.
    Dies sieht der Spieler nicht, aber macht mir die Arbeit deutlich leichter.


    Textdraws, Dialoge etc. folgen erst später bei mir.

    Fang erstmal an, dir ein paar Standart gamemodes anzuschauen. Dann fängst du mit kleinen Schritten an, diese abzuändern. Baust ein paar Fahrzeuge ein, schreibst ein paar Abfragen, etc...


    public praxisa(playerid)
    {
    schulung[playerid]=1;//Direkt auf 1 setzen. Sonst "könnte" es Komplikationen geben!
    SetPlayerPos(playerid,-2029.79,-120.518,35.1692);
    Fahrschulauto = CreateVehicle(405,-2082.92,-124.124,35.3203,175.277, 0, 1,-1);
    SetPlayerCheckpoint(playerid,FahrschulCheckpoints[0][0],FahrschulCheckpoints[0][1],FahrschulCheckpoints[0][2],3.0);//Der erste CP wird gesetzt.
    SendClientMessage(playerid, GELB, "[Fahrschuhle]Fahr Prüfung Gestartet.");
    SendClientMessage(playerid, GELB, "[Fahrschuhle]Auf Zum ersten Checkpoin.");
    }



    if(schulung[playerid]>0)//Wenn sich der Spieler in der Prüfung befindet.
    {
    DisablePlayerCheckpoint(playerid);
    if((schulung[playerid]-1)<sizeof(FahrschulCheckpoints))
    {
    schulung[playerid]++;
    SetPlayerCheckpoint(playerid,FahrschulCheckpoints[schulung[playerid]-1][0],FahrschulCheckpoints[schulung[playerid]-1][1],FahrschulCheckpoints[schulung[playerid]-1][2],3.0);
    SendClientMessage(playerid, GELB, "[Fahrschuhle]Sie haben den Checkpoint Erreicht.");
    SendClientMessage(playerid, GELB, "[Fahrschuhle]Ab zum Nächsten.");
    }
    else //Wenn letzter Checkpoint
    {
    DestroyVehicle(Fahrschulauto);
    SendClientMessage(playerid, ROT, "------------------Erfogreich Bestanden----------------------");
    SendClientMessage(playerid, GELB, "[Fahrschuhle]Sie haben ihr Führerschein erfolgreich Bestanden.");
    //SetPlayerCheckpoint(playerid, -2091.8999023438, -129, 34.400001525879, 2.0);//Keine Ahnung wofür du das brauchst, aber ich lasse es mal drin.
    sInfo[playerid][sSpieler_autoschein] = 1;
    schulung[playerid] = 0;//Prüfung beendet.
    }
    }


    Du hast einen Kopierfehler gehabt.

    Das ist ein ziemlicher Zeilenaufwand.
    Wir hauen zunächst erstmal alle Checkpoints in ein Array und lassen jedesmal einfach die Variable hochzählen.


    Sieht dann wie folgt aus:

    //Definition des Spielerzählers
    schulung[MAX_PLAYERS]; //Hast du zwar bereits drin, möchte ich aber anders verwenden. Musst du folglich NICHT mehr einbauen ;)



    //Definition für das Array:
    new Float:FahrschulCheckpoints[19][3] = {
    {-2083.3999023438, -129.19999694824, 35.0},
    {-2052.8999023438, -140.39999389648, 35.0},
    {-2070.5, -145.7998046875, 35.0},
    {-2068.5, -118.90000152588, 35.0},
    {-2069.599609375, -131.19921875, 35.0},
    {-2024.3000488281, -203.10000610352, 35.0},
    {-2039.2998046875, -128.8994140625, 34.900001525879},
    {-2025.19921875, -180.2998046875, 35.0},
    {-2042.3000488281, -163.5, 35.0},
    {-2042.099609375, -193, 35.0},
    {-2057.3000488281, -156.5, 35.0},
    {-2038.6999511719, -240.5, 35.0},
    {-2083.1999511719, -245.89999389648, 36.099998474121},
    {-2069.3000488281, -236.69999694824, 35.0},
    {-2058.6999511719, -228.80000305176, 35.0},
    {-2088.5, -204.10000610352, 35.0},
    {-2067.5, -213.69999694824, 38.0},
    {-2083, -157.19999694824, 35.0},
    {-2083, -157.19999694824, 35.0}
    //{-2091.8999023438, -129, 34.400001525879}
    };



    Die Fahrschul-Prüfung muss durch irgendetwas ausgelöst werden. Setze dabei bitte die Variable schulung[playerid]=1; , damit die Prüfung beginnen kann. Somit erspart sich eine überflüssige, sonst notwendige, Variable.
    Setze hierbei auch gleich den ersten Checkpoint zu Prüfungsbeginn: SetPlayerCheckpoint(playerid,FahrschulCheckpoints[0][0],FahrschulCheckpoints[0][1],FahrschulCheckpoints[0][2],3.0)


    Nun kommen wir zur Abfrage unter dem Callback "OnPlayerEnterCheckpoint":

    public OnPlayerEnterCheckpoint(playerid)
    {
    if(schulung[playerid]>0)//Wenn sich der Spieler in der Prüfung befindet.
    {
    DisablePlayerCheckpoint(playerid);
    if(schulung[playerid]<sizeof(FahrschulCheckpoints))
    {
    schulung[playerid]++;
    SetPlayerCheckpoint(playerid,FahrschulCheckpoints[schulung[playerid]-1][0],FahrschulCheckpoints[schulung[playerid]-1][1],FahrschulCheckpoints[schulung[playerid]-1][2],3.0);
    SendClientMessage(i, GELB, "[Fahrschuhle]Sie haben den Checkpoint Erreicht.");
    SendClientMessage(i, GELB, "[Fahrschuhle]Ab zum Nächsten.");
    }
    else//Wenn letzter Checkpoint
    {
    DestroyVehicle(Fahrschulauto);
    SendClientMessage(i, ROT, "------------------Erfogreich Bestanden----------------------");
    SendClientMessage(i, GELB, "[Fahrschuhle]Sie haben ihr Führerschein erfolgreich Bestanden.");
    //SetPlayerCheckpoint(playerid, -2091.8999023438, -129, 34.400001525879, 2.0);//Keine Ahnung wofür du das brauchst, aber ich lasse es mal drin.
    sInfo[playerid][sSpieler_autoschein] = 1;
    schulung[playerid] = 0;//Prüfung beendet.
    }
    }
    return 1;
    }


    So in etwa könnte die ganze Sache aussehen. Wäre nebenbei doch deutlich kürzer.

    Schau mal. Wenn du in der Selection einen FeuerwehrCharakter auswählst, dann setzt er dich in das Feuerwehr-Team.
    Wählst du nun einen Zivi-Charakter, so bist du immernoch im Feuerwehr-Team ;)


    Lösungsmöglichkeit:
    Bei allen anderen Classes wieder auf TEAM_ZIVILISTEN (5) setzen.

    new RandomSpawn[MAX_PLAYERS];//das hier brauchst du nicht! wofür denn bitte diese zeile???!!



    new Float:RandomSpawns[2][3] = {//Sind doch erstmal nur 2 Werte und keine 4 und in die zweite Klammer gehört hier eine 3 (ich seh da aufjedenfall x,y,z)
    {-2789.2852,-271.1917,7.1875},
    {-2714.6638,-232.5632,7.1871}
    };//Sonst in Ordnung.



    forward RandomSpawn(playerid);


    public RandomSpawn(playerid)
    {
    if(RandomSpawn{playerid] == 0)
    {
    new rand = random(sizeof(RandomSpawns);
    SetPlayerPos(playerid, RandomSpawns[rand][0], RandomSpawns[rand][1],RandomSpawns[rand][2]);//Du hast die Z-Coordinate vergessen
    }
    return 1;
    }


    Sonst sollte es passen.

    Ich hatte halt den Fehler in der IsPlayerInFrak Funktion vermutet ;)
    Vermute ich nebenbei immernoch.
    Außerdem sieht das hier komisch aus:
    format(text,sizeof(text),"[Fraktions Chat] %s: %s",SpielerName(playerid),text);
    und das :
    SendClientMessage(i,Blau,text);


    Was bemerkt? :D

    Die Sache von Fernandez funktioniert an für sich schon, fehlt nur ein kleiner Teil:

    ocmd:f(playerid,params[])
    {
    new text[128];
    if(sscanf(params,"s",text))return SendClientMessage(playerid,Grün,"/f [Chat-Text]");
    format(text,sizeof(text),"[Fraktions Chat] %s: %s",SpielerName(playerid),text);
    for(new i=0; i<GetMaxPlayers(); i++)
    {
    if(IsPlayerConnected(i))
    {
    if(GetPVarInt(playerid,"Fraktion")==GetPVarInt(i,"Fraktion"))//Der Spieler wird wohl immer in seiner eigenen Fraktion sein, also Fragen wir ab, ob er in derselben ist, wie der Sender der Nachricht.
    {
    SendClientMessage(i,Blau,text);
    }
    }
    }
    return 1;
    }


    Ich weiß halt nicht, wie eure IsPlayerInFraktion - Abfrage definiert ist.
    So könnte es klappen, muss aber nicht.
    EDIT: Ähm wir senden zweimal den TEXT ?!?
    Schaut euch nochmal die oberen Zeilen an, dann findet ihr auch den Fehler.


    http://wiki.sa-mp.com/wiki/OnPlayerPrivmsg
    Wiki hilft weiter ;)


    (also der code stimmt jetzt wahrscheinlich von mir nicht wirklich, wie bereits im vorfeld schon erwähnt.)

    Das muss man natürlich schon ein wenig umstruktieren ;)



    if(strcmp(cmd, "/motor",true) == 0)
    {
    if((GetPlayerVehicleID(playerid)!=INVALID_VEHICLE_ID) && (GetPlayerState(playerid)==PLAYER_STATE_DRIVER))//Erstmal abchecken, ob er überhaupt in einem Fahrzeug sitzt "UND" Fahrer ist!
    {
    if(IsANoTachoVehicle(GetPlayerVehicleID(playerid)))
    {
    SendClientMessage(playerid, COLOR_GRAD1, "{FFFFFF}Fahrräder haben {FF0000}keinen{FFFFFF} Motor ...");
    return 1;
    }
    new engine,lights,alarm,doors,bonnet,boot,objective;
    new vid = GetPlayerVehicleID(playerid);
    GetVehicleParamsEx(vid,engine,lights,alarm,doors,bonnet,boot,objective);
    if(engine == VEHICLE_PARAMS_ON)
    {
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~r~aus!", 2000, 5);
    Motor[vid] = false;//Keine Ahnung wo man das noch weitergehend verwenden müsste; finde ich persönlich jetzt unnötig ;)
    TextDrawSetString(tMotor[playerid], "[~r~Motor~w~]");
    }
    else
    {
    new Float:health;
    GetVehicleHealth(vid,health);
    if(health<400)
    {
    return SendClientMessage(playerid,0xFFAAFF,"Sorry Kolläsch, aber dein Motor machts nichtmehr");
    }
    else
    {
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    GameTextForPlayer(playerid, "~n~~n~~n~~n~~n~~n~~W~Motor ~g~an!", 2000, 5);
    Motor[vid] = true;//Hier ebenfalls =)
    TextDrawSetString(tMotor[playerid], "[~g~Motor~w~]");
    }
    }
    }

    return 1;
    }


    In etwa so sollte das klappen ;)


    Edit:Habe die Fahrer-Abfrage direkt mit oben rein gehauen.

    Achso...
    hau das einfach in die obige Funktion mit rein ;)


    Hier:

    public OnVehicleDamageStatusUpdate(vehicleid, playerid)
    {
    //#pragma unused playerid


    new Float:health;
    GetVehicleHealth(vehicleid, health);
    if(health<200)
    {
    for(new i=0;i<GetMaxPlayers();i++)
    {
    if(IsPlayerInVehicle(i,vehicleid))
    {
    SetVehicleHealth(vehicleid,200.0);//Hier einfach einsetzen :D
    RemovePlayerFromVehicle(i);
    }
    }
    }
    return 1;
    }