使用Java Nashorn加载“任务”

时间:2015-12-10 21:03:47

标签: java nashorn

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

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

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

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

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

例如(伪脚本):“/ requestDir/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),客户端能够复制在服务器上加载的任何任务,但是(如果从之前的问题 - 使用脚本生成子类可能),则客户端无法覆盖所有情况。 它会像通过网络发送脚本sctring并在客户端评估脚本以使其工作一样简单吗?

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

1 个答案:

答案 0 :(得分:2)