tag:blogger.com,1999:blog-62560456337223373522024-03-14T08:53:19.969+01:00WizardMMO development blogDevelopment of a HTML5 MMORPG using Websockets, Java and MongoDBPhilipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.comBlogger198125tag:blogger.com,1999:blog-6256045633722337352.post-30606822094745576212014-09-01T20:49:00.005+02:002014-09-01T20:49:48.506+02:00Moving to wordpressI decided to move this blog out of Googles reach and onto my own server on <a href="http://wizardmmo.com/">wizardmmo.com</a>.<br />
<br />
From now on, any future updates will be posted on my wordpress blog on <a href="http://wizardmmo.com/blog">wizardmmo.com/blog</a>. Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-5180328914848701032014-08-31T19:15:00.000+02:002014-08-31T19:15:11.604+02:00Various bugfixes<ul>
<li>Vampiric spells no longer freeze the client</li>
<li>Characters which somehow manage to get stuck in walls on mapchange or login will get moved to a nearby open position</li>
<li>Multi-hit spells now retain their multi-hit property on logout</li>
<li>Tailored items now have icons</li>
</ul>
Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-81856315789101796252014-08-29T20:01:00.000+02:002014-08-29T20:16:09.858+02:00New Websocket implementationMy server is online with a new websocket implementation by <a href="http://java-websocket.org/">java-websocket</a> by <a href="http://tootallnate.net/">TooTallNate</a>. I hope that this will work better for all the people which could not connect. Please <a href="http://play.wizardmmo.com/">try again</a> and comment to tell me about your experience.<br />
<br />
Replacing my WS implementation was surprisingly painless. I ran into some problems with my duplicate login prevention, but worked them out eventually. I had to sacrifice my stack for pure TCP sockets, but considering that I haven't regression-tested that code in ages, that's maybe for the better.<br />
<br />
On an unrelated note: It's true. You can't put a server online without having it attacked immediately. I already have some IPs from China and Russia trying to brute-force my SSH root password. Good luck with that. It's randomly-generated and far too long to brute-force, especially over the net.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com8tag:blogger.com,1999:blog-6256045633722337352.post-29754336411142753922014-08-28T20:32:00.000+02:002014-08-28T20:32:03.112+02:00Some problems fixed... or not.Some people commented on my last post that they have problems logging in. Thank you very much for that. I now changed the server to:<br />
<br />
1. terminate the old connection instead of the new one when the same account logs in twice<br />
2. terminate connections when they don't responds to pings in a while<br />
<br />
However, I am quite sure that this only fixed the symptom, not the actual problem, which seems to be a bug in my websocket implementation. I am thinking about trashing that hacky thing and replace it with a tried and true implementation <a href="http://java-websocket.org/">like this</a>.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-43214887908246044902014-08-28T01:13:00.002+02:002014-08-28T01:20:32.502+02:00Onliner for a dayMy server is now online for a day and I already have three account registrations. Considering that I didn't actually do anything to promote it yet except for writing on this blog, these are three more people than expected. It would be even more motivating, though, when they would have actually done anything, but looking at their saves in the database it seems like they didn't even move from the starting point. I wonder if they encountered some problem or just didn't felt like playing.<br />
<br />
Another topic: I am currently building a website on <a href="http://wizardmmo.com/">wizardmmo.com</a> using <a href="https://wordpress.org/">Wordpress</a> as a content management system. When it's finished I will start to think about how to spread the word about my game.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com2tag:blogger.com,1999:blog-6256045633722337352.post-19028672582411901692014-08-26T11:31:00.003+02:002014-08-26T11:33:23.914+02:00It's online!I rented a small virtual machine, installed my server on it and uploaded my javascript client. Except for some small initial issues it now runs great. At least as long as I am the only one who is playing.<br />
<br />
It is now available at <a href="http://wizardmmo.com/">wizardmmo.com</a>. But before I start to promote it, I need to take care of some things from my todo list.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-74856605605435392682014-08-24T21:54:00.001+02:002014-08-24T21:55:24.168+02:00My game is now called WizardMMOI finally decided on a name: Until I come up with something better, it will be called <b>WizardMMO</b>. I already registered the domain <a href="http://wizardmmo.com/">wizardmmo.com</a> and will soon build a website. Yes, the name is very generic, but this is what my game is about. It's a MMO where you play only wizards. Much easier to remember than some word-salad title or made-up fantasy name.<br />
<br />
My original working title used to be Wizardwar, but<a href="https://www.wizardwars.com/"> Paradox Interactive beat me to that by a few months</a>.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-87011390095454352332014-08-24T17:31:00.000+02:002014-08-24T17:31:04.381+02:00Walk animation, cast animation and ice particle effect<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaFqgCzgeBbH3Gvw4DO8v2dd4IXsAnk1yAnX8fFpxzNnvLPQY3Ym47KLuglCvqwngwsWgzkCaapzrac3u5KA38fPdilo1JZ8ndVvcR7ygwCun2t5UErGrx8LKLvyfHVMCrNUVcMgUOQZAN/s1600/client_2014-08-24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaFqgCzgeBbH3Gvw4DO8v2dd4IXsAnk1yAnX8fFpxzNnvLPQY3Ym47KLuglCvqwngwsWgzkCaapzrac3u5KA38fPdilo1JZ8ndVvcR7ygwCun2t5UErGrx8LKLvyfHVMCrNUVcMgUOQZAN/s1600/client_2014-08-24.png" /></a></div>
<br />I did some long-needed pixel artwork. A walk animation for the player-character, a casting pose and the missing particle effect for cold attacks.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-56434852251718751992014-08-16T15:16:00.002+02:002014-08-30T01:06:52.687+02:00ToDo ListI haven't made a proper roadmap in ages. So this is not really a roadmap but rather an unordered but prioritized todo list.<br />
<br />
<span style="color: red;">Must Have</span><br />
<span style="color: orange;">Should Have </span><br />
<span style="color: #ffd966;">Nice to have</span><br />
<span style="color: #666666;">Not sure if worth doing</span><br />
<br />
<ul>
<li> Netcode</li>
<ul>
<li><span style="color: #ffd966;">Zipped messages</span></li>
<li><span style="color: orange;">Client-sided prediction</span></li>
</ul>
<li>Security</li>
<ul>
<li><span style="color: orange;">Password reset </span></li>
<li><span style="color: #ffd966;">Brute force prevention</span></li>
<li><span style="color: #ffd966;">Websocket over TLS</span></li>
</ul>
<li>Character customization</li>
<ul>
<li><strike><span style="color: orange;">Genders</span></strike></li>
<li><span style="color: #999999;">Portrait engine </span></li>
</ul>
<li>Graphic engine</li>
<ul>
<li><span style="color: #ffd966;">Dynamic recoloring of graphics </span></li>
<li><span style="color: orange;"><strike>Particle effect for cold spells</strike> </span></li>
</ul>
<li>Animations </li>
<ul>
<li><strike><span style="color: red;">Create walk animation for player character</span></strike></li>
<li><strike><span style="color: orange;">Cast animation (code and graphics) </span></strike></li>
<li><span style="color: red;">Dead animation (code and graphics)</span></li>
</ul>
<li>Equipment</li>
<ul>
<li><span style="color: orange;">Staffs & staff crafting</span></li>
</ul>
<li>Mining</li>
<ul>
<li><span style="color: #ffd966;">Prospect spell</span></li>
<li><span style="color: #ffd966;">Sense spell</span></li>
</ul>
<li>Spells</li>
<ul>
<li><strike><span style="color: orange;">Auto-generation of spells with target areas</span></strike></li>
</ul>
<li>Route Finding</li>
<ul>
<li><span style="color: #ffd966;">Upgrade from Dijkstra to A*</span></li>
<li><span style="color: #ffd966;">Allow multiple layers</span></li>
<li><span style="color: #ffd966;">Allow tiles with complex walkability-shape</span></li>
<li><span style="color: #ffd966;">Flee algorithm </span></li>
</ul>
<li>Content</li>
<ul>
<li><span style="color: orange;">One more soft material</span></li>
</ul>
<li> Website</li>
<ul>
<li><strike><span style="color: red;">Host for gameserver</span></strike></li>
<li><span style="color: red;">Static content </span></li>
<li><strike><span style="color: red;">Forum</span></strike></li>
<li><span style="color: orange;">Bugtracker</span></li>
<li><span style="color: orange;">Wiki</span></li>
<li><span style="color: orange;">All of that accessible with the ingame account</span></li>
</ul>
<li>Marketing</li>
<ul>
<li><span style="color: red;"><b><strike>Come up with a name already!</strike> </b></span><span style="color: red;"><b><span style="color: red;"> </span></b></span></li>
<li><strike><span style="color: red;"><span style="color: red;">Get a domain name </span></span></strike></li>
</ul>
</ul>
Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-26783718563435704272014-07-29T21:44:00.000+02:002014-07-29T21:44:48.204+02:00Mining System implementedI implemented the <a href="http://ontraindevelopment.blogspot.de/2014/05/mining-system.html">mining system</a>. I also made the first mining map, an NPC which sells the mining spells,
and two Foni's, one giving mining hints and one telling a bit more about
herself. I am not that happy with the iron ore item sprite, though. It looks like shit. No, it <i>literally</i> does. Just look at it:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGKn_dFtCNOXf1tJPkWjsAtTUGzq7Yqxc92FYTdwWAk85WFVI91lAzsJkpV1vOxcUBSiUATTLv95zDkuKotg20QUiIuplwSaNAIoQETZbMjZEzlIIZzQ-b-BjCcjtTfzEnJvRNAz40PczB/s1600/client_2014-07-29.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGKn_dFtCNOXf1tJPkWjsAtTUGzq7Yqxc92FYTdwWAk85WFVI91lAzsJkpV1vOxcUBSiUATTLv95zDkuKotg20QUiIuplwSaNAIoQETZbMjZEzlIIZzQ-b-BjCcjtTfzEnJvRNAz40PczB/s1600/client_2014-07-29.png" /></a></div>
<br />
But otherwise, I am quite happy with this feature. It works just like I designed it. Sensing and prospecting isn't implemented yet, but probing and mining works just as intended and I think hunting for ore is really fun... at least compared to the "click on ore, watch progress bar" resource gathering systems of most MMORPGs. Now I just need something which can actually be done with the ore. Currently it's just vendor trash, and not even a particularly lucrative kind.<br />
<br />
<br />
<div style="text-align: center;">
<br /></div>
<br />
<br />
<br />Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-11875234970818303512014-07-26T11:38:00.001+02:002014-07-26T11:38:55.457+02:00Wenibe and Angel quest finishedI reworked Wenibe and finished the angel quest. I actually did two weeks ago. I need to take this blogging thing more serious again.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com2tag:blogger.com,1999:blog-6256045633722337352.post-59476540483324911442014-06-30T11:38:00.000+02:002014-06-30T12:58:59.937+02:00AoE overhaulI spent the whole Sunday with overhauling the code for AoE attacks. It is now much more extensible for different attack patterns than just points and circles. I also implemented attacks which target a ground location instead of a specific opponent, which works both for mobs and for players.
<p>
However, the procedural spell generation system doesn't create any spells with that feature yet. Both kinds of AoE attacks are now visualized by the client during their preparation-time, so players can dodge attacks more intuitively.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-13402526672425275912014-06-18T22:50:00.001+02:002014-06-18T23:29:29.893+02:00Little content todo listI am currently working on content up to level 10. I made the dungeon which should bring the player to level 10, but it is still quite hardcore. Here is a little Todo list of stuff I need to add to prepare the player for it:<br />
<ul>
<li>Give the healer more healing spells for sale</li>
<li>Quest to introduce the player to item crafting</li>
<li>Add a level 5 soft crafting material so the player can craft hats and robes before visiting the dungeon</li>
<li>Draw the container for the MacGuffin #1 and add it to the dungeon</li>
<li>Add more staffs (<a href="http://ontraindevelopment.blogspot.de/2013/02/equipment-revamp.html">and write the code for making staffs do what they are supposed to be doing</a>) </li>
</ul>
Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-33984071998121098682014-06-18T22:38:00.000+02:002014-06-18T22:38:46.358+02:00My shell is not complicated!To get the current HP of a boss monster, you just have to use one simple, easy to remember, command:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">/shell user.getMapInstance().getMobs().stream().filter(function(mob) { return mob.getName() == "Boss" }).findFirst().get().getHp();</span><br />
<br />
...<br />
<br />
I might need to work on this.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-57378080956109289342014-06-08T17:56:00.000+02:002014-06-08T18:11:40.553+02:00Labyrinth generatorI experimented with procedural map generation. The maze below is created completely on the server based on a random seed. I might want to use this algorithm as-is in the finished game to create procedural dungeons, but for now it's mainly a proof-of-concept. I could imagine a lot more kinds of maps which could be created procedurally than just this one.<br />
<br />
This, however, begs the question of how much I want to rely on procedural content. While procedural generation is a great way to create huge amounts of content with minimal work, it can never compete with the ingenuity of hand-designed content.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzeaj3-cPF1XdirSYp-9XZTkWtDNGCen2_MNvJXzIZLMg2Jg5b88sKQWi9EvDUKrPuaOcjLOoVDjKVjB5hnL0D-3zfWNU3uqQ13mvziQ7ERAXzZLOUuiVnlH87LEzV155nkcoQwsRWwI7Y/s1600/client_2014-06-08.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzeaj3-cPF1XdirSYp-9XZTkWtDNGCen2_MNvJXzIZLMg2Jg5b88sKQWi9EvDUKrPuaOcjLOoVDjKVjB5hnL0D-3zfWNU3uqQ13mvziQ7ERAXzZLOUuiVnlH87LEzV155nkcoQwsRWwI7Y/s1600/client_2014-06-08.png" /></a></div>
<br />
<br />
<br />
To send the procedurally-generated map to the client, I had to write my own encoding routine for my maps. I used to just forward the original JSON code from Tiled to the client. But because there is no Tiled file for procedurally-generated maps, I had to write a routine to encode the map data myself.<br />
<br />
The same routine is now used for the maps made in Tiled. This has the advantage that I only transfer the information about the map which the client needs to know. This saves bandwidth and removes cheating opportunities.<br />
<br />
<br />
<br />
<br />Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-3559637876897529412014-06-01T19:16:00.002+02:002014-06-01T19:16:44.946+02:00MinimapI've added a minimap. An easy to do but crucial feature.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh586jfbo4adoeBJuEMhNiZhm3tqa4KwYl13-yPTr3MeP4HPH7UkrYlllUuK24PG0z88z1UKYLgqPZe77bmD2TL7spi_dqU6HXlXytfpQc8JQXZm0Ry-RQD3XVR6pV1sN1Q8UVjYiy7Mz1/s1600/client_2014-06-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh586jfbo4adoeBJuEMhNiZhm3tqa4KwYl13-yPTr3MeP4HPH7UkrYlllUuK24PG0z88z1UKYLgqPZe77bmD2TL7spi_dqU6HXlXytfpQc8JQXZm0Ry-RQD3XVR6pV1sN1Q8UVjYiy7Mz1/s1600/client_2014-06-01.png" /></a></div>
<br />
<br />
<br />Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-88476214174771263032014-05-26T01:00:00.000+02:002014-05-26T01:00:33.676+02:00Content Content Content!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZrvMpFSxHhWY-no7r7gUS2KG1n4wkL6RxA0X8vxU7azvFW6AXgO0_Dqc3enaxL_MPfcP0jXFrPCOgPDlmwoJnnh8tdvgwqzNhvaY4vphTJQAi5vJrbmtpNK42MVrVQXKaC9Q3e7P5A8m0/s1600/angel_lake_tiled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZrvMpFSxHhWY-no7r7gUS2KG1n4wkL6RxA0X8vxU7azvFW6AXgO0_Dqc3enaxL_MPfcP0jXFrPCOgPDlmwoJnnh8tdvgwqzNhvaY4vphTJQAi5vJrbmtpNK42MVrVQXKaC9Q3e7P5A8m0/s1600/angel_lake_tiled.png" height="217" width="400" /></a></div>
The last days were all about adding content. I made the first complete quest, I made the biggest map so far, I balanced the existing mobs and I made a new tileset which I will soon use for the first real dungeon. But there is still a lot of stuff to do before I got enough content to go public.<br />
<br />
<br />Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-72260798782107523482014-05-21T17:40:00.000+02:002014-05-21T17:41:50.840+02:00Attack particle effectsMy buglist is shrinking down to the "that code will be replaced anyway" and "freak accident which happened once during development" categories, so I started something new. Attacks now create projectiles which fly from the caster to the target. That makes combat a lot more immersive:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQS53PVQ2XFS-LNdJTdFvPG7JjwnhCY2TPlsSDYu9nvG_fJUaUBZcqQKPgc1Ch6JzG_OCMgbGAhwF_jxi8aVfMUPFxOjqCu8h_EibLRzEsKO0IO8Khbvp7zEZHgoOHeV5mJ9DEXXxR9-wc/s1600/client_2014-05-21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQS53PVQ2XFS-LNdJTdFvPG7JjwnhCY2TPlsSDYu9nvG_fJUaUBZcqQKPgc1Ch6JzG_OCMgbGAhwF_jxi8aVfMUPFxOjqCu8h_EibLRzEsKO0IO8Khbvp7zEZHgoOHeV5mJ9DEXXxR9-wc/s1600/client_2014-05-21.png" /></a></div>
<br />Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-71832106095739238212014-05-19T14:03:00.000+02:002014-06-30T13:03:32.142+02:00Mining systemJust a concept for now.<br />
<br />
Resource gathering is an important part of every crafting system. An important resource would be ores and minerals mined from the depth of the earth.<br />
<br />
It would, of course, be unthinkable for a wizard to take a pickaxe and perform <i>manual labor</i> to excavate minerals. Like everything in Pecosia, there is a branch of magic dedicated to these kinds of jobs: <b>Geomancery</b>.<br />
<br />
Geomancery is the art of using magic to sense minerals in the earth and getting them to the surface. A geomancer hunting for ores needs two spells: A detection spell which tells him where the minerals are hiding and a mining-spell which gets them to the surface. More advanced minerals do of course require more advanced geomancery spells to find and mine.<br />
<br />
<h3>
Detection spells:</h3>
<br />
<h4>
Prospect</h4>
The first spell cast by a geomancer visiting a new location. It tells them if and which minerals can be found on this map, but not where. <br />
<h4>
Probe</h4>
<h4>
<span style="font-weight: normal;">Tells the</span><span style="font-weight: normal;"> geomancer if there are mineral deposits in range and how far they are away, but not in which direction. It does so by telling the caster the level of mineral radiation at its current position. The closer they are, the higher the radiation. However, when there are multiple deposits in range, their radiation adds up which could mislead the</span><span style="font-weight: normal;"> geomancer.</span></h4>
<h4>
Sense</h4>
<h4>
<span style="font-weight: normal;">Tells the</span><span style="font-weight: normal;"> geomancer the direction of the next mineral deposit, but not how close it is. When there are multiple deposits nearby, the vector-product is created and the angle of that is shown, so again, multiple deposits in range can be misleading.</span></h4>
<h4>
<span style="font-weight: normal;"> </span></h4>
<h3>
<span style="font-weight: normal;"><b>The Mining spell</b></span></h3>
<h4>
<span style="font-weight: normal;">When the geomancer believes that she found the deposit, she will use the mine-spell. It will reveal any mineral deposits in range and turn them into items which can then be picked up. The mine-spell is much more MP-costly and slower to cast than the detection spells. So while a geomancer which just casts it randomly might find a deposit once in a while, one which uses probe and sense will be much more successful in the long run.</span></h4>
<h4>
</h4>
<h4>
</h4>
<h4>
<span style="font-weight: normal;"></span></h4>
<h4>
<span style="font-weight: normal;"> </span></h4>
<h4>
<span style="font-weight: normal;">All of this should not be hard to implement. But before I start I need to work on some bugs. I am using a spreadsheet for a while to collect any bugs I find but do not feel like fixing right away, and it has grown quite long. Some are of the we-can-live-with-that-for-now level, but there is also a very critical bug which makes the whole network system unresponsive under some condition which I definitely need to take care of before starting with any new features. There are also some worrysome bugs which are not that critical, but very hard to reproduce. Multithreading is hell.</span></h4>
Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-37127867246687304692014-05-03T18:22:00.000+02:002014-05-03T18:22:30.215+02:00Fighting NPCs<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzKQ4eHI213FY04gyw-92qG2M_h5xt12938qHqr6dA60NHFgVxI6YSO-o6uq3ofDJfNHTHl5HfYLx5fD7405qjNu0YIz-oDb0LR1qNs-HaidPYY_WOHhA8fHu6MFqygypkKfczRF21rzw-/s1600/client_2014-05-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzKQ4eHI213FY04gyw-92qG2M_h5xt12938qHqr6dA60NHFgVxI6YSO-o6uq3ofDJfNHTHl5HfYLx5fD7405qjNu0YIz-oDb0LR1qNs-HaidPYY_WOHhA8fHu6MFqygypkKfczRF21rzw-/s1600/client_2014-05-03.png" /></a></div>
<br />
I added the ability for NPC scrips to turn NPCs into mobs and revert them back to NPCs when defeated. This will be very useful for quest scripting. I want to avoid those cliché "Kill 10 rats" quests. I want quests which actually tell a story and are not just excuses for mob grinding.<br />
<br />
I also did a first quest where you retrieve a stolen item. The player finds the thief and talks to them. Then the thief turns hostile and fights the player. Well, that's the basic plot. The details are of course much more fleshed out (don't want to spoil).Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-2003845232713671382014-04-26T20:24:00.000+02:002014-04-26T20:46:04.525+02:00Shutdown procedure<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFe0TmexJPjWwIsFR9nraP1pyI4Pmk9zLIvT1816Z_lFzdtHvmZnwYdv3IKL4mpPLB-uPahGWnQcpp2w3Tp2qZcBZVWD-Im1jfFtoN3VAhoSwVWfG_TZsDDOY1DYn-G8cktUrqKWSwpvY6/s1600/client_2014-04-26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFe0TmexJPjWwIsFR9nraP1pyI4Pmk9zLIvT1816Z_lFzdtHvmZnwYdv3IKL4mpPLB-uPahGWnQcpp2w3Tp2qZcBZVWD-Im1jfFtoN3VAhoSwVWfG_TZsDDOY1DYn-G8cktUrqKWSwpvY6/s1600/client_2014-04-26.png" /></a></div>
<br />
Until now there was no proper way to shut down the server. The only way was to kill the JVM process, which didn't save any characters. I finally solved this by adding a proper shutdown-command which properly disconnects and saves all the characters, terminates all the map instances and properly finishes up all the other stuff which happens in the background. I also wrote a server-sided javascript which can be executed from the shell and shuts down the server after a countdown. This utilizes a new admin-broadcast feature I also implemented.<br />
<br />
I mostly did the script as a PoC for server-sided scripts started from the console. This might come in really handy for special events managed by GMs. Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-68811614118020258532014-04-12T13:05:00.000+02:002014-04-12T13:07:43.261+02:00Choosing a wiki softwareI am currently looking for a wiki software to use.<br />
<br />
My should-requirements are:<br />
<br />
<ul>
<li>Uses PHP </li>
<li>Simple to set up and administrate</li>
<li>Syntax similar to MediaWiki</li>
<li>Doesn't use databases besides MySQL and MongoDB </li>
</ul>
<br />
My can-requirements are:<br />
<br />
<ul>
<li>Possible to hack in a way that it can share user accounts with my game</li>
</ul>
<br />
<h3>
MediaWiki</h3>
My first idea was the popular <a href="http://www.mediawiki.org/">MediaWiki</a>, but the<a href="http://www.mediawiki.org/wiki/Manual:What_is_MediaWiki%3F"> "What is MediaWiki"</a> section on their homepage says:<i> </i><br />
<br />
<i>"MediaWiki is geared towards the needs of the Wikimedia Foundation. The program is primarily developed to run on a large server farm
for Wikipedia and its sister projects. Features, performance,
configurability, ease-of-use, etc are designed in this light; if your
needs are radically different the software might not be appropriate for
you." </i><br />
<br />
I just want a wiki for my small little game, not build a million-article encyclopedia running on a dedicated server-farm, so this doesn't really sound like the right software for me.<br />
<br />
<h3>
PmWiki </h3>
The second software which caught my eye was <a href="http://www.pmwiki.org/">PmWiki</a>, pretty much the Anti-MediaWiki.<br />
<br />
It is extremely simple to set up, because it doesn't even require a database. It saves everything in flatfiles. This might look strange in this day and age, but <a href="http://www.pmwiki.org/wiki/PmWiki/FlatFileAdvantages">they are making a convincing argument</a>. I tried it and the installation was indeed a breeze - just copy the PHP-files and it runs out-of-the-box.<br />
<br />
But what really surprised me is that PmWiki by default does not even know the concept of personalized user accounts. In the default configuration, everything can be edited anonymously. When you don't like that, you can set individual passwords, but they are not bound to accounts. Anyone who knows the password can read or edit specifically protected pages.<br />
<br />
There are, however, <a href="http://www.pmwiki.org/wiki/Cookbook/Security">lots of addons which enable mandatory logins with username and password</a>. Many of them are designed to use the user databases of other systems. That likely means that I could write my own which uses the accounts in my MongoDB.<br />
<i><br /></i>
<i><br /></i>Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-56839760119044233752014-04-09T15:11:00.002+02:002014-04-09T15:11:52.257+02:00MongoDB authenticationI used to run MongoDB authentication-less. I used to rely on a firewall to shield MongoDB against outside access and only allow access from within the server-network like early MongoDB guides suggested, but I know that my skills as a sysadmin are limited. So I decided to enabled user accounts and authentication for MongoDB and add support for authentication to the gameserver. Better safe than sorry.Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0tag:blogger.com,1999:blog-6256045633722337352.post-70400491811633610932014-04-06T20:28:00.001+02:002014-04-06T20:28:35.451+02:00Password changing<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj97gqvBHwHwHtmxomI1zUEnRHTguUUhZI_Nx6G9WD5SwOpYPN79oGrgmrQDZnqxUsKx9kNQsq9Zqz9LOnVTPrF2Ow8WbjwWsZXTdBOmbISKRtMmFw7RKBOuwblfO6XCC0mdbzkGjFZZ8kD/s1600/client_2014-04-06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj97gqvBHwHwHtmxomI1zUEnRHTguUUhZI_Nx6G9WD5SwOpYPN79oGrgmrQDZnqxUsKx9kNQsq9Zqz9LOnVTPrF2Ow8WbjwWsZXTdBOmbISKRtMmFw7RKBOuwblfO6XCC0mdbzkGjFZZ8kD/s400/client_2014-04-06.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I replaced the "Logout" button in the control bar with a new button "Menu". This button opens a popup menu with lots of links. "Logout" does the same thing the old logout button did. "Settings" opens a new window which allows the user to change their password.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The other options are links which will lead to various web-applications I still need to set up.</div>
Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com3tag:blogger.com,1999:blog-6256045633722337352.post-42439111298623766372014-03-27T10:48:00.001+01:002014-03-27T10:49:21.276+01:00Crafting interface implemented<p>I added support for crafting. NPCs can now display a crafting window. They can freely define how many slots to display and where to display them. The item script can also define a handler-function which receives the items the player dragged into the window. Each slot can define a "tag" which says which items can go there. Items can now have one or more such tags which define the crafting use they have.
</p><p>
The Java part of the engine does the ground-work of validating that the users input is legal (tags match the slots, user actually has the items).
</p><p>
The scripted function is then responsible for checking if the combination is a valid recipe, remove the items and give the player a new item. This function could also be implemented as a Java class. When I develop a more complex crafting system, I might opt to do so.</p>Philipphttp://www.blogger.com/profile/07753201014110955270noreply@blogger.com0