Beiträge von Templer

    new Float:RandomCarSpawn[][] = //Kann man Leerlassen, wenn du direkt reinschreibst
    {
    {-1937.7556,254.7303,40.7958,305.5078},
    {-1938.9354,262.7770,40.7961,308.2664},
    {-1939.1427,275.5966,40.7946,234.6807},
    {-1937.9933,268.9982,40.7957,296.6247},
    {-1922.4078,242.3564,40.7957,1.3237},
    {-1922.5801,304.1950,40.7960,179.2829},
    {-1915.7850,306.7280,40.7959,180.4715} //Das letzte Komma war zuviel
    };//Das ust die zeile 1058

    Einfach die ArrayGröße leerlassen, da er dies auch der Compiler berechnen kann, nachher bitte mit meinem Code neu Kompilieren und alle Errorzeilen zeigen, da du im Script sie falsch verwendet hast:


    new GunPrice[][] = {
    {75}, //parachute
    {75}, //golfclub
    {75}, //nightstick
    {75}, //knife
    {75}, //baseballbat
    {100}, //shovel
    {75}, //poolcue
    {50}, //purpledildo
    {50}, //whitedildo
    {50}, //longwhitedildo
    {50}, //whitedildo2
    {50}, //flowers
    {600}, //cane
    {300}, //sdpistol
    {300}, //colt45
    {500}, //deagle
    {400}, //Tec9
    {400}, //uzi
    {500}, //mp5
    {750}, //shotgun
    {1200}, //spas12
    {600}, //ak47
    {600}, //m4
    {1000}, //rifle
    {7}, //pistolammo
    {7}, //shotgunammo
    {9}, //smgammo
    {10}, //assaultammo
    {10} //rifle
    };

    Falsche Geschwindigkeitsberechnung?


    Aufgrund mangelnder Informationen kannst du diese Funktion nutzen:


    /* Wiedergibt die Geschwindigkeit, egal ob zu Fuß oder im Fahrzeug, vom Spieler */
    // playerid Die PlayerID vom Spieler
    GetPlayerSpeed(playerid) // by misco
    {
    new Float:Vx, Float:Vy, Float:Vz, Float:rtn;


    if(IsPlayerInAnyVehicle(playerid))
    {
    GetVehicleVelocity(GetPlayerVehicleID(playerid), Vx, Vy, Vz);
    }
    else
    {
    GetPlayerVelocity(playerid, Vx, Vy, Vz);
    }


    rtn = floatsqroot(Vx * Vx + Vy * Vy + Vz * Vz);
    return floatround(rtn * 100 * 1.61);
    }

    Zwar haut dies den ganzen Kontext von 'BlackAce' aus, aber wenn es dir so schwer fällt hab ich dir hier ein kleines Callback gemacht :P




    forward CheckMoney(playerid);
    forward OnPlayerChangeMoney(playerid, new_money);
    public OnGameModeInit()
    {
    SetTimer("CheckMoney", 1000, true);
    }
    public CheckMoney(playerid)
    {
    if(GetPVarInt(playerid, "Spieler_Bargeld") != GetPlayerMoney(playerid))
    {
    CallLocalFunction("OnPlayerChangeMoney", "dd", playerid, GetPlayerMoney(playerid) - GetPVarInt(playerid, "Spieler_Bargeld"));
    SetPVarInt(playerid, "Spieler_Bargeld", GetPlayerMoney(playerid));
    }
    return true;
    }
    public OnPlayerChangeMoney(playerid, new_money)
    {
    //Hier kannst du nun überprüfen, ob der Spieler mehr Geld bekommen oder Geld verloren hat.

    if(new_money > 0) SendClientMessage(playerid, 0xFFFFFF, "Sie haben mehr Geld bekommen.");
    else if(new_money < 0) SendClientMessage(playerid, 0xFFFFFF, "Sie haben Geld verloren.");

    return 1;
    }

    Ja, daher auch das "never used", also "nie benützt". Er durchsucht ja dein Script nach diesen Funktionen, aber um dies zu beheben suche einfach nach 'IsNumeric' oder 'ReturnUser' und setze vor Ihnen den Tag "stock ", also:


    stock IsNumeric( /*Parameter*/)
    stock ReturnUser( /*Parameter*/)

    Ganz einfach und vielleicht etwas mehr Arbeit ist einfach für jeden Timer von dem du die Zeit wissen willst eine Variable zu erstellen, hier das Beispiel mit GlobalTimer und OneUseTimer:



    forward GlobalTimer();
    forward OneUseTimer();
    new gGlobalTimerCounter;
    new gOneUseTimerCounter;
    public OnGameModeInit()
    {
    SetTimer("GlobalTimer", 5000, true); //Alle 5 Sekunden.
    gGlobalTimerCounter = gettime() + 5; //Ab derzeitigem Sekundenzähler noch 5 dazu.


    SetTimer("OneUseTimer", 10000, false); //Einmalig nach 10 Sekunden.
    gOneUseTimerCounter = gettime() + 5; //Ab derzeitigem Sekundenzähler noch 10 dazu.
    }
    public GlobalTimer()
    {
    //Es wurde gerade ausgeführt und da er sich wiederholt, nochmal 5 Sekunden zum derzeitgen Sekundenzähler
    gGlobalTimerCounter = gettime() + 5;


    //restlicher Code


    return 1;
    }
    public OneUseTimer()
    {
    //Da OneUseTimer nur einmal aufgerufen wird, reicht es die Variable 'gOneUseTimerCounter'
    //nur bei Auruf von SetTimer zu setzen.


    //restlicher Code


    return 1;
    }
    //Um nun herauszufinden, wann GlobalTimer und OneUseTimer aufgerufen wird einfach:
    new string[128];
    format(string, sizeof(string), "'GlobalTimer' wird in %d Sekunden ausgeführt.", gGlobalTimerCounter - gettime());
    SendClientMessage(playerid, COLOR_GREY, string);


    format(string, sizeof(string), "'OneUseTimer' wird in %d Sekunden ausgeführt.", gOneUseTimerCounter - gettime());
    SendClientMessage(playerid, COLOR_GREY, string);


    //Natürlich kann es nun sein, da 'OneUseTimer' nur einmal aufgerufen wird, dass dann negative Sekunden angezeigt werden,
    //weil der Sekundenzähler von 'gettime()' nun größer ist als die Variable von 'gOneUseTimerCounter', daher
    //hier ein kleiner Fix


    new oneusetime = gOneUseTimerCounter - gettime();
    format(string, sizeof(string), "'OneUseTimer' wird in %d Sekunden ausgeführt.", (oneusetime >= 0 ? oneusetime : 0));
    SendClientMessage(playerid, COLOR_GREY, string);


    //oder anders


    new oneusetime = gOneUseTimerCounter - gettime();
    if(oneusetime >= 0) format(string, sizeof(string), "'OneUseTimer' wird in %d Sekunden ausgeführt.", oneusetime);
    else format(string, sizeof(string), "'OneUseTimer' wird nicht mehr ausgeführt.");
    SendClientMessage(playerid, COLOR_GREY, string);


    Hah, und ich hab programmieren gelernt, indem ich den Godfather Zeile für Zeile (1 - 2 Monate) auf deutsch übersetzt habe und somit das Script auswendig konnte. Mit der Zeit ist nach dem Übersetzen dann das Wissen zu Programmieren, wie das Empfängnis von Maria, zu mir gekommen :-p


    Damaliges Problem: Ich hab nie kapiert, dass wenn man zu oft "CreateMenu" aufruft, dass der Server abstürzt xD

    Zitat

    Die Änderungen werden erst nach einem Neustart aktiv und nicht direkt live, da sowas für SA-MP zu viel wäre ^^

    Genau aus diesem Grunde finde ich es selber unbrauchbar. Ansonsten hätte man damit Beispielsweise auch gute SAMP Behebungen machen können, wie dass man Bots auf Slots setzen könnte, worauf der Spieler kein Zugriff hat.



    Maximale Slotanzahl: 30
    Bot bekommen ID´s nach 30 ^^



    //EDIT: was ich geschrieben hab, ist schmafu... Das unterstützt ja schon SAMP Intern mit den Bots ^^

    Zitat

    Ein Gameserver, der z.B. über ein Panel konfiguriert wird, und maximal 50 Slots mit 3 NPC´s zulässt, lässt sich mit diesem Plugin in wenigen Minuten auf 500 Slots mit 10 NPC´s hochschrauben. Wer dies macht, haftet selbst dafür, da dies nicht der eigentliche Sinn des Plugins ist.

    Genau aus diesem Grund sperren manche/viele Hoster das Benützen von eigenen Plugins. ^^



    Nebenbei wirkt sich das nicht negativ auf den Server aus, wenn man mittendrin die Slotanzahl erhöht/niedriger setzt? Also was würde Beispielsweise geschehen, wenn 50 Spieler oben sind und man danach die Slot auf 40 stellt.



    Abgesehen von der regulären MAX_PLAYERS Definition im Script, da wenn die Slotanzahl niedriger als MAX_PLAYERS ist, zu diesen Array-Fehlern kommen, die den restlichen Code nichtmehr ausführen :P .

    public OnPlayerPickUpPickup(playerid, pickupid)
    {
    for(new t = 1; t < MAX_HOUSES; t++)
    {
    if(pickupid == haus[t][hIDP] && WillRein == 1 && WillRaus == 0)
    {
    SetPlayerInterior(playerid,haus[t][hInt]);
    SetPlayerVirtualWorld(playerid, haus[t][hID]+1);
    SetPlayerPos(playerid, haus[t][hX2],haus[t][hY2],haus[t][hZ2]);
    }
    else if(pickupid == haus[t][hIDP2] && WillRaus == 1 && WillRein == 0)
    {
    SetPlayerInterior(playerid,0);
    SetPlayerVirtualWorld(playerid, 0);
    SetPlayerPos(playerid, haus[t][hX]+2,haus[t][hY],haus[t][hZ]);
    }
    }
    for(new i = 1; i < MAX_TANKEN; i++)
    {
    if(pickupid == tanke[i][tIDP] && tanke[i][tBetrieb] == 1 && WillRein == 1 && WillRaus == 0)
    {
    SetPlayerInterior(playerid,tanke[i][tInt]);
    SetPlayerVirtualWorld(playerid, tanke[i][tID]+1);
    SetPlayerPos(playerid, tanke[i][tIX],tanke[i][tIY],tanke[i][tIZ]);
    TankeCP[i] = SetPlayerCheckpoint(playerid,tanke[i][tCPX],tanke[i][tCPY],tanke[i][tCPZ],2);
    }
    else if(pickupid == tanke[i][tIDP] && tanke[i][tBetrieb] == 0 && WillRein == 1 && WillRaus == 0)
    {
    SendClientMessage(playerid,COLOR_RED,"Diese Tankstelle ist InAktiv!");
    WillRein = 0;
    }
    else if(pickupid == tanke[i][tIDP2] && WillRaus == 1 && WillRein == 0)
    {
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    SetPlayerPos(playerid, tanke[i][tPX]+2,tanke[i][tPY],tanke[i][tPZ]);
    DisablePlayerCheckpoint(playerid);
    }
    }
    return 1;
    }

    Dieses Wort von Maddin zählt. Es wurde auch nirgendwo bekannt gegeben, dass es genau mindestens 2 Teilnehmer geben musste. Würde man nun die vorhin genannte Behauptung von wegen "rippen" auslassen, wäre es in dem Sinne N a t e zugesprochen seinen Preis zu erhalten. Bisher hat er ja nur als alleiniger die Mühe aufgenommen überhaupt etwas zu schaffen und da auch noch keine minderst Bewertung angegeben wurde (Beispiel: Umfrage) steht ein Sieger fest. Nebenbei wird das vorhandene Design vom Forum hier natürlich nicht ersetzt, sondern das von N a t e als Zusatz hinzugefügt und wer es nicht haben will, soll auch noch auf den Stil wechseln.


    Die Sachen wie "Es gab keine Konkurrenz", "Er hat Angst vor anderen Mitstreitern", "Sein Design ist schlecht" ist keine Ausrede für eine nicht Einhaltung des Gewinnes.


    Wenn die Moderatoren und Administratoren mit dieser Entscheidung nicht umgehen können, sollten Sie lieber nächstes mal diesen Contest genauer planen. Denn der Beitrag den ich gesehen habe kann nur in maximal 5 - 10 Minuten (je nach Tippgeschwindigkeit) geschrieben worden sein. Und die Regel von wegen "Verlängerung möglich" kann auch nicht gelten, da sich auch keiner in diesem Zeitraum gemeldet hat, der noch eine kleine Zeit für sein Stil gebrauchen könnte.


    Daher sollte dieses Thema endgültig geschlossen werden und der N a t e soll seinen Gewinn erhalten. Nicht nur die Forengäste/-benutzer sollen sich an geschriebene Regeln halten, sondern auch die andere Seite (diese gewaltige Aussage soll denn Nutzern in diesem Thema angesprochen sein, wenn auch an einen Administrator/Moderator, die gegen die Gewinnausschüttung waren oder noch immer sind).

    yay du kriegst 10 / 10 Punkten nur weil folgendes drin steht, ansonsten fördere ich nur meine Beitragszahl :-p


    if(x==0&&y==0&&z==0) return SendClientMessage(playerid,0xFF0000FF,"FEHLERCODE 1337 LOL ZOMFG ROFL LMAO!!!!!");


    auch wenn ich eher 'floatcmp' bevorzugt hätte, wegen Integer und Float Vergleich.

    Sicher das die Definition 'gate1' auch wirklich einem CreateObject zugewiesen ist?


    Ansonsten würde ich mir anschauen, ob die Codes vor SetTimer überhaupt aufgerufen werden.


    und zu aller Letzt auch wirklich nachprüfen, ob die Koordinaten zum schließen nicht den Koordinaten zum öffnen ähneln (Ist ein Fehler der sehr oft passiert).

    Also die Bitshift Operatoren << und >> verschieben einfach von einem Integer die Bits nach links oder Rechts.


    Testen kannst du es indem du im Windows Taschenrechner auf "Programmieren" gehst, dort dann eine Integer Bytezahl mit sagen wir vielleicht 25 eingibst und dann mit den Knöpfen RoL (BitShift nach Links <<) und RoR (BitShift nach Rechts >>) erkennen kannst, dass oben bei den Zahlen im Dualsystem sich die 1er oder 0er nach rechts oder links verschieben. Der Gebrauch ist aber in Pawn sehr unwahrscheinlich, da Pawn hauptsächlich nur mit ByteZahlen arbeitet im Gegensatz beispielsweise zu C++.