Was gibst du denn ein?
Beiträge von Jeffry
-
-
Im Grunde hast du recht, ABER die Namen können auch 24 Zeichen lang werden, Grund ist hier SetPlayerName, welches erlaubt dem Namen 24 Zeichen zu geben.
Oh, ja stimmt. Hatte ich verdrängt, Danke für den Hinweis.
Allerdings spielt das auch keine Rolle, da MAX_PLAYER_NAME 24 ist, und da passen die 24 Buchstaben vom Spieler-Name rein. Ein +1 ist also trotzdem nicht unbedingt notwendig.Habe dennoch meinen Kommentar natürlich angepasst.
-
if(sscanf(params, "fffi",tmp_interior))return SendClientMessage(playerid, COLOR_GREY, "{00A5FF}/setinterior {B3B3B3}[InteriorKoords] [InteriorID]");
zu:
if(sscanf(params, "i",tmp_interior))return SendClientMessage(playerid, COLOR_GREY, "{00A5FF}/setinterior {B3B3B3}[InteriorID]"); -
@Skoam: Komisch.
updateHaus(id)
{
new string[128];
if(hInfo[id][h_pickup] != -1)
{
DestroyPickup(hInfo[id][h_pickup]);
hInfo[id][h_pickup] = -1;
}
if(hInfo[id][htext] != Text:-1)
{
Delete3DTextLabel(hInfo[id][htext]);
hInfo[id][htext] = Text3D:-1;
}
if(!strlen(hInfo[id][h_besitzer]))
{
hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
hInfo[id][htext]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10.0, 0, 1);
}
else
{
hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
hInfo[id][htext]=Create3DTextLabel(string, COLOR_BLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10.0, 0, 1);
}
return 1;
}
Einen Fehler habe ich gefunden, den hab ich auch selbst rein gemacht (bei der if-Abfrage den Tag vergessen).
Möglicherweise liegen die anderen beiden daran, dass du 10 anstatt 10.0 geschrieben hast. -
Schreibe die updateHaus-Funktion so:
updateHaus(id)
{
new string[128];
if(hInfo[id][h_pickup] != -1)
{
DestroyPickup(hInfo[id][h_pickup]);
hInfo[id][h_pickup] = -1;
}
if(hInfo[id][htext] != -1)
{
Delete3DTextLabel(hInfo[id][htext]);
hInfo[id][htext] = Text3D:-1;
}
if(!strlen(hInfo[id][h_besitzer]))
{
hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
hInfo[id][htext]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
}
else
{
hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
hInfo[id][htext]=Create3DTextLabel(string, COLOR_BLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
}
return 1;
}Dann füge im enum, dort wo du "htext" deklariert hast "Text3D:" vor das "htext" hinzu, dass es so aussieht:
Text3D:htext,Und füge bei OnGameModeInit, ganz als erstes, das hier ein:
for(new i=0; i<sizeof(hInfo); i++)
{
hInfo[i][h_pickup] = -1;
hInfo[i][htext] = Text3D:-1;
}Warum tritt das Problem auf? Es gibt auch eine ID 0, das wird bei dem Code den du hattest nicht berücksichtigt.
-
Naja...das geht aber besser.

ocmd:pn(playerid, params[])
{
new sender[MAX_PLAYER_NAME+1]; //Das +1 brauchst du nicht, da die Namen nur 24 Zeichen haben können und MAX_PLAYER_NAME 24 ist.
GetPlayerName(playerid, sender, sizeof(sender));new pID, text[128]; //Es können 144+1(EOS) Zeichen in SendClientMessage angezeigt werden.
if(sscanf(params, "us[128]", pID, text)) return SendClientMessage(playerid, COLOR_RED, "INFO: /PN [ID] [TEXT]");
format(text, 200, "[PN] Spieler %s sagt : '%s'", sender, text); //200 passt hier nicht, du hast es ja nur mit 128 deklariert.
SendClientMessage(pID, COLOR_RED, text);
return 1;
}
zu:
ocmd:pn(playerid, params[])
{
new sender[MAX_PLAYER_NAME], pID, text[145];
if(sscanf(params, "us[145]", pID, text)) return SendClientMessage(playerid, COLOR_RED, "INFO: /PN [ID/NAME] [TEXT]");
GetPlayerName(playerid, sender, sizeof(sender));
format(text, sizeof(text), "[PN] Spieler %s sagt : '%s'", sender, text);
return SendClientMessage(pID, COLOR_RED, text);
} -
1.)
Die pKnastzeitBis ist der Timestamp (also die Uhrzeit) an dem der Spieler aus dem Knast entlassen wird. Sobald gettime() (gibt den momentanen Timestamp zurück) größer ist als pKnastzeitBis, dann wird der Spieler entlassen.2.)
Ahh, achso. Dann ändere:
SpielerInfo[pID][pWanteds] = (wanteds/5) + 1;
SetPlayerWantedLevel(pID, SpielerInfo[pID][pWanteds]);
zu:
SpielerInfo[pID][pWanteds] = wanteds;
SetPlayerWantedLevel(pID, (SpielerInfo[pID][pWanteds]/5) + 1);
Dann passt es.3.)
Ja, das hattest du ja schon im Befehl drin.
if(wanteds<1||wanteds>25)return SendClientMessage(playerid,error,"Du kannst nur minimal 1 Wanted oder maximal 25 Wanteds geben!");
Oder?4.)
Einen Minuten-Timer (gleich wie der Sekunden-Timer) bei dem du bei jedem Aufruf für jeden Spieler (Schleife!) der online ist, einen Wanted Punkt abziehst:
SpielerInfo[pID][pWanteds]--;
SetPlayerWantedLevel(pID, (SpielerInfo[pID][pWanteds]/5) + 1);
Wenn du die Änderung aus Punkt 2 gemacht hast, dann gibt das hier auch Sinn. -
Gut, das sähe dann im Ansatz so aus:
Beim Befehl:
SpielerInfo[pID][pKnast] = 1;
SpielerInfo[pID][pKnastzeitBis] = gettime() + eingegebene_zeit;
SpielerInfo[pID][pKnastzeit] = eingegebene_zeit;Diese Werte speicherst du beim SavePlayer (also bei OnPlayerDisconnect) in die Datenbank/Datei.
Wenn die Knast Zeit zu Ende ist (mit einem 1 Sekunden Timer prüfen):
OnGameModeInit:
SetTimer("SekundenTimer", 1000, true);Und das Callback:
forward SekundenTimer();
public SekundenTimer()
{
new time = gettime();
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(SpielerInfo[i][pKnast] == 1)
{
if(SpielerInfo[i][pKnastzeitBis] < gettime())
{
SpielerInfo[i][pKnast] = 0;
SpielerInfo[i][pKnastzeitBis] = 0;
SpielerInfo[i][pKnastzeit] = 0;
//Und hier dann die Position setzen, etc...
}
}
}
return 1;
}Beim Login lädst du einfach diese 3 Werte aus der Datenbank/Datei und dann fragst du bei OnPlayerSpawn ab:
if(SpielerInfo[playerid][pKnast] == 1)
{
SpielerInfo[playerid][pKnastzeitBis] = gettime() + SpielerInfo[playerid][pKnastzeit]; //Damit die 500 Sekunden wieder drauf sind.
//Hier Position wieder in den Knast setzen.
} -
Das Problem ist die Reihenfolge. Wenn du Admin ist, dann trifft das zuerst zu, die unteren werden auf Grund des else's nicht mehr abgefragt.
Stelle es so um:
ocmd:admins(playerid,params[])
{
#pragma unused params
new plname[MAX_PLAYER_NAME],result[500],string[256],sendername[MAX_PLAYER_NAME],strings[228];
foreach(Player, i)
{
if(!IsPlayerNPC(i))
{
if(PlayerInfo[i][pAdmin] == 0 && PlayerInfo[i][pScripter] == 0) continue;
GetPlayerName(i, plname, sizeof(plname));
GetPlayerName(i, sendername, sizeof(sendername));
if(AdminDuty[i] == 1) format(string, sizeof(string), "{00FF00}[IM DIENST] %s | Nummer: %d\n", plname,PlayerInfo[i][pPnumber]);
else if(M_Bot[i][PAFK] == 1) format(string,sizeof(string),"{FF0000}[AWAY] %s | Nummer: %d\n", plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pScripter] == 8) format(string,sizeof(string),"%s | Scripter | Nummer: %d\n\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 1) format(string,sizeof(string),"%s | Probe Supporter | Nummer: %d\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 2) format(string,sizeof(string),"%s | Supporter | Nummer: %d\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 3) format(string,sizeof(string),"%s | Moderator | Nummer: %d\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 4) format(string,sizeof(string),"%s | Super Moderator | Nummer: %d\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 5) format(string,sizeof(string),"%s | Administrator | Nummer: %d\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 6) format(string,sizeof(string),"%s | Head-Admin | Nummer: %d\n",plname,PlayerInfo[i][pPnumber]);
else if(PlayerInfo[i][pAdmin] == 7) format(string,sizeof(string),"%s | Projektleiter | Nummer: %d\n\n",plname,PlayerInfo[i][pPnumber]);result = str_combine_large(result, string);
}
}
Außerdem habe ich dir die Abfrage auf pAdmin und pScripter = 0 geändert, da sonst keine Admins mehr angezeigt worden wären, die kein Scripter sind. -
alva:
Dein Lösungsvorschlag ist zwar in Ordnung, aber wirklich Sinn macht er bei einem solchen Vorhaben nicht, da die Statistiken des Spielers ja erst aktualisiert werden, wenn er den Server verlässt, und das kann dauern. Ich habe in meinem Server, zum Vergleich, Spieler die weit über 100 Stunden am Stück online sind, das wäre schlecht, wenn sich da die Werte erst aktualisieren, wenn die den Server verlassen, vor allem wenn man bedenkt, dass zum Beispiel nach 90 Stunden der Server abstürzt, was ja vorkommen kann. Die Spieler wären da sicher nicht erfreut drüber.
Das würde ich so also nicht empfehlen.
Außerdem ist diese Berechnung hier falsch:
var = var % 3600; // berechnet wie viele Stunden das jetzt waren
das muss
var = var / 3600; // berechnet wie viele Stunden das jetzt waren
lauten, da dir sonst nur Werte zwischen 0 und 3599 ausgegeben werden, sprich für zum Beispiel 3 Stunden (10800 Sekunden) würde es dir 0 ausgeben, für 3 Stunden und 1 Minute würde es dir 60 ausgeben.
Dennoch, wie gesagt, würde ich davon abraten.@Stormi25:
Ok, kannst du dann bitte posten, wie dein angepasster Timer aussieht (Start des Timer, Callback)? -
1.)
Bei deinem stock fehlt GetPlayerPos und du musst abfragen bei wem sie in der Nähe sind.
stock teaminrangeofpoint(playerid, frakid)
{
new count, i, Float:pos[3];
for(; i < MAX_PLAYERS;i++)
{
GetPlayerPos(i, pos[0], pos[1], pos[2]);
if(!IsPlayerInRangeOfPoint(playerid, 20.0, pos[0], pos[1], pos[2])) continue;
if(SpielerInfo[i][pTeam] == frakid && SpielerInfo[i][pDuty]) count ++;
}
return count;
}if(SpielerInfo[playerid][pWanteds] > 0)
{
if(teaminrangeofpoint(playerid, 1))
{
format(wstring, sizeof(wstring), "%s wurde durch ausloggen Verhaftet!",SpielerName(playerid));
SendClientMessageToAll(info, wstring);
SpielerInfo[playerid][pKnast] = 1;
SpielerInfo[playerid][pWanteds] = 0;
SetPlayerWantedLevel(playerid, 0);
//Außerdem musst du darauf achten, dass der Spieler erst hier danach gespeichert wird
//und nicht schon davor, sonst wird pKnast in der Datenbank/Datei nicht gesetzt.
}
}2.)
Das sähe dann so aus:
ocmd:wanted(playerid,params[])
{
if(SpielerInfo[playerid][pTeam] == 1)
{
new wanteds, pID, string[145];
if(sscanf(params,"uis[145]",pID,wanteds,string))return SendClientMessage(playerid,info,"/wantedtest [Spieler] [Wantedzahl] [Grund]");
if(wanteds<1||wanteds>25)return SendClientMessage(playerid,error,"Du kannst nur minimal 1 Wanted oder maximal 25 Wanteds geben!");
SpielerInfo[pID][pWanteds] = (wanteds/5) + 1;
SetPlayerWantedLevel(pID, SpielerInfo[pID][pWanteds]);
format(string,sizeof(string)," Du hast %s Wanteds gegeben. Grund %s",SpielerName(pID),wanteds,string);
SendClientMessage(playerid,cop,string);
format(string,sizeof(string)," %s hat dir %i Wanteds Gegeben. Grund: %s",SpielerName(playerid),wanteds,string);
SendClientMessage(pID,info,string);
format(string,sizeof(string), "Nun ist dein Wantedlevel auf %i gestiegen!",SpielerInfo[pID][pWanteds]);
SendClientMessage(pID,warn,string);
SavePlayer(pID);
}
else
{
SendClientMessage(playerid,error,"Du bist kein Polizist!");
}
return 1;
}
Ich habe dir einige Änderungen gemacht, vor allem die unnötig vielen Variablen weg gemacht.
Die Berechnung nach deinem Modell ist diese: sterne = (wanteds/5) + 1
Kannst es nachrechnen.3.)
Was soll den der Knast Befehl machen? Soll die Zeit auch runter gehen, wenn der Spieler offline ist, oder soll die verbleibende Zeit gespeichert werden, und wenn er wieder online kommt, dann muss er den Rest absitzen? Oder soll er es wieder von vorne absitzen?
Generell kannst du in allen Varianten mit gettime() als Erkennungsmerkmal, ob der Spieler im Knast ist und wie lange, arbeiten. -
Wann benutzt man dann %d ?
%d und %i sind absolut identisch, du kannst sie austauschen wie du willst, das macht keinen Unterschied. -
@Kontrax: Ja, genau. Korrekt.
-
Ja, diese Datenbank ID musst du in der Variable beim Erstellen speichern, dafür gibt es:
http://wiki.sa-mp.com/wiki/MySQL/R33#cache_insert_idUnd die Datenbank ID muss dann in das Format oben, damit der Wert in das %d geschrieben wird.
-
http://wiki.sa-mp.com/wiki/MySQL/R33#cache_get_row_int
Bzw
http://wiki.sa-mp.com/wiki/MyS…che_get_field_content_int@Kontrax:
Mache eine Schleife durch alle deine so erstellten Fahrzeuge (id_x) und frage ab, ob das gleich GetPlayerVehicleID ist. Wenn ja, dann ist das i der Schleife der Index, damit kannst du dann auf die Datenbank zugreifen, mit WHERE id = %d
Wobei das id eben der Datenbank ID entspricht. -
Ja, und ja.
-
Hinter DIALOG_RROLLER fehlt eine Klammer zu: )
Steht sogar im Kommentar dahinter. -
-
Corvus:
Mache die Tank Variable zu einem Float und schreibe anstatt %i: %0.2f -
Ich kann deiner Antwort nicht entnehmen ob das ganze funktioniert hat oder nicht, daher frage ich sicherheitshalber mal nach, da der Thread nicht als erledigt markiert wurde.
@Stormi25: