Lade dir hier die neuste Version herunter und füge deine Daten dort ein:
http://sa-mp.com/download.php
Ersetze die im neuen Ordner vorhandenen Includes aber nicht.
Lade dir hier die neuste Version herunter und füge deine Daten dort ein:
http://sa-mp.com/download.php
Ersetze die im neuen Ordner vorhandenen Includes aber nicht.
Unter den Includes:
new bool:hitSound[MAX_PLAYERS];
OnPlayerConnect:
hitSound[playerid] = false;
OnPlayerCommandText:
if(!strcmp(cmdtext, "/toghitsound", true))
{
hitSound[playerid] = !hitSound[playerid];
if(hitSound[playerid]) SendClientMessage(playerid, 0xFFFFFFFF, "Hitsound ist an.");
else SendClientMessage(playerid, 0xFFFFFFFF, "Hitsound ist aus.");
return 1;
}
Und das Callback für den Ton:
public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid, bodypart)
{
if(issuerid != INVALID_PLAYER_ID)
{
if(hitSound[issuerid])
{
//Ton für issuerid spielen
}
}
return 1;
}
Ah, bei dir war das, dass es doppelt aufgerufen wird.
Dann sollte es so passen:
stock MedicalSpawn(playerid)
{
static lastSpawn[MAX_PLAYERS];
new h,m,s,str[168],t;
new Float:x,Float:y,Float:z;
GetPlayerPos(playerid,x,y,z);
t = gettime(h,m,s);
if(lastSpawn[playerid]+1 < t)
{
lastSpawn[playerid] = t;
PickupInfo[playerid][pu_x] = x;
PickupInfo[playerid][pu_y] = y;
PickupInfo[playerid][pu_z] = z;
PickupInfo[playerid][pu_hour] = h;
PickupInfo[playerid][pu_minute] = m;
PickupInfo[playerid][pu_seconds] = s;
PickupInfo[playerid][pu_pickup] = CreatePickup(1313,0,PickupInfo[playerid][pu_x],PickupInfo[playerid][pu_y],PickupInfo[playerid][pu_z]);
format(str,sizeof(str),"Deathpoint of %s\nTime of Death: %02d:%02d:%02d\n%i Seconds left until respawn.",getPlayerName(playerid),h,m,s,SpielerInfo[playerid][pDeathtime]);
PickupInfo[playerid][pu_label] = Create3DTextLabel(str,Weiß,PickupInfo[playerid][pu_x],PickupInfo[playerid][pu_y],PickupInfo[playerid][pu_z],15.00,0,0);
if(MedicalTimerID[playerid] != -1) KillTimer(MedicalTimerID[playerid]);
MedicalTimerID[playerid] = SetTimerEx("MedicalTimer",1000,true,"i",playerid);
}
SetSpawnInfo(playerid,0,SpielerInfo[playerid][pSkin],1171.4297, -1323.3737, 15.5000,90.000,0,0,0,0,0,0);
SetPlayerVirtualWorld(playerid,0);
SetPlayerInterior(playerid,0);
SpawnPlayer(playerid);
TogglePlayerControllable(playerid,0);
SetPlayerCameraPos(playerid, 1233.3835, -1325.5378, 28.5698);
SetPlayerCameraLookAt(playerid, 1232.3846, -1325.5327, 28.4548);
return 1;
}
Du musst es vor dem SpawnPlayer erstellen und die Position auslesen, sonst ist er ja schon bei der neuen Position.
Versuche es ohne den leeren Platzhalter:
format(string2,sizeof(string2),"%s\t%d Tonnen\t%s\t%s\n%s",FrachtInfo[i][fracht_name],FrachtInfo[i][fracht_gewicht],FabrikInfo[RandomStartFabrik][uName],FabrikInfo[RandomZielFabrik][uName]);
Zu
format(string2,sizeof(string2),"%s\t%d Tonnen\t%s\t%s\n",FrachtInfo[i][fracht_name],FrachtInfo[i][fracht_gewicht],FabrikInfo[RandomStartFabrik][uName],FabrikInfo[RandomZielFabrik][uName]);
Auf deinem Screenshot ist es doch 16:51 Uhr und nicht 10 Uhr, oder nicht?
Rechts oben im Radar ist die Uhrzeit die er meint. Ist relativ schlecht zu erkennen, habe auch ne Weile gesucht bis ich sie gesehen habe.
Die Zeit vor dem Chat ist abhängig von der Uhrzeit des PCs.
Füg es doch direkt mit in der Spielerspalte ein statt unnötige weitere Einträge in der SQL Datenbank anzulegen.
Das ist eine schlechte Idee, vor allem für Auswertungen und wenn man mal eine IP sperren will, die mit keinem Spieler verbunden ist.
Und du hast bei Zeit nur gettime stehen. Statt die Anzahl umgerechnet dazu zu rechnen. Das kann nicht funktionieren also selbst wenn er dein Wert richtig gesetzt hätte.
Das war in dem Fall egal, da der Parameter im format nicht genutz wurde, da er direkt im Wert "Permanent" eingetragen hat, so gab es keinen fünften Platzhalter, in den gettime gefüllt werden würde.
Versuche es so:
ocmd:ban(playerid,params[])
{
new pID, reason[20], string[145], query[256];
if(!isPlayerAnAdmin(playerid,2))return SendClientMessage(playerid,COLOR_RED,"Du bist kein Teammitglied./Du hast nicht den jeweiligen Adminrang.");
if(sscanf(params,"us",pID,reason))return SendClientMessage(playerid, COLOR_RED,"{FFD200}Benutze:{FEFEFE}/Ban [ID] [Grund]");
format(string, sizeof(string), "* Du wurdest vom Administrator %s vom Server gebannt. Grund: %s", PlayerName(playerid), reason);
SendClientMessage(playerid, COLOR_RED, string);
format(query, sizeof(query), "INSERT INTO `bans` (`ban`,`IP`,`name`,`grund`,von,zeit) VALUES ('1','%s','%s','%s','%s','Permanent')",SpielerIP(pID),PlayerName(pID),reason,PlayerName(playerid));
mysql_query(query);
Kick(pID);
return 1;
}
Ich habe die Query-Länge angepasst, die war etwas kurz, und den "ban" Wert direkt im INSERT Query auf 1 gesetzt, das ist besser.
Das Problem war, dass du bei sscanf bei cmdtext eine 10 hattest, anstatt einer 8.
Das ganze mit strtok kannst du weg lassen, das bringt nichts.
Mache es so:
if(strcmp(cmdtext, "/lrampe", true, 7) == 0)
{
if(strlen(cmdtext) == 7) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: {FAFAFA}/rampeweg [Slot]");
else if(cmdtext[7] == ' ')
{
new i;
if(sscanf(cmdtext[8], "d", i)) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: {FAFAFA}/rampeweg [Slot]");
if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Es gibt nur rampen 0-150!");
if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Diese rampe existiert nicht!");
new Float:x, Float:y, Float:z;
GetObjectPos(rampeID[moneys], x, y, z);
if(!IsPlayerInRangeOfPoint(playerid, 4, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist nicht in der Nähe der rampe!");
DestroyObject(rampeID[i]);
rampeID[i] = -1;
rampeTime[i] = 0;
new str[145];
Delete3DTextLabel(rampeLabel[i]);
format(str, sizeof(str), "{FAFAFA}Du hast rampe {FF6400}%d{FAFAFA} entfernt!)",i);
SendClientMessage(playerid, 0xFF0000FF,str);
return 1;
}
}
Das ergibt eh kein Sinn, wenn 9 Zeichen vorhanden sind soll die Meldungkommen /rampeweg Slot ?
Wenn man nur den Befehl eingibt, ohne Parameter, dann soll die Info-Nachricht kommen. Das ist korrekt so.
Ich könnte vermuten, dass die Uhrzeit des Servers nicht stimmt.
Schau mal im Server Log, ob die Zeit da auch falsch ist. Wenn ja, dann wende dich an deinen Host, damit der dir sie Uhrzeit des Servers umstellt.
Kannst du beide Befehle mal komplett posten, der der geht und der der nicht geht?
Zu deiner Frage 1:
Dazu musst du in deinem Spieler-Enum folgende Werte hinzufügen:
Float:oldPosX,
Float:oldPosY,
Float:oldPosZ,
Float:oldPosA,
oldPosI,
Dann musst du bei OnPlayerDisconnect die Position abfragen:
GetPlayerPos(playerid, SpielerInfo[playerid][oldPosX], SpielerInfo[playerid][oldPosY], SpielerInfo[playerid][oldPosZ]);
GetPlayerFacingAngle(playerid, SpielerInfo[playerid][oldPosA]);
SpielerInfo[playerid][oldPosI] = GetPlayerInterior(playerid);
Und diese Werte musst du dann mit dem Speichersystem deiner Wahl (MySQL, SQLite, dini, ...) entsprechend, wie die anderen Stats auch, speichern.
Dann kannst du beim Login oder gegebenenfalls bei OnPlayerSpawn (je nach Aufbau), die Spielerposition wieder setzen, nachdem du die Daten, wie die anderen Stats auch, geladen hast.
SetPlayerPos(playerid, SpielerInfo[playerid][oldPosX], SpielerInfo[playerid][oldPosY], SpielerInfo[playerid][oldPosZ]);
SetPlayerFacingAngle(playerid, SpielerInfo[playerid][oldPosA]);
SetPlayerInterior(playerid,SpielerInfo[playerid][oldPosI]);
Gegebenenfalls (wieder je nach System) musst du noch eine Variable anlegen, um zu definieren, ob der Spieler das erste mal spawnt, damit er nur dann zu den Koordinaten gespawnt wird.
Zu Frage 2:
Das würde ich dir nicht empfehlen, denn es kann ziemlich schnell sein, dass du 2000 registrierte Spieler hast. Hat dann nur jeder Spieler ein Fahrzeug, dann hast du bereits das Limit an Fahrzeugen erreicht, die gleichzeitig erstellt sein können, sprich der 2001ste Nutzer kann dann kein Fahrzeug mehr erstellen.
if(IsPlayerInRangeOfPoint(playerid,6,Blitzer[ii][BlitzX],Blitzer[ii][BlitzY],Blitzer[ii][BlitzZ])&&GetPlayerState(playerid) == PLAYER_STATE_DRIVER&&!IsACop(playerid)&&!IsAFW(playerid)&&!IsAMedic(playerid)&&!IsANoTachoVehicle(playerid)&&AdminDuty[playerid] == 1)
Hast du dir die Werte der Variablen und von GetName mal per Print ausgeben lassen?
Dem Code nach sollte das nämlich so passen. Vielleicht stehst du ja doch irgendwo als Besitzer oder Inhaber drin.
Die Version des MySQL Plugins, die du nutzt, ist zu neu.
Versuche es mit dem R5, ich habe das hier mal angehängt: MySQL (Installation, Zugriff, Einstellungen, Login & Register Beispiel)
Lade dir das crashdetect Plugin herunter und füge es in deinen Server ein. Dann poste was im Server Log steht, wenn du den Server startest.
http://forum.sa-mp.com/showthread.php?t=262796
Versuche es so:
if(strcmp(cmdtext, "/entfernen", true, 10) == 0)
{
if(strlen(cmdtext) == 10) return SendClientMessage(playerid, 0xFF0000FF, "Benutze: /entfernen [ID]");
else if(cmdtext[10] == ' ')
{
new i = strval(cmdtext[11]);
if(i < 0 || i >= sizeof(rampeID)) return SendClientMessage(playerid, 0xFF0000FF, "Es gibt nur Objekte von 1-20");
if(rampeID[i] == -1) return SendClientMessage(playerid, 0xFF0000FF, "Dieses Objekt existiert nicht!");
GetObjectPos(rampeID[i], x, y, z);
if(!IsPlayerInRangeOfPoint(playerid, 4, x, y, z)) return SendClientMessage(playerid, 0xFF0000FF, "Du bist nicht in der Nähe des objects");
DestroyObject(rampeID[i]);
rampeID[i] = -1;
rampeTime[i] = 0;
new str[32];
format(str, sizeof(str), "%d entfernt",i);
SendClientMessage(playerid, 0xFF0000FF,str);
return 1;
}
}
Versuche es so:
stock IsPlayerBizMember(playerid)
{
for(new i=0; i < MAX_BUSINESS; i++)
{
if(Business[i][b_x] == 0.0 && Business[i][b_y] == 0.0 && Business[i][b_z] == 0.0)continue;
if(!strlen(Business[i][b_besitzer]))continue;
if(!strcmp(GetName(playerid), Business[i][b_besitzer], true))return 1;
if(!strlen(Business[i][b_inteilhaber]))continue;
if(!strcmp(GetName(playerid), Business[i][b_inteilhaber], true))return 1;
}
return 0;
}