Mit dem Inhalt kann ich nichts anfangen.
Damit fange ich leider auch nichts an, das sind ja nur irgendwelche Werte.
Das crashdetect Plugin gibt dir nichts aus?
Was ist, wenn du das "x" drückst, um die Konsole zu schließen?
Mit dem Inhalt kann ich nichts anfangen.
Damit fange ich leider auch nichts an, das sind ja nur irgendwelche Werte.
Das crashdetect Plugin gibt dir nichts aus?
Was ist, wenn du das "x" drückst, um die Konsole zu schließen?
Da sollte das eigentlich nicht mehr vorkommen.
Gibt dir das crashdetect Plugin etwas aus, wenn der Server abstürzt? Du machst einen "/gmx" oder?
Welche MySQL Plugin Version nutzt du?
Postfuhr_Stationen[p][p_benutzt[playerid]] = 1;
zu:
Postfuhr_Stationen[p][p_benutzt][playerid] = 1;
Schaut so aus @Jeffry , aber das Problem ist immer noch vorhanden
Versuche es so:
public OnPlayerSpawn(playerid)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(specID[i] == playerid)
{
if(!IsPlayerInAnyVehicle(playerid))
{
TogglePlayerSpectating(i,1);
PlayerSpectatePlayer(i,playerid);
SetPlayerInterior(i,GetPlayerInterior(playerid));
SetPlayerVirtualWorld(i,GetPlayerVirtualWorld(playerid));
}
else
{
TogglePlayerSpectating(i,1);
PlayerSpectateVehicle(i,GetPlayerVehicleID(playerid));
SetPlayerInterior(i,GetPlayerInterior(playerid));
SetPlayerVirtualWorld(i,GetPlayerVirtualWorld(playerid));
}
}
}
Warum kommt diese Warning-Meldung?
Scheint so, als sei die Verbindung nicht mehr aktiv. Entferne die Zeile mal und schaue, ob der Fehler weiterhin auftritt, oder dann weg ist.
Versuche es so:
stock ChangeVehicle(playerid,vmodell)
{
new Float:pos[4],seed[3],vID = GetPlayerVehicleID(playerid),newveh, engine, lights, alarm, doors, bonnet, boot, objective, bool:pSeatid[0xF],
seatmodel, seatcount, seatx;
seatmodel = GetVehicleModel(vID);
seatcount = GetVehicleSeatCount(seatmodel)+1;
if(!seatmodel) return -1;
if(!IsPlayerInAnyVehicle(playerid))return 1;
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
GetVehicleZAngle(vID,pos[3]);
GetVehicleVelocity(vID,speed[1],speed[2],speed[3]);
DestroyVehicle(vID);
for(new p; p<MAX_PLAYERS; p++)
{
if(!IsPlayerConnected(p) || IsPlayerNPC(p)) continue;
if(GetPlayerVehicleID(p) == vID) pSeatid[GetPlayerVehicleSeat(p)] = true,seatx++;
if(seatx >= seatcount) return -1;
for(new i; i<sizeof pSeatid; i++) if(!pSeatid[i]) return i;
PutPlayerInVehicle(p,newveh,pSeatid[i]);
return -1;
newveh = CreateVehicle(vmodell,pos[0],pos[1],pos[2]+0.5,pos[3],1,1,-1);
PutPlayerInVehicle(playerid,newveh,0);
SetVehicleVelocity(newveh,speed[0],speed[1],speed[2]);
GetVehicleParamsEx(newveh, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(newveh, 1, lights, alarm, doors, bonnet, boot, objective);
}
return 1;
}
stock ChangeVehicle(playerid,vmodell)//@Jeffry
{
new Float:pos[4],seed[3],vID = GetPlayerVehicleID(playerid),newveh, engine, lights, alarm, doors, bonnet, boot, objective, seat[MAX_PLAYERS] = {-1, ...};
new seatcount = GetVehicleSeatCount(GetVehicleModel(vID));
if(!IsPlayerInAnyVehicle(playerid))return 1;
GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
GetVehicleZAngle(vID,pos[3]);
GetVehicleVelocity(vID,speed[1],speed[2],speed[3]);
DestroyVehicle(vID);
for(new i = 0; i < MAX_PLAYERS; i++) if(GetPlayerVehicleID(i) == vID) seat[i] = GetPlayerVehicleSeat(i);
newveh = CreateVehicle(vmodell,pos[0],pos[1],pos[2]+0.5,pos[3],1,1,-1);
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(seat[i] != -1)
{
if(seat[i] < seatcount) PutPlayerInVehicle(i, newveh, seat[i]);
else SetPlayerPos(i,pos[0],pos[1],pos[2]);
}
}
PutPlayerInVehicle(playerid,newveh,0);
SetVehicleVelocity(newveh,speed[0],speed[1],speed[2]);
GetVehicleParamsEx(newveh, engine, lights, alarm, doors, bonnet, boot, objective);
SetVehicleParamsEx(newveh, 1, lights, alarm, doors, bonnet, boot, objective);
return 1;
}
Doch, da musst du den spectate Modus neu starten, also entsprechende Teile aus dem Befehl einfügen.
Wenn ich es richtig sehe, dann reicht der Untere Abschnitt, also das mit PlayerSpectatePlayer.
Den kannst du fast so lassen, den Code von mir fügst du vor (das vor dem Kommentar) und nach (das nach dem Kommentar) deiner CreateVehicle Zeile ein.
Dann unter den Includes:
new specID[MAX_PLAYERS] = {-1, ...};
Im Befehl:
specID[playerid] = playerID;
Beim beenden:
specID[playerid] = -1;
Und bei OnPlayerSpawn:
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(specID[i] == playerid)
{
//Spectate für "i" neu starten, auf "playerid".
}
}
Das kannst du so machen:
new seat[MAX_PLAYERS] = {-1, ...};
for(new i = 0; i < MAX_PLAYERS; i++) if(GetPlayerVehicleID(i) == vID) seat[i] = GetPlayerVehicleSeat(i);
//Fahrzeug neu erstellen...
for(new i = 0; i < MAX_PLAYERS; i++) if(seat[i] != -1) PutPlayerInVehicle(i, newveh, seat[i]);
Beachte aber, dass das neue Fahrzeug nicht weniger Sitze haben sollte, als das vorherige (Bus -> Motorrad), wenn mehr Sitze belegt sind, als dass neue Fahrzeug hat.
Du bist aber noch im spectate Modus, oder? Wenn ja, dann ist das ein bekannter Fehler. Ich habe den bei mir auf dem Server damals so umgangen, dass ich den spectate Modus automatisch neu gestartet habe, wenn der gestorbene Spieler wieder gespawnt ist (OnPlayerSpawn).
(oder die BLOWFISH Verschlüsselung von Crypt)
Möglicherweise das hier, der Beschreibung nach: http://forum.sa-mp.com/showthread.php?t=271230
Error Zeile bei SV_Name
Das geht so nicht, du kannst im enum keinen Wert zuweisen.
Das musst du zum Beispiel bei OnGameModeInit dann machen, über die Variable für die das enum ServerInfo steht.
Oder du nutzt defindes:
#define SERVER_NAME "Mein Server"
Versuche es mit dieser Version:
http://forum.sa-mp.com/showthread.php?t=570927
Hast du das sscanf Plugin in deiner server.cfg eingetragen?
Poste bitte mal mehr vom Log, vom Start des Servers an.
Du darfst den Index (idx) auch nur im Index (das was zwischen [ ] steht) von VehicleInfo nutzen, nicht als vehicleid.
vehicleid != Index
GetVehicleParamsEx(idx, engine, lights, alarm, doors, bonnet, boot, objective);
zu:
GetVehicleParamsEx(vID, engine, lights, alarm, doors, bonnet, boot, objective);
Gleiches beim Set... .
Soll ich idx durch i ersetzen oder den stock benutzen den du mir erstellt hast?
Ersetze es durch "i".
Das hier soll ich dann durch GetVehiclePos(vID, VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]); im public TachoTimer ersetzen?
Fehler: Sobald ich in ein Fahrzeug einsteige wird der Kilometerstand automatisch hochgezählt.
Da bin ich mit den Variablen durcheinander gekommen.
Nutze
GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
Diese Werte müssen aktualisiert werden.
Mit idx, ja.
Soll ich im Befehl den Index von vID zu idx ersetzen?
Ja, für die Indexe ([vID]) jeweils.
Ist "sql10" auch die richtige Datenbank, also heißt deine Datenbank so?
Ansonsten benenne mal die Tabellen um zu "Tor" und "TimeBan" also von den Großbuchstaben her. Das MySQL Plugin hat da zum Teil (nicht immer) Probleme, ich hatte das schon mit "id" und "ID", dass es das nicht genommen hat.
Die Tabellen "Tor" und "TimeBan" existieren in deiner Datenbank "sql10" nicht.
Möglicherweise wurden sie nicht exportiert, oder nicht mehr importiert.
Das Problem ist, dass du auf den Index von VehicleInfo mit der vehicleid drauf zu greifst, das geht aber nicht, da die vehicleid nicht der Index-ID entspricht.
Erstelle dazu eine folgende Funktion, um aus der vehicleid den Index zu bekommen:
stock getVehIndex(vehicleid)
{
for(new i = 0; i < sizeof(VehicleInfo); i++)
{
if(VehicleInfo[i][v_Objekt] == vehicleid)
{
return i;
}
}
return -1;
}
Dann kannst du die TachoTimer Funktion so schreiben:
forward TachoTimer();
public TachoTimer()
{
for(new i=0; i < MAX_PLAYERS; i++)
{
new vID = GetPlayerVehicleID(i);
if(!IsPlayerConnected(i) || PlayerInfo[i][p_LoggedIn] != true)continue;
if(!IsPlayerInAnyVehicle(i))continue;
new idx = getVehIndex(vID);
if(idx == -1) continue;
new tacho[256], Float:hp;
GetVehicleHealth(vID, hp);
VehicleInfo[idx][v_Kilometer] += e_GetDistance(vID);
format(tacho, sizeof(tacho), "%s~n~Geschwindigkeit: %dkm/h~n~Kilometerstand: %d.%dkm~n~Treibstoff: %dl~n~Schaden: %0.2f", VehicleNames[GetVehicleModel(vID)-400], GetPlayerSpeed(i), VehicleInfo[idx][v_Kilometer]/1000, VehicleInfo[idx][v_Kilometer]%1000, VehicleInfo[idx][v_Tank], hp);
PlayerTextDrawSetString(i, Tacho[i][0], tacho);
if(VehicleEngineOn(vID))PlayerTextDrawSetString(i, Tacho[i][2], "~g~Motor");
else PlayerTextDrawSetString(i, Tacho[i][2], "~w~Motor");
if(VehicleLightsOn(vID))PlayerTextDrawSetString(i, Tacho[i][3], "~g~Licht");
else PlayerTextDrawSetString(i, Tacho[i][3], "~w~Licht");
if(VehicleDoorLocked(vID))PlayerTextDrawSetString(i, Tacho[i][4], "~g~Tueren");
else PlayerTextDrawSetString(i, Tacho[i][4], "~w~Tueren");
GetVehiclePos(vID, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
}
return 1;
}
Zu dem anderen Problem:
Da musst du die e_GetDistance Funktion ebenfalls abändern. Und zwar zu:
stock e_GetDistance(vehicleid)
{
new Float:x2, Float:y2, Float:z2, Float:value, idx = getVehIndex(vehicleid);
if(idx == -1) return 0;
GetVehiclePos(vehicleid, x2, y2, z2);
value = floatsqroot(floatpower(floatabs(floatsub(x2, VehicleInfo[idx][v_KMX])), 2)+floatpower(floatabs(floatsub(y2, VehicleInfo[idx][v_KMY])), 2)+floatpower(floatabs(floatsub(z2, VehicleInfo[idx][v_KMZ])), 2));
return floatround(value);
}
Zudem musst du dann beim Laden der Fahrzeuge den Wert von diesen Variablen
VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]
auf den Wert von
VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]
setzen, damit nicht der Null-Punkt als Berechnungsstart genommen wird.
Dann musst du außerdem, wenn die Distanz dazu gerechnet wurde, also in der Funktion zur Positionsberechnung, oder dort wo es der Variable hinzugefügt wird (je nach dem wie der Rest deines Systems aussieht) die Koordinaten aktualisieren, sprich:
GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
Damit diese neue Position als neuer Berechnungsstart genommen wird.