目录

我的学习分享

记录精彩的程序人生

X

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编写基本对话。 本教程的下一部分将介绍高级技术。 在继续本教程的第二部分之前,请确保本教程的步骤有效。