编辑“︁
Stendhal Quest Coding
”︁
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Navigation for Stendhal Top|Contributing}} {{Navigation for Stendhal Contributors}} {{ TODO | Update page for changes in quest coding }} {{Stendhal Quests}} __TOC__ If you have ideas for new quests or are interested in helping to refine quest ideas, please have a look at the [[Stendhal Quest Contribution|Quest Contributor's Guide]] or the [[Stendhal Quest Ideas]]. == Before you start == This page describes how to code a quest. You don't need to know a lot about Java. You should, however, already have [[Configure a development environment (IDE)|setup an IDE]] and be able to compile and start a local Stendhal server. This tutorial assumes that the new quest only uses NPCs and items that already exist in Stendhal. To add a new NPC, see [[Stendhal NPC Coding]]. == Creating a quest skeleton == This tutorial is based on the quest "Beer For Hayunn". As this quest already exists, you may want to delete the java file locally in order to follow this tutorial. Quest files are put into the package games.stendhal.server.maps.quests. (If you are new to Java: this refers to the folder stendhal/src/games/stendhal/server/maps/quests). Please create a new file in that folder called BeerForHayunn.java. (Note: The upper / lower case spelling is important, even on Microsoft Windows): <source lang="java"> package games.stendhal.server.maps.quests; import games.stendhal.server.entity.npc.*; import games.stendhal.server.entity.npc.action.*; import games.stendhal.server.entity.npc.condition.*; import games.stendhal.server.entity.player.*; import java.util.*; public class BeerForHayunn extends AbstractQuest { public static final String QUEST_SLOT = "beer_hayunn"; @Override public void addToWorld() { super.addToWorld(); } @Override public String getSlotName() { return QUEST_SLOT; } @Override public String getName() { return "BeerForHayunn"; } public List<String> getHistory(final Player player) { final List<String> res = new ArrayList<String>(); return res; } } </source> Don't worry, if you don't understand a word of this; just copy it. We will explain the important parts and extend this skeleton in the following sections. In order for the Stendhal server to pick up this file, it has to be registered in the file StendhalQuestSystem.java in the package games.stendhal.server.core.rp by adding two lines at the appropriate places: <source lang="java"> import games.stendhal.server.maps.quests.BeerForHayunn; // [...] loadQuest(new BeerForHayunn()); </source> Of course in the case of this tutorial the two lines for BeerForHayunn are already there. == Teaching the NPC to talk == Okay, we have now completed the preparation. Our first task is to get Hayunn to reply to the word "quest". Therefore we add a new method called prepareQuestStep() at the end of the file BeerForHayunn, just above the last closing "}". This method makes Hayunn reply to the word "quest" with the answer "My mouth is dry, but I can't be seen to abandon this teaching room!" <source lang="java"> public void prepareQuestStep() { // get a reference to the Hayunn npc SpeakerNPC npc = npcs.get("Hayunn Naratha"); // add a reply on the trigger phrase "quest" to Hayunn npc.addReply("quest", "My mouth is dry, but I can't be seen to abandon this teaching room!"); } </source> There is one little step left before we can test it: We need to tell the server to execute our new method. There is already a method called "addToWorld" which will be executed on server start. So we add a call to our method in "addToWorld": <source lang="java"> @Override public void addToWorld() { super.addToWorld(); prepareQuestStep(); } </source> Okay, all done? Please start the server (depending on whether you are using an IDE or not you might have to compile or build first). Go to Hayunn and say "quest", after starting the conversation with "hi". He should now respond with the sentence "My mouth is dry, but I can't be seen to abandon this teaching room!". == Commonly used conversation phrases == Good, Hayunn now replies to the trigger "quest". He does not, however, reply to "task". All other NPCs accept both words as synonym. A simple solution would be to add a second ''npc.addReply'' line. But there is a better way which makes it very easy to add additional synonyms later. We predefined lists of commonly used [http://arianne.cvs.sf.net/viewvc/arianne/stendhal/src/games/stendhal/server/entity/npc/ConversationPhrases.java?view=markup ConversationPhrases]. If there are already conversation phrases defined for the triggers that you would like to add, you should use the phrases. Let's adjust the above sample by using ''ConversationPhrases.QUEST_MESSAGES'' instead of the hard coded word "quest": <source lang="java"> public void prepareQuestStep() { // get a reference to the Hayunn npc SpeakerNPC npc = npcs.get("Hayunn Naratha"); // add a reply on quest related trigger phrases to Hayunn npc.addReply(ConversationPhrases.QUEST_MESSAGES, "My mouth is dry, but I can't be seen to abandon this teaching room!"); } </source> Please compile and restart your server. Hayunn should now respond to "quest", "task", and "favor", after you started the talk by saying "hi". == Blue trigger words == As you probably know NPCs can say words in blue, words that they expect to be repeated by the player. We want to add such words for "beer" and "tavern". As we have done before, we will add npc.addReply lines for those words. So, how do we get the words colored blue? Simple, add a "#" in front of them. If you actually want to include a #-character, you need to repeat it. <source lang="java"> public void prepareQuestStep() { // get a reference to the Hayunn npc SpeakerNPC npc = npcs.get("Hayunn Naratha"); // ask for a beer and explain it npc.addReply(ConversationPhrases.QUEST_MESSAGES, "Please bring me a #beer."); // explain blue words npc.addReply("beer", "Margaret sells beers in the #tavern."); npc.addReply("tavern", "If you don't know where the inn is, you could ask old Monogenes."); // an example for escaping # npc.addReply("trading", "http://stendhal.game-host.org/wiki/index.php/StendhalFAQ##Trading"); } </source> You know the drill: Compile, restart and try it out. == Second Part of this Tutorial == Congratulations if you made it this far. You are now able to code basic dialogs with NPCs. The next section of this tutorial will describe advanced techniques. Please make sure the steps on this page work before you continue to [[Stendhal Quest Coding - Part 2|the second part of this tutorial]]. [[Category:Stendhal]]
摘要:
请注意,所有对gamedev的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Gamedev:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
Template:Br
(
编辑
)
Template:Navigation for Stendhal Contributors
(
编辑
)
Template:Navigation for Stendhal Top
(
编辑
)
Template:Stendhal Quests
(
编辑
)
Template:Stendhal menu for Builders and Hosters
(
编辑
)
Template:Stendhal menu for Contributors
(
编辑
)
Template:Stendhal menu for Developers
(
编辑
)
Template:Stendhal menu for Extenders
(
编辑
)
Template:Stendhal menu for GMs
(
编辑
)
Template:Stendhal menu for Players
(
编辑
)
Template:Stendhal menu for World
(
编辑
)
Template:TODO
(
编辑
)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息