【问题标题】:Loading 'quests' with Java Nashorn使用 Java Nashorn 加载“任务”
【发布时间】:2015-12-10 21:03:46
【问题描述】:

在我发现 Nashorn 之前,我一直在研究自己的脚本引擎。快速分析让我相信这是我想要的,但也给我留下了一些设计问题。

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

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

  • 任务 - 描述任务的内容,有诸如“onStart(...)”、“onFinish(...)”之类的方法。包含此任务需要完成的所有任务的列表,其中一些任务在“onStart”中分配给玩家(意味着它们是起点)。请注意,Quest 是一个 BASE 类,只创建一次并存储在 quest 注册表中,然后当分配给玩家时,玩家会获得指向 Quest 的自己的 QuestHolder。
  • 任务 - 任务中某个步骤的描述,可以是 IListener 也可以不是 - 在这种情况下,只有当外部的某些东西命令完成时,它才会“完成()”。任务还可以从提到的任务的所有任务列表中分配下一个任务。
  • IListener - 许多(数十个)扩展接口的基础,如“IListenerKill”、“IListenerTravel”或“IListenerPlace”(非常自我解释)。侦听器与分配给它们的实体(例如玩家)挂钩,并将在操作时调用适当的方法。如果任务实现了一些 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 语句,它会“计算杀死”雪人,只有当他被火炬杀死时(例如,像这样的任务:“烧掉那些雪人!”)。当然,我可以去扩展我的每个 Task 和 IListener 类来检查额外的东西(类似于之前伪示例中的“.addRequirement(...)”),但这永远不会是“覆盖任何情况”。问题是:如何从脚本中扩展Java类的类和方法?

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

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

【问题讨论】:

  • @markspace 我并没有真正看到自己(或与此相关的任何人)从开发人员那里编译大量任务。环境。不是每个管理员(引擎/游戏的用户)甚至都可以用 Java 和脚本语言编写代码,虽然仍然需要一些知识,但在一些简短的教程或简单的模板之后仍然可以编写代码。此外,您可以非常远程地进行操作(它是基于文本的:P)。
  • 好的,所以我不能扩展类,让 Java 对象的方法怎么样:TaskKill#shouldCount(Player player, Target target),它会在脚本中调用一个返回布尔值的方法。这种方法可以进行一些检查,不是吗?注意:我对整个脚本编写知之甚少,所以我的问题可能很糟糕。

标签: java nashorn


【解决方案1】:
猜你喜欢
  • 1970-01-01
  • 2014-06-02
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2019-07-30
  • 1970-01-01
相关资源
最近更新 更多