IsPlayerInRangeOfPoint(i, 10.0, x, y, z)
zu:
IsPlayerInRangeOfPoint(i, 30.0, x, y, z)
Dann wäre der Radius 30 Einheiten. Das kannst du beliebig anpassen.
IsPlayerInRangeOfPoint(i, 10.0, x, y, z)
zu:
IsPlayerInRangeOfPoint(i, 30.0, x, y, z)
Dann wäre der Radius 30 Einheiten. Das kannst du beliebig anpassen.
Die Zeit entspricht der Systemzeit des Servers (Windows / Linux).
Eventuell kann dir dein Hoster das umstellen.
Falls nicht, musst du diese Include nutzen:
http://forum.sa-mp.com/showthread.php?t=347605
Dann nimmst du als Timestamp:
gettime() - 3600 * 3;
Nee tatsächlich nicht da die privaten fahrzeuge durchgegangen werden vom spieler
![]()
Ah, stimmt. Im formatierten Code sieht's gleich besser aus, da wird deutlich wie es gemeint war. Dachte du hattest den Code aus dem verlinkten Codeschnipsel-Thread nur kopiert.
Wobei ich das trotzdem wahrscheinlich nicht so machen würde, wegen folgendem Beispiel:
Stell dir vor, zwei Fahrzeuge vom gleichen Spieler stehen Kofferraum an Kofferaum sich gegenüber. Dazwischen der Spieler. Abstand zwischen den beiden Fahrzeugen ist genau der, des Ranges.
Bei deinem Code wird immer das Fahrzeug mit der kleineren ID genommen, deshalb würde ich die Abfrage zum nächsten Fahrzeug zusätzlich drin lassen.
Ist zwar recht unwahrscheinlich, dass genau die Konstellation vorkommt, aber aus Erfahrung weiß ich von meinem damaligen Server, es gibt nichts was nicht passieren kann ![]()
===
EDIT: @IPrototypeI
Haha jo xDD ![]()
Das "nativechecker" Plugin muss in der server.cfg an letzter Stelle bei "plugins" stehen, sonst werden die nachfolgenden Plugins nicht erkannt.
^
Hast du es auch im SA-MP Server Ordner?
Falls ja, installiere dieses All-In-One-Paket:
All in One Runtimes - Download - CHIP
Serverlog wenn nativechecker am Ende steht:
Du benötigst dieses Plugin:
forum.sa-mp.com/showthread.php?t=92246
^
Bitte lese meine Posts auch bevor du darauf antwortest.
Das "nativechecker" Plugin muss in der server.cfg an letzter Stelle bei "plugins" stehen, sonst werden die nachfolgenden Plugins nicht erkannt.
^
Versuche es so:
stock GetPlayerNearestCarID(playerid,Float:radius)
{
new Float:vx,Float:vy,Float:vz,Float:tmp,Float:min = radius,carid = INVALID_VEHICLE_ID;
for(new v = 1; v <= MAX_VEHICLES; v++)
{
GetVehiclePos(v,vx,vy,vz);
tmp = GetPlayerDistanceFromPoint(playerid,vx,vy,vz);
if(tmp < min)
{
carid = v;
min = tmp;
}
}
return carid;
}
Falls das nicht klappt, erhöhe den Radius etwas, von 5 auf 10 oder so.
Du benötigst dieses Plugin:
http://forum.sa-mp.com/showthread.php?t=92246
Das "nativechecker" Plugin muss in der server.cfg an letzter Stelle bei "plugins" stehen, sonst werden die nachfolgenden Plugins nicht erkannt.
Wie sieht deine GetPlayerNearestCarID Funktion aus?
Anstatt
format(str, sizeof(str), "%s hat den Spieler %s gebannt.", name1, name2);
halt
format(str, sizeof(str), "%s hat dem Spieler %s $%d gegeben.", name1, name2, strval(inputtext));
Natürlich im OnDialogResponse von dem DIALOG_GELDGEBEN Dialog.
Versuche dich mal am Rest selbst, ich habe dir jetzt alle Dialoge so fertig gestellt, dass du den Code nur an die richtige Stelle kopieren musst. Das dürfte machbar sein.
Sollten dort Fehler auftreten, poste bitte deinen Code, dann kann dir daran geholfen werden.
Probiere das bitte aus, sonst lernst du nichts dabei. Am besten zuerst mit nur einem "Teil".
if(dialogid==DIALOG_ADMINPANEL)
{
if(response)
{
new pID = GetPVarInt(playerid, "clickedplayerid");
new name1[MAX_PLAYER_NAME], name2[MAX_PLAYER_NAME];
GetPlayerName(playerid, name1, MAX_PLAYER_NAME);
GetPlayerName(pID, name2, MAX_PLAYER_NAME);
new str[128];
switch(listitem)
{
case 1:
{
Ban(pID);
format(str, sizeof(str), "%s hat den Spieler %s gebannt.", name1, name2);
SaveToFile("BanLog", str);
return 1;
}
//...weitere listitems
}
}
}
Hier als Beispiel für das Ban Listitem:
new clickedplayerid = GetPVarInt(playerid, "clickedplayerid");
new name1[MAX_PLAYER_NAME], name2[MAX_PLAYER_NAME];
GetPlayerName(playerid, name1, MAX_PLAYER_NAME);
GetPlayerName(clickedplayerid, name2, MAX_PLAYER_NAME);
new str[128];
format(str, sizeof(str), "%s hat den Spieler %s gebannt.", name1, name2);
SaveToFile("BanLog", str);
Und das ganz unten im Gamemode:
forward SaveToFile(filename[],text[]);
public SaveToFile(filename[],text[])
{
new h, m, s, d, mo, y;
gettime(h, m, s); getdate(y, mo, d);
new File:wFile, filepath[256], string[256];
format(filepath,sizeof(filepath),"%s.txt",filename);
wFile = fopen(filepath,io_append);
format(string,sizeof(string),"(%02d.%02d.%d %02d:%02d:%02d) %s\r\n", d, mo, y, h, m, s, text);
fwrite(wFile,string);
fclose(wFile);
print(string);
return 1;
}Analog für die anderen natürlich.
Klar.
Bei OnPlayerClickPlayer:
new h, m, s, d, mo, y;
gettime(h, m, s); getdate(y, mo, d);
new name1[MAX_PLAYER_NAME], name2[MAX_PLAYER_NAME];
GetPlayerName(playerid, name1, MAX_PLAYER_NAME);
GetPlayerName(clickedplayerid, name2, MAX_PLAYER_NAME);
printf("%s hat das Adminpanel bei dem Spieler %s geöffnet (%02d.%02d.%d %02d:%02d:%02d)", name1, name2, d, mo, y, h, m, s);
So müsste es klappen
Da fehlt aber die Abfrage ob dem Spieler das Fahrzeug gehört.
Ich würde es so vorschlagen:
new vehicleid = GetPlayerNearestCarID(playerid,5);
for(new slot = 0;slot<MAX_PLAYER_VEHICLES;slot++)
{
if(IsValidVehicle(PrivateVehicle[playerid][slot][vehID]))
{
if(vehicleid == PrivateVehicle[playerid][slot][vehID])
{
if(!IsPlayerBehindVehicle(playerid,PrivateVehicle[playerid][slot][vehID]))return SendClientMessage(playerid, COLOR_GREY, "Du befindest dich nicht am Kofferraum des Fahrzeuges.");
ShowPlayerDialog(playerid, DIALOG_TRUNK, DIALOG_STYLE_LIST, "Kofferraum", "Gegenstände einlagern\nGegenstände auslagern\nKofferraum Inhalt überprüfen", "Auswählen", "Schließen");
SetVehicleParamsEx(PrivateVehicle[playerid][slot][vehID],engine,lights,alarm,doors,bonnet,VEHICLE_PARAMS_ON,objective);
SendClientMessage(playerid, -1, "Privatcar");
return 1;
}
}
}
Du musst die angegebenen Codes jeweils mit dem drunterstehenden ersetzen.
Über das "GetPVarInt" weißt du dann an beliebiger Stelle, welche ID der Spieler angeklickt hatte (z.B. in OnDialogResponse von DIALOG_SetArmour).
Dann bricht dein Code bei ID 1 ab..da hier wanted[i.][0] auf 0 bleibt...
Nein, der Code bricht beim ersten Nuller ab, da das Array aber sortiert wurde, kommt nach dem ersten Nuller kein Wanted-Wert mehr, somit muss auch nichts mehr ausgegeben werden, alle Spieler mit 0 Wanted haben ja kein Wanted.
@IPrototypeI
Möp ![]()
Ich nehme alles zurück und behaupte das Gegenteil.
Ändere
new pID=clickedplayerid;
zu:
SetPVarInt(playerid, "clickedplayerid", clickedplayerid);
Und:
if(!PlayerInfo[playerid][pAdmin] >= 2)
zu:
if(PlayerInfo[playerid][pAdmin] < 2)
Die angeklickte ID bekommst du dann im Listitem über
printf("Es wurde ID %d zuvor angeklickt.", GetPVarInt(playerid, "clickedplayerid"));
Wäre natürlich sinnvoll das auch im Start Post zu dokumentieren. Danke für die Info.
Ohne Negation dann:
new wanted[MAX_PLAYERS][2], str[512], name[MAX_PLAYER_NAME];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) continue;
wanted[i][0] = PlayerInfo[i][pWanted];
wanted[i][1] = i;
}
SortDeepArray(wanted, 0, .order = SORT_DESC);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(wanted[i][0] <= 0) break;
GetPlayerName(wanted[i][1], name, MAX_PLAYER_NAME];
format(str, sizeof(str), "%s%s (%d)\n", str, name, wanted[i][0]);
}
ShowPlayerDialog(playerid, DIALOG_WANTED, DIALOG_STYLE_LIST, "Wanteds", str, "Ok", "Abbrechen");
Aber wie bekomm ich die spieler so sortiert, dass die mit den meisten wanteds ganz oben sind?
new wanted[MAX_PLAYERS][2], str[512], name[MAX_PLAYER_NAME];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) continue;
wanted[i][0] = PlayerInfo[i][pWanted] * -1; //Negation, damit der höchste Wert am Anfang kommt (es wird von kleinstem zu größtem sortiert)
wanted[i][1] = i;
}
SortDeepArray(wanted, 0);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(wanted[i][0] >= 0) break; //>= 0 entspricht keinem Wanted, da wir es ja zuvor negiert haben
GetPlayerName(wanted[i][1], name, MAX_PLAYER_NAME];
format(str, sizeof(str), "%s%s (%d)\n", str, name, PlayerInfo[wanted[i][1]][pWanted]);
}
ShowPlayerDialog(playerid, DIALOG_WANTED, DIALOG_STYLE_LIST, "Wanteds", str, "Ok", "Abbrechen");
SortDeepArray:
http://forum.sa-mp.com/showthread.php?t=343172