当前位置: 首页 > 知识库问答 >
问题:

如何通过Runnable修改事件

印劲
2023-03-14

我有一个在事件上触发的可运行文件。我试图从事件中获取列表并清除它,但将列表放在事件期间创建的实体的元数据存储中。到目前为止,我已经尝试过:

注意:这个类实现了一个事件监听器。

@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的人来说,更好的解释是:

我正在努力使玩家不会在死亡时掉落物品,但它们仍然会从他们的库存中移除。我也需要它,所以<代码>列表

共有1个答案

蒋默
2023-03-14

您的电话:

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区分大小写。 因此,如果要更改字体大小,则必须执行以下操作: