NaturesAura/src/main/java/de/ellpeck/naturesaura/entities/EntityEffectInhibitor.java

206 lines
7.3 KiB
Java
Raw Normal View History

package de.ellpeck.naturesaura.entities;
import com.google.common.collect.ListMultimap;
import de.ellpeck.naturesaura.Helper;
2019-02-22 19:06:47 +01:00
import de.ellpeck.naturesaura.api.NaturesAuraAPI;
import de.ellpeck.naturesaura.api.misc.IWorldData;
import de.ellpeck.naturesaura.api.render.IVisualizable;
2020-01-26 01:41:49 +01:00
import de.ellpeck.naturesaura.items.ItemEffectPowder;
import de.ellpeck.naturesaura.items.ModItems;
import de.ellpeck.naturesaura.misc.WorldData;
import net.minecraft.entity.Entity;
2020-01-21 23:02:39 +01:00
import net.minecraft.entity.EntityType;
import net.minecraft.item.ItemStack;
2019-10-20 22:30:49 +02:00
import net.minecraft.nbt.CompoundNBT;
2020-01-21 23:02:39 +01:00
import net.minecraft.network.IPacket;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.util.DamageSource;
import net.minecraft.util.EntityDamageSource;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Tuple;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
2020-09-22 03:17:02 +02:00
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
2019-10-20 22:30:49 +02:00
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
2020-01-23 19:20:47 +01:00
import net.minecraftforge.fml.network.NetworkHooks;
import java.util.List;
public class EntityEffectInhibitor extends Entity implements IVisualizable {
private static final DataParameter<String> INHIBITED_EFFECT = EntityDataManager.createKey(EntityEffectInhibitor.class, DataSerializers.STRING);
private static final DataParameter<Integer> COLOR = EntityDataManager.createKey(EntityEffectInhibitor.class, DataSerializers.VARINT);
private static final DataParameter<Integer> AMOUNT = EntityDataManager.createKey(EntityEffectInhibitor.class, DataSerializers.VARINT);
private ResourceLocation lastEffect;
private boolean powderListDirty;
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
2019-02-21 12:42:45 +01:00
public int renderTicks;
2020-01-21 23:02:39 +01:00
public EntityEffectInhibitor(EntityType<?> entityTypeIn, World worldIn) {
super(entityTypeIn, worldIn);
}
2019-02-22 19:06:47 +01:00
public static void place(World world, ItemStack stack, double posX, double posY, double posZ) {
2020-01-26 01:41:49 +01:00
ResourceLocation effect = ItemEffectPowder.getEffect(stack);
2020-01-21 23:02:39 +01:00
EntityEffectInhibitor entity = new EntityEffectInhibitor(ModEntities.EFFECT_INHIBITOR, world);
2019-02-22 19:06:47 +01:00
entity.setInhibitedEffect(effect);
entity.setColor(NaturesAuraAPI.EFFECT_POWDERS.get(effect));
entity.setAmount(stack.getCount());
entity.setPosition(posX, posY, posZ);
2020-01-21 23:02:39 +01:00
world.addEntity(entity);
2019-02-22 19:06:47 +01:00
}
@Override
public void onAddedToWorld() {
super.onAddedToWorld();
this.powderListDirty = true;
}
@Override
public void onRemovedFromWorld() {
super.onRemovedFromWorld();
this.setInhibitedEffect(null);
this.updatePowderListStatus();
}
2020-01-21 23:02:39 +01:00
@Override
protected void registerData() {
this.dataManager.register(INHIBITED_EFFECT, null);
this.dataManager.register(COLOR, 0);
this.dataManager.register(AMOUNT, 0);
}
@Override
public void notifyDataManagerChange(DataParameter<?> key) {
super.notifyDataManagerChange(key);
if (INHIBITED_EFFECT.equals(key) || AMOUNT.equals(key))
this.powderListDirty = true;
}
@Override
public void setPosition(double x, double y, double z) {
if (x != this.getPosX() || y != this.getPosY() || z != this.getPosZ())
this.powderListDirty = true;
super.setPosition(x, y, z);
}
@Override
2020-01-21 23:02:39 +01:00
public void tick() {
super.tick();
if (this.powderListDirty)
this.updatePowderListStatus();
if (this.world.isRemote) {
2020-01-21 23:02:39 +01:00
if (this.world.getGameTime() % 5 == 0) {
2020-01-23 20:57:56 +01:00
NaturesAuraAPI.instance().spawnMagicParticle(
2020-01-28 18:08:56 +01:00
this.getPosX() + this.world.rand.nextGaussian() * 0.1F,
this.getPosY(),
this.getPosZ() + this.world.rand.nextGaussian() * 0.1F,
this.world.rand.nextGaussian() * 0.005F,
this.world.rand.nextFloat() * 0.03F,
this.world.rand.nextGaussian() * 0.005F,
this.getColor(), this.world.rand.nextFloat() * 3F + 1F, 120, 0F, true, true);
}
2019-02-21 12:42:45 +01:00
this.renderTicks++;
}
}
@Override
public boolean canBeCollidedWith() {
return true;
}
2020-01-21 23:02:39 +01:00
@Override
protected void readAdditional(CompoundNBT compound) {
this.setInhibitedEffect(new ResourceLocation(compound.getString("effect")));
this.setColor(compound.getInt("color"));
this.setAmount(compound.contains("amount") ? compound.getInt("amount") : 24);
}
@Override
protected void writeAdditional(CompoundNBT compound) {
compound.putString("effect", this.getInhibitedEffect().toString());
compound.putInt("color", this.getColor());
compound.putInt("amount", this.getAmount());
}
@Override
public IPacket<?> createSpawnPacket() {
2020-01-23 19:20:47 +01:00
return NetworkHooks.getEntitySpawningPacket(this);
2020-01-21 23:02:39 +01:00
}
@Override
public boolean attackEntityFrom(DamageSource source, float amount) {
if (source instanceof EntityDamageSource && !this.world.isRemote) {
2020-01-21 23:02:39 +01:00
this.remove();
2019-02-22 19:06:47 +01:00
this.entityDropItem(this.getDrop(), 0F);
return true;
} else
return super.attackEntityFrom(source, amount);
}
2019-02-22 19:06:47 +01:00
public ItemStack getDrop() {
2020-01-26 01:41:49 +01:00
return ItemEffectPowder.setEffect(new ItemStack(ModItems.EFFECT_POWDER, this.getAmount()), this.getInhibitedEffect());
2019-02-22 19:06:47 +01:00
}
2020-02-07 15:22:30 +01:00
public ResourceLocation getInhibitedEffect() {
String effect = this.dataManager.get(INHIBITED_EFFECT);
if (effect == null || effect.isEmpty())
return null;
return new ResourceLocation(effect);
}
public void setInhibitedEffect(ResourceLocation effect) {
this.dataManager.set(INHIBITED_EFFECT, effect != null ? effect.toString() : null);
}
2020-02-07 15:22:30 +01:00
public int getColor() {
return this.dataManager.get(COLOR);
}
public void setColor(int color) {
this.dataManager.set(COLOR, color);
}
2020-02-07 15:22:30 +01:00
public int getAmount() {
return this.dataManager.get(AMOUNT);
}
public void setAmount(int amount) {
this.dataManager.set(AMOUNT, amount);
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
public AxisAlignedBB getVisualizationBounds(World world, BlockPos pos) {
2020-09-22 03:17:02 +02:00
return Helper.aabb(this.getPositionVec()).grow(this.getAmount());
}
@Override
2019-10-20 22:30:49 +02:00
@OnlyIn(Dist.CLIENT)
public int getVisualizationColor(World world, BlockPos pos) {
return this.getColor();
}
private void updatePowderListStatus() {
ListMultimap<ResourceLocation, Tuple<Vector3d, Integer>> powders = ((WorldData) IWorldData.getWorldData(this.world)).effectPowders;
if (this.lastEffect != null) {
List<Tuple<Vector3d, Integer>> oldList = powders.get(this.lastEffect);
oldList.removeIf(t -> this.getPositionVec().equals(t.getA()));
}
ResourceLocation effect = this.getInhibitedEffect();
if (effect != null) {
List<Tuple<Vector3d, Integer>> newList = powders.get(effect);
newList.add(new Tuple<>(this.getPositionVec(), this.getAmount()));
}
this.powderListDirty = false;
this.lastEffect = effect;
}
}