当前正在尝试创建一个药水效果,一旦时间用完,将其他药水效果应用到玩家身上。看起来很简单,但我发现了一些错误和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);
}
}
}
}
这是可行的,但效果是无限的。
你正在执行你的行动,同时药水的效果正在循环。这类似于在迭代数组时修改数组。别那么做。
另外,不要执行类似药水效果客户端的操作。客户端要做的唯一事情是图形和用户输入/输出。
像药水这样的事情必须在服务器上处理,否则服务器会在下一个更新数据包上覆盖您的操作。
只需在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格式图片下测试通过,其他图片格式请自行测试和修改 代码流程在注释中写的很详细了,不多做解释。 以上就