public OnFilterScriptExit()
{
for(new playerid = 0; playerid < MAX_PLAYERS; playerid++) StopAudioStreamForPlayer(playerid);
return 1;
}
N3xiz: So wie das aussieht musst du da alle eintragen.
public OnFilterScriptExit()
{
for(new playerid = 0; playerid < MAX_PLAYERS; playerid++) StopAudioStreamForPlayer(playerid);
return 1;
}
N3xiz: So wie das aussieht musst du da alle eintragen.
Was meinst du mit "es erscheint eine verbuggte Version des zuletzt erstellten Interiors"?
Kannst du das bitte erklären, und vielleicht ein Bild dazu posten? Und wie erstellst du dieses "andere TextLabel"?
ocmd:givetitle(playerid,params[])
{
if(SpielerInfo[playerid][Adminlevel] < 7) return SendClientMessage(playerid, GRAU, "Erst ab Level 7!");
new pID,title[32],string3[128];
if(sscanf(params,"us[32]",pID,title)) return SendClientMessage(playerid, GRAU, "Anwendung: '/settitle [Spieler] [Title]'");
format(SpielerInfo[pID][Adminrang], 32, title);
format(string3,sizeof(string3),"(( ** ADMIN ** %s hat den Tietel von %s auf %s geändert. ))",GetName(playerid),GetName(pID),title);
SendAdminMessage(drot, string3);
return 1;
}
Außerdem muss "Adminrang" im enum als "Adminrang[32]" deklariert sein.
Falls du nicht das sscanf Plugin verwendest, sondern die Funktion:
Eddy: Das ist immernoch falsch. Der Fehler liegt am SpielerName-Array, welches nicht existiert. Und die Klammer die du hinzugefügt hast gehört da nicht hin. ![]()
if(dialogid == Ueberweisung2)
{
new pID = Ueberweiser[playerid];
new str[128],str2[128],str3[128],sname[MAX_PLAYER_NAME],sname2[MAX_PLAYER_NAME];
if(!response)return ShowPlayerDialog(playerid,Bankmenu,DIALOG_STYLE_LIST,"Transaktionen","Einzahlung\nAuszahlung\nKontostand\nÜberweisung","Wählen","Abbrechen");
if(pInfo[playerid][Bank] < strval(inputtext))return SendClientMessage(playerid,0xC8C8C8FF,"Du hast nicht genug Geld auf dem Konto");
pInfo[playerid][Bank] -= strval(inputtext);
pInfo[pID][Bank] += strval(inputtext);
GetPlayerName(playerid, sname, MAX_PLAYER_NAME);
GetPlayerName(playerid, sname2, MAX_PLAYER_NAME);
format(str,sizeof(str),"Sie haben %d$ auf das Konto von %s Überwiesen",strval(inputtext),sname2);
ShowPlayerDialog(playerid,UeberweisungText1,DIALOG_STYLE_MSGBOX,"Transaktion",str,"Beenden","");
format(str2,sizeof(str2),"%s hat ihnen %d$ auf ihr Konto überwiesen",sname,strval(inputtext));
SendClientMessage(pID,0xC8C8C8FF,str2);
}
Nix da egal, wenn schon, denn schon. ![]()
Wenn es in Kilometern angezeigt wird, und du es aber in Metern haben willst ist es eben andersherum, sprich du musst es * 1000 machen (oder, falls du es noch drin hast, beim Speichern die Division durch 1000 raus machen, falls du es beim Laden nicht wieder mit 1000 multiplizierst [sonst wird es ja mit jedem Speichern um das 1000-fache kleiner!]).
Also ggf. so:
format(string, sizeof(string), "%dkm", floatround(Distanz*1000.0));
PS: Danke für das Lob, freut mich ![]()
Was geht denn nicht? Ich schätze du meinst die Anzeige des Title's welchen du ihm gibst. Nur was gibst du da ein? Eine Zahl?
Dann ändere das dritte "%s" im format zu "%d".
Außerdem fehlt nach dem ersten return etwas.
Ok, super!
Ich gehe mal davon aus, du meinst die Anzeige, bei der du es in Kilometern angezeigt haben willst, anstatt in Metern, und das jeder durch 1000 rechnen kann. Wenn ja, dann ist das kein Problem. Du musst einfach nur bei dem format in dem du die Distanz als string für das Textdraw formatierst durch 1000 rechnen, also z.B. so:
format(string, sizeof(string), "%0.2fkm", Distanz/1000.0);
Dann bleibt die Variable gleich (wird nicht geteilt), aber die Anzeige ist in km.
Zwecks dem Speichern/Laden von anderen Fahrzeugen:
Ja, für alle Fahrzeuge jeweils so. Variable und Dateiname umbenennen, so dass es passt. Vom Prinzip her ist es immer das gleiche, auch für neue Fahrzeuge die du noch hinzufügen willst.
Auf ein Array mit einem invaliden Index zuzugreifen ist dennoch keine gute Idee und ein schlechtes Beispiel, weil im schlechtesten Fall bricht der Code einfach ab und es kommt "Unknown Command.", was nicht wirklich schön ist. Mir ist klar, dass die Abfrage auf 0 fehlt, aber einem Anfänger ist das meistens nicht auf den ersten Blick klar.
Außerdem fehlt noch die Abfrage, ob der Spieler ein NPC ist, den kann man ja schlecht teleportieren.
Schneller ist der Code zwar, aber dafür fehleranfälliger. Wird beispielsweise OnPlayerDisconnect durch einen Fehler in einem Filterscript mal nicht ausgeführt (verursacht zum Beispiel durch ein zugreifen auf einen Array-Index mit einem invaliden Wert...), dann bleibt der Wert des Arrays für online Spieler auf true, was zur Folge haben kann, dass ein Spieler ausgewählt wird, der gar nicht online ist. Das ist zwar weit hergeholt, passiert aber dennoch Anfängern häufig. Da die Geschwindigkeit hier irrelevant ist (Nanosekunden) ist es wichtiger einen sicheren, unabhängigen Code zu haben.
Warum er dir das in 1000'fachen Wert speichert kann ich dir so nicht sagen, das müsste man mal debuggen. Aber wenn es mit /1000.0 (!) geht, dann ist ja gut.
Wenn du aber sagst, er lädt es nicht mehr, lädt er es denn, wenn du das /1000 weg machst, unabhänngig davon, ob jetzt 5000 ist der Date steht?
Zwecks den 2.33/2.31/2.30:
Das liegt daran, dass du die Position zwischen zwei Punkten berechnest. Am Anfang sind deine vLastX(etc) aber alle 0, sprich es wird die Distanz vom 0-Punkt zum Spawn-Punkt berechnet. Du müsstest das abfangen, indem du nur output dazuzählst, wenn die drei Last's nicht 0 sind:
if(vehicles[vehicleid][vLastX] != 0.0 && vehicles[vehicleid][vLastY] != 0.0 && vehicles[vehicleid][vLastZ] != 0.0) vehicles[vehicleid][vehicleKm] += output;
Dann wäre zumindest das behoben.
Teste das mit dem Speichern/Laden mal ohne die Division durch 1000, und schau ob er dann was lädt.
Wenn nicht, dann liegt es möglicherweise daran, dass du versuchst die Daten zu laden, bevor du die Fahrzeuge erstellt hast (Reihenfolge des Codes bei OnGameModeInit). Es müssen erst die Fahrzeuge erstellt werden, dann können die Daten geladen werden.
Das so zu machen ( Nemesus Jr: Fabi.StaR
ist keine gute Idee. In einem Befehl mag es zwar funktionieren, da ja dann mindestens ein Spieler online ist, aber setzt man es in einen Timer und kein Spieler ist online, dann hat man eine Endlosschleife, was zur Folge hat, dass auch niemand mehr den Server betreten kann.
Außerdem kann es theoretisch sein, dass es sehr sehr viele Wiederholungen bei der Methode gibt, denn wenn nur ein Spieler online ist, man aber 500 Slots hat, besteht jedes mal nur eine Chance von 1 zu 499 Chance, dass der Wert getroffen wird. Bei 2000 Wiederholungen ist immer noch eine 2%'ige Chance, dass noch kein Spieler gefunden wurde (2000 ist zwar nicht viel, trotzdem sollte man keine theoretischen Lücken lassen).
Kaliber: Deine Methode wird auch nicht, bzw. nicht richtig, funktionieren, wenn nur ein/kein Spieler online ist, da ein random aus 0 keinen Sinn gibt.
Für @Mausibiba: ist es sicher am einfachsten und am leichtesten zu verstehen, eine Funktion zu verwenden, die einfach eine random ID ausgibt, ohne viel Code drum herum (fehleranfällig!).
stock GetRandomPlayer(playerid)
{
new onlinecount = 0, oID[MAX_PLAYERS];
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && !IsPlayerNPC(i) && i != playerid)
{
oID[onlinecount] = i;
onlinecount++;
}
}
if(onlinecount > 0) return oID[random(onlinecount)];
else return INVALID_PLAYER_ID;
}
Wäre dann ganz einfach zu verwenden:
new player1 = GetRandomPlayer(playerid);
if(player1 == INVALID_PLAYER_ID) return SendClientMessage(playerid, 0xFF0000FF, "Es ist kein Spieler außer dir online!");
SetPlayerPos(player1, x, y, z);
Die momentane Zeit muss noch abgezogen werden.
nochpremium = sInfo[playerid][pPremiumZeit] - gettime();
Dachte das machst du schon.
Das darfst du aber erst NACH der Abfrage machen.
EDIT:
Also so:
Dann würde ich es so schreiben:
forward saveCar();
public saveCar()
{
new autos[32];
for (new i=0; i < sizeof(lspdcar); i++)
{
format(autos, sizeof(autos), "/Autos/lspdcar%i.ini", i);
if ( !dini_Exists(autos) )
{
dini_Create(autos);
}
dini_FloatSet(autos,"Gefahrene KM", vehicles[lspdcar[i]][vehicleKm]);
}
return 1;
}
forward loadCar();
public loadCar()
{
new autos[32];
for (new j=0; j < sizeof(lspdcar); j++)
{
format(autos, sizeof(autos), "/Autos/lspdcar%i.ini", j);
if ( !dini_Exists(autos) )
{
dini_Create(autos);
}
vehicles[lspdcar[j]][vehicleKm] = dini_Float(autos,"Gefahrene KM");
}
return 1;
}
Nein, sorry. TeamViewer oder TeamSpeak nutze ich für Support nicht, da das viel zu lange dauert, die Zeit habe ich nicht. Eine Antwort dauert eine Minute, bei TeamViewer kommt es meistens auf eine Stunde raus.
new zeitBisEnde = DIE_SPIELER_VARIABLE;
new tage = zeitBisEnde / 86400;
zeitBisEnde -= tage * 86400;
new stunden = zeitBisEnde / 3600;
zeitBisEnde -= stunden * 3600;
new minuten = zeitBisEnde / 60;
zeitBisEnde -= minuten * 60;
new sekunden = zeitBisEnde;
Ein Tag hat 1440 Minuten. ![]()
Kannst es ja noch durch 60 teilen, dann hast du es in Stunden.
Oder du erstellst dir durch herunter rechnen eine Ausgabe wie
ZitatDu hast noch X Tage, X Stunden und X Minuten Premium.
Wie erstellst du denn die Fahrzeuge die du speichern willst?
Ja, das kannst du genau gleich machen.
timestamp += zeitBisEnde;
Zu
timestamp = zeitBisEnde;
Du kannst aber auch einfach zeitBisEnde in die Datenbank eintragen.
Du nutzt noch alte Includes, bzw. einen alten Server.
Lade dir hier die neusten Daten herunter und füge deine Code da ein: http://files.sa-mp.com/samp03z_svr_R4_win32.zip
new zeitBisEnde = gettime() + tage * 86400; //1 Tag = 86400 Sekunden
mysql_SetInt("accounts", "Geld", SpielerInfo[playerid][pGeld], "Name", SpielerInfo[playerid][pName]);
zu:
mysql_SetInt("accounts", "Geld", GetPlayerMoney(playerid), "Name", SpielerInfo[playerid][pName]);