Beiträge von Goldkiller

    Beides hat mMn Vor- und Nachteile.
    Was man in Beiden Fällen machen müsste, wäre zusätzlich sich die Routen-ID merken.
    enum e_PlayerMuellInfo {
    bool:pmi_bAktiv, // Könnte man entfernen, wenn pmi_RoutenID = 0 bedeutet Inaktiv und alles 1>= Aktiv
    pmi_Checkpoint,
    pmi_Route //Neu
    }


    Ein extra enum für jede Route ist nicht so klug. Da würde ich eher nur ein extra Wert anlegen um die Route zu speichern.
    Also so:
    //Methode 1)
    enum e_Muell {
    Float:M_fX,
    Float:M_fY,
    Float:M_fZ,
    Float:M_fRad,
    M_iRoute //Neu
    }
    new
    Muellabfuhr_Stationen[][e_Muell] = { ... };
    Dann muss man aber zusätzlich durchzählen, bei welchem Index in der Variable Muellabfuhr_Stationen die Route für den Spieler beginnt und wie viele
    Checkpoints diese hat (zB 12).
    Also zB:

    Zitat

    Route 1 beginnt bei Index 0 und hat 7 Checkpoints (0-6)
    Route 2 beginnt bei Index 7 und hat 12 Checkpoints (7-18)
    etc


    Das könnte man in eine extra Variable auslagern ( zb: Muellabfuhr_Routen mit Routen-ID und Anzahl an CPs ) oder man sammelt die Information jedes mal wenn
    die benötigt werden.


    Eine Andere Möglichkeit wäre, man legt für jede Route eine extra Variable an.
    //Methode 2)
    // Keine Veränderung am enum
    enum e_Muell {
    Float:M_fX,
    Float:M_fY,
    Float:M_fZ,
    Float:M_fRad
    }
    new
    Muellabfuhr_Stationen_Route1[][e_Muell] = { ... },
    Muellabfuhr_Stationen_Route2[][e_Muell] = { ... },
    Muellabfuhr_Stationen_Route3[][e_Muell] = { ... };
    Könnte man auch machen, allerdings müsste man mit jeder neuen Route auch den Code anpassen (Abgesehen von den Daten für die Routen).
    Möglich wäre auch, dass mit der Pointer Include zu machen. Damit
    sollte es sogar einfacher sein,die 2. Methode umzusetzen. Bin mir aber auch nicht ganz sicher, ob das funktioniert (denke aber schon).


    So oder so, in Beiden Fällen müsste man den Code etwas umschreiben. Ich würde aber die 1.Methode nehmen, wenn ich sowas machen müsste.

    timer[playerid] = SetTimerEx("TotSekunde",1000,true,"i",playerid);//Startet er den Timer
    Der Parameter macht ja Sinn,du benutzt ihn aber nie:
    forward TotSekunde();
    public TotSekunde()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    Tottime[i] ++;
    if(Tottime[i] == 120)
    {
    Tottime[i] = 0;
    tottimer(i);
    }
    }
    }
    return 1;
    }
    Anstatt durch alle Spieler mit der Schleife zu gehen, nutzt doch den Parameter den du mit SetTimerEx übergibst.

    Wenn du die Funktion (CallRemoteFunction) kennst die du nutzen musst, wo liegt das Problem?
    Es fehlt zwar im Wiki ein Beispiel mit einem Return Wert, es ist aber dennoch beschrieben.

    Zitat

    Return Values:
    The value that the last public function returned.


    new return_wert = CallRemoteFunction("HierDieFunktion", "d", killerid/*oder playerid*/ ); //


    //Edit:
    Bevor ich es vergesse.
    Die Funktion IsRegierung sieht jetzt aber nicht so aus, als müsste man die unbedingt in ein Filterscript auslagern.

    //OnGameModeInit
    SetTimer("updateview", (1000*60)*60, true);


    Vom Prinzip her ist 60 Minuten ja richtig, praktisch würde es aber nicht so 100% funktionieren.
    Zum einen sind die Timer nicht genau. Bedeutet, 60 Minuten als Interval des Timers sind keine 60 Minuten in Echtzeit.
    http://forum.sa-mp.com/showthread.php?t=289675

    Zitat

    As you can see, the timer is roughly 25% off!


    Zum zweiten hast du (je nachdem wie du es möchtest) nicht das gewünschte Ergebnis. Angenommen die Timer wären exakt (sind sie aber nicht) und du startest um 10:59, sind wird die Ingame Zeit auf 10 gestellt. Obwohl in 1 Minuten bereits 11 Uhr wäre. Ist dann 11:59, dann wird erst auf 11 Uhr gestellt obwohl auch jetzt in 1 Minute bereits 12 Uhr wäre. Ich finde,dass das zu spät ist.
    Da die Timer aber langsamer sind, wird aus 60 Minuten (25% ist vllt etwas hoch) zB 62 Minuten. Starte ich jetzt um 10:59, wird die Uhr auf 10 geschaltet. Jetzt warte ich aber 62 Minuten und überspringe praktisch 11:** und gehe bis 12:01. Jetzt wird die Ingame Zeit auf 12 Uhr gestellt, war aber nie bei 11. Du hast also eventuell Pech und überspringst eine Uhrzeit.



    Setz die Zeit des Timers nicht auf 60 Minuten, da die Zeit zu wenig Spielraum gewährt. Ich würde die Zeit auf einen Wert zwischen 1-5 Minuten stellen. Die Zeit muss mMn nicht 100% genau sein, dass ist aber Jedem selbst überlassen.


    Es ist sogar noch viel einfacher :)
    Player[] online = Bukkit.getServer().getOnlinePlayers();
    String[] VAR_XY = new String[online.length]; // new VAR_XY[MAX_PLAYERS] wäre Integer
    VAR_XY[playerid] = 1; // <-- geht nicht, fehlermeldung


    Wirklich viel einfacher ... so einfach,dass es sogar 1 Fehler enthält :wacko: .

    Ich finde es wirklich gut, dass du die Lösung selbst gefunden hast. Besser ist sogar noch, dass du die Lösung mitgeteilt hast und somit eventuell anderen Usern hilfst. Zwar könntest du das Thema noch als Erledigt markieren, ist aber nur nebensache.
    Das du deine Lösung mitgeteilt hast ist in jedem Fall sehr gut. So sollten es viel mehr User tun :).

    Das reicht aber nicht wie du siehst.


    public LoadFrakCars()
    {
    //hier debuggen
    new data[2],id;
    cache_get_data(data[0],data[1],dbhandle);
    //hier debuggen mit data Werten
    if(!data[0])return 1;
    for(new i=0; i<data[0]; i++)
    {
    //hier debuggen mit i
    id = getFreeFrakID();
    //hier debuggen mit id
    if(id == -1)return 1;
    //hier debuggen
    fCar[id][fdb_id] = cache_get_field_content_int(i, "id");
    fCar[id][fModel] = cache_get_field_content_int(i, "Model");
    fCar[id][fx] = cache_get_field_content_float(i, "X");
    fCar[id][fy] = cache_get_field_content_float(i, "Y");
    fCar[id][fz] = cache_get_field_content_float(i, "Z");
    fCar[id][fr] = cache_get_field_content_float(i, "R");
    fCar[id][fc1] = cache_get_field_content_int(i, "Farbe1");
    fCar[id][fc2] = cache_get_field_content_int(i, "Farbe2");
    fCar[id][f_ID] = cache_get_field_content_int(i, "fID");
    fCar[id][fvID] = CreateVehicle(fCar[id][fModel], fCar[id][fx], fCar[id][fy], fCar[id][fz], fCar[id][fr], fCar[id][fc1], fCar[id][fc2], 0);
    printf("%i FCAR: %i, %f, %f, %f, %f, %i, %i", fCar[id][fdb_id], fCar[id][fModel], fCar[id][fx], fCar[id][fy], fCar[id][fz], fCar[id][fr], fCar[id][fc1], fCar[id][fc2]);
    }
    return 1;
    }
    Bei getFreeFrakID könnte man auch so debuggen.

    Wird auch nicht funktionieren.
    Bei cache_get_field_content_int und cache_get_field_content_float ist jeweils die falsche Zeile angegeben (immer 0).


    Zitat

    for(new i=0; i<sizeof(fCar); i++)


    Das würde ich so nicht machen. Mit data[0] hast du in dem fall doch die Anzahl an Zeilen und gehst die durch. Natürlich muss darauf geachtet werden, dass dann der Laufindex (i) niemals größer als sizeof(fCar) wird.

    Kombination aus Aktueller CP und Distanz zum nächsten CP (So habe ich es früher zumindest gemacht).
    Man rechnet quasi einen Score aus, den der Rennfahrer gerade hat.
    Zum Beispiel:
    Score = ( Aktueller-CP * 1000 ) + (1000 - Distanz-zum-nächsten-CP-Vom-Fahrer-Aus)
    Spieler 1 ist CP 5 und 20LE (Längeneinheiten) von CP 6 entfernt
    Score = (5 * 1000) + (1000 - 20 ) = 5980
    Spieler 2 ist auch CP 5 aber 30 LE von CP 6 entfernt und hätte damit Score 5970.


    Mit dem Score muss man dann natürlich noch die Sortierung durchführen.


    //Edit:
    Die 1000 kann man auch höher Stellen. Sollte aber so gewählt sein, dass es zwischen 2 CPs nie eine höhere Distanz gibt als diesen Wert. Denn der aktuelle CP sollte höher gewertet werden als die Distanz zum nächsten CP.


    Musst natürlich das Rad neu erfinden:

    Zitat

    core.inc
    native min(value1, value2);
    native max(value1, value2);


    Zitat

    stock GetTotalBits(v) {
    v -= ((v >> 1) & 0x55555555),v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
    return (((v + (v >> 4) & 0xF0F0F0F) * 0x1010101) >> 0x18);
    }


    Gib doch wenigstens den ursprünglichen Autoren an, zb den hier. Als ob es noch Niemandem aufgefallen wäre, dass hier ständig Sachen von sa-mp.com gepostet werden mit leichter Umstrukturierung (zB Änderungen der Variablennamen, mehrere Anweisungen in 1 Zeilen, Hex Schreibweise anstatt Dezimal).
    Gleiches würde ich auch bei SWAP anmerken.

    3 Fehler:


    1. Fehler:

    Zitat

    warning 213: tag mismatch


    Du willst nur Werte vom Typ Float, daher musst du die Variable auch damit versehen.
    new Float:Autohaus2Spawns...
    2. Fehler:

    Zitat

    new /*Float:*/Autohaus2Spawns[][3] = { // Hier steht eine 3 für die Anzahl an "Werten pro Zeile" - Stimmt nicht so ganz, kann man sich aber so vorstellen
    {1866.2549,-1863.8971,13.0965,89.3289}, // 4 Werte


    Die 3 in der Deklaration passt nicht zu den 4 Werten:
    new /*Float:*/Autohaus2Spawns[][4]
    3. Fehler:

    Zitat

    new randspawn = random(Autohaus2Spawns[][3]);


    Das passt vorne und hinten nicht.
    Hier ist eine gute Beschreibung im 2. Beispiel.
    new randspawn = random( sizeof(Autohaus2Spawns) );


    Jetzt müsstest du aber randspawn noch irgendwo benutzen ...

    Ist ja nicht so, als gäbe es in Smarty keine count (ähnliche) Funktion um damit eine for-Schleife Rückwärts laufen zu lassen.
    Kann mir nicht auch nicht so recht vorstellen, dass du mit Smarty im PHP Tag wieder Smarty ausgeben kannst/sollst :/.


    http://www.smarty.net/docsv2/de/language.function.php.tpl

    Zitat

    Dieses Tag ist nur für erfahrene Benutzer gedacht und wird auch von diesen normalerweise nicht benötigt.


    //Edit:
    http://www.smarty.net/forums/v…d316096d05651c34f909#9546
    Schon bischen her bei mir mit Smarty aber so ging es mMn früher.