Leaderboard
Popular Content
Showing content with the highest reputation on 03/18/18 in all areas
-
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)2 points
-
PVP MMR System This is my original work which is inspired by 'DOTA MMR System' and 'DRAGON NEST PVP System'. This system includes the following features: Match making rank system Rank title system Game modes PVP Ladder Points and PVP Ladder Shop (Needs rework) PVP Ladder Board Other Features: [VIDEO] Solo MMR with Glicko-2 Rating System [VIDEO] Party MMR with Glicko-2 Rating System [VIDEO] Ancient Defense Special Mention ~ I'd personally like to thank @AnnieRuru for your help by teaching me the ways on how to make a proper battleground, instance, advance sql and optimized script.. Although I had to re-write everything AGAIN from scratch, it was all worth-it when I compared it from the first version I made. Truly the BEST and BEAST scripter / mentor I've ever known PS: Thanks to @Secrets for releasing Glicko-2 Rating System! This greatly helps at least trim down some problems and possible abuse to the system. Note: Hi guys, I just want to show you my current work in-progress. I'm kinda happy with it, so I decided to showcase it. No hate please! Just love1 point
-
1 point
-
1 point
-
1 point
-
i like @Balfear but it's a bit colorless xD all tho it look good for me1 point
-
1 point
-
1 point
-
Edited my post to vote for the 1st one. @fTakano1 point
-
My vote goes to @fTakano, the green one. Followed by @Narutekz. Awesome designs!1 point
-
1 point
-
My Collectibles I just decided to put my released scripts in here organization purposes and easier access for others who might want to add them to their servers. I will keep on releasing my scripts, both Free and Paid, whenever it is ready! You can also visit my gitlab for access of these files: https://github.com/pajodex/ScriptCollections So here are my script collection!! Free Release: ------- Not mine but I modified these then released with permission from author -------- Paid Release: I hope you enjoy these scripts! Feel free to comment / suggest / or react on whichever script. Hoping to release more of these soon! ~ Have a good day~ SHOW CASE:1 point
-
Another option is to set effects on an item with a set 'sleep' command on them so they refresh and continue constantly. Setting the items level requirement to 99 would give you that desired requirement as well, but of course, you're assigning it to an item then and that takes up a slot or inventory space. 3000,Item_Name,Item Name,4,20,10,1,,1,,1,0xFFFFFFFF,15,2,136,,1,0,,{ while (isequipped(3000) ) { specialeffect2 700; sleep2 1600; specialeffect2 500; sleep2 1600; } },{},{} So this equips in the accessory slot and refreshes an effect at certain intervals (The effects in this script are actually random, so don't rely on those to even be working effect numbers), and the sleep sets a refresh rate (should be adjusted to the effect) so that if a new player warps on to the map, they'll see the effect appear after a set interval of time. It isn't perfect, but it's fun to play with and you can use it to give your GMs a special aura from players or unique to each GM entirely. Hope this helps, ~Azura Skyy1 point
-
Hello. I haven't seen a tutorial to adding custom robes to one's client, and Google turned up naught, so I did a bit of studying and documented it myself. It's rather crude (and a few months outdated), but I hope it helps: click Please make sure you follow the steps carefully. It can be rather tricky. I screwed up a few times myself.1 point