Beiträge von Hagi

    Ich stehe ja so zu der ganzen Angelegenheit:


    - 0815 Server: Jedem mag es selber überlassen sein, was für einen Server er aufsetzt, ob ein standart Script oder nicht. Jeder Server, auch die Großen, hatten zu ihren Beginnen selber nur GF Scripte. Aber jedes Script kann sich weiterentwickeln und schlussendlich fast komplett Selfmade sein, so dass von den GS Strukturen fast nichts mehr übrig ist.


    - Rechtschreibung und Grammatik: Es ist von den Forenregeln auch nicht klar festgelegt. Man könnte die Rechtscheibung höchstens in Punkt 14 einbeziehen, auf die Qualität des Post. Jedoch ist ganz klar. Wer ordentlich schreibt und seinen Text vernünftig strukturiert erhält schneller Hilfe als jemand, der das einfach nur hinklatscht. Also schießt man sich mit einer schlechten Rechtschreibung und Strukturierung selber ins Bein. Dann benötigt es auch niemanden mehr der einen darauf hinweist, man erhält einfach selten Hilfe. Wer sich den Post nicht durchlesen will auf Grund der oben genannten Punkte, soll es halt sein lassen und der Treadersteller erhält keine Lösung.


    - Suchfunktion: Ja natürlich gibt es die Suchfunktion. Jedoch finde ich Beiträge in denen nur steht: " Äh Idiot Sufu", kontraproduktiv. Es wäre meiner Meinung nach viel effizienter einen Lösungsansatz zu geben und die Suchfunktion nur nebenbei zu erwähnen. Sollte es Probleme geben, da speziell auf die Wünsche des Usern zugeschnitten werden müssen, so hilft die Suchfunktion da auch nicht weiter.


    Schlussendlich: Jeder User ist unterschiedlich. Manche lernen und verstehen es auf Anhieb, wenn sie die Lösung sehen. Manche jedoch müssen halt einfach nachfragen, damit sie es verstehen. Aber das sei doch jedem selber überlassen wie er es angeht. Wer dann helfen möchte kann es tun, wer nicht soll es halt lassen.


    MFG und einen schönen Abend
    Hagi


    edit: Punkt Rechtscheibung

    Gehört zwar nicht ins Thema, aber naja:


    Deine Variable Zoneid existiert nicht. Vermutlich möchtest du einen return Wert von einer GangZone in dieser Variable speichern. Da dies normalerweise ein Int wert ist, würde


    new zoneid;
    vermutlich abhilfe schaffen. Aber ohne Quellcode leider keine kompetentere Hilfe möglich.

    Wie gesagt, Float ne.


    new Float:health;
    GetPlayerHealth(playerid,health);
    SetPlayerHealth(playerid, health - 5.0);


    edit: GetPlayerHealth

    Du brauchst ne Funktion, die dir die Entfernung zwischen Spieler und einem Punkt wiedergeben kann. Lässt sich mathematisch ganz einfach berechnen.


    So dann lässte durch alle ne Schleife laufen und speicherst jede Entfernung in eine Zelle eines Array. So zum Schluss dann noch schaun, ob eine Position kleiner ist als die vorherige und dann die Stelle des Arrays, welches auch gleichzeitig die Stelle im enum ist in einer seperaten Variable speichern: Sieht dann etwa so aus.



    new hit;
    new distance[maxplaces];


    for(new i = 0;i<maxplaces;i++)
    {
    distance[i] = /* Hier dann deine Funktion, die dir die Entfernung gibt*/;


    if(distance[i] < distance[hit])
    {
    hit = i;
    }
    }


    Die einzige Möglichkeit wäre:


    Den zweiten Index nicht mit einem Enum, sondern mit Zahlen zu benennen. Dann könntest du einfach ne for loop durchlaufen lassen. Problem dabei: du weißt nicht mehr welche Spalte welchen Wert enthält, da der Bezug zu Namen fehlt.


    Eine Alternative, leider nur mit viel Aufwand verbunden, sind die PVars. Ich denke, du willst die Variablen Clearen, wenn der Spieler offline geht ? Die PVars resetten sich automatisch wenn man sich ausloggt.


    Aber beide Varianten sind sehr aufwändig oder unübersichtlich. Demnach ist es wohl die einfachste Lösung alle Arrayzellen untereinander zu schreiben und auf Null zu setzen.

    Es wird eine Variable geben in der das Geld despeichert wird, welche bei deiner Funktion SaveAccount dann in eine Datei o.ä geschrieben wird. Wenn du den Namen der Var kennst, dann da einfach den Betrag reinschreiben, der nach dem kaufen des Autos noch da ist. Manche Script lesen direkt mit GetPlayerMoney aus, manche führen parallel aber auch noch eigene Variablen.


    if(strcmp(cmdtext,"/adrenalin",true)==0)
    {
    if(GetPVarInt(playerid,"Inventar") +1 <= GetPVarInt(playerid,"MaxInventar"))
    {
    SetPVarInt(playerid,"inventar",GetPVarInt(playerid,"inventar") +1);
    }
    return 1;
    }


    Sollte funktionieren

    Als erstes brauchst du ein verzeichnis der checkpoints in der linie


    enum ilinie
    {
    Float:x,
    Float:y,
    Float:z,
    name[20]
    }


    #define laengelinie1 10 // Für 10 Haltestellen
    new linie1[laengelinie1][ilinie] =
    {
    {123.4,234.5,345.6,"Haltestelle 1"}
    // Hier einfach dem dem Beispiel drüber weitere Haltestellen eintragen
    };


    Dann brauchst du einen Command, der den Spieler "duty" setzt. Man wird nur duty, wenn man sich in einem Bus befindet.


    if (strcmp("/busjob", cmdtext, true, 10) == 0)
    {
    if(IsPlayerInAnyVehicle(playerid))
    {
    new vid = GetPlayerVehicleID(playerid);
    new model = GetVehicleModel(vid);
    if(model == 431 || model == 437)
    {
    SendClientMessage(playerid, 0x33CCFFAA,"Du kannst nun deine Linie fahren");
    SetPlayerSkin( playerid, 122);
    SetPVarInt(playerid,"BUS",1);
    SetPlayerCheckpoint(playerid,linie1[GetPVarInt(playerid,"BUS")][x],linie1[GetPVarInt(playerid,"BUS")][y],linie1[GetPVarInt(playerid,"BUS")][z],7.0);
    new string[64];
    format(string,sizeof(string),"Nächste Haltestelle: %s",linie1[GetPVarInt(playerid,"BUS")][name]);
    SendClientMessage(playerid, 0x33CCFFAA,string);
    }
    }
    return 1;
    }


    Wir starten also die Linie und setzen den ersten marker.


    Überprüfen wir nun, ob der Spieler in einem Marker gefahren ist.


    public OnPlayerEnterCheckpoint(playerid)
    {
    if(GetPVarInt(playerid,"BUS") < laengelinie1)
    {
    if(IsPlayerInRangeOfPoint(playerid,10.0,linie1[GetPVarInt(playerid,"BUS")][x],linie1[GetPVarInt(playerid,"BUS")][y],linie1[GetPVarInt(playerid,"BUS")][z]))
    {
    DisablePlayerCheckpoint(playerid);
    SetPVarInt(playerid,"BUS",GetPVarInt(playerid,"BUS") +1);
    SetPlayerCheckpoint(playerid,linie1[GetPVarInt(playerid,"BUS")][x],linie1[GetPVarInt(playerid,"BUS")][y],linie1[GetPVarInt(playerid,"BUS")][z],7.0);
    new string[64];
    format(string,sizeof(string),"Nächste Haltestelle: %s",linie1[GetPVarInt(playerid,"BUS")][name]);
    SendClientMessage(playerid, 0x33CCFFAA,string);
    }
    }
    else
    {
    SendClientMessage(playerid, 0x33CCFFAA,"Du hast deine Route beendet und erhälst $1500");
    GivePlayerMoney(playerid,1500);
    }
    return 1;
    }


    Ist er in einem Radius von 10 Meter um den Checkpoint (sollte sich der Marker verschieben dienst es als protectionsystem) dann erhält er den nächsten Marker, sofern das nicht der letzte Marker war. Andernfalls erhält er sein Geld. Und die Route ist beendet.

    Bau dir mal nen debug command, der alle Autos mit einer for durchgeht und auf die Position setzt auf der diese Spawnen : "SetVehicleToRespawn();"


    Dann stellst du dich vor die schief stehenden Autos und beobachtest mal was passiert, wenn diese neu spawnen. Vllt erkennste ja was komisches.


    edit: Hier haste direkt den Command


    if(!strcmp("/respawndebug", cmdtext, true))
    {
    for(new i = 0;i<MAX_VEHICLES;i++)
    {
    SetVehicleToRespawn(i);
    }
    GameTextForPlayer(playerid,"Carrespawn im Debug",3000,3);
    }

    An Interiors kanns nicht liegen. Das einzige was ich mir vorstellen könnte. Die Autos spawnen zu "tief" und fallen deshalb durch die Map und Spawnen in der näheren Umgebung oder springen aus dem Boden ein paar Meter weiter. Versuch mal die z Koordinate um einen Meter zu erhöhen.


    Was noch sein könnte, dass die Autos mehrmals geladen werden. Dafür müssen diese ja nichtmal mehr als einmal im GM sein. Wenn du ein Filterscript benutzt passiert es häufig dass die Autos erstellt werden, dass Filterscript unloaded wird (die autos bleiben aber) und dann wieder geladen wird, wodurch die Autos ein zweites mal created werden. Nutzt du denn ein Filterscript für die obigen Autos?

    Dass du eine globale Variable nimmst


    PDtimer


    Die bei jedem Spieler einen neuen Wert erhält, da SetTimer ja die TimeriD returnt ist eher suboptimal, da Spieler A Disconnected auch der Timer von Spieler B gekillt wird. Mach lieber für jeden Spieler eine eigene Variable in der die Timerid des Spielers gespeichert wird.


    SetPVarInt(playerid,"TIMERID",SetTimer....);
    KillTimer(GetPVarInt(playerid,"TIMERID");

    Jaja da natürlich nicht. Di willst ja für jeden Spieler einen eigenen Timer haben oder ? Alternativ kannst du ja auch nur näherungswerte nehmen, sprich einen Timer, der alle 6 Sekunden mit einer for die Spieler durchgeht und jedem, egal ob schon 60 Sekunden auf dem Server oder nicht, eine Minute abzieht.


    Im ersten Falle musst du das unter OnPlayerConnect machen. Und nicht vergessen den Timer beim Disconnecten zu killen.


    SetPVarInt(playerid,"TIMERID",SetTimer....);
    KillTimer(GetPVarInt(playerid,"TIMERID");

    Ich denke, du willst jede Stune einen Payday erhalten. So du benutzt dafür eine Variable, die die verbleibenden Minuten enthält. Bdeutet also, dass der Public jede Minute (60 Sekunden = 60000 Millisekunden) aufgerufen werden muss. Soweit so gut, da du das ja schon hast. Thoretisch dürfte das auch so funktionieren. Das einzige, was ich jetzt noch komisch finde ist, dass du in deinem payday public einen integer Wert nutzt, der nicht übermittelt wird. Ich würde hier auf jeden Fall SetTimerEx nutzen, da so der Int Wert übermittelt werden kann. Dies könnte auch dein Problem lösen, da der public dann für einen Spieler genau das macht, was er auch soll und nicht zufällig einem Spieler zweimal den Public durchführt.


    SetTimerEx("paydaytimer",1000*60,1,"i",playerid);

    Würd einfach mal sagen, die Variable wird falsch gesetzt
    PlayerInfo[playerid][pJob] = 16;


    Laut der Abfrage:


    if(PlayerInfo[playerid][pJob] == 0 && PlayerInfo[playerid][pMember] != 18 || PlayerInfo[playerid][pJob] == 0 && PlayerInfo[playerid][pLeader] != 18 )


    Erhält man den Job trucker gesetzt, wenn man Zivilist ist (job 0) und nicht bei der Fraktion 18.