Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 12/02/14 in all areas

  1. ROLauncher (Ragnarök Launcher) Coded by: Leeg Designed by: Daegaladh After several weeks of coding and banging our heads on our keyboards, we are proud to announce you... ROLauncher (abbreviated as ROL) is a launcher for Ragnarök Online Clients from 2013 and onwards. As you may know, these new clients do not have any login screen at all (although you can restore it with recent patchers), but you can use a launcher to execute your client and be able to login successfully. Furthermore, ROLauncher has some new features that will seduce you... This is ROLauncher's main window (The background is transparent, what you are just seeing behind is my desktop). In this screen you can see some new additions. For example, we have added a new field called "PROFILE". What's its use? - You may ask. It is a listbox which will display all your stored accounts. You will be able to click on it and select the account you wish to use for login and it will automatically fill both ID and Password fields. Furthermore, we have added an editor to manage all your profiles. This is the profile editor window, which will allow you to create, delete, and edit all your stored profiles! Finally, we have added a checkbox that allows you to create new profiles without having to get into the editor. VIDEO Further features: [ADDED] Ability to create a log file with data of the installation folder plus md5 hashes of each file in it. Press CTRL+L in the main window to activate this function. This runs as a background process and it will not interfere in the GUI, so you can create the log file and still continue using ROLauncher while the log is being written. - As suggested by Conflicts See it in action HERE [ADDED] Auto updating: ROL will check for new updates, download them and patch itself every time a new ROL version is launched. [SOON] Localization: language depends on your system's language. Remember ROL won't work if your client was diffed with "Restore Login Window". And you need to enable the following diff: "Use SSO Login packet." Download 11 December 2014 There was a bug with the built-in updater! I found a bug in the built-in updater, which was not updating correctly, it's been fixed already, but you need to redownload ROL (sorry!). I've already updated all the links. Changelog ::: [F.A.Q.] ::: Do I need anything special to make this work? No, you just need a 2013 or onwards client and .NET Framework 4, which you should already have in your computer. If you don't have it, you can download it from Microsoft's site for free. Can I use this with my server for free? Yes, ROLauncher will create a configurable .ini where you can put your own client name to connect ROLauncher and your client. Will this be open-source? No, at least not right now. Can I edit its colors or skin? No. This version we are offering is for free and it will not allow such things. However, if you are interested in customising this, please send us a message to Daegaladh or to me. Which languages will be available for this? Any. If you want to get this in your native language check this: https://docs.google.com/spreadsheets/d/1lpFrjMbFqT6qsZfRE2Zt_O8jiCpmHAgHxP56r84CjBk/edit?usp=sharing And that's all, thank you! If you have any doubt, criticism, or suggestion, please, tell us! P.S: Sorry for the bit of Spanish in the screens, it will be all in English when it is released Bye!
    1 point
  2. File Name: (HANSIP) Skill Spam Protection File Submitter: Kichi File Submitted: 29 May 2014 File Category: Source Modifications Content Author: Kichi Info & History Info: HANSIP Protection is a src modification to make sure NDG,speed hack, WPE Users still follow the rules. History: This is a simple code, which we have made since long to minimize the NDG User. The first way to solve NDG, we add a cooldown for skills that dosn't has a fixed cooldown (Sonic Blow, Cross Impact, etc). But the player doesn't allowed to do double cast. Finaly we made this code that minimize the NDG users, but still keep the original feature that is double cast for some skills (Sonic Blow, Cross Impact, etc). Implementation & Feature Implementation: Download the file Apply manual "rA - Hansip Protection.diff" to your src. Paste "battle_conf.txt" to conf/import/ Don't forget to recompile your server. All done Features: The user still able to use double SB / CI / etc. You may switch on and off. Very simple Skill Packet Spam detector . Note: 2013 client already detect modified file (after act delay). so i've tested this using WPE. i got the number from comparing with and without *cheat. Supported Skills: Bash Sonic Blow Arrow Vulcan Double Strave Bowling Bash Ninja Kouenka Ninja Hyousensou Jupitel Thunder Cross Impact Dragon Breath Fire & Water Change Log: 1.1 -Add archer double strave skill 1.2 -Add support for some skills 1.3 -Change name from NDG to Hansip -Add skill packet spam detector & punishment -Support PRE-RE Click here to download this file
    1 point
  3. Are you upgrading your control panel? Just download the latest Flux Control Panel and Re-install it back. You won't see the error comes out. Download em' here : http://rathena.github.io/FluxCP/
    1 point
  4. What did you change on your FluxCP installation? I noticed the Labels on the left menu are literally named Label, which shouldn't be. Also, for your issue, I think it (/module) requires you to confirm the e-mail, by entering it twice, but your theme (/themes) doesn't show the text-box for it.
    1 point
  5. Did you even tried 2013 and 2014 clients??Diff client wih restore login window and you will get login screen and can run without any launcher (login screen patch even works for 2014-10), use NEMO for patching. As of launcher, the profile part is good.
    1 point
  6. This part here kinda makes me hesitate. If my assumption is correct, the "fully configurable" version is, paid. Don't get me wrong, I like it. However, I don't see much improvements over other previously released Launchers, other than the Profile Switch / Save. And I'm pretty sure most RO players keep the username part, and type their passwords rather quickly, rendering this feature kind of redundant. Now if it had functions like built-in patcher, file integrity checker (download the file with mismatched crc), and 1 click Log sending of the player's OS / installation folder / dependencies / grf files read / etc for debugging purposes, then it would be nice. (I saw these on the server NeoMind and Ossi built) PS: I feel bad, seeing as it is still a Project in Progress, please take my opinions above as suggestions to further improve your product.
    1 point
  7. Edit /conf/application.php : 'RequireEmailConfirm' => false, // Require e-mail confirmation during registration.
    1 point
  8. I maked one launcher (alpha design) for my server too, but on delphi, but I like the ideas of profile, I will added on mine! And Thanks for share! Here is mine Launcher:
    1 point
  9. Cool! it's nice to see new things in RO community
    1 point
  10. I was hoping that 2012 client will be compatible. nah! Nice One!
    1 point
  11. Not sure about this, but check skill.c if( sd && battle_config.equip_self_break_rate ) { // Self weapon breaking rate = battle_config.equip_natural_break_rate; if( sc ) { if(sc->data[SC_GIANTGROWTH]) rate += 10; if(sc->data[SC_OVERTHRUST]) rate += 10; if(sc->data[SC_MAXOVERTHRUST]) rate += 10; }
    1 point
  12. Kapitel 1: Alles hat einen Anfang 1.0 - Einführung in die Welt der Scripter (Vorwort) 1.1 - NPCs (Non-Playable-Character) 1.2 - Script Commands 1.3 - Befehle Teil 1 - Abläufe 1.4 - Variablen 1.5 - Operatoren 1.6 - If-Abfragen 1.7 - Labels 1.8 - Kommentare 1.9 - Befehle Teil 2 - Menüs und Eingaben Kapitel 2: Der Weg des Kriegers 2.0 - Noch ein weiter Weg 2.1 - Arrays 2.2 - Befehle Teil 3 - Die erste Quest 2.3 - Befehle Teil 4 - Effiziente und bessere Menüs 2.4 - SQL 2.5 - Verschiedene Arten von NPCs 2.6 - Schleifen 2.7 - Monster 2.8 - Events Kapitel 3: Die geheime Kunst der Mönche 3.0 - Willkommen im Orden 3.1 - RID 3.2 - Funktionen 3.3 - Dynamische Menüs 3.4 - Dynamische Shops 3.5 - Dynamische Arrays 3.x - Coming soon... Kapitel 1: Alles hat einen Anfang 1.0 - Einführung in die Welt der Scripter (Vorwort) Viele neue Scripts entstehen in der Ragnarok Community. Die internationale Community tut ihr bestes daran stetig neue Dinge zu entwickeln und das Leben in Ragnarok so wie wir es kennen zu erweitern und den Spaß zu vergrößern. Es gibt viele verschiedene Arten von Scripts. Mal sind es kleine Dinge, wie ein Kafra Shop oder auch was größeres, wie ein Quest System. Die Möglichkeiten sind unendlich. Ich vertrete die Meinung das Scripts das Herzstück jedes Servers sind. Sie sind die letzte Schnittstelle zu den Spielern und die Spieler sind es die damit kommunizieren. Umso wichtiger ist es das sie auch funktionieren und den Spielern neue Möglichkeiten bieten Ragnarok neu zu erleben. Ich möchte euch in diese wunderbare Welt des Scriptens einführen und euch zeigen das in jedem von euch ein Scripter stecken kann und das auch ihr euren Teil zu dieser tollen Community beitragen könnt. Wie wird das Guide ablaufen ? - Ich werde euch Schritt für Schritt durch die Thematik führen und euch so gut es geht alles erklären was ihr wissen müsst. Mit Beispielen vereinfache ich das ganze und erläutere anschließend alles. Gegebenfalls werde ich euch danach kleine Aufgaben stellen die ihr versucht zu lösen. Hier wirkt das Trial and Error Prinzip. Versuchen und Scheitern. Das ganze wiederholt ihr bis es funktioniert. Der Prozess des Lernens erfordert Fehler zu machen und aus diesen Fehlern lernen wir und dann machen wir es besser. Es wichtig das ihr viel übt und wiederholt um euch Dinge einzuprägen. 1.1 - NPCs (Non-Playable-Character) NPC, auch genannt Non-Playable-Character sind die Personen die in der Map verteilt stehen und die man als Spieler ansprechen kann. Jeder NPC hat ein Grundgerüst, welches ich euch hier zeige. Beispiel: prontera,156,212,7<tab>script<tab>Charlie<tab>811,{ } Erläuterung: Das ist unser Beispiel namens Charlie, so sieht das Grundgerüst für jeden NPC aus. Es definiert alle wichtigen Daten über den NPC. Auf welcher Map es sich befindet, wo es genau steht, wie es heißt und wie es aussieht. Gehen wir mal genauer drauf ein. prontera = Die Map auf der sich der NPC befindet 156 = Die X Koordinate auf der Map 212 = Die Y Koordinate auf der Map 7 = Ausrichtung des NPCs (Die Richtung in die der NPC schaut) script = Typ des NPCs (Es gibt verschiedene Typen von NPCs auf die ich noch eingehen werde) Charlie = Name des NPCs (Was der Spieler im Spiel sieht unter dem NPC) 811 = Aussehen des NPCs (Es werden IDs für das Aussehen verwendet) <tab> = Das sollte wohl klar sein. Es ist wichtig das ihr <tab> drückt und keine Leerzeichen verwendet, ansonsten funktioniert der Script nicht { } = Hier beginnt der Spaß, denn hier kommen später unsere Befehle und alles andere rein Map,X,Y: Wenn ihr wissen wollt wohin ihr euren NPC hinstellen sollt dann geht im Spiel auf die gewünschte Stelle und tippt folgendes ein: "/where". Hiermit erfahrt ihr auf welcher Map und X und Y Koordinate ihr euch befindet. Somit habt ihr schon so gut wie alles was ihr braucht. Ausrichtung des NPCs: [1][8][7] [2][ ][6] [3][4][5] An diesem Raster könnt ihr sehen welche Zahl für welche Blickrichtung steht. Mehr gibt es eigentlich dazu nicht zu sagen. Typ des NPCs: Es gibt wie schon gesagt verschiedene Arten von NPC Typen. Ich zeige euch die wichtigsten. script = Standard NPC Typ (Wird am häufigsten verwendet) shop = Shop NPC (wie der Name schon sagt handelt es sich hierbei um ein Shop) monster = Monster Spawn (Dieser Typ legt ein Spawn für Monster fest) warp = Warp Point (Ein Warp Punkt der euch zur gewünschten Map, X und Y Koordinate bringt) Name des NPCs: Den denkt ihr euch natürlich selbst aus. Es ist zu beachten das NPC Namen auch Leerzeichen enthalten dürfen. Maximal können 23 Zeichen für den Namen verwendet werden und jeder Name muss einzigartig sein. Der Server erlaubt keine doppelte Namen, da sonst Daten durcheinander kommen würden. (z.B. bei Event Labels) Aussehen des NPCs: Eine Liste der NPCs und deren IDs findet ihr z.B. hier: http://nn.nachtwolke.com/dev/npclist/ Hinweis: Haltet euch immer an das Beispiel, dann kann nichts schief gehen. Falls doch mal ein Fehler auftaucht, dann schaut nach ob ihr auch <tab> statt Leerzeichen verwendet habt und ob alle Kommas richtig sitzen. 1.2 - Script Commands Im Laufe der Zeit werde ich neue Befehle aufgreifen und ich kann euch natürlich nicht jeden Befehl ins Detail erklären, deswegen müsst ihr lernen die Wiki zu lesen. Dort findet ihr alle Script-Befehle bis in jedes Detail erklärt, sogar mit Beispielen. Das ist sehr wichtig. Ihr könnt euch nicht alle Befehle am Anfang merken, erst recht nicht wie alles funktioniert. Nutzt es als Nachschlagewerk und haltet euch nicht zurück. Die Wiki werdet ihr noch sehr oft verwenden müssen. Link: http://rathena.org/wiki/Category:Script_Command 1.3 - Befehle Teil 1 - Abläufe Hier beginnt der ganze Spaß. Ihr werdet nun euren ersten sprechenden NPC erstellen. Beispiel: prontera,156,212,7 script Charlie 811,{ mes "[Charlie]"; mes "Hallo ! Mein Name ist Charlie."; next; mes "[Charlie]"; mes "Ich heiße euch willkommen!"; close; } Erläuterung: Sobald ihr den NPC anklickt wird der Script zwischen den { } ausgeführt. Das ist der sogenannte Script-Block. Dieser enthält den kompletten Script des NPCs. Ich erläutere euch nun die Befehle die ich hier verwendet habe. mes "<message>"; Öffnet ein Fenster mit dem folgenden Text "<message>". Die beiden "" beinhalten den Text der ausgegeben werden soll und mit ; beenden wir den Befehl. Ein mes steht für eine Zeile. Bedeutet, wenn ihr eine neue Zeile anfangen wollt verwendet ein weiteres mes. Wenn ihr in der Wiki schaut werdet ihr verschiedene Varianten finden. Link: http://rathena.org/wiki/Mes next; Zeigt euch ein Button am unteren Rand des Fensters an. Bedeutet das Script pausiert und wartet darauf bis ihr "Next" klickt. Tut ihr das wird das Fenster gesäubert und ihr könnt es wieder neu füllen. Somit könnt ihr eure Texte strukturieren und leserlicher machen, (auch segmentieren genannt), und dem Spieler Zeit geben Stück für Stück den Text zu lesen. Stellt euch zum Beispiel eine Unterhaltung mit dem NPC und dem Spieler vor, sieht besser aus und ist Spieler-freundlicher. Link: http://rathena.org/wiki/Next close; Dieser Befehl zeigt euch ein Close Button am unteren Rand des Fensters an. Wenn ihr es klickt wird das Fenster geschlossen und der Script beendet. Wenn ihr nach diesem Befehl noch mehr Befehle schreibt werden diese nicht ausgeführt, deswegen wird close ausschließlich nach mes und next verwendet. Link: http://rathena.org/wiki/Close Der Server arbeitet Schritt für Schritt jede Zeile ab. Stellt euch vor ihr gibt einem Kleinkind vor was es zu tun hat. Gar nicht mal so schwer oder ? Lernaufgabe: Erstelle ein NPC namens Harald, welches dem Spieler sagt das er ihn in Ruhe lassen soll. Danach wird das Script normal beendet. Wenn ihr wollt probiert es mit verschiedenen Namen und verschiedenen Texten und wenn ihr wollt auch an verschiedenen Orten. Ihr könnt Harald auch ein anderes Aussehen verpassen. Probiert alles aus und macht euch mit dem Grundgerüst und den Befehlen vertraut. Hinweis: Vergesst nicht das ; nach jedem Befehl zu verwenden. Ihr werdet es am Anfang sehr oft vergessen. Prägt es euch also schon früh ein! Das ; wird verwendet um ein Befehl zu beenden. 1.4 - Variablen Beim Scripten wird der Punkt kommen wo ihr Variablen verwenden müsst. In diesen könnt ihr Informationen speichern, sie aufrufen und verarbeiten. Ich werde euch die verschiedenen Arten von Variablen und deren Limitationen zeigen. Integer: Sind sogenannte Ganzzahlen z.B. (0, 1, 2, 3, 592, -235, -2, etc.) Zu beachten ist das wenn ihr Kommazahlen verwendet, diese einfach geschnitten werden. Bedeutet wenn ihr 5.6 eintippt. Dann wird der Server nur die 5 benutzen und nicht das was hinter dem Komma steht. Später ist das wichtig zu beachten wenn ihr rechnet und Irgendetwas zum Beispiel durch 2 teilen wollt. Behaltet dies im Hinterkopf. String: Sind sogenannte Zeichenketten z.B.: "Hallo", "Dies ist eine Botschaft" oder auch Buchstaben wie "a" und "b". Beinhaltet alle euch bekannten Zeichen von A bis Z und Wörter, Sätze, Sonderzeichen und auch Zahlen. (Mit den Zahlen kann man dann aber nicht rechnen!) Hier ist zu beachten das Strings immer in "" geschrieben werden müssen, ansonsten werden diese nicht erkannt und es gibt Fehlermeldungen. Hier nun die verschiedenen Typen die man in der Athena Scripting Sprache festlegen kann: variablenname = Eine permanente Charakter basierende Variable @variablenname = Eine temporäre Charakter basierende Variable .variablenname = Eine permanente NPC Variable .@variablenname = Eine temporäre NPC Variable $variablenname = Eine globale permanente Variable $@variablenname = eine globale temporäre Variable #variablenname = eine permanente Account basierende Variable Ein $ and das Ende einer Variable liefert eine String Variable die man z.B. für die Input funktion gebrauchen kann. z.B.: @var$ <--- Eine temporäre String Variable mit dem Namen var. Temporär bedeutet das die Variable gelöscht wird sobald der Server resetted wird. Permanent bedeutet das die Variable bleibt selbst wenn der Server resetted wird. Global bedeutet das sie für den Server gilt und nicht nur für den Charakter oder Account. Account bassierend bedeutet das sie für den Account gesetzt wird. (Nützlich wenn man Quests auf nur 1x pro Account reduziern will) Bestimmt wollt ihr nun wissen wie man Variablen benutzt. Dafür brauchen wir den Befehl "set". Wie man ihn benutzt und in ein Script einbaut zeige ich euch jetzt. Beispiel: prontera,156,212,7 script Charlie 811,{ mes "[Charlie]"; mes "Hallo ! Mein Name ist Charlie."; next; mes "[Charlie]"; mes "Ich heiße euch willkommen!"; set @geredet, 1; close; } Erläuterung: Dies ist unser Beispiel von vorhin, aber etwas ist anders. Wir haben eine temporäre Charakter Variable namens "geredet" erstellt und eine 1 eingespeichert. Nun könnten wir am Anfang abfragen ob die Variable auf 1 gesetzt ist und wenn ja dann würde statt diesem Text ein ganz anderer Text erscheinen. Dafür brauchen wir die sogenannten If-Abfragen, zu denen wir schon bald kommen werden. set; Speichert einen Wert in eine Variable. Ist die Variable nicht vorhanden wird sie erstellt. Ist sie jedoch schon vorhanden, wird der alte Wert mit dem neuen Wert überschrieben. Link: http://rathena.org/wiki/Set Wir können Variablen auch abrufen und diese in "mes" ausgeben lassen. Beispiel: prontera,156,212,7 script Charlie 811,{ mes "[Charlie]"; set @geredet, 1; mes "Die Variable ist auf " + @geredet + " gesetzt"; close; } Erläuterung: Um eine Variable aufzurufen reicht es einfach den Namen anzugeben. Das "+" ist ein Operator, aber dazu kommen wir gleich. Ihr seht, das ich die Variable mit dem Rest des Textes ganz einfach verbunden habe indem ich das "+" dazwischen geschrieben habe. Als hätte ich es zusammengerechnet. (In diesem Fall verbunden) 1.5 - Operatoren Ich behandle in diesem Thema zwei Arten von Operatoren. Die mathematischen und die logischen Operatoren. Bei den logischen Operatoren gibt es nochmal zwei verschiedene Arten, unzwar die logischen Vergleiche und die logischen Verknüpfungen. mathematische Operatoren: + Addiert Zahlen - Subtrahiert Zahlen * Multipliziert Zahlen / Dividiert Zahlen (Hinweis: Nicht vergessen, bei einem Ergebnis von z.B 5.6 wird 5 rauskommen, da der Server nur Ganzzahlen verarbeitet) % Rest einer Division, z.B.: 7%2 = 1 Diese Operatoren sind ausschließlich für Integer zu verwenden. Die einzige Ausnahme ist "+", wie im Beispiel vorhin kann man damit Variablen mit Texten oder sogar Texte mit Texten verbinden. logische Operatoren (Vergleiche): == Trifft zu wenn beide Seiten gleich sind. [ 2==2 (wahr) 2==1 (falsch) ] != Trifft zu wenn beide Seiten nicht gleich sind. [ 1==1 (falsch) 2==1 (wahr) ] >= Trifft zu wenn der erste Wert größer oder gleich ist als der zweite Wert. [ 2>=2 (wahr) 3>=2 (wahr) 1>=2 (falsch) ] <= Trifft zu wenn der erste Wert kleiner oder gleich ist als der zweite Wert. [ 1<=2 (wahr) 1<=1 (wahr) 2<=1 (falsch) ] > Trifft zu wenn der erste Wert größer ist als der zweite Wert. [ 2>1 (wahr) 1>2 (falsch) ] < Trifft zu wenn der erste Wert kleiner ist als der zweite Wert. [ 1<2 (wahr) 2<1 (falsch) ] logische Operatoren (Verknüpfungen): && UND || ODER ! NICHT Diese Operatoren werden einzig und allein für If-Abfragen verwendet. 1.6 - If-Abfragen Jetzt wird es spannender. Nachdem wir gelernt haben was Variablen und Operatoren sind kommen wir nun zu den If-Abfragen. Hier werden wir sowohl variablen als auch logische Operatoren verwenden. Zudem lassen sich auch Funktionen mit Rückgabewerten verwenden, jedoch behandeln wir diese erst später. if; Es handelt sich dabei um eine logische Abfrage. Dabei werden Werte mit Hilfe von logischen Operatoren abgeglichen und auf ihre Wahrheit oder Falschheit überprüft. Je nach Resultat wird der darauf folgende Codeblock ausgeführt oder nicht. Link: https://rathena.org/wiki/If Beispiel: prontera,156,212,7 script Charlie 811,{ if(@geredet == 1) { mes "[Charlie]"; mes "Habe ich dir meinen Namen nicht schon verraten ?"; next; mes "[Charlie]"; mes "Na los, verschwinde endlich!"; close; } else { mes "[Charlie]"; mes "Hallo ! Mein Name ist Charlie."; next; mes "[Charlie]"; mes "Ich heiße euch willkommen!"; set @geredet, 1; close; } } Erläuterung: Wie ihr sehen könnt ist am Anfang von unserem netten Kerl Charlie eine If-Abfrage. Im Grunde wird überprüft ob die Variable "@geredet" auf 1 gesetzt ist, wenn diese Aussage WAHR ist, wird der Codeblock darunter zwischen den geschweiften Klammern ausgeführt. Danach kommt ein "else" welches auf Deutsch "ansonsten" bedeutet. Im Klartext: Ansonsten wenn die Aussage NICHT WAHR, also UNWAHR ist, führe den Codeblock unter "else" aus. Ein "else" ist kein muss, jedoch kommt es darauf an wie euer Script aufgebaut sein soll. In diesem Fall wollen wir entweder das eine ODER das andere ausgeben lassen. Nochmal: Wenn ihr den NPC das erste mal anspricht wird der Codeblock unter "else" ausgefuhrt weil @geredet noch nicht auf 1 gesetzt wurde. Das wird es dann dort. Beim zweiten mal Ansprechen ist die Aussage WAHR und der Codeblock unter "if" wird ausgegeben. Stellt euch das wie eine Gabelung vor, entweder der eine oder der andere Weg. Mehrere Verzweigungen: Es ist auch möglich mehrere If Abfragen zu verketten mit dem "else if" befehl, statt eines "else" benutzt ihr "else if"" und macht so noch eine abfrage. Die letzte wird dann ein "else" falls keine der vorherigen Abfragen zu trifft. Ergänzung: Es ist möglich alle Arten von Variablen miteinander zu vergleichen solange diese den selben Datentypen haben, heißt: string mit string vergleichen. Int mit Int vergleichen und so weiter. Ansonsten erhaltet ihr nur Fehler. Liest euch zudem unbedingt die Wiki Seite von if durch, damit ihr es besser versteht. 1.7 - Labels Labels werden heutzutage so gut wie kaum noch verwendet. Man bezeichnet es als unsauber. Es kann in einigen Situationen jedoch hilfreich sein und sollte niemals ganz vergessen werden. Wir werden dafür ein neuen Befehl benötigen den ich euch zeigen werde. goto <label>; Mit "goto" kann man an ein label springen. Heißt man springt an eine bestimmte Zeile im Script wo euer Label steht. Für mehr Informationen besucht die Wiki Seite. Link: https://rathena.org/wiki/Goto Beispiel: prontera,156,212,7 script Charlie 811,{ if(@geredet == 1) { goto L_geredet; } mes "[Charlie]"; mes "Hallo ! Mein Name ist Charlie."; next; mes "[Charlie]"; mes "Ich heiße euch willkommen!"; set @geredet, 1; close; L_geredet: mes "[Charlie]"; mes "Habe ich dir meinen Namen nicht schon verraten ?"; next; mes "[Charlie]"; mes "Na los, verschwinde endlich!"; close; } Erläuterung: Kommt euch das bekannt vor ? Genau es ähnelt dem "if" und "else" Beispiel. Statt das wir ein "else" verwenden, springen wir zur Zeile wo "L_geredet:" steht. "goto" erlaubt uns quasi einfach hin und her zu springen und von dort aus läuft der Script ganz normal weiter nach unten. Man kann mit dieser Methode auch aus Schleifen springen nachdem ein gewünschter Zustand erreicht wurde. Die Möglichkeiten sind unendlich. Lernaufgabe: Probiert euch mal selbst daran und baut ein paar Labels in euer Script und versucht hin und her zu springen. 1.8 - Kommentare Eines der nützlichsten Werkzeuge in der Informatik. Auch wenn sie selbst kein Einfluss auf eueren Script haben, werden sie dazu verwendet euch das Leben leichter zu machen. Wie der Name schon sagt sind es Kommentare. Sie dienen euch dazu Notizen im Script zu machen oder euren Script zu erklären und leserlicher zu machen und haben dabei kein Einfluss auf den Script selbst. Beispiel: prontera,156,212,7 script Charlie 811,{ //Hier frage ich ab ob die Variable @geredet auf 1 gestellt ist if(@geredet == 1) { goto L_geredet; //Wenn ja springe ich zum Label L_geredet } //Diese Stelle wird nur ausgeführt wenn wir nicht zu L_geredet gesprungen sind und die If-Abfrage UNWAHR war. mes "[Charlie]"; mes "Hallo ! Mein Name ist Charlie."; next; mes "[Charlie]"; mes "Ich heiße euch willkommen!"; set @geredet, 1; close; //Hier steht das Label. Man kann es sich als eine Art Checkpoint vorstellen an den man springen kann. L_geredet: mes "[Charlie]"; mes "Habe ich dir meinen Namen nicht schon verraten ?"; next; mes "[Charlie]"; mes "Na los, verschwinde endlich!"; close; } Erläuterung: Wie ihr sehen könnt beginnt man ein Kommentar mit "//" Damit hat die Zeile kein Einfluss mehr und steht nur als Text da für euch. Sehr hilfreich also nutzt es auch ! Im Laufe der Zeit lernt ihr sparsam aber effizient damit umzugehen. Ihr wollt euren Script damit ja nicht zukleistern. 1.9 - Befehle Teil 2 - Menüs und Eingaben - coming soon... _____________________________________________________________________________________ Dieses Guide basiert auf dem veralteten Guide aus 2007 welches erstmalig auf eAthena veröffentlich wurde. Ich selbst habe durch diesen Guide scripten gelernt. Ich habe dieses Werk als Grundlage für meinen Guide genommen. Die Struktur ist ähnlich oder wurde verändert, der Inhalt jedoch ist von mir verfasst und basiert auf der aktuellen rAthena Wiki. Link: Klick mich
    1 point
  13. Please avoid posting, and (or) asking for links of private servers on this section. On-topic, Harmony's file encryption has been reliable to me, and really the only reason left to justify the use of Harmony.
    1 point
  14. You can check if a cell is walkable or not and then let the npc walk to it or use a new random coordination. checkcell("<map name>",<x>,<y>,<type>); source: Checkcell
    1 point
  15. script prontera,150,150,0 script Cleaner 1002,15,15,{ end; OnTouchNPC: .@gid = monsterattached(); getmapxy .@map$, .@x, .@y, 3; // move to 1 cell near the mob / min distance between npc-mob if ( .@x > .x0 ) .@dx = -1; else if ( .@x < .x0 ) .@dx = 1; if ( .@y > .y0 ) .@dy = -1; else if ( .@y < .y0 ) .@dy = 1; .@x_tmp = .@x + .@dx; .@y_tmp = .@y + .@dy; if ( !checkcell(.@map$,.@x_tmp,.@y_tmp,cell_chkpass) ) { for ( .@dx = -1; .@dx < 2 && .@break == 0; .@dx++ ) for ( .@dy = -1; .@dy < 2; .@dy++ ) { if ( .@dx == 0 && .@dy == 0 ) continue; .@x_tmp = .@x + .@dx; .@y_tmp = .@y + .@dy; if ( checkcell(.@map$,.@x_tmp,.@y_tmp,cell_chkpass) ) { .@break = 1; break; } } } if ( .@x_tmp != .@x && .@y_tmp != .@y ) movenpc strnpcinfo(3), .@x_tmp, .@y_tmp; specialeffectmob 10; unitkill .@gid; end; OnInit: getmapxy .@map$, .x0, .y0, 1; // .@npc_name$ = strnpcinfo(3); npcspeed 50; freeloop 1; while( true ) { sleep 10000; do { .@x = .x0 + rand(-10,10); .@y = .y0 + rand(-10,10); } while( !checkcell(.@map$,.@x,.@y,cell_chkpass) ); .x0 = .@x; .y0 = .@y; npcwalkto .x0, .y0; // movenpc .@npc_name$, .x0, .y0; } } src src/custom/script.inc | 19 +++++++++++++++++++ src/custom/script_def.inc | 3 +++ src/map/script.c | 8 ++++++++ 3 files changed, 30 insertions(+) diff --git a/src/custom/script.inc b/src/custom/script.inc index 1e01c88..c8e825c 100644 --- a/src/custom/script.inc +++ b/src/custom/script.inc @@ -17,3 +17,22 @@ // script_pushint(st,1); // return 0; //} + +BUILDIN_FUNC(monsterattached) +{ + struct block_list *bl = map_id2bl(st->rid); + if(st->rid == 0 || bl == NULL || bl->type != BL_MOB) + script_pushint(st,0); + else + script_pushint(st,st->rid); + return SCRIPT_CMD_SUCCESS; +} + +BUILDIN_FUNC(specialeffectmob) +{ + int type = script_getnum(st,2); + struct block_list *bl=map_id2bl(st->rid); + if(bl != NULL && bl->type == BL_MOB) + clif_specialeffect(bl, type, AREA); + return SCRIPT_CMD_SUCCESS; +} \ No newline at end of file diff --git a/src/custom/script_def.inc b/src/custom/script_def.inc index 3319eea..5a75166 100644 --- a/src/custom/script_def.inc +++ b/src/custom/script_def.inc @@ -9,3 +9,6 @@ **/ //BUILDIN_DEF(example,""), + +BUILDIN_DEF(monsterattached,""), +BUILDIN_DEF(specialeffectmob,"i"), \ No newline at end of file diff --git a/src/map/script.c b/src/map/script.c index b6be34d..29d0634 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -13986,6 +13986,14 @@ int recovery_sub(struct map_session_data* sd, int revive) bl = &sd->pd->bl; break; case 3: //Get Mob Position + if( script_hasdata(st,6) ) { + struct script_data *data = script_getdata(st,6); + get_val(st, data); + if( !data_isstring(data) ) + bl = map_id2bl(script_getnum(st, 6)); + } + else if( st->rid && map_id2bl(st->rid) != NULL ) + bl = map_id2bl(st->rid); break; //Not supported? case 4: //Get Homun Position if(script_hasdata(st,6)) I didn't thought about friendly mob
    1 point
  16. function script success { set.@zeny, getarg(0); set zeny, zeny - .@zeny; successrefitem 5; emotion e_gg; set .@win,rand(1,3); if (.@win == 1) { mes "Perfect!"; mes "Heh heh!"; mes "Once again,"; mes "flawless work"; mes "from the master~"; } else if(.@win == 2) { mes "Success...!"; mes "Yet again, my amazing"; mes "talent truly dazzles"; mes "and shines today."; } else { mes "Heh heh!"; mes "I'm all done."; mes "No doubt, my work is"; mes "to your satisfaction."; mes "Sheer, utter perfection~"; } return; } function script failed { set.@zeny, getarg(0); set zeny, zeny - .@zeny; downrefitem 5; emotion (!rand(5))?e_cash:e_omg; set .@lose,rand(1,3); if (.@lose == 1) { mes "OH! MY GOD!"; mes "Damn it! Not again!"; mes "I'm terribly sorry, but you know practice does make perfect."; mes "Um, right? Heh heh..."; } else if(.@lose == 2) { mes "Nooooooo!"; mes "It broke!"; mes "I-I'm sorry!"; } else { mes "Crap!"; mes "It couldn't take"; mes "much more tempering!"; mes "Sorry about this..."; } return; } prontera,156,145,4 script Refine 58,{ if(countitem(2589)==0){ mes "You don't have the Fallen Angel Wing right?"; mes "Sorry I can't help you"; close; } set .@zeny, 5000; set .@needzen, .@zeny*7; mes "Refining your Fallen Angel Wing?"; mes "I can do it for you for ^FF0000"+.@zeny+"^000000 Z!"; next; if (zeny < 35000) { mes "For this process, I need around ^FF0000"+.@needzen+"^000000 Z."; mes "Seems like you don't have it. please get them first."; close; } set .@i,2589; if((getequipid(EQI_GARMENT)!=2589)){ mes "Please put on those wings first"; close; } if(getequipisenableref(.@i)) { mes "I don't think I can"; mes "refine this item at all..."; close; } //Check to see if the items is already +10 if(getequiprefinerycnt(.@if) >= 10) { mes "I can't refine this"; mes "any more. This is as"; mes "refined as it gets!"; close; } callfunc "success", .@zeny,.@zeny; next; callfunc "success", .@zeny; next; mes "One more refining to go..."; next; callfunc "failed", .@zeny; next; callfunc "failed", .@zeny; next; mes "DARN! If I failed again this time, say goodbye, SAY GOODBYE~~"; next; mes "So, will you still continue doing this? What if it broke again? It will lose forever."; if(select("Let it go:STAHP! Please stop this!") == 1) { next; mes "Le.. Le.. Let it go~"; mes "Let it go~"; mes "LET IT GO~"; emotion e_sob,1; } else { next; mes "What are you talking about?"; mes "There's no going back."; mes "AND I SHALL CONTINUE THIS!!!"; emotion e_omg,1; emotion e_slur,0; } next; callfunc "success", .@zeny; emotion e_gg,0; emotion e_omg,1; next; callfunc "success", .@zeny; emotion e_gg,0; emotion e_omg,1; next; callfunc "success", .@zeny; emotion e_gg,0; emotion e_omg,1; next; mes "Done. LOL"; close2; specialeffect 154, SELF; specialeffect 154, SELF; specialeffect 154, SELF; specialeffect 154, SELF; specialeffect 154, SELF; end; } just run it, bring 35000 zeny or 7*(required zeny per "smash") and equip the item (2859) oh btw, since I got more free time, I added some well, entertainment.
    1 point
×
×
  • Create New...