Probleme mit Motorschaden Script...

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
  • Tach, ich mal wieder :S also diesmal hab ich folgendes Problem:


    public OnPlayerUpdate(playerid)
    {


    new vid = GetPlayerVehicleID(playerid);



    //----Motorschaden----
    {
    new Float:hxx;
    GetVehicleHealth(vid, hxx);
    if(!IsPlayerInAnyVehicle(playerid))return 1;
    if(GetVehicleHealth(vid, hxx) <=300.0)
    {
    TogglePlayerControllable(vid, true);
    SendClientMessage(playerid,ROT,"Du hast einen Motorschaden!");
    }
    }
    return 1;
    }
    Gut, aber sobald ich in ein Auto rein gehe Spammt er mich mit der Meldung voll, "Du hast einen Motorschaden!" und wenn mein Zustand dann unter 300 Ist Freezt er das Auto nicht -.-


    weiß jemand woran das liegen könnte? Hab schon die unterschiedlichsten Methoden probiert :(


    Edit:// Hab das public noch hingeschrieben!
    Edit2:// [/pwn] hat gesponnen -,-

    Einmal editiert, zuletzt von Aarys ()

  • Ne, ich will ja das man dann nur nicht mehr fahren kann, also das Auto des Spielers Freezen, denn ich das ist mir zu umständlich mit /raus, denn wenn man direkt macht das nur das Auto gefreezt wird, muss man nicht extra einen CMD fürs Rausgehen machen :)

  • Es ist glaube ich nicht möglich, nur das Fahrzeug zu freezen.
    Der Name der Funktion verrät es ja schon ein wenig "TogglePlayerControllable".


    Dementsprechend muss der Code so aussehen (jedoch wird der Spieler gefreezt und nicht das Fahrzeug :(

    new ms[MAX_VEHICLES]; // oben im Script einfügen


    public OnPlayerUpdate(playerid)
    {
    new vid = GetPlayerVehicleID(playerid);
    //----Motorschaden----
    {
    new Float:hxx;
    GetVehicleHealth(vid, hxx);
    if(!IsPlayerInAnyVehicle(playerid))return 1;
    if(GetVehicleHealth(vid, hxx) <=300.0 && ms[vid] == 0)
    {
    TogglePlayerControllable(playerid, true);
    ms[vid] = 1;
    SendClientMessage(playerid,ROT,"Du hast einen Motorschaden!");
    }
    }
    return 1;
    }
    Die Variable "ms" muss dann beim reparieren wieder auf 0 gesetzt werden.


    - Ungetestet -

  • ist ja auch kein wunder -.-


    du benutzt das public OnPlayerUpdate. ich denke mal das wird jede sekunde oder alle paar sekunden aufgerufen und immer dann passiert das.
    außerdem haste da 2 unnötige abfrage sowie etwas was ich nicht so ganz verstehe. du fragst 2mal den status des wagens ab und dann fragste noch ob er in einem auto sitzt und wenn er NICHT in einem auto sitzt, return 1. das kapiere ich nicht. warum wird wenn er nicht in einem auto sitzt der vorgang fprtgesetzt?


    das wird häftg laggen wenn du das so unter dem public auch noch hast.


    hier die richtige variante:


    public OnPlayerStateChange(playerid, newstate, oldstate)
    {
    if(newstate == PLAYER_STATE_DRIVER)
    {
    new vehicleid = GetPlayerVehicleID(playerid), Float:vhp;
    if(GetVehicleHealth(vehicleid, vhp) <= 300)
    {
    TogglePlayerControllable(playerid,0);
    SendClientMessage(playerid,0xFF0000FF,"Das Fahrzeug hat einen Motorschaden!");
    }
    }
    return 1;
    }


    //edit: habe gerade gelesen das du dein auto freezen willst, das geht wenn überhaupt nur mit VeloCity glaube ich, damit kenne ich mich aber nicht aus.
    man kann den spieler aus dem auto werfen.


    mit velocity wäre es dann so wenn ich mich nicht irre:


    new Float:vx, Float:vy, Float:vz;
    SetVehicleVelocity(vehicleid, vx*0, vy*0, vz*0);


    das machste einfach an stelle von TogglePlayerControllable(playerid,0);

    Einmal editiert, zuletzt von Simon ()

  • Also, zugespammt werde ich nichtmehr, jedoch kommt die Meldung direkt wenn ich ins Auto steige und werde gefreezt!
    Hab auch bei
    if(GetVehicleHealth(vehicleid, vhp) <= 300)
    Das "<" auf ">" gestellt, aber dann passiert garnix mehr, man wird nicht gefreezt etc.


    Die Methode mit Velocity kann ich ja mal ausprobieren...
    wäre Nett wenn trotzdem noch jemand nen Vorschlag hat :D

  • das mit velocity klappt nicht :D damit wird nur dein fahrzeug gestoppt, du kannst aber danach weiter fahren.
    sobald du in dein auto steigst, wird der schaden des wagens abgefragt. wenn der unter 300 ist, wirste gefreezed und es kommt die meldung.


    du müsstes nun nen anderen command machen um auszusteigen, oder du machst es mit velocity. dann musst du bei OnPlayerKeyStateChange abfragen ob er im die tasten "w", "s", "d", "a" drückt, ob er im auto sitzt und ob der schaden unter 300 ist. wenn das alles zutrifft wieder die selbe funktion wie schon oben genannt mit velocity machen. so wird jedesmal wenn er losfahren will und der schaden unter 300 ist das auto gestoppt.


    //edit: hier ich habe es mal für dich gemacht:


    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
    {
    if(newkeys == KEY_UP || newkeys == KEY_DOWN || newkeys == KEY_LEFT || newkeys == KEY_RIGHT)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new vehicleid = GetPlayerVehicleID(playerid), Float:vhp, Float:vx, Float:vy, Float:vz;
    if(GetVehiclehealth(vehicleid, vhp) <= 300)
    {
    SetVehicleVelocity(vehicleid,vx*0,vy*0,vz*0);
    }
    }
    }
    return 1;
    }

    Einmal editiert, zuletzt von Simon ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Wenn man zusätzlich ein andere Taste drückt würde nach dem obigen Code nichts passieren - deswegen bitweisen Vergleich (&) verwenden anstelle von gesamten Vergleich (==).

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • if(newkeys & KEY_UP || newkeys & KEY_DOWN || newkeys & KEY_LEFT || newkeys & KEY_RIGHT || HOLDING( KEY_UP | KEY_DOWN | KEY_RIGHT | KEY_LEFT))


    ich glaube so muss es, wobei ich mir nicht sicher bin ob man das HOLDING braucht und wenn mans braucht obs so richtig ist, aufjedenfall stehts so bei wiki.

  • #define HOLDING(%0) \ ((newkeys & (%0)) == (%0))


    und dann müsste es auch so aussehen:


    if(newkeys & KEY_UP || newkeys & KEY_DOWN || newkeys & KEY_LEFT || newkeys & KEY_RIGHT || HOLDING( KEY_UP) || HOLDING( KEY_DOWN) || HOLDING( KEY_RIGHT) ||HOLDING( KEY_LEFT))


    glaube ich, ich habe es vorher noch nie so gemacht.

  • Mhm dann kommen Errors:
    D:\GTA San Andreas\GTA San Andreas\GTA San Andreas\gamemodes\VillageRL.pwn(708) : error 029: invalid expression, assumed zero
    D:\GTA San Andreas\GTA San Andreas\GTA San Andreas\gamemodes\VillageRL.pwn(708) : error 029: invalid expression, assumed zero
    D:\GTA San Andreas\GTA San Andreas\GTA San Andreas\gamemodes\VillageRL.pwn(708) : error 029: invalid expression, assumed zero
    D:\GTA San Andreas\GTA San Andreas\GTA San Andreas\gamemodes\VillageRL.pwn(708) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    4 Errors.


    Zeile 708:
    if(newkeys & KEY_UP || newkeys & KEY_DOWN || newkeys & KEY_LEFT || newkeys & KEY_RIGHT || HOLDING( KEY_UP) || HOLDING( KEY_DOWN) || HOLDING( KEY_RIGHT) ||HOLDING( KEY_LEFT))

    :x

  • probiers mal so:



    #define HOLDING(%0) \ ((newkeys & (%0)) == (%0))



    if(newkeys & KEY_UP || newkeys & KEY_DOWN || newkeys & KEY_LEFT || newkeys & KEY_RIGHT || HOLDING(KEY_UP) || HOLDING(KEY_DOWN) || HOLDING(KEY_RIGHT) || HOLDING(KEY_LEFT))

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