用自定义骑手生成自定义马

时间:2015-02-01 16:31:23

标签: java bukkit

我想生成一个自定义马及其自定义骑手暴徒,然后自定义它们。但是,只要您拨打spawn(loc, Horse.class),就无法在其生成之前致电getEntity()。 你也不能从像spawn(loc, custommob);这样的变量或任何预定制的实体中产生一个暴徒。并且您无法实例化new Horse();

所以马需要在没有任何自定义的情况下产生,没有骑手,然后才能进行修改。但是这会触发EntitySpawnEvent,因为'默认匹配'我的世界不允许产卵。而且我没有定制,以后可以识别它,所以要通过取消。

我和它的骑手有同样的问题,在它产生之前无论如何我都无法自定义它,因此我无法将其识别为骑手。 如果我产生了生成黑名单上的任何东西,它将被取消,如果我在白名单上产生任何东西,它将只会产生并且无法识别。我不希望任何随机的暴徒突然成为骑手。

我如何能够产生这两个怪物,定制它们,让它们在尊重黑名单的同时找到彼此并相互乘客?

@EventHandler
public void onMobSpawn(CreatureSpawnEvent event) {
    String world = event.getEntity().getWorld().getName();
    if (world.equals("Someworld") || world.equals("Someotherworld")) {
        if (event.getEntityType().equals(EntityType.SKELETON)) { // Whitelisted
            // Continue whitelist actions
        }
    } else {
        /* I could add here to spawn the horse, and add an exception to the filter.
         * But how do I customize it?
         * I can't customize it before it spawned and I can't get it after it spawned.
         * Same for the rider.
         */
        // loc.getWorld().spawn(loc, Horse.class);
        event.setCancelled(true);
    }
}

2 个答案:

答案 0 :(得分:1)

实际上有可能在它产生之后得到马。调用world.spawnEntity(Location, EntityType)时,它会返回生成的实体。

所以,为了获得一匹马,你可以使用:

Entity entity = location.getWorld().spawnEntity(location, EntityType.HORSE);
Horse horse = (Horse) entity

拥有马后,您可以按照自己喜欢的方式进行自定义,例如:

horse.setCustomName("My Custom Horse");

或者

horse.setPassenger(horseRider);

您也可以为您喜欢的任何其他实体执行此操作。所以,这就是你的代码的样子:

Horse horse = (Horse) location.getWorld().spawnEntity(location, EntityType.HORSE);
Skeleton rider = (Skeleton) location.getWorld().spawnEntity(location, EntityType.SKELETON);
//customize the rider and horse in any way you want

horse.setPassenger(rider);

如果您要在CreatureSpawnEvent或其他类似的spawn事件中调用此代码,请确保:

!event.getSpawnReason().equals(SpawnReason.CUSTOM)

再次产生实体之前,要避免无限循环

虽然产卵和定制实体之间几乎没有延迟,但如果需要,你可以在一个单独的位置(如产卵世界或其他东西)产生它们,然后在设置乘客之前将它们传送到正确的位置:

horse.teleport(realLocation);
skeleton.teleport(realLocation);

horse.setPassenger(skeleton);

但是,除非您是异步进行自定义,否则这不应该是必要的,这不应该首先设置实体的信息。

答案 1 :(得分:1)

CreatureSpawnEvent.getSpawnReason()是解决您问题的好方法。 请看SpawnReason.CUSTOM

  

当一个生物被插件生成时

@EventHandler
public void onNormal(CreatureSpawnEvent event) {
    // This will prevent an infinite loop
    if (event.getSpawnReason() != SpawnReason.CUSTOM) {
        event.setCancelled(true);
        // Spawn what you want
    }
}