java - 使用 Java Nashorn 加载 'quests'

标签 java nashorn

在我发现 Nashorn 之前,我已经在自己的脚本引擎上工作了一段时间。快速分析让我相信这就是我想要的,但也给我留下了一些设计问题。

我正在尝试开发自定义任务加载器,它允许我从文件加载自定义任务,然后将它们分配给玩家。

我的问题主要在于设计,因为我不知道基于脚本的代码在内部如何工作(性能)。目前我有一组不同的类(在 Java 中),例如:(注意“...”表示“一些参数”)。

  • Quest - 任务内容的描述,具有“onStart(...)”、“onFinish(...)”等方法。保存此任务需要完成的所有任务的列表,其中一些任务在“onStart”中分配给玩家(意味着它们是起点)。请注意,Quest 是一个 BASE 类,仅创建一次并存储在任务注册表中,然后当分配给玩家时,玩家将获得自己的指向 Quest 的 QuestHolder。
  • 任务 - 任务中某些步骤的描述,可以是 IListener,也可以不是 - 在这种情况下,只有当来自外部的东西命令完成时,它才会“complete()”。任务还可以从上述任务的所有任务列表中分配下一个任务。
  • IListener - 许多(数十个)扩展接口(interface)的基础,例如“IListenerKill”、“IListenerTravel”或“IListenerPlace”(相当 self 解释)。监听器与他们被分配到的实体(例如玩家) Hook ,并将根据操作调用适当的方法。如果任务实现一些 IListener,它可以监听实体的操作并知道它何时完成。
  • QuestHolder - Quest 的数据保存对象。
  • 还有一些其他内容,但以上是最重要的。

现在,我需要 Nashorn 能够从多个文件 (/questDir/QuestName.js) 加载多个任务并为它们创建“new Quest()”。

例如(伪脚本):“/questDir/MerryChristmas.js”

Quest q = new Quest("MerryChristmas");
Task t = new TaskKill("Kill elfs and snowmans terrorizing city!");
t.addTarget(Target.SNOWMAN, 5); // Task will listen to those kills.
t.addTarget(Target.Elf, 2);
t.setRequirements(new RequirementLevel(10)); // Every task can have requirements needed to even begin it, if some other task will try to apply task of which player is not fulfilling requirements, it won't be assigned until condition is met (tracked internally with events).
t.addNext("Come Back for present!"); // Upon completing, will assign task with this name, if one is found in Quest's all task list.
q.addTask(t);
q.addStartingTask(t);
t = new TaskTalk(Type.NPC, "Come back for present!");
t.setTarget("Santa Claus"); // some npc's name.
q.addTask(t);

再说一遍 - 这完全是伪脚本,但我需要能够将此类脚本加载“解析”到 Java 对象(任务)中。

我想学习的下一件事:上面的方法利用了已经存在的东西,所有对象(任务和监听器)都是预先准备好的,并由游戏本身处理。我想更进一步,在脚本中创建自定义对象。

说 - 我还想在 TaskKill 中添加一个 if 语句,只有当雪人被 torch 杀死时,才会“计数杀死”雪人(例如:“烧掉那些雪人!”)。当然,我可以扩展每个 Task 和 IListener 类来检查其他内容(类似于之前伪示例中的“.addRequirement(...)”),但这永远不会“覆盖任何情况”。问题是:如何从脚本中扩展 Java 类的类和方法?

最后:脚本加载到服务器上。游戏是MP。对于 Java 端包含的所有内容(例如:TaskKill),客户端能够复制服务器上加载的任何任务,但是(如果从上一个问题来看,可以使用脚本创建子类)那么客户端无法涵盖所有​​情况。 是否像通过网络发送脚本字符串并在客户端上评估脚本以使其正常工作一样简单?

感谢您提供任何链接、代码、来源、解释!

最佳答案

关于java - 使用 Java Nashorn 加载 'quests',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34211687/

相关文章:

java - 使用 Eclipse 在 Tomcat 服务器外部的展开目录中部署 Java Web 应用程序

java - 使用java嵌套#if宏处理

java - 优化if条件

java - Java找不到符号错误

java - 通过 Java 使用 Selenium 显示计数为 1 的 WebElements 列表

javascript - 寻找与 Nashorn 的 jjs 解释器一起使用的 javascript 单元测试套件

javascript - 当使用绑定(bind)进行 eval 时,Nashorn 找不到函数

javascript - Nashorn/jjs 安全 : executing a user's script on server side

javascript - Nashorn 解析 TypeScript

java - 对与 HashMap 连接的模型的 ArrayList 进行排序