Probleme mit /rentcar System

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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
  • Hallo,
    ich habe vor Jahren mal ein Mietsystem gescriptet, was nun total alt ist und ich etwas überarbeiten möchte.


    Damals war es so gescriptet, dass man sich in das auto setzt und dann mit /rentcar das auto bewegen kann..
    Ist man dann ausgestiegen, und wollte wieder einsteigen musste man es wieder mieten...
    Außerdem ist das Auto nach 1 Minute nicht benutzung respawnt.


    NUN möchte ich es so, dass man sich reinsetzt das auto mieten kann und es dann für 30 minuten fahren kann. Sollte sich also jemand anderes reinsetzten sollte eine nachricht kommen wo drin steht Das Fahrzeug gehört XY oder so. Und wenn die 30 Minuten um sind sollte das Auto respawnen, auch wenn man im Wagen sitzt.


    Hier mein Altes System, wie bearbeite ich es nun?



    Befehl:


  • Der Code ist aber ziemlich abenteuerlich.


    OnPlayerStateChange kannst du so machen:


    Den /rentcar Befehl kannst du dann so machen:


    Der /verlassen Befehl bleibt weitgehend gleich.


    Wenn du es nun anpassen willst, dass das Fahrzeug für genau 30 Minuten aktiv ist, dann musst du eine Spielervariable anlegen, in der du den Wert speicherst, wann die Zeit vorbei ist und eine Variable die die Index ID beinhaltet, unter den Includes:

    C
    new rentTime[MAX_PLAYERS];
    new rentIdx[MAX_PLAYERS];

    Sowie eine Variable um das Fahrzeug als gemietet zu markieren (-1 = nicht vermietet):

    C
    new rentBlocked[MAX_VEHICLES] = {-1,...};


    Unter OnGameModeInit startest du einen Prüf-Timer:

    C
    SetTimer("CheckRentCars", 5000, true);

    [wiki]SetTimer[/wiki]


    Und der Code dazu:


    Den /rentcar Befehl musst du dann so anpassen:


    Bei OnPlayerDisconnect zum Beispiel:

    C
    if(rentTime[playerid] != 0)
    {
        new idx = rentIdx[playerid];
        SetVehicleToRespawn(rentroller[idx]);
        rentTime[playerid] = 0;
        rentBlocked[idx] = -1;
    }


    Und das OnPlayerStateChange sieht dann so aus:


    Beachte bitte die Kommentare im Code und passie die Stellen entsprechend an.

  • Vielen Dank dafür !
    Das einzige was bisher komisch ist ist, dass wenn ich das Auto miete, dort steht das das auto bereits einem spieler gehört obwohl es ja mir ist.

  • Ah, beim Einsteigen? Das habe ich vergessen, dem Spieler auch eine Nachricht zu senden, sorry.
    Das wäre dann so:

  • Ah, beim Einsteigen? Das habe ich vergessen, dem Spieler auch eine Nachricht zu senden, sorry.
    Das wäre dann so:

    C
    if(newstate == PLAYER_STATE_DRIVER){	if(!IsANoTachoVehicle(GetPlayerVehicleID(playerid)))	{		TextDrawShowForPlayer(playerid, Speedo[playerid]);		//SetTimerEx("Speedometer", 100, 1, "d", playerid);		//Ich habe diesen Timer auskommentiert, da er jedes mal gestartet würde,		//wenn du in ein Fahrzeug einsteigst, das einen Tacho hat, sprich irgendwann		//hast du 1000 Timer am Laufen, von denen jeder 10x pro Sekunde aufgerufen		//wird. Deine CPU wird dir das nicht danken ;)		//Also besser so:		speedoTimer[playerid] = SetTimerEx("Speedometer", 100, 1, "d", playerid);		//Und den Timer auch wieder beenden, wenn der Speedometer nicht mehr angezeigt wird.		//Oder noch besser ist es, einen einzigen globalen Timer mit einer Schleife durch		//alle Spieler zu machen, der Timer wird dann bei OnGameModeInit gestartet.		if(IsABike(GetPlayerVehicleID(playerid)))		{			timer2[playerid] = SetTimerEx("TankTimer",60000,1,"i",playerid);		}		else		{			timer2[playerid] = SetTimerEx("TankTimer",20000,1,"i",playerid);		}	}	//Hier der Code für die Roller:	new veh = GetPlayerVehicleID(playerid);	for(new i=0; i<sizeof(rentroller); i++)	{		if(veh == rentroller[i])		{			if(rentBlocked[i] == -1)			{				SendClientMessage(playerid,0xF60000F6,"Dieses Fahrzeug kannst du mieten! Tippe /rentcar, wenn du nicht möchtest, dann /verlassen.");				SendClientMessage(playerid,0xF60000F6,"Das Auto wird nach 30 Minuten respawnt.");				TogglePlayerControllable(playerid,0);			}			else if(rentBlocked[i] != playerid)			{				SendClientMessage(playerid,0xF60000F6,"Dieses Fahrzeug gehört bereits einem Spieler.");				RemovePlayerFromVehicle(playerid);			}			else			{				SendClientMessage(playerid, 0xF60000F6, "Willkommen.");			}			break;		}	}}

    Was auch nicht funktioniert ist, dass das Mietverhältnis aufgelöst und das Fahrzeug respawnt.

  • Ahh ja, gettime arbeitet mit Sekunden, habe es mit GetTickCount vertauscht.

    C
    rentTime[playerid] = gettime() + 30 * 60 * 1000; //30 Minuten zu je 60 Sekunden und 1000ms.


    Zu

    C
    rentTime[playerid] = gettime() + 30 * 60; //30 Minuten zu je 60 Sekunden.

    Und nochmal der Hinweis:
    Lasse die Vollzitate, es macht doch keinen Sinn, dass zwei mal der gleiche Text hintereinander da steht. Ich habe es schon gesehen, dass diese Vollzitate samt Code von Mods entfernt wurden, also unterlasse es bitte und nutze nur den ANTWORTEN Button, das reicht, ist übersichtlicher und du bekommst keine Verwarnung.

  • Wie gesagt, die Codes musst du natürlich anpassen, wie du es haben willst.
    Wenn man in einem Fahrzeug als Fahrer sein muss, dann:

    C
    if(GetPlayerState(playerid) != PLAYER_STATE_DRIVER) return SendClientMessage(playerid, 0xFF0000FF, "Error: Du musst in einem Fahrzeug sein.");


    Das sind minimale Anpassungen, die jeder anders haben will, daher habe ich das weg gelassen.

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