Java +脚本 - 对象更改?

时间:2015-04-09 00:34:40

标签: java

我不知道Object alteration这个词在这里是否正确,或者它是否与被问到的问题有关,所以如果不是,我会在建议中道歉,如果有人想要更改标题,我会道歉随意

基本上我正在开发一个小型多人游戏项目,我希望能够为玩家启用脚本,以便在不触及原始服务器源代码的情况下创建对其服务器的修改。我不确定我正在计划使用的脚本语言,但首先我需要弄清楚这是否可行。

让我们说为了示范,我们使用的是平面文件存储,为我们的玩家保存原始文本格式,我们的播放器类看起来像这样:

public final class Player extends AliveEntity {
    private String    name;
    private int       currency;

    public Player(String name, int currency) {
      this.name = name; 
      this.currency = currency;
    }

    // Getters & Setters here...
}

现在假设我们的文件保存系统将所有变量保存在Player类中,因此例如我们的保存文件可能如下所示:

**JohnDoe.txt**
    name = "JohnDoe"
    currency = 0

让我们说我希望人们能够通过脚本对Player类进行更改,作为modding api的一部分,这将允许他们向类中添加另一个变量。例如(Psuedo Script Example)

**Mod.script**
    Script Start:
        Player.add(Integer, Score)
    :Script End

为了举例说明,我们希望在执行脚本之后,我们希望这允许我们的播放器类现在更像这样。

public final class Player extends AliveEntity {
    private String    name;
    private int       currency;
    private int       score;

    public Player(String name, int currency) {
      this.name = name; 
      this.currency = currency;
    }

    // Getters & Setters here...
}

该分数现在将成为玩家类的一部分并保存在玩家档案中。

也许这种实现方式不符合逻辑,或者是不可能的,但我想知道它是否可能以及正确的方法是什么。正如您所看到的,我只需要将变量添加到可供其他脚本使用的播放器类中,并将与播放器一起保存/加载。

2 个答案:

答案 0 :(得分:2)

你可以做的是在你的玩家类中拥有一张地图。如果您希望拥有多种类型,则此地图不会描述任何类型。

HashMap<Object, Object> properties = new HashMap<>();

但是,如果您要使用脚本语言,我相信打字可能很困难,所以您还可以坚持使用Strings。

我建议LUA非常成熟并且具有良好的Java绑定。

否则,您可以使用名为属性

的对象进行调用
public class Properties{
    String type;
    String value
}

然后,您可以使用此对象的type属性来确定将其传输到脚本时应该使用的类型。

答案 1 :(得分:1)

首先,你必须先实现某种解释器(了解你的txt并将其转换为java代码),它应遵循一些语法语法。

然后您可以使用像BeanShell这样的库来在运行时编译您的新代码。有了它,您甚至可以允许您的播放器直接从Java代码实现,而不是要解释的文本。

我建议您创建默认界面并强制玩家实施它,这样您的游戏就可以控制玩家创建的任何内容。

我想我不需要在这里显示任何代码就足够了。看一下我用来说它可以做黑色的BeanShell库#@ $%voodoomagic¨。