Leaderboard
Popular Content
Showing content with the highest reputation since 06/07/24 in all areas
-
Quite a bit of time has passed since I originally attempted to revive this forum and reintroduce Melia to the world, and while we're still not anywhere near completing this project, today I felt the need to post once again, as a sign of life. Ever since my last post, somehow, there have have been both many and also few changes. We have made considerable improvements to the code, its structure, and its reliability, while also adding many new features that are slowly but surely bringing Melia closer to becoming a full-fledged game server. It's been a slow process, but I believe we're still on a good path. Unfortunately, many of the changes have been focused on underlying systems and don't necessarily show on the surface, which might make it seem like the project has advanced very little. This is not the case though, and even outside of developing the code there have been advancements. One of the largest changes on my side has been a shift in how I perceive this project. What started as a server emulator for the latest version of ToS is slowly shaping into something more, as we discover how few users are actually looking for such a project. As counterintuitive as it may sound, every person I heard express interest in Melia over the years has had different ideas of what they'd want to create with it, and their ideas rarely align with the game the server is compatible with. And since we also discovered unprecedented abilities to modify the client's behavior from the server, it has become more and more viable to craft much more customized experiences than were originally thought possible. With this outlook, we gradually veered away from creating a straight forward server emulator and are now striving to make the server a piece of software that can not only recreate the functions of one game or a version of it. Instead we invision users handcrafting and piecing together their ideal world, while sticking to our ideals of making Melia as simple to use as possible for all user levels. This may all sound rather vague, but I'm excited to keep working on this project and showing you what it can evolve into over the next months and beyond. We've been here for ten years, and we'll keep going for as long as there is any interest in us doing so. I hope you'll keep following Melia with interest, and more updates are on the horizon.1 point
-
In this post we will learn all the different parts of how an NPC's XML file is constructed in order to help create custom XMLs for NPCs. <portraitAnimation image="NPCportrait_Makenna.dds"> This line is the most obvious, it needs to match the file name. On that same note because of how these files are loaded, it is based on the filename. For the custom Makenna NPC portrait to appear in game, you'll need to name the file NPCportrait_Makenna.dds. This name will be dependent on the NPC's name. For example, internally Nora is _nora, this is set in NPCInfo.XML, without the underscore in the name, that file is fairly self-explanatory. For this example, the NPC's name in that file is _makenna. <clipInformations number='15'> <clipInformation x1=" 0" y1=" 0" x2=" 384" y2=" 512" originX=" 0" originY=" 0" /> <clipInformation x1=" 134" y1=" 123" x2=" 123" y2=" 260" originX=" 134" originY=" 123" /> <clipInformation x1=" 386" y1=" 0" x2=" 511" y2=" 62" originX=" 134" originY=" 123" /> <clipInformation x1=" 386" y1=" 64" x2=" 511" y2=" 126" originX=" 134" originY=" 123" /> <clipInformation x1=" 386" y1=" 255" x2=" 511" y2=" 318" originX=" 134" originY=" 123" /> <clipInformation x1=" 386" y1=" 128" x2=" 511" y2=" 189" originX=" 134" originY=" 123" /> <clipInformation x1=" 386" y1=" 191" x2=" 511" y2=" 253" originX=" 134" originY=" 123" /> <clipInformation x1=" 185" y1=" 210" x2=" 225" y2=" 227" originX=" 185" originY=" 210" /> <clipInformation x1=" 407" y1=" 448" x2=" 447" y2=" 465" originX=" 185" originY=" 210" /> <clipInformation x1=" 407" y1=" 469" x2=" 447" y2=" 486" originX=" 185" originY=" 210" /> <clipInformation x1=" 407" y1=" 491" x2=" 447" y2=" 508" originX=" 185" originY=" 210" /> <clipInformation x1=" 464" y1=" 425" x2=" 504" y2=" 442" originX=" 185" originY=" 210" /> <clipInformation x1=" 464" y1=" 450" x2=" 504" y2=" 467" originX=" 185" originY=" 210" /> <clipInformation x1=" 464" y1=" 471" x2=" 504" y2=" 488" originX=" 185" originY=" 210" /> <clipInformation x1=" 464" y1=" 493" x2=" 504" y2=" 510" originX=" 185" originY=" 210" /> </clipInformations> This represents the different animation frames, the very first one should be for the main body itself. <clipInformations number='15'> This value should equal the number of entries below. x1 is left most X coordinate of the chunk y1 is the top Y coordinate of the chunk x2 is the right most X coordinate of the chunk y2 is the bottom Y coordinate of the chunk originX is where on the initial left-most X coordinate of the frame the part should be layered on top of. This will be 0 for the main body. originY is where on the initial top Y coordinate of the frame the part should be layered on top of. This will be 0 for the main body. the values range from 0 to 511 (512 pixels in each direction in total). the 0 coordinates start from the top left corner of the image. <animations number='21'> <animation index='0' name='base'> <background> <clips number='1'> <clip value=" 0 " /> </clips> </background> </animation> <animation index='1' name='normal'> <background> <clips number='2'> <clip value=" 7 " /> <clip value=" 1 " /> </clips> </background> <frame index='0' duration='0.06'> <clips number='1'> <clip value=" 2 " /> </clips> </frame> <frame index='1' duration='0.15'> <clips number='1'> <clip value=" 3 " /> </clips> </frame> <frame index='2' duration='0.06'> <clips number='1'> <clip value=" 2 " /> </clips> </frame> </animation> This portion defines the chunks used for each emotion. <animations number='21'> This indicates the number of different emotions or animation values there are. <animation index='0' name='base'> This indicates the index of the animation, you will increment this by 1 for each animation you add, and this will always start from an index of 0. The name indicates the name that the client calls in scripts for the animation. The first index should always be named base, this is used for the base portrait. normal indicates the neutral expression that all NPCs have good, love, bad, and hate indicate the favor based expressions that NPCs can use automatically based on favor level. If an NPC doesn't have these, it will default to normal. Any other emotions added can have any name but the NPC script's dialogue must call it manually. <clips number='2'> This indicates the number of chunks to use for this animation (usually eyes and mouth). <clip value=" 7 " /> This indicates which clip to use from above, it starts from an index of 0, so setting this to 0 would be the main body typically. <frame index='0' duration='0.06'> <clips number='1'> <clip value=" 2 " /> </clips> </frame> <frame index='1' duration='0.15'> <clips number='1'> <clip value=" 3 " /> </clips> </frame> <frame index='2' duration='0.06'> <clips number='1'> <clip value=" 2 " /> </clips> </frame> This is used for animating chunks, usually the eyes. <frame index='0' duration='0.06'> index selects which part should be animated from the above list of indexes in `clip`. duration is how long this specific frame of animation plays You will iterate index by 1 for each additional frame of animation you use. I recommend keeping the duration and number of frames the same for animating eyes since this is how official NPCs are animated and will give the desired blink effect. <clips number='1'> the number of clips to use for the frame. I've never seen this set to more than 1, but technically you should be able to animate multiple parts at once. <clip value=" 2 " /> Indicates the chunk used for this frame of animation, 2 should be her eyes half closed chunk and 3 should be fully closed. 1 would also be her normal eyes fully opened, which we set above, when it isn't animating, it will use that chunk instead. And that's about all there is to this file, aside from the usual XML syntax. If there are any further questions about how these files work, please feel free to ask questions here.1 point
-
Hi, I just started reverse engineering the TOS network protocol and your project has been a huge help with that. So I thought about also contributing a bit. I noticed that your ZC_DEAD Packet is not correct. I program in Java and I don't know how to do stuff in C# so I don't want to create a pull-request, but here is the Structure of the Packet public class Dead { private short size; private int handle; private byte unk1; private byte killCount; private byte unk3; private byte unk4; private Killer[] killer; private static class Killer { private int handle; private int xp; private int classXp; } } I hope this will be useful for you.1 point
-
I have a link to a github project for an Elsword emulator that has been abandoned last year. The last update I seen on it was in 2017 feel free to give it a look but keep in mind I am not affiliated with Esemu nor was I that big of a community member when it's community was still available. The link to the project is https://github.com/ESEmu I think it's prealpha so you won't have anything playable with this yet and you most likely will have to put a ton of work into this. This project obviously isn't for the feint of heart so I do not have much hope that you guys will interested in reviving Esemu the problems weren't legal based as to why Esemu failed before it was more of a internal issue I do not know the full details on the internal struggles that past developers had on Esemu so I do not have much information. Anyways I would be eternally grateful for anyone willing to at least take a look at this project even if there isn't much hope for it to be saved.0 points