Beiträge von Jeffry

    Der Code kann auf Grund mehrerer Tatsachen so nicht funktionieren. Auch das was oben gepostet wurde ist absoluter Käse, man kann doch nicht nur eine Variable für alle Spieler benutzen, ist doch klar, dass das nicht tut.


    Fangen wir mal ganz von vorne an:


    1.) Die Variable:
    new PlayerText:StatisticBox[MAX_PLAYERS] = {PlayerText:-1, ...}; //Initialisiert das Array (für alle Spieler) mit dem Wert -1.


    2.) OnPlayerConnect:
    StatisticBox[playerid] = CreatePlayerTextDraw(playerid,490.000000, 320.000000, "Level: --"); //Erstellt das Textdraw für den Spieler, GetPlayerScore macht in OnPlayerConnect wenig Sinn, daher der Timer.
    PlayerTextDrawShow(playerid,StatisticBox[playerid]);
    PlayerTextDrawBackgroundColor(playerid,StatisticBox[playerid], 255);
    PlayerTextDrawFont(playerid,StatisticBox[playerid], 3);
    PlayerTextDrawLetterSize(playerid,StatisticBox[playerid], 0.600000, 2.000000);
    PlayerTextDrawColor(playerid,StatisticBox[playerid], -1);
    PlayerTextDrawSetOutline(playerid,StatisticBox[playerid], 1);
    PlayerTextDrawSetProportional(playerid,StatisticBox[playerid], 1);
    PlayerTextDrawSetSelectable(playerid,StatisticBox[playerid], 0);


    3.) OnGameModeInit/OnFilterScriptInit (je nach dem):
    SetTimer("CheckAllScore", 1000, 1); //Ein Timer zum Updaten der Levels, automatische Änderung des Textdraws wenn sich ein Level ändert.


    4.) Unten im GM/FS:
    forward CheckAllScore(); //Der Aufruf des Timers.
    public CheckAllScore()
    {
    new str[64];
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && !IsPlayerNPC(i))
    {
    format(str,sizeof(str),"Level: %i",GetPlayerScore(i));
    PlayerTextDrawSetString(i,StatisticBox[i],str);
    }
    }
    return 1;
    }



    5.) OnPlayerDisconnect:

    //Wenn das Textdraw existiert, lösche es.
    if(StatisticBox[playerid] != PlayerText:-1) PlayerTextDrawDestroy(playerid, StatisticBox[playerid]);
    StatisticBox[playerid] = PlayerText:-1;



    Hierbei noch einmal die Bitte: Wenn Ihr keine Ahnung habt, dann postet bitte nicht. Das ist nicht böse gemeint, sondern um eben sowas zu verhindern, dass der Frage-Steller erst recht keinen Durchblick mehr haben wird, weil nur undurchdachter Käse gepostet wird, durchmischt mit Fragen die Off-Topic sind.
    Erst Hirn ein, dann Posten. Das macht es uns allen leichter.

    Du hast zur Zeit vier Textdraws verwendet. Je eins für Fahrzeug, Geschwindigkeit, Schaden und Tank. Du musst, damit die Abstände immer die selben sind, alle Informationen in ein Textdraw packen. Damit sparst du nicht nur 75% der Textdraws sondern hast auch bessere Formatierungsmöglichkeiten.


    new str[128];
    format(str,sizeof(str), "Fahrzeug: %s Geschwindigkeit: %d Schaden: %d%% Tank: %d%%", Fahrzeugname, speed, health,tank);
    TextDrawSetString(td[playerid], str);


    Verstanden? Probiers aus.

    Also, da es ja oben anscheinend keiner wirklich richtig erklären kann oder will (warum auch immer trotzdem gepostet, aber gut...), erklär ich dir das mal ganz grob und geb dir die Dinge vor, die du benötigst. Ich kann dir natürlich nicht alles bis hin ins kleinste Detail erklären, bzw. das ganze System erstellen, aber es sollte einigermaßen verständlich sein:


    Schritt 1: Initialisierung der Variablen
    new PlayerLevel[MAX_PLAYERS];
    new PlayerExp[MAX_PLAYERS];


    Schritt 2: Spieler betritt den Server (OnPlayerConnect)
    PlayerLevel[playerid] = 0; //Zu 0 setzen, damit er nicht die Statistiken eines anderen Spielers erhält, wichtig.
    PlayerExp[playerid] = 0;
    LoadPlayerStatistics(playerid); //Je nach dem wie du deine Spieler-Statistiken lädst.


    Schritt 3: Statistiken Laden
    PlayerLevel[playerid] = dini_Int(Spielerdatei, "Level");
    PlayerExp[playerid] = dini_Int(Spilerdatei, "Exp");
    //Ich habe hier dini als Beispiel genommen, musst du eben an dein System anpassen

    Schritt 4: Statistiken Speichern
    dini_IntSet(Spielerdatei, "Level", PlayerLevel[playerid]);
    dini_IntSet(Spielerdatei, "Exp", PlayerExp[playerid]);
    //Ebenso hier


    Schritt 5: Funktion zum geben der Experience
    stock GivePlayerExp(playerid, exp)
    {
    PlayerExp[playerid] += exp; //Experience geben
    while(PlayerExp[playerid] >= (PlayerLevel[playerid]+1)*1000)
    {
    PlayerLevel[playerid]++; //Level up
    PlayerExp[playerid] -= PlayerLevel[playerid]*1000; //Hier ziehen wir die Punkte wieder ab (Bsp: Exp = 999 Level = 0 => +10 => Exp = 9 Level = 1)
    }
    return 1;
    }


    Schritt 6: Ausgabe
    new str[144];
    format(str, sizeof(str), "Du bist im Experience Level %d und hast dort %d Punkte. Du musst noch %d Punkte sammeln um ins nächste Level zu kommen.", PlayerLevel[playerid], PlayerExp[playerid], ((PlayerLevel[playerid]+1)*1000)-PlayerExp[playerid]);
    SendClientMessage(playerid, 0xFF0000FF, str);



    Anmerkung:
    Die Levels sind so aufgebaut:
    Level 0 => 1: 1000 Punkte (ges. 1000)
    Level 1 => 2: 2000 Punkte (ges. 3000)
    Level 2 => 3: 3000 Punkte (ges. 6000)
    (usw.)


    So, das wars. Ich denke das ist anschaulich genug, damit solltest du eine Menge anfangen können.
    Natürlich musst/kannst du das ganze abändern, je nach dem wie du es wünschst. Das ist aber das grobe Gerüst auf das du aufbauen kannst. Nennen wir es das Skelett.

    Oh Kinders, immer diese Diskussionen anstatt mal auf den Punkt zu kommen.


    string wird einfach wieder in string geschrieben. Einfacher gehts nicht.
    new string[2048];
    format(string,sizeof(string),"_____________________________________|Statistiken|_____________________________________");
    format(string, sizeof(string),"%s\n*Statistiken von %s*",string,name);
    format(string, sizeof(string), "%s\nLevel:[%d] Geschlecht:[%s] Alter:[%d] Geld:[$%d] Bank:[$%d] Handy:[%d]",string, level,atext,age, cash, account, pnumber);
    format(string, sizeof(string), "%s\nPremiumRang:[%s] Herkunft:[%s] Verheiratet:[%s] Spielzeit:[%d] Job:[%s]",string, drank,otext,married,ptime,jtext);
    format(string, sizeof(string), "%s\nFishesCaught:[%d] GrößterFisch:[%d] Verbrechen:[%d] Gefängniszeit:[%d] Gesucht:[%d]",string, fishes,bigfish,crimes,arrests,warrests );
    format(string, sizeof(string), "%s\nKills:[%d] Tode:[%d] Respekt:[%d/%d] WantedLevel:[%d] Spawnhealth:[%.1f] LottoNr:[%d]",string,kills,deaths,exp,expamount,wanted,shealth+50,lotto);
    format(string, sizeof(string), "%s\nDrogen:[%d] Materials:[%d] Team:[%s] Krankheit:[%s] Organisation:[%s] Rank:[%s]",string,drugs,mats,ttext,dtext,ftext,rtext);
    format(string, sizeof(string), "%s\nNachLoginMin: [%d] Spielminuten: [%d]",string,PlayerInfo[targetid][pMinutesSinceLogin],PlayerInfo[targetid][pGesamtMinutes]);
    format(string, sizeof(string),"%s\nHausschlüssel[%d] Bizzkey[%d] Leihschlüssel[%d] Int[%d] Local[%d]",string, housekey,bizkey,HireCar[targetid],intir,local);
    format(string, sizeof(string),"%s\nHealth [%.2f] Schutzweste [%.2f] IP[%s] Ping [%d] Warnungen[%d]",string,plHealth,plArmour,plIP,GetPlayerPing(targetid),PlayerInfo[targetid][pWarns]);
    ShowPlayerDialog(playerid, DIALOG_STATS,DIALOG_STYLE_MSGBOX,"DSR User Stats",string,"Auswählen","Abbrechen");


    Nein, du musst nichts aufsplitten.
    Ja, man kann den string größer als 500 machen.
    Nein, strcat ist nicht übersichtlicher, wenn dann ist das relativ und liegt im Auge des Betrachters.


    Doch kannst du Musst ihn aber mit ` eingrenzen


    Danke, das war mir nicht bekannt. Gut zu wissen.



    %d steht auch für Intergers, das kann man bedenkenlos verwenden.


    Der Fehler in der ersten Zeile liegt hier:
    ´Fraktion´='0',
    zu:
    `Fraktion`='0',
    Die Haken waren falschrum.

    new year,month,d, tmp[24]; //Variablen deklarieren
    getdate(year, month, d); //getdate gibt das Datum zurück
    format(tmp, sizeof(tmp), "%02d.%02d.%d", d, month, year); //Formatierung
    dini_Set(Spielerdatei, "Datum", tmp); //Speicherung


    new,h,m,s; //Variablen deklarieren
    gettime(h,m,s); //gettime gibt die Uhrzeit zurück
    format(tmp, sizeof(tmp), "%02d:%02d:%02d", h, m, s); //Formatierung
    dini_Set(Spielerdatei, "Zeit", tmp); //Speicherung

    #include <a_samp>


    #define MAX_FLUGHAEFEN 5


    #define DODO_ID 593
    #define NEVADA_ID 553
    #define SHAMAL_ID 519
    #define BEAGLE_ID 511


    new Dodo[MAX_FLUGHAEFEN];
    new Shamal[MAX_FLUGHAEFEN];
    new Nevada[MAX_FLUGHAEFEN];
    new Beagle[MAX_FLUGHAEFEN];


    new Flughafen[MAX_PLAYERS] = {-1,...};
    new FlughafenNr[MAX_PLAYERS];
    new FlughafenName[MAX_FLUGHAEFEN][25];
    new Strecke[MAX_PLAYERS];


    enum Check
    {
    Float:x,
    Float:y,
    Float:z,
    Float:size
    };
    //Die Flughäfen
    new Float:Checkpoints[5][Check] = {
    {1576.9788,1391.3984,10.8483, 10.0},//lva,0
    {-1364.0537,-215.1572,14.1484, 10.0},//sfa,1
    {-760.1149,1994.4023,5.4734,10.0},//sherman,2
    {1726.6909,-2407.4905,13.5547,10.0},//ls,3
    {2866.5273,1870.2122,14.1785,10.0}//rockshore,4


    };


    public OnFilterScriptInit()
    {
    Dodo[0]=1;
    Dodo[1]=1;
    Dodo[2]=1;
    Dodo[3]=1;
    Dodo[4]=1;
    Shamal[0] = 1;
    Shamal[1] = 1;
    Shamal[2] = 1;
    Shamal[3] = 1;
    Shamal[4] = 1;
    Nevada[0] = 1;
    Nevada[1] = 1;
    Nevada[2] = 1;
    Nevada[3] = 1;
    Beagle[0]=1;
    Beagle[1]=1;
    Beagle[2]=1;
    Beagle[3]=1;
    Beagle[4]=1;
    FlughafenName[0] = "Name0";
    FlughafenName[1] = "Name1";
    FlughafenName[2] = "Name2";
    FlughafenName[3] = "Name3";
    FlughafenName[4] = "Name4";
    return 1;
    }


    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if(!strcmp(cmdtext, "/work", true))
    {
    new vehid = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(vehid) != DODO_ID && GetVehicleModel(vehid) != NEVADA_ID && GetVehicleModel(vehid) != SHAMAL_ID && GetVehicleModel(vehid) != BEAGLE_ID) return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Flugzeug.");
    new id = GetNearestAirport(playerid);
    if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: No Airports found (If you get this error use /admin to report this bug to an admin!).");
    Flughafen[playerid] = id;
    FlughafenNr[playerid] = 0;
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,Checkpoints[id][x],Checkpoints[id][y],Checkpoints[id][z],Checkpoints[id][size]);
    new str[144];
    format(str, sizeof(str), "Info: Flughafen %s (ID: %d) wird angezeigt. Erlaubte Flugzeuge:", FlughafenName[id], id);
    SendClientMessage(playerid, 0x00FFFFFF, str);
    if(Dodo[id] == 1) format(str, sizeof(str), "Dodo", str);
    if(Shamal[id] == 1) format(str, sizeof(str), "%s, Shamal", str);
    if(Nevada[id] == 1) format(str, sizeof(str), "%s, Nevada", str);
    if(Beagle[id] == 1) format(str, sizeof(str), "%s, Beagle", str);
    return SendClientMessage(playerid, 0x00FFFFFF, str);
    }
    return 0;
    }


    public OnPlayerEnterCheckpoint(playerid)
    {
    FlughafenNr[playerid]++;
    if(FlughafenNr[playerid] == 1)
    {
    //kein Geld, dafür:
    //Neuer Flughafen ...
    new vehid = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(vehid) != DODO_ID && GetVehicleModel(vehid) != NEVADA_ID && GetVehicleModel(vehid) != SHAMAL_ID && GetVehicleModel(vehid) != BEAGLE_ID) return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Flugzeug.");
    new id = GetRandomAirport(playerid);
    if(id == -1) return SendClientMessage(playerid, 0xFF0000FF, "Error: Kein Flughafen gefunden.");
    Flughafen[playerid] = id;
    DisablePlayerCheckpoint(playerid);
    SetPlayerCheckpoint(playerid,Checkpoints[id][x],Checkpoints[id][y],Checkpoints[id][z],Checkpoints[id][size]);
    Strecke[playerid] = floatround(GetPlayerDistanceFromPoint(playerid, Checkpoints[id][x],Checkpoints[id][y],Checkpoints[id][z]));
    new str[144];
    format(str, sizeof(str), "Info: Flughafen %s (ID: %d) wird angezeigt. Erlaubte Flugzeuge:", FlughafenName[id], id);
    SendClientMessage(playerid, 0x00FFFFFF, str);
    if(Dodo[id] == 1) format(str, sizeof(str), "Dodo", str);
    if(Shamal[id] == 1) format(str, sizeof(str), "%s, Shamal", str);
    if(Nevada[id] == 1) format(str, sizeof(str), "%s, Nevada", str);
    if(Beagle[id] == 1) format(str, sizeof(str), "%s, Beagle", str);
    return SendClientMessage(playerid, 0x00FFFFFF, str);
    }
    else
    {
    //Geld...und kein neuer Flughafen mehr:
    FlughafenNr[playerid]=0;
    Flughafen[playerid]=-1;


    GivePlayerMoney(playerid,((Strecke[playerid]/1000)*1500)+25000);
    }
    return 1;
    }


    stock GetNearestAirport(playerid)
    {
    new Float:d = 2000000000.0, id = -1, veh = GetVehicleModel(GetPlayerVehicleID(playerid));
    for(new i=0; i<MAX_FLUGHAEFEN; i++)
    {
    if(i == Flughafen[playerid]) continue;
    new Float:tmp = GetPlayerDistanceFromPoint(playerid, Checkpoints[i][x],Checkpoints[i][y],Checkpoints[i][z]);
    if(tmp < d)
    {
    if(veh == DODO_ID && Dodo[i] == 1 ||
    veh == SHAMAL_ID && Shamal[i] == 1 ||
    veh == BEAGLE_ID && Beagle[i] == 1 ||
    veh == NEVADA_ID && Nevada[i] == 1) d = tmp, id = i;
    }
    }
    return id;
    }


    stock GetRandomAirport(playerid)
    {
    new id = -1, veh = GetVehicleModel(GetPlayerVehicleID(playerid)), count;
    for(new i=0; i<MAX_FLUGHAEFEN; i++)
    {
    if(veh == DODO_ID && Dodo[i] == 1 ||
    veh == SHAMAL_ID && Shamal[i] == 1 ||
    veh == BEAGLE_ID && Beagle[i] == 1 ||
    veh == NEVADA_ID && Nevada[i] == 1) count++;
    }
    count = random(count)+1;
    for(new i=0; i<MAX_FLUGHAEFEN; i++)
    {
    if(veh == DODO_ID && Dodo[i] == 1 ||
    veh == SHAMAL_ID && Shamal[i] == 1 ||
    veh == BEAGLE_ID && Beagle[i] == 1 ||
    veh == NEVADA_ID && Nevada[i] == 1)
    {
    count--;
    if(count == 0) id = i;
    }
    }
    return id;
    }


    Hier bitte. Hat 5 Minuten gedauert das zu ändern.
    Sollte funktionieren.

    TogglePlayerControllable(playerid, false);
    SetTimerEx("Unfreeze", 10000,0,"d",playerid);


    forward Unfreeze(playerid);
    public Unfreeze(playerid) return TogglePlayerControllable(playerid);


    Sollte soweit selbsterklärend sein.

    Nein das geht nicht. Die Sichtweite ist vom Spiel her begrenzt. Wenn du die erhöhen willst brauchst du einen Mod.
    Es gibt allerdings die Möglichkeit das Wetter zu einer bestimmten ID zu ändern, dann sieht man alle Objekte viel weiter, dafür ist alles mehr oder weniger Pink.