script_fix - SA:MP-Bugs entfernen, Plug&Play

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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 ;)

    Include
    /* Fix-Include - behebt einige "Bugs"
    ** by Tion
    */

    Include
    // Bug 1: Kick
    // 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

    Include
    new Float:SF_VehicleEnterPosition[MAX_PLAYERS][3]; // b3
    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];

    Include
    // b1
    forward SF_Kick(playerid);
    public SF_Kick(playerid) {
    Kick(playerid);
    }

    Include
    forward SF_PutPlayerInVehicle(playerid, vehicleid, seat);
    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);
    }

    Include
    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) {
    // 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);
    }

    Include
    public OnPlayerStateChange(playerid, newstate, oldstate) {
    // 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);
    }

    Include
    forward SF_DestroyVehicle(vid);
    public SF_DestroyVehicle(vid) {
    // b5
    for(new i = 0; i < MAX_PLAYERS; i++)
    if(IsPlayerInVehicle(i, vid)) RemovePlayerFromVehicle(i);

    DestroyVehicle(vid);
    }

    Include
    public OnVehicleDeath(vehicleid, killerid) {
    // b5 + b6
    for(new i = 0; i < MAX_PLAYERS; i++)
    if(IsPlayerInVehicle(i, vehicleid)) RemovePlayerFromVehicle(i);

    Include
    return CallLocalFunction("SF_OnVehicleDeath", "ii", vehicleid, killerid);
    }

    Include
    public OnGameModeInit() {
    SetTimer("SF_SecondTimer", 1000, true);
    CallLocalFunction("SF_OnGameModeInit", "");
    }

    Include
    forward SF_SecondTimer();
    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;
    }
    }

    Include
    public OnPlayerUpdate(playerid) {
    // b7
    SF_desktop[playerid] = false;
    return CallLocalFunction("SF_OnPlayerUpdate", "i", playerid);
    }

    Include
    #if defined _ALS_OnPlayerEnterVehicle
    #undef OnPlayerEnterVehicle
    #else
    #define _ALS_OnPlayerEnterVehicle
    #endif

    Include
    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif

    Include
    #if defined _ALS_OnPlayerStateChange
    #undef OnPlayerStateChange
    #else
    #define _ALS_OnPlayerStateChange
    #endif

    Include
    #if defined _ALS_OnPlayerUpdate
    #undef OnPlayerUpdate
    #else
    #define _ALS_OnPlayerUpdate
    #endif

    Include
    // b1
    #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
    Die Include einfach als "script_fix.inc" in eurem pawno/includes-Ordner speichern und in eurem Gamemode ganz oben per #include <script_fix> einbinden. Danach muss nichts mehr geändert werden, die Include hängt sich automatisch überall rein ;)


    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 :love: )
    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

  • Joa nicht schlecht, sind aber eher nur Kleinigkeiten.
    Da gibt es viel graviererende Bugs.
    Gbug z.B.
    Oder, wenn man als Beifahrer in nem Auto aufn Desk geht, das Auto weiterfährt und der Fahrer aussteigt.
    Wird das Auto sobald der Spieler vom Desk wieder zurückkommt geportet.

  • Gbug z.B.

    Ist doch schon von Anfang an drinne ? ;)


    Oder, wenn man als Beifahrer in nem Auto aufn Desk geht, das Auto weiterfährt und der Fahrer aussteigt.
    Wird das Auto sobald der Spieler vom Desk wieder zurückkommt geportet.

    Wird jetzt auch behoben, danke ;)


    Du solltest die include mal richtig hooken da wenn ich meine include nehme Fehler kommen da der hook nicht richtig ist

    Nutze jetzt auch ALS-Hooks - richtig gehookt war es ja vorher schon, nur halt nicht kompatibel ;)

  • Doofe frage, aber bin Neuling im Scripten^^


    Muss ich einfach nur denn #include <NAME> setzen sonst nicht`s?


    mfg.

    Ja


    Hat keine der hier genannten Fixes, zumindest finde ich die dort in der Liste nicht wieder ;)

  • Hey,


    erstmal klasse das sich jemand daran setzt und sich auch darüm kümmert, doch ich habe ein Problem mit der Include.
    Sobald ich es eingebaut habe, und den Server starte sehe ich die anderen Spieler alle auf dem Desktop bzw. alle haben die Sanduhr neben dem Kopf.
    Die anderen selbst sehen genau das gleiche aus ihrer Perspektive.


    Bitte um Hilfe.

  • erstmal klasse das sich jemand daran setzt und sich auch darüm kümmert, doch ich habe ein Problem mit der Include.
    Sobald ich es eingebaut habe, und den Server starte sehe ich die anderen Spieler alle auf dem Desktop bzw. alle haben die Sanduhr neben dem Kopf.
    Die anderen selbst sehen genau das gleiche aus ihrer Perspektive.


    Bitte um Hilfe.

    Wie die haben eine Sanduhr neben dem Kopf ?


    Welches Script nutzt du ?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hami: Und es liegt 100%ig an der Include ? ^^
    Nutzt du ein öffentliches Script ( auch edited ) oder 100% aus eigener Hand ?


    Maximilian: Ich erkenne Desktop-Benutzer mit der Include.
    Guck dir mal SF_desktop[playerid] an - es wird bei allen Spielern jede Sekunde auf true gesetzt, bei OnPlayerUpdate immer auf false.
    OPC wird nicht aufgerufen, wenn der Spieler auf dem Desktop ist, sonst bei jedem Serverloop.
    Also erkenne ich innerhalb von maximal 1,01 Sekunden, ob der Spieler auf dem Desktop ist ;)
    Und das ganze war recht schnell zu finden, ein Blick in die Wiki und etwas denken :D


    Rapid: Es wird in der Include nur ein einziger Timer genutzt, der global für alle Spieler läuft. Von daher sollte die INC nicht so auf die Anzahl der Timer einwirken ( um 1 erhöhen, um es genau zu sagen ).

  • Tion: ich hab kein problem, dass hat Rapid:
    (dass er alle AFK sieht) ^^

    Öhm, okay, sry ^^


    Merkwürdig das es bei einigen funktioniert.
    Weiß jemand was eventuell diese Include blockieren könnte o.Ä.?

    Auf Anhieb wüsste ich nichts, da ich eigentlich nur ganz normal hooke...
    Vielleicht versuchst du testweise mal, vor das „CallLocalFunction“ bei OnPlayerUpdate ein „return “ zu setzen ?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen