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

Minecraft从自定义药水效果中添加新药水效果

宣弘新
2023-03-14

当前正在尝试创建一个药水效果,一旦时间用完,将其他药水效果应用到玩家身上。看起来很简单,但我发现了一些错误和bug,

直接尝试添加效果

    @Override
    public void performEffect(EntityLivingBase entity, int amplifier){
        if (entity instanceof EntityPlayer)
        {
            EntityPlayer player = (EntityPlayer)entity;
            if(player != null){
                if(player.getActivePotionEffect(PotionRegistry.effectBuzz) != null){
                int duraction = player.getActivePotionEffect(PotionRegistry.effectBuzz).getDuration();
                    if(duration <= 2){
                        player.addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 1200));
                    }
                }
            }
        }
    }

不用说,这会产生这个错误

[16:10:04][服务器线程/错误]:遇到意外异常Net.Minecraft.util.ReportedException:在Net.Minecraft.Network.NetworkSystem.NetworkTick(NetworkSystem.java:212)~[NetworkSystem.Class:?]在Net.Minecraft.Server.MinecraftServer.UpdateTimeLightAndEntities(MinecraftServer.java:807)~[MinecraftServer.Class:?]在Net.Minecraft.Server.MinecraftServer.Tick(MinecraftServer.java:688)~[MinecraftServer.Class:?]在Net.Minecraft.Server.Integrated.IntegratedServer.Tick(IntegratedServer.java:156)~[IntegratedServer.Class:?]在Net.Minecraft.Server.MinecraftServer.Run(MinecraftServer.java:537)[MinecraftServer.Class:?]在java.lang.Thread.Run(未知源)[?:1.8.0_161]由:java.util.HashMap$Hashiterator.NextNode(未知源)导致的:java.util.HashMap$Keyiterator.Next(未知源)~[?:1.8.0_161]在net.minecraft.Entity.EntityLivingBase.UpdatePotionEffects(EntityLivingBase.java:650)~[EntityLivingBase.Class:?]在Net.Minecraft.Entity.EntityLivingBase.OnEntityUpdate(EntityLivingBase.java:383)~[EntityLivingBase.Class:?]在Net.Minecraft.Entity.Entity.OnUpdate(Entity.java:436)~[Entity.Class:?]在Net.Minecraft.Entity.EntityLivingBase.OnUpdate(EntityLivingBase.java:2144)~[EntityLivingBase.Class:?]在Net.Minecraft.Entity.Player.EntityPlayer.OnUpdate(EntityPlayer.java:260)~[EntityPlayer.Class:?]在Net.Minecraft.Entity.Player.EntityPlayerMP.OnUpdateEntity(EntityPlayerMP.java:345)~[EntityPlayerMP.Class:?]在Net.Minecraft.Network.NetHandlerPlayServer.Update(NetHandlerPlayServer.java:174)~[NetHandlerPlayServer.Class:?]在net.minecraftforge.fml.common.network.handshake.networkdispatcher$1.update(networkdispatcher.java:216)~[networkdispatcher$1.class:?]在Net.Minecraft.Network.NetworkManager.ProcessReceivedPackets(NetworkManager.java:309)~[NetworkManager.Class:?]在net.minecraft.network.networksystem.networktick(networksystem.java:197)~[networksystem.class:?]...又有5个

好像我在一个tick事件中运行这个

在CommonProxy中

MinecraftForge.EVENT_BUS.register(new EventManager());

然后对EventManager本身

public class EventManager {

public static PotionEffect potion = new PotionEffect(MobEffects.WEAKNESS, 1200);
public static PotionEffect potion2 = new PotionEffect(MobEffects.HUNGER, 600);
public static PotionEffect potion3 = new PotionEffect(MobEffects.UNLUCK, 1200);

@SubscribeEvent
public void onTick(WorldTickEvent event){
    EntityPlayer player = Minecraft.getMinecraft().thePlayer;
    World world = Minecraft.getMinecraft().theWorld;
    if(player != null){
        boolean hasEffect = player.isPotionActive(PotionRegistry.effectBuzz);
        int applyIt = 0;

        if(hasEffect){
            applyIt = 1;
        } else if(!player.isPotionActive(potion.getPotion()) && applyIt == 1){
            applyIt = 2;
        } else {
            applyIt = 0;
        }

        if(player != null && applyIt == 2){
            player.addPotionEffect(potion);
        }
    }
}

}

这是可行的,但效果是无限的。

共有1个答案

林哲茂
2023-03-14

你正在执行你的行动,同时药水的效果正在循环。这类似于在迭代数组时修改数组。别那么做。

另外,不要执行类似药水效果客户端的操作。客户端要做的唯一事情是图形和用户输入/输出。

像药水这样的事情必须在服务器上处理,否则服务器会在下一个更新数据包上覆盖您的操作。

只需在ExtendPlayer实体中设置一个标志,然后onTick或player update事件检查该标志是否存在,然后添加药水。

@Override
public void performEffect(EntityLivingBase entity, int amplifier){
    if (entity instanceof EntityPlayer)
    {
        EntityPlayer player = (EntityPlayer)entity;
        if(player != null){
            if(player.getActivePotionEffect(PotionRegistry.effectBuzz) != null){
            int duraction = player.getActivePotionEffect(PotionRegistry.effectBuzz).getDuration();
                if(duration <= 2){
                    ExtendedPlayer ePlayer = ExtendedPlayer.get(player);
                    ePlayer.enableBuzz();
                }
            }
        }
    }
}

类似于扩展播放机的东西

public class ExtendedPlayer implements IExtendedEntityProperties {

     ... Extended player setup here

     protected boolean startBuzz = false;

     public void enableBuzz() 
     {
          this.startBuzz = true;
     }
     public static final ExtendedPlayer get(EntityPlayer player) {
        return (ExtendedPlayer) player.getExtendedProperties("MuddymansExtendedPlayer");
    }

    public EntityPlayer getPlayer() {
        return this.player;
    }

    /**
    * Updates anything that needs to be updated each tick
    * NOT called automatically, so you must call it yourself from LivingUpdateEvent or a TickHandler
    */
    public void onUpdate() {
        if(!player.worldObj.isRemote) {
            if(this.enableBuzz) {
                Player player = this.getPlayer()
                player.addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 1200));
                player.addPotionEffect(new PotionEffect(MobEffects.HUNGER, 600));
                player.addPotionEffect(new PotionEffect(MobEffects.UNLUCK, 1200));
                this.startBuzz = false;
            }
        }
    } 
}

从事件处理程序调用exteded播放机更新事件

 @SubscribeEvent
 public void livingTick(final LivingUpdateEvent event) {
        if (event.entity != null && event.entity instanceof EntityPlayer) {
            if(!event.entity.isDead) {
                ExtendedPlayer.get((EntityPlayer)event.entity).onUpdate();
            }
        }
 类似资料:
  • 本文向大家介绍Android自定义View实现水波纹效果,包括了Android自定义View实现水波纹效果的使用技巧和注意事项,需要的朋友参考一下 介绍:水波纹散开效果的控件在 App 里面还是比较常见的,例如 网易云音乐歌曲识别,附近搜索场景。 看下实现的效果: 实现思路: 先将最大圆半径与最小圆半径间距分成几等份,从内到外,Paint 透明度依次递减,绘制出同心圆,然后不断的改变这些同心圆的半

  • 本文向大家介绍android自定义ViewPager水平滑动弹性效果,包括了android自定义ViewPager水平滑动弹性效果的使用技巧和注意事项,需要的朋友参考一下 android ViewPager是一个经常要用到的组件,但android系统本身为我们提供的ViewPager是没有任何效果的,只能是一页一页的滑动,这样会让人感觉很死板,在看一些知名大公司的App时,看到了他们的ViewPa

  • 本文向大家介绍Android自定义View实现水面上涨效果,包括了Android自定义View实现水面上涨效果的使用技巧和注意事项,需要的朋友参考一下 实现效果如下: 实现思路: 1、如何实现圆中水面上涨效果:利用Paint的setXfermode属性为PorterDuff.Mode.SRC_IN画出进度所在的矩形与圆的交集实现 2、如何水波纹效果:利用贝塞尔曲线,动态改变波峰值,实现“随着进度的

  • 本文向大家介绍Android 自定义view实现水波纹动画效果,包括了Android 自定义view实现水波纹动画效果的使用技巧和注意事项,需要的朋友参考一下 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了个让人兴奋的效果,兴致高昂的来找你,看了之后目的很明确,当然就是希望你能给她; 在这样的关键时候,身子板就一定得硬了,可千万别说不行,爷们儿怎么能说不行呢;

  • 本文向大家介绍Android自定义view实现水波纹进度球效果,包括了Android自定义view实现水波纹进度球效果的使用技巧和注意事项,需要的朋友参考一下 今天我们要实现的这个view没有太多交互性的view,所以就继承view。 自定义view的套路,套路很深       1、获取我们自定义属性attrs(可省略)       2、重写onMeasure方法,计算控件的宽和高       3

  • 本文向大家介绍java实现图片加水印效果,包括了java实现图片加水印效果的使用技巧和注意事项,需要的朋友参考一下 图片加水印代码,这些代码不常用,但是用到的时候需要注意的地方也挺多的,每次都重写比较麻烦,记下来备忘。代码是图片加水印的一般流程,可根据实际项目需要自行修改。 注:代码在JPG和PNG格式图片下测试通过,其他图片格式请自行测试和修改 代码流程在注释中写的很详细了,不多做解释。 以上就