我一直在研究自己的脚本引擎一段时间,直到我发现了Nashorn。快速分析让我相信这是我想要的,但也给我留下了一些设计问题。
我正在尝试开发自定义任务加载器,允许我从文件加载自定义任务,然后将其分配给玩家。
我的问题主要是设计,因为我不知道基于脚本的代码如何在内部工作(性能)。目前我有一组不同的类(在Java中),例如:(注意“......”表示“一些args”)。
现在,我从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并在客户端评估脚本以使其工作一样简单吗?
感谢您提供任何链接,代码,来源和解释!
答案 0 :(得分:2)