Beiträge von Ternary

    Aktuelle Version: v1.1


    Vorwort
    Hallo Breadies,
    lang lang ist's her, dass ich mein letztes Script veröffentlicht habe. Ich gebe zu, dass ich mich ein wenig aus der Szene zurückgezogen habe. Doch nun komme ich wieder (ha, zu früh gefreut) :P
    Deshalb veröffentliche ich nun meine Arbeit von dieser Nacht.


    Was ist es?
    Es handelt sich hierbei um ein Raketen-Script.
    Aus dem Kontrollraum der Area51 kann man Raketen abfeuern, die irgendwo explodieren.
    Dazu wählt man den entsprechenden Punkt einfach auf der Karte aus.
    Die Rakete explodiert an der Stelle, an der sie ein World-Objekt berührt. Das heißt, entweder auf dem Boden, oder irgendeinem Dach. Fahrzeuge oder Personen werden einfach "durchschossen", also ignoriert. Objekte werden auch nicht beachtet. Es zählt wirklich nur die originale Welt.


    Voraussetzungen
    Wie immer, verwende ich auch hier ZCMD. Das ist allerdings nur zum Compilen nötig, wer das Script also verwendet, wie es ist, braucht es nicht unbedingt.
    Was auf jeden Fall gebraucht wird, ist das MapAndreas-Plugin. Ohne dieses Plugin kann das Filterscript nicht richtig arbeiten, da es die Daten vom Boden bzw. einem Hausdach aus diesem Plugin erhält. Zum Compilen wird dann auch noch die dazugehörige Include benötigt.
    Downloaden kann man das MapAndreas-Gesamtpaket hier.


    Video
    [video]

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.
    [/video]
    Sorry für die extremst miserable Qualität. Sowas kommt raus, wenn man schlechtes Internet hat und nicht 8 Stunden mit einem Video-Upload verbringen will 8|
    Vielleicht will mir ja jemand ein anständiges Video erstellen :P
    Wichtig: Das Video ist nicht mehr aktuell. Siehe Changelog für aktuellere Informationen.


    Bekannte Bugs

    • Man darf bei /startrocket nicht im Icon stehen, sonder man muss daneben sein, da sonst der Text mit "/startrocket" die Textdraws immer überschreibt


    Download


    Pastebin


    Mediafire



    Changelog
    v1.1 Startzeit auf 50 Sekunden verkürzt


    Edits
    1. Rechtschreibung + Edits eingefügt
    2. Formatierung
    3. Nochmal Formatierung
    4. Bekannte Bugs eingefügt
    5. Neue Version
    6. Und schon wieder die Formatierung :S

    CurrentMap von 2 nach 0 runterzählen und dann halt wieder auf 2 setzen.
    Mit dem Code da kommen wir nicht weit... da fehlt die hälfte

    Durch das Callback-Hooking wird bei OnFilterScriptInit beispielsweise automatisch erst der Callback in der Include aufgerufen, der dann erst an das Init im Script weiterleitet.
    So kann man im Script ganz normal seine Callbacks ohne zusatzfunktionen benutzen, und die Include klappt trotzdem richtig.

    Naja, wie ihr so günstige Lizenzen verkaufen könnt sieht man ja hier dran:


    Minecraft Key bei euch: 25€
    Minecraft Key bei Mojang (Herstellerfirma von Minecraft): 19.95€


    So weit ich weiß, darf auch nur Mojang diese Keys vertreiben

    Also, hallo Leute.


    Ich habe heute gleich mehrere Fragen, die hoffentlich alle beantwortet werden :D
    Also fange ich mal an:


    1. Kann man es via JavaScript (jQuery-Lib) umsetzen, eine Box mit ihrem Text langsam einzublenden? Also, dass sie erst nur ganz schwach, bzw. größtenteils transparent ist, und langsam immer sichtbarer wird.


    2. Wie kann man eine Box nicht nur horizontal, sondern auch vertikal, zentriert ausrichten? Also mit center bekomme ich ja das horizontale hin, nur hätte ich es halt auch gerne vertikal mittig.
    Ich möchte da ungern mit konstanten Pixleanzahlen arbeiten, da bei unterschiedlicher Bildschrimauflösung dann auch die Box an unterschiedlichen Positionen steht.


    Das war's erstmal soweit, hoffe ihr könnt mir da helfen.


    MFG
    Ben

    Omg....
    Lern doch bitte erstmal die Grundlagen...
    sizeof(bla) war ein Beispiel. Bei dem was hier ist, wäre richtig:
    format(string20, sizeof(string20), " ....
    Wie kommts überhaupt, dass du string20 mit einer länge von string19 formatierst? Ich glaube du hast das komplette format-System nicht verstanden.
    Guck dir das im samp-Wiki mal an, dann kann man weiterreden, aber so kann das nicht gehen.


    Edit: @Abwerber2000: Steck deine neue Abwerbe-Community sonst wo hin, die wird nicht lange existieren, genauso wie dein Account hier.
    Edit 2: Außerdem stimmt kaum was von deinen Versprechungen. Klar, sichereres Handeln... sind ja auch keine da, mit denen man handeln kann, dann ist es sicher xD

    Ich mach mir hier zwar unbeliebt, aber jetzt muss ich mal tacheles reden:


    Es ist doch sowasvon scheiß egal von wem das hier ist. Hauptsache es hilft jemandem. Und selbst wenn er alles erfragt hat, was er nicht hat, dann ist das doch kein Problem?!
    Das Forum ist dazu da Leuten zu helfen. Dazu zählt auch, Sachen zu fragen, zu verarbeiten und letztendlich dann zu veröffentlichen... Wen interessierts, obs nun von ihm ist oder nicht?


    MFG
    Ben

    Was ich mich grade frage ist, warum alle denken, er hätte den Code komplett erfragt.
    Mein Gott, wenn ihr doch schon so eingebildet seid, und der Meinung seid, der Rest ist alles dumm, dann haltet doch selbst zu eurem Wort und DENKT MAL NACH bevor ihr postet.


    Er hat lediglich gefragt, wie man an die Bezeichnungen bzw. die Datenamen der einzelnen Bilder rankommt. Dort steht nichts von irgend einem Code.
    Also lasst ihn mal gefälligst in Ruhe und packt euch mal an die eigene Nase.


    MFG
    Ben

    Mach es so.
    Er kann sich über RCON dein Adminlevel geben, ja. Aber noch bevor er dazu kommt wird er gebannt.
    Ist meiner Meinung nach die simpelste Lösung...
    Denn wenn er das RCON Passwort ''wie auch immer'' ständig weiß...soll er doch.
    Sobald er /rcon login XY eintippt mit dem richtigen Passwort, wird er gebannt.


    //edit: /makeadmin rausnehmen. Du kannst es ja selber über rcon machen^^


    Ihr habt es immernoch nicht verstanden, oder? Einen solchen Callback gibt es nicht...
    Es gibt höchstens OnRconLoginAttempt(ip[], password[], success), wobei dieser Code aber aufgrund der fehlenden playerid auch nicht geht...

    So bringt man den Anfängern aber "falsches" scripten bei. Bei mir war es genauso und jetzt muss mir BlackAce stück für stück in den Kopf eintrichtern, wie man sowas ressourcenschonend macht.
    Und es ist ja nicht so, dass deins nicht nur nicht ressourcenschonend ist, sondern dass es die Ressourcen geradezu auffrisst.


    Ich sehe jetzt schon Scripte von Anfängern vor mir, die ein eigenes Rechenzentrum brauchen und sowas fördert das einfach nur.


    Man sollte es den Usern schon richtig beibringen. Ich verurteile diese Methode nicht, aber es ist halt nicht die beste. Und bitte tu uns allen den Gefallen, und schreibe noch rein, dass der Timer bei OnPlayerDisconnect bitte zu löschen sei, bzw. zeige den Leuten das. Und stell die Timerzeit auf minimal 100, das reicht vollkommen, denn so viel Leben kann man garnicht verlieren, eigentlich würden sogar 500ms reichen.


    Edit: Kleine Erläuterung wie man das mit dem löschen am besten löst:
    Oben "new timer[MAX_PLAYERS];", vor den Timer "timer[playerid] = SetTimer...", und bei OnPlayerDisconnect beendest du den "timer[playerid]" halt wieder.

    Hallo Leute, ich habe folgendes Problem, und zwar mache ich folgendes:
    new temp[6][128];
    sscanf(string, "a<p<,>s[128]>[6]", temp);


    Wenn ich das derart mache, bekomme ich folgende Warnings in der Console:

    Zitat

    [21:13:59] sscanf warning: Unclosed specifier parameter, assuming '<', consider using something like p<<>.
    [21:13:59] sscanf error: String/array must include a length, please add a destination size.


    Was mache ich da falsch?


    MFG
    Ben


    Edit:
    Habe es vorher schon so probiert:
    new temp[6][128];
    sscanf(string, "p<,>a<s[128]>[6]", temp);

    Und was soll jetzt der Präfix [0.3e] ?!
    Das kann man mit 0.3d genauso machen. Falls nicht, korregiert micht, aber ich habe keine Funktion gefunden, die es nur in 0.3e gibt...


    Bitte ändere mal den Präfix, das könnte andere eventuell täuschen.


    MFG
    Ben


    Edit: Abgesehen davon kannst du deinen Server direkt umbringen. Wenn mal 30 Spieler auf dem Server sind, und jenachdem immer mal wieder neue dazuconnecten und wieder weggehen, dann explodiert der Server schon bald, da du am Ende 100 Timer am laufen hast, nämlich für jeden Spieler der einmal connected ist. Wenn ich jetzt 3 mal connecte, habe ich 3 Timer nur für mich. Abgesehen davon ist es sinnlos den alle 1 Millisekunden upzudaten. 200 Millisekunden würden locker reichen, abgesehen davon, dass man es auch ganz ohne Timer machen könne, auch wenn es dann komplizierter wäre.

    I. Einleitung
    II. Textdraw erstellen
    III. Textdraw anklickbar machen
    IV. "Anklickmodus" starten
    V. Das Callback
    VI. Schlusswort



    I. Einleitung


    Hallo liebe Brotfische,


    seit der SAMP-Version 0.3e gibt es nun eine Möglichkeit, die Textdraws anklickbar zu machen und das Klicken eine bestimmte Funktion ausführen zu lassen.
    Mit Hilfe dieser Funktion ist es nun endlich möglich, beispielsweise richtige Handys oder auch neuartige Skin-Auswahlen zu schaffen.


    Ich möchte euch heute mal erklären, wie das ganze funktioniert, um bereits jetzt prophylaktisch zu verhindern, dass dämliche Fragen danach erstellt werden.


    Also wollen wir mal Anfangen.


    II. Textdraw erstellen


    Was brauchen wir, um ein anklickbares Textdraw zu erstellen? - Genau, erstmal ein nicht anklickbares Textdraw.
    Also, worauf warten wir? Wir erstellen sofort, schnell und einfach mal ein Textdraw. Es gibt extra Textdraw-Creator-Filterscripts, die man verwenden kann, man kann es allerdings auch manuell machen. Als Demonstrationstextdraw nehme ich hier nun eines aus meiner Teamselection für ein DM-Script.
    Textdraw0 = TextDrawCreate(150.000000, 99.000000, "USA");
    TextDrawBackgroundColor(Textdraw0, 255);
    TextDrawFont(Textdraw0, 1);
    TextDrawLetterSize(Textdraw0, 0.669999, 2.000000);
    TextDrawColor(Textdraw0, -1);
    TextDrawSetOutline(Textdraw0, 0);
    TextDrawSetProportional(Textdraw0, 1);
    TextDrawSetShadow(Textdraw0, 1);
    Dies ist nun ein ganz normales Textdraw, welches bei OnGameModeInit einzubauen ist. Wichtig ist natürlich auch, dass wir die Variable Textdraw0 zuvor noch oben definieren.



    III. Textdraw anklickbar machen


    Schön, wir haben jetzt ein Textdraw, aber wie war das jetzt mit dem anklicken? Das kommt jetzt.
    Vom SA-MP Team selbst wird empfohlen, dem Textdraw zusätzlich noch eine genaue Größe zuzuweisen, um dadurch das anklickbare Feld genau zu bestimmen. Dies machen wir mit folgendem Code:
    TextDrawTextSize(Textdraw0, 199.000000, 796.000000);
    Bei meiner Teamselection habe ich die Größe absichtlich sehr groß gemacht, um den ganzen Bot sozusagen anklickbar zu machen. Aber lasst euch davon nicht irritieren, die Größe könnt ihr ja einfach so ändern wie ihr sie braucht.
    Indem ihr TextDrawUseBox verwendet, könnt ihr euch eine Box anzeigen lassen, und dadurch den anklickbaren Bereich genau anzeigen lassen.
    Nun haben wir alle wichtigen Vorgaben für das Textdraw erfüllt und können es nun anklickbar machen.
    TextDrawSetSelectable(Textdraw0, 1);
    Dadurch setzen wir die Selectable-Einstellung des Textdraws auf 1, also true. Setzen wir sie auf 0, also false, wird das Textdraw dann nicht mehr anklickbar sein.



    IV. "Anklickmodus" starten


    Na gut, ein anklickbares Textdraw haben wir schonmal, nur es funktioniert noch nicht. Denn es ist nur in einem bestimmten Modus anklickbar.
    Für meine Skin-Selection habe ich es beispielsweise direkt nach dem Login eingebaut. Den Anklickmodus für einen Spieler starten wir mit folgender Funktion:
    SelectTextDraw(playerid, 0xFFFFFFFF);
    Wichtig ist natürlich noch, dass wir das Textdraw zuvor noch dem Spieler anzeigen, was mit TextDrawShowForPlayer umsetzen können.
    Der erste Parameter von SelectTextDraw gibt an, für welchen Spieler der Anklickmodus gestartet werden soll, der zweite die Hoverfarbe, also in welcher Farbe das Textdraw erscheinen soll, wenn der Spieler mit der Maus darüber fährt.
    Zu beachten wäre noch, dass dadurch alle als anklickbar definierten TextDraws, die bei dem Spieler momentan angezeigt werden, ab sofort auch anklickbar sind. Das heißt, dass eventuelle andere TextDraws vorher noch versteckt werden sollten.



    V. Das Callback


    Wenn ein Spieler das Textdraw nun anklickt wird ein bestimmter Callback aufgerufen. Was ein Callback ist, solltet ihr eigentlich bereits wissen.
    Es handelt sich dabei um folgenden:
    public OnPlayerClickTextDraw(playerid, Text:clickedid)
    Die Parameter enthalten zum einen den Spieler, der das Textdraw angeklickt hat, und zum anderen das angeklickte Textdraw.
    Wenn wir nun wollen, dass wenn der Spieler das Textdraw angeklickt hat, der Anklickmodus beendet und das Textdraw versteckt wird, müssen wir das ungefähr so machen:
    public OnPlayerClickTextDraw(playerid, Text:clickedid) {
    if(clickedid == Textdraw0) {
    CancelSelectTextDraw(playerid);
    TextDrawHideForPlayer(playerid, Textdraw0);
    return 1;
    }
    return 1;
    }
    Wir prüfen also erst, ob es sich wirklich um das Textdraw handelt, beenden dann den Anklickmodus und verstecken das Textdraw. Danach können wir noch alles mögliche aufrufen, was wir aufrufen wollen, beispielsweise um den Skin des Spieler zu setzen:
    public OnPlayerClickTextDraw(playerid, Text:clickedid) {
    if(clickedid == Textdraw0) {
    CancelSelectTextDraw(playerid);
    TextDrawHideForPlayer(playerid, Textdraw0);
    SetPlayerSkin(playerid, 0);
    return 1;
    }
    return 1;
    }



    VI. Schlusswort


    Ich hoffe dieses kleine aber feine Tutorial hat euch einen schönen Einblick in die kommenden 0.3e-Funktionen geschafft und euch sehr geholfen.
    Bewertungen sind natürlich gerne erwünscht, für Fehler, sei es nur in der Einrückung, übernehme ich natürlich keine Haftung, aber euer Computer sollte schon nicht durch sowas in die Luft fliegen :P


    Mit freundlichen Grüßen,
    946ben


    Edit 1: Kleine Anmerkung zu TextDrawUseBox eingefügt (danke an BlackAce) | Edit 2: Titel bearbeitet