Stendhal任务编码一
开始之前
本文描述了如何编写任务代码。 您不需要了解很多关于Java的知识。 但是,您应该已经设置了IDE并能够编译并启动本地Stendhal服务器。
本教程假定新任务仅使用已在Stendhal中存在的NPC和项目。 要添加新的NPC,请参阅Stendhal NPC编码。
创建任务骨架
本教程基于任务“Beer for Hayunn”。 由于此任务已存在,您可能希望在本地删除java文件以跟随本教程。
Quest文件放入包games.stendhal.server.maps.quests中。 (如果您是Java新手:这是指文件夹stendhal/src/games/stendhal/server/maps/quests)。
请在上面那个文件夹中创建一个名为BeerForHayunn.java的新文件。 (注意:大写/小写拼写很重要,即使在Microsoft Windows上也是如此):
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;
}
}
不要担心,如果你不明白这一点; 只是复制它。 我们将在以下部分中解释重要部分并扩展此框架。
为了让Stendhal服务器获取此文件,必须在包games.stendhal.server.core.rp中的文件StendhalQuestSystem.java中注册,方法是在适当的位置添加两行:
import games.stendhal.server.maps.quests.BeerForHayunn;
// [...]
loadQuest(new BeerForHayunn());
当然,在本教程的情况下,BeerForHayunn的两行已经存在。
教NPC说话
好的,我们现在已经完成了准备工作。 我们的首要任务是让Hayunn回复“quest”这个词。
因此,我们在文件BeerForHayunn的末尾添加一个名为prepareQuestStep()的新方法,就在最后一个结束“}”之上。 这种方法让Hayunn回答“quest”这个词的答案是“My mouth is dry, but I can't be seen to abandon this teaching room!”
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!");
}
在我们测试它之前还有一小步:我们需要告诉服务器执行我们的新方法。 已经有一个名为“addToWorld”的方法将在服务器启动时执行。 所以我们在“addToWorld”中添加对方法的调用:
@Override
public void addToWorld() {
super.addToWorld();
prepareQuestStep();
}
好的,一切都完成了吗? 请启动服务器(取决于您是否使用IDE,您可能必须先编译或构建)。 在说“hi”开始对话之后,对Hayunn说“quest”。 他现在应该回答“My mouth is dry, but I can't be seen to abandon this teaching room!”。
常用的会话短语
好,Hayunn现在回复触发“quest”。 但是,他没有回复“task”。 所有其他NPC都接受这两个词作为同义词。 一个简单的解决方案是添加第二个npc.addReply行。 但是有一种更好的方法可以让以后更容易添加其他同义词。 我们预定了常用的会话短语列表。 如果已经为要添加的触发器定义了对话短语,则应使用这些短语。
让我们使用ConversationPhrases.QUEST_MESSAGES而不是硬编码的单词“quest”来调整上面的示例:
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!");
}
请编译并重新启动您的服务器。 在你开始说“hi”之后,Hayunn现在应该回应“quest”,“task”和“favor”。
蓝色触发词
你可能知道NPC可以说蓝色的单词(表示期望玩家重复这些单词),他们期望玩家重复这些单词。 我们想为“beer”和“tavern”添加这样的词。 正如我们之前所做的那样,我们将为这些单词添加npc.addReply行。
那么,我们如何得到蓝色的字? 很简单,在它们前面添加一个“#”。 如果你真的想要包含#-character,你需要重复它。
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");
}
你知道这个练习:编译,重启并试一试。
本教程的第二部分
恭喜你,如果你做到这一点。 您现在可以使用NPC编写基本对话。 本教程的下一部分将介绍高级技术。 在继续本教程的第二部分之前,请确保本教程的步骤有效。