装载';任务';使用Java Nashorn

装载';任务';使用Java Nashorn,java,nashorn,Java,Nashorn,我在自己的脚本引擎上工作了一段时间,直到我发现了纳肖恩。Quick analysys让我相信这正是我想要的,但也给我留下了一些设计问题 我正在尝试开发自定义任务加载器,它允许我从文件中加载自定义任务,然后将这些任务分配给玩家 我的问题主要在于设计,因为我不知道基于脚本的代码在内部是如何工作的(性能)。目前我有一组不同的类(在Java中),例如:(注意“…”表示“一些参数”) 任务-描述任务的内容,有“onStart(…)”、“onFinish(…)”等方法。保存此任务需要完成的所有任务的列表,

我在自己的脚本引擎上工作了一段时间,直到我发现了纳肖恩。Quick analysys让我相信这正是我想要的,但也给我留下了一些设计问题

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

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

  • 任务-描述任务的内容,有“onStart(…)”、“onFinish(…)”等方法。保存此任务需要完成的所有任务的列表,其中一些任务在“onStart”中分配给玩家(意味着它们是起点)。请注意,任务是一个基类,只创建一次并存储在任务注册表中,然后当分配给玩家时,玩家将获得指向任务的自己的任务持有者
  • 任务-任务中某个步骤的描述,可以是IListener,也可以不是IListener-在这种情况下,它将“complete()”,只有当来自外部的东西将命令完成时。任务也可以从任务列表中分配下一个任务
  • IListener—许多(几十个)扩展接口的基础,如“IListenerKill”、“IListenerTravel”或“IListenerPlace”(完全自我解释)。监听器连接到分配给它们的实体(例如播放器),并在操作时调用适当的方法。若任务实现了一些IListener,那个么它可以监听实体的动作并知道何时完成
  • 任务持有者-任务的数据持有对象
  • 其他一些东西,但以上是最重要的
现在,我需要Nashorn能够从多个文件(/questDir/QuestName.js)加载多个任务,并为它们创建“new Quest()”

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

同样,这完全是伪脚本,但我需要能够将这些脚本“解析”到Java对象(任务)中

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

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

最后:在服务器上加载脚本。游戏是MP。对于Java端包含的所有内容(例如:TaskKill),客户机能够复制服务器上加载的任何任务,但(如果可以从前面的带有脚本的提问子类中进行复制),则客户机无法覆盖所有情况。 它会像通过网络发送脚本字符串并在客户端上评估脚本以使其正常工作那样简单吗


感谢所有链接、代码、来源和解释

实际上,您可以在Nashorn脚本中扩展Java类。请参阅,您也可以调用超类方法

@markspace我真的没有看到我自己(或任何人)从dev.env那里编译成吨的任务。不是每个管理员(引擎/游戏的用户)都能用Java编写代码,而脚本语言虽然仍然需要一些知识,但经过一些简短的教程或简单的模板后仍然可以编写代码。另外,您可以非常远程地执行此操作(它是基于文本的:P)。好吧,所以我不能扩展类,让Java对象的方法如:TaskKill#shouldCount(Player-Player,Target-Target)如何,它将在脚本中调用一个返回布尔值的方法。这种方法可以做一些检查,不是吗?注意:我对脚本的整体了解很少,所以我的问题可能很糟糕。
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);