Jump to content

Normynator

Developer
  • Posts

    292
  • Joined

  • Days Won

    16

Everything posted by Normynator

  1. I will have look at it. Thanks for letting me know!
  2. Thats a dependency, you need to install discord.js via NPM
  3. Also ich sehe eig immer nur Thor ?
  4. Trank you! @Lemongrass Its already Done, was an old screenshot. I will update that soon, add a detailed guide and post changelogs.
  5. People in a discord Server can write and it appears in ingame Channel, and People ingame write to channel and it appears in discord @spinzaku
  6. roCORD for rAthena Hey everyone, I am currently working on a Discord bot which allows interaction between a Discord server and an in game channel. Support for Version 1 is now dropped! Version 2 can be found under this link -> https://github.com/Normynator/roCORD/tree/development Documentation about installation and configuration can be found here -> https://github.com/Normynator/roCORD/tree/development/docs More updates on Version 2 will follow.
  7. roCORD - a discord to in game bot.

    https://github.com/Normynator/Ragnarok/tree/master/rA_mods/discordbot

  8. https://rathena.org/board/forum/143-guides/ erster Eintrag bei Guides
  9. Da fehlt die Funktion „custom“. Wäre hilfreich, wenn du das komplette Script postest
  10. You just need to be able to execute Python.
  11. @tr0n gar nicht, die mvp times werden manuell in ne config file eingetragen. Bin davon ausgegangen, dass wenn man den bot als Spieler nutzen möchte, man keinen Zugriff auf Daten vom Server hat.
  12. 1920x1080 also FullHd war Maximum soweit ich weiß, also leider nix mit Ultrawide ?
  13. —> Check the Docs, click me! <— Das sollte funktionieren (für cash mounts)
  14. Discord Normynator#7313, bin immer da, außer ich schlafe adde mich einfach
  15. Wenn ich mich richtig erinnere ging das so: Sagen wir der Cast dauert 1s, dann ist Variable Casttime 0,8s und fixed 0,2. variable cast time wird von dex*2+int reduziert, wenn man 560 erreicht ist sie 0,0s Hat man also 560 dex*2+int folgt: 0,0 + 0,2 = 0,2 Dein cast ist also 0,2s anstatt 1s wie vorher. Hoffe das ist verständlich
  16. Vorwort: Ich schreibe diesen Guide, da ich mich im Moment mit diesem Thema befasse und mir aufgefallen ist, dass es kaum Dokumentationen über Sprites gibt. Jeder weiß wahrscheinlich was die .spr bedeutet - in der Datei befindet sich ein Charakter, Monster oder Gegenstand Sprite. Wie funktioniert .spr aber nun? In diesem Guide möchte ich versuchen alles zu teilen, was ich darüber weiß, und versuchen es so gut wie es geht zu erklären. Hierbei möchte ich einräumen, dass ich natürlich auch Fehler mache und sich diese einschleichen könnten. Falls ihr also einen Fehler, egal ob Logik, Rechtschreibung oder Grammatik findet, gebt mir Bescheid, damit ich den Guide weiter verbessern kann. Quellen: Folgende Quellen habe ich gefunden und genutzt: ROChargenPHP, ein Tool welches in PHP geschrieben ist und es ermöglicht Sprites im Browser anzuzeigen https://github.com/ScDarko/ROChargenPHP http://mist.in/gratia/ro/spr/index.html, eine Seite die sich mit dem Client befasst, aber leiden größtenteils auf Chinesisch ist. Meine Implementierung: Ich werde am Ende des Guides meine eigene "Proof of Concept" Implementierung verlinken. Geschrieben in Python. Ich möchte anmerken, dass dies kein optimaler und auch sicherlich nicht fehlerfreier Code ist. Der Code ist entstanden während ich gelernt habe wie Sprites aufgebaut sind. Ich habe den Code auch nach dem ersten Schreiben größtenteils unverändert gelassen und hatte nicht das Ziel möglichst sauberen oder effizienten Code zu schreiben. Falls ihr eine viel genutzte, sauberer Implementierung sehen möchtet, verweise ich auf ROChargenPHP Fehler: Wie schon erwähnt ist dieser Guide sicherlich nicht fehlerfrei, wenn ihr also einen Fehler findet, schreibt mir auf Discord, nutzt den verlinkten Discord Server oder antwortet einfach im Forum. Bei Frage und Anregungen: https://discord.gg/fWtj7GB (Ich war mal so frei und hab ein Server erstellt) Los gehts! Was ist .spr? - ein kleiner "Guide" Version 1.0 Header: Name Size Sprite Header 2 byte Indexed Frames 2 byte RGBA Frames 2 byte Der Sprite Header muss immer ‚SP‘ sein. Die Version ist entweder 0x0102 oder 0x0002. Nun folgen 2 byte für die Anzahl der Indexed Frames. Danach 2 byte für die Anzahl der RGBA Frames. Einer der beiden Werte ist hierbei immer Null. RGBA Frames und Indexed Frames geben an wie viele Frames des jeweiligen Types in der Datei folgen werden. Wichtig ist noch, dass die Werte immer als ‚little Endian‘ zu interpretieren sind. Frame Data: Wir wissen nun aus dem „Header“ Abschnitt wie viele Frames in unserer Datei vorzufinden sind, welche Version vorliegt und ob es Indexed Frames oder RGBA Frames sind. Indexed Frames: Bei Indexed Frames ist es wichtig, welche Dateiversion vorliegt. Wir unterscheiden: Version 0x0102: Name Size Width 2 byte Height 2 byte Length 2 byte Data {Length} byte Die ersten beiden Byte geben die Höhe und die nächsten beiden die Breite des Frames an. Danach kommen noch einmal zwei Byte, die die Anzahl der folgenden Byte, die Daten enthalten angeben. Wie müssen die Bytes, die als tatsächliche Daten deklariert wurden, nun interpretiert werden? Wichtig hierbei ist zu wissen, dass in Version 0x0102 (in der befinden wir uns grade) der Hintergrund komprimiert ist. Die Komprimierung funktioniert wie folgt:
 Wenn ein Byte den Wert 0x00 hat, dann gibt das nächste Byte an, wie oft dieses wiederholt werden muss. (0x00 repräsentiert in der Palette die Hintergrundfarbe) Ein Beispiel: 00 05 wird zu 00 00 00 00 00 00 Falls ein Byte nicht den Wert 0x00 hat, wird das Byte so übernommen. Auch hier ein Beispiel: 05 wird zu 05 (unverändert) Hier eine kleine Routine, an der man einfach sehen kann wie es als Code aussehen würde: def parse_frame_data513(data): ret_data = {} q = 0 j = 0 while j < data.__len__(): if data[j] == 0x00: for i in range(data[j + 1]): ret_data[q] = 0x00 q += 1 j += 1 else: ret_data[q] = data[j] q += 1 j += 1 return ret_data Nun haben wir eine Liste von Bytes, die die Daten des Frames repräsentieren. Wir können diese Daten auch einfach Pixel nennen. Version 0x0002: Name Size Width 2 byte Height 2 byte Data {Height * Width} byte Wie auch in Version 0x0102 werden Höhe und Breite durch die ersten 4 Bytes bestimmt. Einen Unterschied gibt es bei der „Length", denn dieses ist nicht im Frame enthalten, sondern ergibt sich aus Höhe * Breite. Da „Length“ nicht existiert werden die tatsächlichen Daten durch Höhe * Breite deklariert. Die Daten beginnen direkt nach dem beiden Byte für „Height“. In dieser Version gibt es keine Kompression. Also folgt: Data = Pixels RGBA Frames: Wird zu einem späteren Zeitpunkt ergänzt. Quelle: https://github.com/ScDarko/ROChargenPHP/blob/dbe268b01e20635bd2207b383bc8c34cbea668db/loaders/class.Sprite.php Ein kleiner Ausschnitt aus ROChargenPHP: for ( $y=$height-1, $i=1; $y>-1; $y-- ) { for( $x=0; $x<$width; $x++, $i+=4 ) { if( $pixels[$i+0] > 0 ) { imagesetpixel( $img, $x, $y, $this->getColor( $img, $pixels[$i+3] * $mult_color[0], $pixels[$i+2] * $mult_color[1], $pixels[$i+1] * $mult_color[2], 127 - $pixels[$i+0]/2 )); } } } Für mehr, sollte ihr die oben genannte Quelle aufsuchen. Palette Wird bald ergänzt. Render Image Wird bald ergänzt Danke an: Noil & Dineos Links: SPRR: https://github.com/Normynator/SPRR (Implementierung, nur Sprite) ImgR: https://github.com/Normynator/ImgR (Implementierung, Sprite, Act & Animation)
  17. if( @Amount < 1 ){ <— Change here mes "You cancelled."; } else{ set #CASHPOINTS,#CASHPOINTS + ( @Amount * .CashPoint[.@a] ); <— here delitem .Coins[.@a],@Amount; <— here mes "Done, you have traded "+@Amount+" of "+getitemname(.Coins[.@a])+" into "+( @Amount * .CashPoint[.@a] )+" CashPoint."; } close; not sure but seems like that script can generate infinite amount of Cashpoints, since there is no actual check for gold coins In inventory
  18. Such mal in deinen Grafik Einstellungen nach „Full Screen (no border)“ oder „Maintain Display Scaling“. Verschiedene Einstellungen bei verschiedenen Benutzern ist ja durchaus möglich dank der Registry
  19. Grafikkarten Treiber aktualisiert? Passiert das auch in einer Windows 10 VM? (https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/) Was für eine Grafikkarte ist im Laptop verbaut?
  20. /db/pre-re/item_flag.txt musst du dein Item hinzufügen. Auszug aus den Docs: // Flagged Items // <ItemID>,<Flag> // // <Flag>: // 1 - As Dead Branch item (will be logged at `branchlog` table and cannot be used at 'nobranch' mapflag)
  21. Zb in npc/pre-re/mobs/fields/payon.txt Und dann einfach die Anzahl editieren oder neue mobs hinzufügen oder was du magst halt.
  22. Er meint alle stellen wo sleep(.gotoCount >= .gotoLimit); vorkommt. Geändert wurde das in folgendem Commit: a8e4c83ef10dc4ccde1bd6e6f40b296d590d9b80 (https://github.com/rathena/rathena/commit/a8e4c83ef10dc4ccde1bd6e6f40b296d590d9b80)
×
×
  • Create New...