Fragen zu einem Taxisystem

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 wage oder versuche mich an eine Job, nämlich Taxifahrer. Jobcars sind bereits alle definiert/gemacht. Ein Grundschema über den Aufbau habe ich auch schon grob.


    1.)Spieler ruft mit /taxicall ein Taxi
    2.)Taxifahrer bekommt Meldung ob er Taxi annehmen will
    3.)Wenn ja, SCM an beide Player und für den Taxifahrer werde die Koordinaten des Anrufers gesetzt (Dass dieser weiss, wo er sich befindet)
    4.)Wenn Taxifahrer Checkpoint erreicht, verschwindet Kegel.
    5.)Per /tarif wird der Preis für 10 Sekunden bestimmt.
    6.)Anrufer kann annehmen oder ablehnen
    7.)Wenn angenommen, Anrufer kann einsteigen und es wird ihm mit einem Timer Geld abgezogen und dem Fahrer all 10 Sekunden gegeben
    8.)Anrufer verlässt das Taxi am Zielort


    Nun kommen ein paar Fragen, die ich nicht selber beantworten kann ?


    1.)Wie kann ich eine SCM an alle Taxifahrer schicken ?


    2.)Wie kann ich jemanden Mithilfe eines Commands und einem Timer Geld abziehen.
    Ich stelle es mir so vor:
    Wenn Spieler nicht Fahrer ist, ziehe dem Player alle 10 Sekunden den Betrag X ab, welcher vor dem Einsteigen durch den Taxifahrer mit /tarif definiert worden ist.


    Ich erwarte keine Codeschnippsel, denn ich will mal etwas Grösseres machen, es versuchen ohne wirklich grosse Hilfe von anderen zu schaffen.
    MfG dUDA

  • Zitat

    1.)Wie kann ich eine SCM an alle Taxifahrer schicken ?


    Du musst eine Möglichkeit in deinem Script haben, Taxifahrer zu erkennen. Eine Möglichkeit dafür wären PVars, dazu wurde gerad erst ein Tutorial erstellt. Gehen wir also davon aus, dass jeder Taxifahrer die PVar "IsTaxiDriver" auf 1 gesetzt hat:


    for (new i=0;i<MAX_PLAYERS;i++) //Für jeden Spieler....
    {
    if(IsPlayerConnected) //...der connected ist...
    {
    if(GetPVarInt(i,"IsTaxiDriver") //...und dessen PVar "IsTaxiDriver" auf 1 gesetzt wurde...
    {
    SendClientMessage(i, 0x00FF00FF, "Ein Taxifahrer wird benötigt");
    }
    }
    }


    Das ist jetzt nur der Code für deine erste Frage, ich bin mir aber nicht sicher ob du den so benutzen kannst. Du musst anschließend noch einen /accept oder wie auch immer Befehl machen, wo der Taxifahrer annehmen kann und dann der Checkpoint erstellt wird. Du kannst i dann übernehmen (also immer für Playerid "i" den Befehl erlauben), aber da i sich relativ schnell ändert musst du dir was einfallen lassen ;) Kernpunkt ist, dass i nicht mehr die selbe ist, wenn der Spieler /accept eingegeben hat, sondern i dann der letzte Taxifahrer ist.

  • Hier wie man einen geld abzieht mit nem CMD:


    public OnPlayerCommandText(playerid,cmdtext[])
    {
    new cmd[30];
    new idx;
    cmd = strtok(cmdtext, idx);


    if(strcmp("/abziehen",cmdtext, true, 10) == 0)
    {
    new pID,tmp[30];
    tmp = strtok(cmdtext, idx);
    pID = strval(tmp);
    GivePlayerMoney(pID,-GELD);
    return 1;
    }



    Das ganz unten im script:
    strtok(const string[], &index)
    {
    new length = strlen(string);
    while ((index < length) && (string[index] <= ' '))
    {
    index++;
    }

    new offset = index;
    new result[20];
    while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1)))
    {
    result[index - offset] = string[index];
    index++;
    }
    result[index - offset] = EOS;
    return result;
    }


    Sollte funktionieren.
    Ungetestet!

  • Ok, werde es nachher versuchen


    Jetzt noch die Frage zu dem SCM, der nur an Taxifahrer geschickt werden soll. Gibt es eine Funktion, die einen Chattext an jeden einzelnen (!) User schickt, sofern er die Bedingung erfüllt ?
    Suche so etwas ;)
    Also eine Message, die an jeden Player geht, sofern er die Bedingung erfüllt. Mit SCMToAll kann das ja irgendwie nicht klappen ;)


    if(PlayerInfo[id(alle Server-Ids][pJob] == 4
    {
    SendClientMessageToAll
    }


    Wie meinste das mitPVars, sagt mir leider nichts.
    PS:Wie sieht das mit DCMD aus ?


    MfG dUDA
    Suche schnell in nem GF rum, ewt werde ich da schlauer

  • mit der vorschleife kannse es machen indem du hiermit:
    if(PlayerInfo[i][Job/*oder anders*/] == Taxifahrer/*oder anders*/) { SendClientMessage(i,0xFFFFFFFF,"Du bist Taxifahrer"); } 
    überprüfst.

  • Also die schleife läuft solange bis sie so groß ist wie der wert von "MAX_PLAYERS" der "500" beträgt.
    Du überpfüfst als nächstes mit if(IsPlayerConnected(i)) ob "i" verbunden ist wen ja überprüftst du ob "i" zu einem Job gehört und den sendest du eine SCM.
    Also: ja diese SCM wird an jedem Taxifahrer geschickt.

  • Sendet das dann eine SCM an alle Taxifahrer (ist das i an alle Leute/Spieler ?) ?


    dUDA

    das i is die SpielerID 1-500 mit IsPlayerConnected(i) sparste schonma Ressourcen, da er sonst unnötig jede ID abfrägt


    mitif(PlayerInfo[i][pJob] == 4)


    frägst du ab ob "i" ,also alle Spieler die Online sind, den Job 4 besitzen, und dann einfach ganz normal die Aktion ausführen
    in dem Fall: SendClientMessage(i,farbe,"dein Text"); wenn di SCMToAll nimmst is es unnötig die oben angegebene Schleife zu nutzen
    da wenn es nur auf einen Spieler zutrifft, gleich an alle Spieler geschickt wird


    so müste des aussehen:


    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerInfo[i][pJob] == 4)
    {
    SendClientMessage(i,farbe,"dein Text");


    oder:
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i) && PlayerInfo[i][pJob] == 4)
    {
    SendClientMessage(i,farbe,"dein Text");

    2 Mal editiert, zuletzt von M33p4r34l ()

  • Hallo


    Also so siehts mal aus:
    dcmd_calltaxi(playerid,params[])
    {
    new id;
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerInfo[id][pJob] == 4)
    {
    SendClientMessage(i,COLOR_GREEN,"dein Text");
    }
    }
    }
    return 1;
    }




    MfG dUDALUS

  • dcmd_calltaxi(playerid,params[])
    {
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerInfo[i][pJob] == 4)
    {
    SendClientMessage(i,COLOR_GREEN,"dein Text");
    }
    }
    }
    return 1;
    }


    So

  • Ok


    Werdes grad schnell Testen
    Bekomme jedoch noch 2 Warnings:


    C:\Users\X\Desktop\dudalus136.pwn(4759) : warning 203: symbol is never used: "params"
    C:\Users\X\Desktop\dudalus136.pwn(4759) : warning 203: symbol is never used: "playerid"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase


    2 Warnings.


    Wie kann ich die playerid Warning wegmachen ? Mit pragma Unused ?


    Edit:Ok, das geht jetzt mal, jetzt muss ich noch den Checkpoint/accepttaxi machen :D

  • Jop genau, mit #pragma unused params unter dem Befehl.


    mfg

  • Ok,so weit habe ich es jetzt mal, jetzt kommt noch der /tarif Teil



    dcmd_calltaxi(playerid,params[])
    {
    #pragma unused params
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerInfo[i][pJob] == 4)
    {
    SendClientMessage(i,COLOR_GREEN,"Ein Anrufer benötigt deine Hilfe");
    SendClientMessage(playerid,COLOR_GREEN,"Alle erreichbaren Taxifahrer wurden informiert");
    }
    }
    }
    return 1;
    }


    dcmd_accepttaxi(playerid, params[])
    {
    new id;
    if (sscanf(params, "u",id)) return SendClientMessage(playerid, COLOR_WHITE, "Verwendung: /accepttaxi [ID]");
    else if(PlayerInfo[playerid][pJob] != 4) return SendClientMessage(playerid, COLOR_GREY, "Du bist kein Taxifahrer");
    else if(id == INVALID_PLAYER_ID || IsPlayerNPC(id)) SendClientMessage(playerid, COLOR_GREY, "Dieser Spieler kann nicht erreicht werden.");
    else
    {
    new Float:X,Float:Y,Float:Z;
    GetPlayerPos(id, X,Y,Z);
    SetPlayerCheckpoint(playerid, X,Y,Z, 6);
    SendClientMessage(playerid,COLOR_GREEN,"Der Anrufer wartet dort auf dich");
    SendClientMessage(id,COLOR_GREEN,"Ein Taxifahrer befindet sich bereits auf dem Weg zu dir");
    }


    return 1;
    }


    Lese es oben nochmals schnell durch.
    MfG dUDA


    Edit: Wie würde sowas in DCMD heissen ?


    public OnPlayerCommandText(playerid,cmdtext[])
    {
    new cmd[30];
    new idx;
    cmd = strtok(cmdtext, idx);


    if(strcmp("/abziehen",cmdtext, true, 10) == 0)
    {
    new pID,tmp[30];
    tmp = strtok(cmdtext, idx);
    pID = strval(tmp);
    GivePlayerMoney(pID,-GELD);
    return 1;
    }

  • Hmm, wird doch einiges schwieriger als ich dachte ;) Dank dir ganz fest für deine Hilfe


    Also jetzt kommt nochmals eine Hürde:


    Der Taxifahrer kann mit /tarif einstellen, wie viel dem Anrufer im Taxi all 10 Sekunden abgezogen wird. Ich muss also prüfen, ob sich der Anrufer als Nicht-Fahrer im Fahrzeug des Taxifahrers befindet (+ob es ein Taxi ist) und der Taxifahrer Fahrer ist.
    Dann kann ich der ID alle 10 Sekunden den Betrag X abziehen und der PlayerID gutschreiben.
    Doch wie mache ich das (In DCMD), das dem Anrufer der festgelegte Beitrag abgezogen wird ?


    MfG dUD

  • SetTimerEx auf 10 Sekunden einstellen, PlayerID und Tarif übergeben und dem Gast einmalig pro Intervall den Betrag abziehen. Der Timer muss endlos oft wiederholt werden, und sobald der Kunde aussteigt den Timer mit KillTimer löschen.


    Hier findest du den Grundbaustein, versuchs mal ;)

  • Ok, werde es versuchen, ein Problem habe ich jetzt aber und ich weiss nicht warum:
    Ich wollte die Ids anzeigen lassen, damit man weiss, von wem man den Auftrag/Anruf bekommt. Jedoch passiert Ingame jetzt bei der Eingabe der beiden CMDs nichts mehr und ich habe Warnings:


    dcmd_calltaxi(playerid,params[])
    {
    #pragma unused params
    for(new i = 0;i<MAX_PLAYERS;i++)
    {
    if(IsPlayerConnected(i))
    {
    if(PlayerInfo[i][pJob] == 4)
    {
    SendClientMessage(i,COLOR_GREEN,"Der Anrufer mit der ID %s benötigt deine Hilfe",playerid);
    SendClientMessage(playerid,COLOR_GREEN,"Alle erreichbaren Taxifahrer wurden informiert");
    }
    }
    }
    return 1;
    }


    dcmd_accepttaxi(playerid, params[])
    {
    new id;
    if (sscanf(params, "u",id)) return SendClientMessage(playerid, COLOR_WHITE, "Verwendung: /accepttaxi [ID]");
    else if(PlayerInfo[playerid][pJob] != 4) return SendClientMessage(playerid, COLOR_GREY, "Du bist kein Taxifahrer");
    else if(id == INVALID_PLAYER_ID || IsPlayerNPC(id)) SendClientMessage(playerid, COLOR_GREY, "Dieser Spieler kann nicht erreicht werden.");
    else
    {
    new Float:X,Float:Y,Float:Z;
    GetPlayerPos(id, X,Y,Z);
    SetPlayerCheckpoint(playerid, X,Y,Z, 6);
    SendClientMessage(playerid,COLOR_GREEN,"Der Anrufer mit der ID %s wartet dort auf dich",id);
    SendClientMessage(id,COLOR_GREEN,"Ein Taxifahrer mit der ID %s befindet sich bereits auf dem Weg zu dir",playerid);
    }

    return 1;
    }


    Warns:


    C:\Users\X\Desktop\dudalus136.pwn(4769) : warning 202: number of arguments does not match definition
    C:\Users\X\Desktop\dudalus136.pwn(4788) : warning 202: number of arguments does not match definition
    C:\Users\X\Desktop\dudalus136.pwn(4789) : warning 202: number of arguments does not match definition
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    3 Warnings.


    Also übberall dort, wo ich playerid oder id in einer SCM anzeigen will. Was mache ich falsch ?


    MfG dUDA


  • SendClientMessage(i,COLOR_GREEN,"Der Anrufer mit der ID %s benötigt deine Hilfe",playerid);
    SendClientMessage(playerid,COLOR_GREEN,"Der Anrufer mit der ID %s wartet dort auf dich",id);
    SendClientMessage(id,COLOR_GREEN,"Ein Taxifahrer mit der ID %s befindet sich bereits auf dem Weg zu dir",playerid);


    Wo hast du gelernt wie man SCM's benutzt? ^^


    Es muss so sein:

    new string1[128],string2[128],string3[128];
    format(string1,128,"Der Anrufer mit der ID %s benötigt deine Hilfe",playerid);
    format(string2,128,"Der Anrufer mit der ID %s wartet dort auf dich",id);
    format(string3,128,"Ein Taxifahrer mit der ID %s befindet sich bereits auf dem Weg zu dir",playerid);


    SendClientMessage(i,COLOR_GREEN,string1);
    SendClientMessage(playerid,COLOR_GREEN,string2);
    SendClientMessage(id,COLOR_GREEN,string3);