Fahrzeug reparieren

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
  • Hi Leute und zwar hab ich folgende Frage und dazu hab ich gleich mal meinen Pawn Code mitgeliefert:


    Ich würde gerne ein Fahrzeug mit /repair wieder Reparieren können, Innenleben sowie das Schadensmodell ^^
    Hierzu hab ich es mit unten stehenden Code versucht, bei dem ich mir den Fahrzeugzustand speichere (vHealth), mir die Positionen speichere (vX,vY,vZ) und die Fahrzeug ID mir in die Variable 'veh' lege.


    Per Abfrage ob der Spieler an der Position des Fahrzeugs ist IsPlayerInRangeOfPoint und die Stateabfrage, also ob er zu Fuß oder Fahrer ist, will ich das er nur in einem Radius von 4.0 der Fahrzeugposition, vorzugsweise das Fahrzeug was vor ihm steht xD, reparieren kann.


    Könnt ihr mir weiterhelfen? Ich komm da grad nicht weiter ^^


    ocmd:repair(playerid,params[])
    {
    new pState = GetPlayerState(playerid);
    new vehID;
    new Float:vX,Float:vY,Float:vZ;
    vehID = GetPlayerVehicleID(playerid);
    GetVehiclePos(veh,vX,vY,vZ);
    if(IsPlayerInRangeOfPoint(playerid,4.0,vX,vY,vZ))
    {
    if(pState == PLAYER_STATE_ONFOOT)
    {


    SetVehicleHealth(vehID, 1000.0);
    RepairVehicle(vehID);
    }
    }
    else
    {
    if(pState == PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,COLOR_RED,"Bitte steige aus dem Fahrzeug!");
    }
    }
    return 1;
    }

    "Dem wird befohlen, der sich nicht selbst gehorchen kann" - Friedrich Nietzsche

    2 Mal editiert, zuletzt von Addickted ()


  • public OnPlayerCommandText(playerid, cmdtext[])
    {
    dcmd(v,1,cmdtext);
    dcmd(vr,2,cmdtext);
    public OnPlayerText(playerid, text[])
    {
    dcmd_vr(playerid,params[])
    {
    #pragma unused params
    if(PlayerInfo[playerid][pAdmin]<1338)
    {
    return 0;
    }
    if(!IsPlayerInAnyVehicle(playerid))
    {
    return SendClientMessage(playerid,COLOR_GREY,"Du musst in einem Auto sitzten!");
    }
    else
    {
    new str[256],name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    format(str,sizeof(str),"%s (%d) hat sein Fahrzeug repariert.",name, playerid);
    new vID = GetPlayerVehicleID(playerid);
    RepairVehicle(vID);
    SetVehicleHealth(vID,1000);
    SendClientMessageToAll(COLOR_GREY,str);
    }
    return 1;
    }


    der command ist dan /vr hoffe ich konnte helfen ps alles geht heile ;)

  • Eigentlich nicht, weil die Abfrage krieg ich hin, wie du sie gepostet hast.


    Ich möchte ein Fahrzeug in einem Umkreis(Radius) von 4.0 reparieren können. Damit du weisst was ich meine:


    Letztendlich will ich das so haben das man nur an einer Tankstelle sein Fahrzeug reparieren kann, wenn man ungefähr daneben steht.


    Für den Moment: Siehe Oben.

    "Dem wird befohlen, der sich nicht selbst gehorchen kann" - Friedrich Nietzsche

  • dan musst du einfach nur ne abfrage hinzufügen und verschidene tankstellen saven und mit inzu packen eine radius abfrage mit mehren kordinaten ebend ;)



    //EDIT

  • Die habe ich drin, und sie funktioniert bei mir nicht. Daher möchte ich ja Hilfe haben, sonst würde ich hier wohl kaum reinschreiben.
    Aber anscheinend liest du meine Beiträge gar nicht richtig. Ich sagte das das mal so werden soll. Momentan will ich nur so haben wie oben beschrieben, sprich Person steht im Max. Radius von 4.0 um einen Punkt rum (Fahrzeug) und kann in diesen Radius dieses reparieren.


    Ich habs versucht so wie oben stehend zu lösen, aber es geht nicht.


    if(IsPlayerInRangeOfPoint(playerid,4.0,vX,vY,vZ))
    {
    if(pState == PLAYER_STATE_ONFOOT)
    {


    SetVehicleHealth(vehID, 1000.0);
    RepairVehicle(vehID);
    }
    }
    else
    {
    if(pState == PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,COLOR_RED,"Bitte steige aus dem Fahrzeug!");
    }
    }
    return 1;

    "Dem wird befohlen, der sich nicht selbst gehorchen kann" - Friedrich Nietzsche


  • if(!IsPlayerInRangeOfPoint(playerid,4.0,vX,vY,vZ))return true;
    if(pState == PLAYER_STATE_ONFOOT)RepairVehicle(vehID);
    if(pState == PLAYER_STATE_DRIVER)return SendClientMessage(playerid,COLOR_RED,"Bitte steige aus dem Fahrzeug!");
    return 1;


    Optimiert und wo lässt du vehid und vX und so abrufen.


    MFG RFT

    RFT

  • Isn Selfmade.


    vehID über das RepairVehicle(vehID);
    vX,vY,vZ über das IsPlayerInRangeOfPoint


    Oder hab ich da grad nen Logikfehler? :D


    Edit: Ich habe mal die Abfrage umgeändert, nun steht wenn man im FZ sitzt "Bitte steige aus dem Fahrzeug aus!". Reparieren tut er es nicht, auch nicht wenn man davor steht.


    if(pState == PLAYER_STATE_ONFOOT)
    {
    if(IsPlayerInRangeOfPoint(playerid,4.0,vX,vY,vZ))
    {


    SetVehicleHealth(vehID, 1000.0);
    RepairVehicle(vehID);
    }
    }
    else
    {
    if(pState == PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,COLOR_RED,"Bitte steige aus dem Fahrzeug!");
    }
    }
    return 1;
    }

    "Dem wird befohlen, der sich nicht selbst gehorchen kann" - Friedrich Nietzsche

    Einmal editiert, zuletzt von Addickted ()

  • if(pState == PLAYER_STATE_ONFOOT)
    {
    if(IsPlayerInRangeOfPoint(playerid,4.0,vX,vY,vZ))// mach doch daraus mein befehl der dan halt nur an den kordinaten geht ist doch einfach also mein befehl mit if(IsPlayerRangeOfPoint(playerid und deine kordinaten ;)
    {


    SetVehicleHealth(vehID, 1000.0);
    RepairVehicle(vehID);
    }
    }
    else
    {
    if(pState == PLAYER_STATE_DRIVER)
    {
    SendClientMessage(playerid,COLOR_RED,"Bitte steige aus dem Fahrzeug!");
    }
    }
    return 1;
    }

  • schnell mal nen ungetestetes System geschrieben.



    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/repveh", cmdtext, true, 10) == 0)
    {
    new Float:vX, Float: vY, Float:vZ;
    GetVehiclePos(GetPVarInt(playerid, "Vehid"), vX, vY, vZ);
    if(!IsPlayerInRangeOfPoint(playerid, 4.0, vX, vY, vZ))return SendClientMessage(playerid, COLOR_RED, "Info: Du bist nicht in der nähe des Fahrzeuges");
    if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT)return SendClientMessage(playerid, COLOR_RED, "Info: Du musst vor dem Fahrzeug stehen");
    RepairVehicle(GetPVarInt(playerid, "Vehid"));
    return 1;
    }
    return 0;
    }


    public OnPlayerExitVehicle(playerid, vehicleid)
    {
    SetPVarInt(playerid, "Vehid", GetPlayerVehicleID(playerid));
    return 1;
    }



    Ich denke sowas brauchst du =).


    MFG RFT

    RFT

  • Also funktionieren tut es, aber nur zum Verständnis für mich.


    Was tut das Script da jetzt genau? Normal wo laut Wiki die vehicleid steht, ist nun dieses GetPVarInt. Speichert er damit die VehicleID ab, damit das Script später weiss vor welchem Fahrzeug er steht?

    "Dem wird befohlen, der sich nicht selbst gehorchen kann" - Friedrich Nietzsche

  • Eklärungen:



    public OnPlayerCommandText(playerid, cmdtext[])
    {
    if (strcmp("/repveh", cmdtext, true, 10) == 0)
    {
    new Float:vX, Float: vY, Float:vZ;
    GetVehiclePos(GetPVarInt(playerid, "Vehid"), vX, vY, vZ); //ruft die Positionen vom Fahrzeug ab
    if(!IsPlayerInRangeOfPoint(playerid, 4.0, vX, vY, vZ))return SendClientMessage(playerid, COLOR_RED, "Info: Du bist nicht in der nähe des Fahrzeuges"); //überprüft ob der Spieler vorm Fahrzeug steht
    if(GetPlayerState(playerid) != PLAYER_STATE_ONFOOT)return SendClientMessage(playerid, COLOR_RED, "Info: Du musst vor dem Fahrzeug stehen");//überprüft ob er im Auto sitzt oder steht
    RepairVehicle(GetPVarInt(playerid, "Vehid")); //repariert das Fahrzeug
    return 1;
    }
    return 0;
    }


    public OnPlayerExitVehicle(playerid, vehicleid)
    {
    SetPVarInt(playerid, "Vehid", GetPlayerVehicleID(playerid));//fragt die Vehicleid ab und speichert sie im PVar Vehid die wir dann jeder Zeit für unseren CMD abrufen können
    return 1;
    }


    MFG RFT

    RFT