我有一个在事件上触发的可运行文件。我试图从事件中获取列表并清除它,但将列表放在事件期间创建的实体的元数据存储中。到目前为止,我已经尝试过:
注意:这个类实现了一个事件监听器。
@EventHandler
public synchronized void playerDeathEvent(final EntityDeathEvent event) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() {
public void run() {
Entity p = event.getEntity();
// Spawn the Firework, get the FireworkMeta.
Firework fw = (Firework) p.getWorld().spawnEntity(p.getLocation(), EntityType.FIREWORK);
FireworkMeta fwm = fw.getFireworkMeta();
// Our random generator
Random r = new Random();
// Get the type
int rt = r.nextInt(4) + 1;
Type type = Type.BALL;
if (rt == 1) type = Type.BALL;
if (rt == 2) type = Type.BALL_LARGE;
if (rt == 3) type = Type.BURST;
if (rt == 4) type = Type.CREEPER;
if (rt == 5) type = Type.STAR;
//Get our random colors
int r1i = r.nextInt(15) + 1;
int r2i = r.nextInt(15) + 1;
Color c1 = getColor(r1i);
Color c2 = getColor(r2i);
// Create our effect with this
FireworkEffect effect = FireworkEffect.builder().flicker(r.nextBoolean()).withColor(c1).withFade(c2).with(type).trail(r.nextBoolean()).build();
// Then apply the effect to the meta
fwm.addEffect(effect);
// Generate some random power and set it
int rp = r.nextInt(2) + 1;
fwm.setPower(rp);
// Then apply this to our rocket
fw.setFireworkMeta(fwm);
// Clear drops and set the drops to be released on explosion
//TODO: fix problem where list is cleared before put into Metadata
List<ItemStack> list = new ArrayList<ItemStack>();
for (ItemStack stack : event.getDrops())
list.add(stack);
fw.setMetadata("dropItems", new FixedMetadataValue(GLDPlugin, list));
event.getDrops().clear();
forceDelete(event);
}
});
}
public void forceDelete(EntityDeathEvent event) {
for (int i = 0; i < event.getDrops().size(); i++)
event.getDrops().remove(i);
}
和(仅最后一节):
@EventHandler
public synchronized void onEntityDeath(EntityDeathEvent evt)
final EntityDeathEvent event = evt;
//No code in this section was changed from the code above.
//TODO: fix problem where list is cleared before put into Metadata
List<ItemStack> list = new ArrayList<ItemStack>();
for (ItemStack stack : event.getDrops())
list.add(stack);
fw.setMetadata("dropItems", new FixedMetadataValue(GLDPlugin, list));
}
});
evt = event;
evt.getDrops().clear();
forceDelete(evt);
}
在顶部,它不会清除事件。getDrops()并将把列表放入实体的元数据中,复制事件。getDrops()。在下面的示例中,它将清除事件。getDrops(),但不会将列表放入实体的元数据中,从而擦除事件。getDrops()。这两种输出都是不可接受的,因为这会导致生成任何项或双项。有什么想法吗?
编辑:对于那些更精通bukkit的人来说,更好的解释是:
我正在努力使玩家不会在死亡时掉落物品,但它们仍然会从他们的库存中移除。我也需要它,所以<代码>列表
您的电话:
Firework.setMetadata(String, MetadataValue);
它本质上是元数据。setMetadata()方法。以下是此方法的文档:
/**
* Sets a metadata value in the implementing object's metadata store.
*
* @param metadataKey A unique key to identify this metadata.
* @param newMetadataValue The metadata value to apply.
* @throws IllegalArgumentException If value is null, or the owning plugin
* is null
*/
public void setMetadata(String metadataKey, MetadataValue newMetadataValue);
因此,无法保证在设置项的“dropItems”元数据后,会发生任何事情。您必须实现一个侦听器来检查烟花何时被销毁,如果烟花包含此元数据,则删除这些项。MetadataValue不是NBT值。
要修改NBT值,您必须通过反射直接从CraftBukkit检索,如下所示:
Firework fw = (Firework) p.getWorld().spawnEntity(p.getLocation(), EntityType.FIREWORK);
java.lang.reflect.Field _entity_ = CraftEntity.class.getField("entity");
_entity_.setAccessible(true);
net.minecraft.server.Entity entity = _entity_.get(fw);
// et cetera
简而言之:不要。编写一个自定义事件处理程序,在焰火爆发时检查元数据值,并相应地采取行动。
12.5. 通过reflect.Value修改值 到目前为止,反射还只是程序中变量的另一种读取方式。然而,在本节中我们将重点讨论如何通过反射机制来修改变量。 回想一下,Go语言中类似x、x.f[1]和*p形式的表达式都可以表示变量,但是其它如x + 1和f(2)则不是变量。一个变量就是一个可寻址的内存空间,里面存储了一个值,并且存储的值可以通过内存地址来更新。 对于reflect.Values也有
该怎么修改代码 验证通过
问题内容: 我正在尝试做这样的事情 item.innerHTML包含需要去那里的html,但是由于它是dom的一部分,因此将其替换为字符串。有没有一种方法可以替换掉innerHTML? 谢谢! 问题答案: 您需要使用ngBindHtml: http://plnkr.co/edit/n1rLzgEZQoa2tJf0qnVZ?p=preview 在控制器中: html: 您将需要以下模块: http:
这是在服务器端作为接收的内容: 如何转换multipart Confont数据类型中的文章对象?我读到改造可能允许使用转换器为这个。就我对文档的理解而言,它应该是实现的东西。 多部分部件使用的转换器,或者它们可以实现来处理自己的序列化。 null
问题内容: 我有一个称为render_something的方法,该方法可以创建很多空白,例如: 结果可能是: 我实际上希望它是这样的: 速度有这样的东西吗? 问题答案: 我刚刚读了这篇关于Velocity Whitespace Gobbling的 文章,其中提出了一些变通方法,包括Line Line截断了Velocity Whitespace 。 这基本上建议通过在每行末尾添加注释来注释掉换行符。
问题内容: 该代码不起作用 问题答案: JavaScript区分大小写。 因此,如果要更改字体大小,则必须执行以下操作: