TLDR:我将数据传递给mob的实例化。该实例化过程的一部分涉及为暴徒实例化AI。我想把传递给暴徒的数据传递给暴民的AI。这很难,因为强迫Super()调用等等。
故事: 我在游戏中创建自己的怪物版本。
我已经编写了自己的路径追踪器(实体用来导航世界的AI目标)。然后我带了一个现有的暴徒(在这种情况下是一头牛)并擦除了它的正常AI并用我自己的替换它: PathFinderGoalRpgMeleeAttack 。
我想创建我的牛的新实例(即 RpgCow rpgCow = new rpgCow(damage,knockback))。
问题在于,当我实例化一个新的暴徒(扩展另一个类时记得)时,我被迫调用super()。 super方法调用方法r()(我重写它以添加我自己的AI)。由于super()调用r(), damage 和 knockback 的值仍然是0.0和0.0(double的默认java值)因为损坏和回击没有有可能被设定。
有关如何解决这个问题并将我传入牛创建的数据插入到PathFinder创建中的任何想法?
我听说过抽象或反思可能是一件好事,但只是阅读这两个主题的文档,似乎都不会对我有所帮助。
编辑,因为我猜我不是那么清楚: 问题是当我将它们传递给路径查找器时,Damage和Knockback的值仍为0,这意味着稍后当我在我的路径查找器中执行this.getDamage时,无论我在创建损坏和击退时传递给暴徒的值是什么永远是0。代码:
public class RpgCow extends EntityCow
{
private double damage;
private double knockback;
public RpgCow(World world, double damage, double knockback)
{
super(world);
this.damage = damage;
this.knockback = knockback;
this.bukkitEntity = new CraftRpgCow(this.world.getServer(), this);
}
@Override
protected void r()
{
this.goalSelector.a(3,new PathFinderGoalRpgMeleeAttack(this,damage,knockback));
}
private static class CraftRpgCow extends CraftCow
{
private CraftRpgCow(CraftServer server, EntityCow parent)
{
super(server, parent);
}
}
}
答案 0 :(得分:1)
如果在超类中创建r()抽象的方法定义,那么r()的任何调用都将使用实例的实现,即使它是在超类的构造函数中调用它。
这可能是比在super()调用之后调用子类(RpgCow)的构造函数中的r()更好的解决方案,这取决于你的实现,应该覆盖在set中设置的`cow.goalselector'。你的超级()电话。
这将要求你让超级类是抽象的,但是当你用实体/怪物编写游戏时,拥有一个抽象基类是你可能想要的功能。
编辑:另一种方法是将你想要的AI传递给超类的构造函数并传递给r(),如果它是null,则执行基类的功能,否则分配新的AI 。接口可以是多态化AI对象的便捷方式。