Fixed and balanced food effects for changelings

This commit is contained in:
Sollace 2019-02-01 10:38:45 +02:00
parent 502ac54dfd
commit eaa2790116
5 changed files with 109 additions and 7 deletions

View file

@ -6,7 +6,6 @@ import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks; import net.minecraft.init.Blocks;
import net.minecraft.item.EnumAction;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe; import net.minecraft.item.crafting.IRecipe;
@ -239,12 +238,30 @@ public class Unicopia implements IGuiHandler {
Commands.init(event); Commands.init(event);
} }
@SubscribeEvent
public static void onItemUseBegin(LivingEntityUseItemEvent.Start event) {
Entity e = event.getEntity();
if (!event.isCanceled() && e instanceof EntityPlayer) {
PlayerSpeciesList.instance().getPlayer((EntityPlayer)e).getFood().begin(event.getItem());
}
}
@SubscribeEvent
public static void onItemUseCancel(LivingEntityUseItemEvent.Stop event) {
Entity e = event.getEntity();
if (!event.isCanceled() && e instanceof EntityPlayer) {
PlayerSpeciesList.instance().getPlayer((EntityPlayer)e).getFood().end();
}
}
@SubscribeEvent @SubscribeEvent
public static void onItemUseFinish(LivingEntityUseItemEvent.Finish event) { public static void onItemUseFinish(LivingEntityUseItemEvent.Finish event) {
Entity e = event.getEntity(); Entity e = event.getEntity();
if (!event.isCanceled() && e instanceof EntityPlayer && event.getItem().getItemUseAction() == EnumAction.EAT) { if (!event.isCanceled() && e instanceof EntityPlayer) {
PlayerSpeciesList.instance().getPlayer((EntityPlayer)e).onEntityEat(); PlayerSpeciesList.instance().getPlayer((EntityPlayer)e).getFood().finish();
} }
} }

View file

@ -0,0 +1,11 @@
package com.minelittlepony.unicopia.player;
import net.minecraft.item.ItemStack;
public interface IFood {
void begin(ItemStack stack);
void end();
void finish();
}

View file

@ -2,6 +2,8 @@ package com.minelittlepony.unicopia.player;
import java.util.UUID; import java.util.UUID;
import javax.annotation.Nullable;
import com.minelittlepony.model.anim.IInterpolator; import com.minelittlepony.model.anim.IInterpolator;
import com.minelittlepony.unicopia.UClient; import com.minelittlepony.unicopia.UClient;
import com.minelittlepony.unicopia.enchanting.IPageOwner; import com.minelittlepony.unicopia.enchanting.IPageOwner;
@ -10,6 +12,8 @@ import com.minelittlepony.unicopia.spell.ICaster;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.FMLCommonHandler;
public interface IPlayer extends ICaster<EntityPlayer>, IRaceContainer<EntityPlayer>, ITransmittable, IPageOwner { public interface IPlayer extends ICaster<EntityPlayer>, IRaceContainer<EntityPlayer>, ITransmittable, IPageOwner {
@ -20,6 +24,8 @@ public interface IPlayer extends ICaster<EntityPlayer>, IRaceContainer<EntityPla
IView getCamera(); IView getCamera();
IFood getFood();
IInterpolator getInterpolator(); IInterpolator getInterpolator();
float getExertion(); float getExertion();
@ -44,7 +50,7 @@ public interface IPlayer extends ICaster<EntityPlayer>, IRaceContainer<EntityPla
void copyFrom(IPlayer oldPlayer); void copyFrom(IPlayer oldPlayer);
void onEntityEat(); void onEntityEat(ItemStack stack, @Nullable ItemFood food);
boolean stepOnCloud(); boolean stepOnCloud();

View file

@ -3,11 +3,13 @@ package com.minelittlepony.unicopia.player;
import java.util.List; import java.util.List;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.minelittlepony.model.anim.BasicEasingInterpolator; import com.minelittlepony.model.anim.BasicEasingInterpolator;
import com.minelittlepony.model.anim.IInterpolator; import com.minelittlepony.model.anim.IInterpolator;
import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.UEffects;
import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.network.EffectSync; import com.minelittlepony.unicopia.network.EffectSync;
import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; import com.minelittlepony.unicopia.network.MsgPlayerCapabilities;
@ -19,6 +21,8 @@ import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.MobEffects; import net.minecraft.init.MobEffects;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagIntArray; import net.minecraft.nbt.NBTTagIntArray;
import net.minecraft.network.datasync.DataParameter; import net.minecraft.network.datasync.DataParameter;
@ -27,6 +31,7 @@ import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.network.play.server.SPacketSetPassengers; import net.minecraft.network.play.server.SPacketSetPassengers;
import net.minecraft.potion.PotionEffect; import net.minecraft.potion.PotionEffect;
import net.minecraft.stats.StatList; import net.minecraft.stats.StatList;
import net.minecraft.world.EnumDifficulty;
class PlayerCapabilities implements IPlayer { class PlayerCapabilities implements IPlayer {
@ -52,6 +57,8 @@ class PlayerCapabilities implements IPlayer {
private final PlayerView view = new PlayerView(this); private final PlayerView view = new PlayerView(this);
private final PlayerFood food = new PlayerFood(this);
private final EffectSync<EntityPlayer> effectDelegate = new EffectSync<>(this, EFFECT); private final EffectSync<EntityPlayer> effectDelegate = new EffectSync<>(this, EFFECT);
private final IInterpolator interpolator = new BasicEasingInterpolator(); private final IInterpolator interpolator = new BasicEasingInterpolator();
@ -224,12 +231,31 @@ class PlayerCapabilities implements IPlayer {
} }
@Override @Override
public void onEntityEat() { public IFood getFood() {
return food;
}
@Override
public void onEntityEat(ItemStack stack, @Nullable ItemFood food) {
if (getPlayerSpecies() == Race.CHANGELING) { if (getPlayerSpecies() == Race.CHANGELING) {
EntityPlayer player = getOwner(); EntityPlayer player = getOwner();
player.addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 2000, 2)); if (food != null) {
player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 2000, 2)); int health = food.getHealAmount(stack);
float saturation = food.getSaturationModifier(stack);
player.getFoodStats().addStats(-health/2, -saturation/2);
player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 100, 3, true, true));
} else {
player.addPotionEffect(new PotionEffect(MobEffects.NAUSEA, 200, 3, true, true));
}
if (player.world.getDifficulty() != EnumDifficulty.PEACEFUL && player.world.rand.nextInt(20) == 0) {
player.addPotionEffect(new PotionEffect(UEffects.FOOD_POISONING, 300, 2, true, true));
}
player.addPotionEffect(new PotionEffect(MobEffects.WEAKNESS, 2000, 2, true, true));
} }
} }

View file

@ -0,0 +1,42 @@
package com.minelittlepony.unicopia.player;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemStack;
class PlayerFood implements IFood {
private final IPlayer player;
private ItemStack eatingStack = ItemStack.EMPTY;
public PlayerFood(IPlayer player) {
this.player = player;
}
@Override
public void begin(ItemStack stack) {
eatingStack = ItemStack.EMPTY;
if (!stack.isEmpty()) {
EnumAction action = stack.getItemUseAction();
if (action == EnumAction.EAT && stack.getItem() instanceof ItemFood) {
eatingStack = stack.copy();
}
}
}
@Override
public void end() {
eatingStack = ItemStack.EMPTY;
}
@Override
public void finish() {
if (!eatingStack.isEmpty()) {
player.onEntityEat(eatingStack, (ItemFood)eatingStack.getItem());
}
}
}