我想生成一个自定义马及其自定义骑手暴徒,然后自定义它们。但是,只要您拨打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);
}
}
答案 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
}
}