装载';任务';使用Java Nashorn
我在自己的脚本引擎上工作了一段时间,直到我发现了纳肖恩。Quick analysys让我相信这正是我想要的,但也给我留下了一些设计问题 我正在尝试开发自定义任务加载器,它允许我从文件中加载自定义任务,然后将这些任务分配给玩家 我的问题主要在于设计,因为我不知道基于脚本的代码在内部是如何工作的(性能)。目前我有一组不同的类(在Java中),例如:(注意“…”表示“一些参数”)装载';任务';使用Java Nashorn,java,nashorn,Java,Nashorn,我在自己的脚本引擎上工作了一段时间,直到我发现了纳肖恩。Quick analysys让我相信这正是我想要的,但也给我留下了一些设计问题 我正在尝试开发自定义任务加载器,它允许我从文件中加载自定义任务,然后将这些任务分配给玩家 我的问题主要在于设计,因为我不知道基于脚本的代码在内部是如何工作的(性能)。目前我有一组不同的类(在Java中),例如:(注意“…”表示“一些参数”) 任务-描述任务的内容,有“onStart(…)”、“onFinish(…)”等方法。保存此任务需要完成的所有任务的列表,
- 任务-描述任务的内容,有“onStart(…)”、“onFinish(…)”等方法。保存此任务需要完成的所有任务的列表,其中一些任务在“onStart”中分配给玩家(意味着它们是起点)。请注意,任务是一个基类,只创建一次并存储在任务注册表中,然后当分配给玩家时,玩家将获得指向任务的自己的任务持有者
- 任务-任务中某个步骤的描述,可以是IListener,也可以不是IListener-在这种情况下,它将“complete()”,只有当来自外部的东西将命令完成时。任务也可以从任务列表中分配下一个任务
- IListener—许多(几十个)扩展接口的基础,如“IListenerKill”、“IListenerTravel”或“IListenerPlace”(完全自我解释)。监听器连接到分配给它们的实体(例如播放器),并在操作时调用适当的方法。若任务实现了一些IListener,那个么它可以监听实体的动作并知道何时完成
- 任务持有者-任务的数据持有对象
- 其他一些东西,但以上是最重要的
感谢所有链接、代码、来源和解释 实际上,您可以在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);