Create a Stendhal server extension: Difference between revisions

Jump to navigation Jump to search
Content deleted Content added
imported>Hendrik Brummermann
imported>Hendrik Brummermann
added navigation menu
 
(26 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{Navigation for Stendhal Top|Building & Hosting}}

How to create a server extension? This will teach you how to! Todays project: add the commands "/date" and "/time" for the users, so that they can check what time or what date it is.
How to create a server extension? This will teach you how to! Todays project: add the commands "/date" and "/time" for the users, so that they can check what time or what date it is.
=Requirements=
==Requirements==
Whats required?
Whats required?
*An OS
*An OS
Line 8: Line 10:
*Java knowledge is recommened
*Java knowledge is recommened


=Getting your own setup=
==Getting your own setup==
Ok, let's be cliched here. The "hello, world!" of stendhal server extensions!
Ok, let's be cliched here. The "hello, world!" of stendhal server extensions!


==The file==
===The file===
Create a file in <downloaded stendhal source>/src/games/stendhal/server/extension/ called "HelloWorldExtension.java" and add this to it (just for now):
Create a file in <downloaded stendhal source>/src/games/stendhal/server/extension/ called "HelloWorldExtension.java" and add this to it (just for now):
<source lang="java">
<pre>
package games.stendhal.server.extension;
package games.stendhal.server.extension;


Line 67: Line 69:
}
}
}
}
</pre>
</source>
Time for an explanation: First, we import a whole lot of stuff. This is just so we can interact with EVERY aspect of the server & game world. Next, we define our class and initilazation function. In that, we request for some variables, and startup the logger. This line:
Time for an explanation: First, we import a whole lot of stuff. This is just so we can interact with every aspect of the server & game world. Next, we define our class and initilazation function. In that, we request for some variables, and startup the logger. This line:
<source lang="java">
<pre>
private static final Logger logger = Log4J.getLogger(HelloWorldExtension.class);
private static final Logger logger = Log4J.getLogger(HelloWorldExtension.class);
</pre>
</source>
creates a logger and configures it for the current class.
MUST point to the right class, or it won't work, and you'll go nowhere when trying to send information to the logs! Now, this line is new (well, isn't all of this? :P)

<pre>
<source lang="java">
StendhalRPRuleProcessor.register("hello", this);
StendhalRPRuleProcessor.register("hello", this);
</pre>
</source>

This code tells the server "register the command '/hello' to the class 'this'" ('this' is a dynamic variable that points the class). Nice, huh? Now the user can type '/hello' into their textboxes without getting a not found error! Wheeee! Now, lets continue onto the onAction functio. In it, we check to see if the command is hello, and run the onHello function. (Why do we check it? Dunno, that's just how I learned it, and I haven't found a way to do it otherwise) In the onHello world function, we then send the player who ran the command a private message: Hello, world! Pretty boring, huh? Now, onto the main project!
This code tells the server "register the command '/hello' to this class" ('this' is a dynamic variable that points the class). Nice, huh? Now the user can type '/hello' into their textboxes without getting a not found error! Wheeee! Now, lets continue onto the onAction functio. In it, we check to see if the command is hello, and run the onHello function. In the onHello world function, we then send the player, who ran the command, a private message: Hello, world! Pretty boring, huh? Now, onto the main project!


==Date and Time==
==Date and Time==
Now, I'm not going to re-post the entire script, as it gets to be just under 100 lines of code, and I don't want a INCREDIBLY long page!
Now, I'm not going to re-post the entire script, as it gets to be just under 100 lines of code, and I don't want a INCREDIBLY long page!
First, we import a new class: <code>java.util.Calendar</code> With that, we can get the current date and time! Then, add these lines to your class method:
First, we import a new class: <code>java.util.Calendar</code> With that, we can get the current date and time! Then, add these lines to your class method:
<source lang="java">
<pre>
StendhalRPRuleProcessor.register("date", this);
StendhalRPRuleProcessor.register("date", this);
StendhalRPRuleProcessor.register("time", this);
StendhalRPRuleProcessor.register("time", this);
</pre>
</source>
These register the date and time commands. Now, we add the if to onAction:
These register the date and time commands. Now, we add the if to onAction:
<source lang="java">
<pre>
if (type.equals("date")) {
if (type.equals("date")) {
onDate(world, rules, player, action);
onDate(world, rules, player, action);
Line 92: Line 96:
onTime(world, rules, player, action);
onTime(world, rules, player, action);
}
}
</pre>
</source>
And add the two functions onDate and onTime:
And add the two functions onDate and onTime:
<source lang="java">
<pre>
private void onDate(RPWorld world, StendhalRPRuleProcessor rules,
private void onDate(RPWorld world, StendhalRPRuleProcessor rules,
Player player, RPAction action) {
Player player, RPAction action) {
Line 107: Line 111:
player.sendPrivateText("The current time is: " + calendar.getTime().toString());
player.sendPrivateText("The current time is: " + calendar.getTime().toString());
}
}
</pre>
</source>
That's it! Now, just recompile your server, and boom! Your 75% there! Now, one last thing; configuring the server to motice your new extension.
That's it! Now, just recompile your server, and boom! Your 75% there! Now, one last thing; configuring the server to load your new extension.

==Configuration ==
Now open the file server server.ini, and add these lines:


==Configuration of marauroa==
Now, again open up marauroa.ini, and add these lines:
<pre>
<pre>
date_time=games.stendhal.server.extension.DateAndTimeExtension
date_time=games.stendhal.server.extension.DateAndTimeExtension
server_extension=date_time
server_extension=date_time
</pre>
</pre>
Now, if you've been following the tut, don't just copy/paste the second line - add 'date_time' to the end of the list, with a comma before it. Also, if you've saved the file somewhere else other than where the Spouse extension is (which I don't recommend doing, it's in a folder called "extension") you're going to have to change the class path to point to that.


Now, if you've been following the tut, don't just copy/paste the second line - add 'date_time' to the end of the list, with a comma before it. Also, if you've saved the file somewhere else (which I don't recommend doing, it's in a folder called "extension") you're going to have to change the class path to point to that.
=Done=

==Done==
Done! Now you've completely added 2 extensions, one of which is pointless other than, "I did it! I did it!" Have your users be notified of the change; they may or may not like it!
Done! Now you've completely added 2 extensions, one of which is pointless other than, "I did it! I did it!" Have your users be notified of the change; they may or may not like it!