Hey alle zusammen,
Wie mindestens 25% von ech schon mitbekommen haben sollten, wird Kalcor keine Bugfixes für den SA:MP-Server herausgeben, wenn sich der Bug auch irgendwie im Script fixen lässt. Ich habe mir jetzt 6 Bugs herausgesucht, die ich noch aus alten Zeiten in Erinnerung habe oder die neu sind und habe eine "Bugfix-Include" geschrieben
** by Tion
*/
// wenn ihr dem Spieler eine Nachricht sendet und ihn dann kickt, wird er zuerst gekickt
// Bug 2: Driver-Change
// wenn ihr jemanden als Fahrer in ein Fahrzeug setzt, obwohl es schon einen Fahrer hat,
// kann der alte Fahrer den neuen nicht im Auto sehen
// Bug 3: g-Bug
// Wenn man in ein Auto einteigt und es fährt weg, wird man reingeportet
// Bug 4: Sniper in Hydra
// Wenn man mit einer Waffe in eine Hydra oder einen Hunter geht und in die FPV geht
// bekommt man das Visier der Waffe zu sehen ( geht nur bei einigen und mach mal )
// Bug 5:
// Wenn man in einem Auto "sitzt", obwohl es zerstört wurde, dann nach links oder rechts
// guckt crasht das Game. Passiert auch nur manchmal
// Bug 6:
// Wenn man in einem Auto stirbt sehen alle, dass man auf dem Auto stirbt, nur mal selber
// sieht sich in dem Auto sterben | nur halb "gefixt"
// Bug 7:
// Steigt man als Fahrer aus während einer der Beifahrer auf dem Desktop ist, wird das
// Auto zu der alten Position des Beifahrers geportet - danke an mbcool
new bool:SF_desktop[MAX_PLAYERS] = false;
new SF_lastvehicle[MAX_PLAYERS];
enum SF_ePortVeh {
SF_vid,
Float:SF_x,
Float:SF_y,
Float:SF_z,
Float:SF_rot
}
new SF_portVeh[SF_ePortVeh];
forward SF_Kick(playerid);
public SF_Kick(playerid) {
Kick(playerid);
}
public SF_PutPlayerInVehicle(playerid, vehicleid, seat) {
// b3
SF_VehicleEnterPosition[playerid][0] = 0;
SF_VehicleEnterPosition[playerid][1] = 0;
SF_VehicleEnterPosition[playerid][2] = 0;
// b2
if(seat != 0) return PutPlayerInVehicle(playerid, vehicleid, seat);
for(new i = 0; i < MAX_PLAYERS; i++) {
if(!IsPlayerConnected(i) || !IsPlayerInVehicle(i, vehicleid) || GetPlayerVehicleSeat(i) != 0) continue;
RemovePlayerFromVehicle(i);
break;
}
return PutPlayerInVehicle(playerid, vehicleid, seat);
}
// b7
SF_lastvehicle[playerid] = vehicleid;
// b3
if(ispassenger)
GetPlayerPos(playerid, SF_VehicleEnterPosition[playerid][0], SF_VehicleEnterPosition[playerid][1], SF_VehicleEnterPosition[playerid][2]);
return CallLocalFunction("SF_OnPlayerEnterVehicle", "iii", playerid, vehicleid, ispassenger);
}
// b7
if(newstate == PLAYER_STATE_DRIVER && GetPlayerVehicleID(playerid) == SF_portVeh[SF_vid]) SF_portVeh[SF_vid] = -1;
// b3
if(newstate == PLAYER_STATE_DRIVER && SF_VehicleEnterPosition[playerid][0] != 0 && SF_VehicleEnterPosition[playerid][1] != 0 && SF_VehicleEnterPosition[playerid][2] != 0 && GetPlayerVehicleSeat(playerid) != 0) { // Er sitzt im Auto
if(GetVehicleDistanceFromPoint(GetPlayerVehicleID(playerid), SF_VehicleEnterPosition[playerid][0], SF_VehicleEnterPosition[playerid][1], SF_VehicleEnterPosition[playerid][2]) >= 3) {
RemovePlayerFromVehicle(playerid);
SetPlayerPos(playerid, SF_VehicleEnterPosition[playerid][0], SF_VehicleEnterPosition[playerid][1], SF_VehicleEnterPosition[playerid][2]);
}
}
// b4
new model = GetVehicleModel(GetPlayerVehicleID(playerid));
if(model == 520 || model == 425) SetPlayerArmedWeapon(playerid, 0);
// b7
if(oldstate == PLAYER_STATE_DRIVER) {
for(new i = 0; i < MAX_PLAYERS; i++) {
if(IsPlayerInAnyVehicle(i) && GetPlayerVehicleID(i) == SF_lastvehicle[playerid] && SF_desktop[i]) {
GetVehiclePos(SF_lastvehicle[playerid], SF_portVeh[SF_x], SF_portVeh[SF_y], SF_portVeh[SF_z]);
GetVehicleZAngle(SF_lastvehicle[playerid], SF_portVeh[SF_rot]);
SF_portVeh[SF_vid] = SF_lastvehicle[playerid];
break;
}
}
}
return CallLocalFunction("SF_OnPlayerStateChange", "iii", playerid, newstate, oldstate);
}
public SF_DestroyVehicle(vid) {
// b5
for(new i = 0; i < MAX_PLAYERS; i++)
if(IsPlayerInVehicle(i, vid)) RemovePlayerFromVehicle(i);
DestroyVehicle(vid);
}
// b5 + b6
for(new i = 0; i < MAX_PLAYERS; i++)
if(IsPlayerInVehicle(i, vehicleid)) RemovePlayerFromVehicle(i);
}
SetTimer("SF_SecondTimer", 1000, true);
CallLocalFunction("SF_OnGameModeInit", "");
}
public SF_SecondTimer() {
// b7
for(new i = 0; i < MAX_PLAYERS; i++) {
if(IsPlayerInAnyVehicle(i) && GetPlayerVehicleID(i) == SF_portVeh[SF_vid] && GetPlayerVehicleSeat(i) != 0 && SF_desktop[i] == true) {
SetVehiclePos(SF_portVeh[SF_vid], SF_portVeh[SF_x], SF_portVeh[SF_y], SF_portVeh[SF_z]);
SetVehicleZAngle(SF_portVeh[SF_vid], SF_portVeh[SF_rot]);
SF_portVeh[SF_vid] = -1;
}
SF_desktop[i] = true;
}
}
// b7
SF_desktop[playerid] = false;
return CallLocalFunction("SF_OnPlayerUpdate", "i", playerid);
}
#undef OnPlayerEnterVehicle
#else
#define _ALS_OnPlayerEnterVehicle
#endif
#undef OnGameModeInit
#else
#define _ALS_OnGameModeInit
#endif
#undef OnPlayerStateChange
#else
#define _ALS_OnPlayerStateChange
#endif
#undef OnPlayerUpdate
#else
#define _ALS_OnPlayerUpdate
#endif
#define Kick(%1) SetTimerEx("SF_Kick", 500, false, "i", %1)
// b2
#define PutPlayerInVehicle SF_PutPlayerInVehicle
// b3
#define PutPlayerInVehicle SF_PutPlayerInVehicle
forward SF_OnPlayerEnterVehicle(playerid, vehicleid, ispassenger);
#define OnPlayerEnterVehicle SF_OnPlayerEnterVehicle
// b3 + b4
forward SF_OnPlayerStateChange(playerid, newstate, oldstate);
#define OnPlayerStateChange SF_OnPlayerStateChange
// b5
#define DestroyVehicle SF_DestroyVehicle
forward SF_OnVehicleDeath(vehicleid, killerid);
#define OnVehicleDeath SF_OnVehicleDeath
// b6
forward SF_OnGameModeInit();
#define OnGameModeInit SF_OnGameModeInit
// b7
forward SF_OnPlayerUpdate(playerid);
#define OnPlayerUpdate SF_OnPlayerUpdate
Bug 1: Kick-Bug
Irgendwan fing der SA:MP-Server an, Packete zu "priorisieren" - bedeutet, die Anweisungen werden unabhängig von der eigentlichen Reihenfolge an den Serber weitergeleitet. Dabei hat das Kick-Packet eine sehr hohe Priorität, überholt also sehr viele andere Packete.
Sendet man dem Spieler jetzt eine Nachricht mit dem Grund, warum er gekickt wurde und kickt ihn danach, wird er zuerst gekickt und danach erhält er die Nachrich (nicht).
Die Include zögert das Kick-Packet etwas hinaus und sendet es 500ms später, so dass sogar Dialoge noch rechtzeitig angezeigt werden, bevor der Client gekickt wird.
Bug 2: Driver-Change
Ab und zu wenn man einen Spieler per "PutPlayerInVehicle" als Fahrer in ein Auto setzt, wird der alte einfach "rausgekickt" ( logisch ), sieht den neuen Fahrer aber nicht im Auto sitzen ( unlogisch ).
Die Include kickt immer zuerst den alten Fahrer raus, bevor der neue reingesetzt wird, so dass dieser bug gar nicht erst entstehen kann.
Bug 3: g-Bug
Steigt man in ein Auto ein und das Auto fährt weg, wird man hinterher geportet, egal wie weit sich das Auto entfernt hat.
Die Include prüft die Distanz beim Einsteigen und wenn man im Auto ist, ist sie zu groß geworden ( -> Auto hat sich zu weit entfernt ) wird man wieder raus geholt.
Bug 4: Sniper in Hydra
Steigt man mit einer Sniper in eine Hydra oder einen Hunter und wechselt in die First-Person sieht man ab und zu das Sniper-Visier.
Das ganze wird umgangen, indem beim Einstieg in die beiden Fahrzeuge die Waffe gewechselt wird.
Bug 5: Crash durch Explosionen ( Spektakulärer Name, darauf sollte ich Copyright beantragen )
Sollte man es schaffen, in einem Auto zu überleben, obwohl das Auto kaputt gegangen ist ( Godmode ) und blickt dann nach rechts oder nach links, crasht das Spiel.
Deshalb werden alle Spieler aus zerstörten Fahrzeugen entfernt.
Bug 6: Sterben auf dem Auto
Stirbt man in einem Auto sieht man sich selber in dem Auto sterben, alle anderen sehen einen aber auf dem Autodach sterben.
Also wird man raus geworfen, wenn man stirbt, dann sehen alle einen an der gleichen Stelle sterben
Bug 7: Desktop-Vehicle-Port ( Since v2, gemeldet von mbcool )
Verlässt man als Fahrer ein Auto während ein Beifahrer an einer anderen Stelle auf dem Desktop gewechselt ist, wird das Auto zu der anderen Stelle zurück geportet.
Die Include portet das Auto beim Zurückkommen vom Desktop wieder an die Stelle, an der das Auto sein müsste
Fehlt was ?
Ich habe einen Bug übersehen, der sich scriptseitig lösen lässt ? Dann meldet euch hier, alle Bugs werden unter Nennung des Authores angehängt und gefixt.
Tion
E01: v0.2
E02: v0.2a
E03: v0.2b