2
1
Fork 1
mirror of https://github.com/ACGaming/Spackenmobs synced 2024-06-10 22:48:54 +02:00
Spackenmobs/src/main/java/mod/acgaming/spackenmobs/item/CustomSpawnEggItem.java
2022-03-06 10:15:32 +01:00

168 lines
5.9 KiB
Java

package mod.acgaming.spackenmobs.item;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.FlowingFluidBlock;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.SpawnReason;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.stats.Stats;
import net.minecraft.tileentity.MobSpawnerTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraft.world.spawner.AbstractSpawner;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class CustomSpawnEggItem extends Item
{
private static final Map<Supplier<EntityType<?>>, CustomSpawnEggItem> EGGS = Maps.newIdentityHashMap();
public static Iterable<CustomSpawnEggItem> getEggs()
{
return Iterables.unmodifiableIterable(EGGS.values());
}
private final Supplier<EntityType<?>> typeIn;
private final int primaryColor;
private final int secondaryColor;
public CustomSpawnEggItem(Supplier<EntityType<?>> type, int primary, int secondary, Properties properties)
{
super(properties);
this.typeIn = type;
this.primaryColor = primary;
this.secondaryColor = secondary;
EGGS.put(type, this);
}
public ActionResultType useOn(ItemUseContext context)
{
World worldIn = context.getLevel();
if (!worldIn.isClientSide)
{
ItemStack stack = context.getItemInHand();
BlockPos pos = context.getClickedPos();
Direction dir = context.getClickedFace();
BlockState state = worldIn.getBlockState(pos);
Block block = state.getBlock();
if (block == Blocks.SPAWNER)
{
TileEntity tile = worldIn.getBlockEntity(pos);
if (tile instanceof MobSpawnerTileEntity)
{
AbstractSpawner spawner = ((MobSpawnerTileEntity) tile).getSpawner();
EntityType<?> type = this.getType(stack.getTag());
spawner.setEntityId(type);
tile.setChanged();
worldIn.sendBlockUpdated(pos, state, state, 3);
stack.shrink(1);
return ActionResultType.SUCCESS;
}
}
BlockPos pos2;
if (state.getCollisionShape(worldIn, pos).isEmpty())
{
pos2 = pos;
}
else
{
pos2 = pos.relative(dir);
}
EntityType<?> type = this.getType(stack.getTag());
if (type.spawn((ServerWorld) worldIn, stack, context.getPlayer(), pos2, SpawnReason.SPAWN_EGG, true, !Objects.equals(pos, pos2) && dir == Direction.UP) != null)
{
stack.shrink(1);
}
}
return ActionResultType.SUCCESS;
}
public ActionResult<ItemStack> use(World worldIn, PlayerEntity playerIn, Hand handIn)
{
ItemStack itemstack = playerIn.getItemInHand(handIn);
BlockRayTraceResult raytraceresult = getPlayerPOVHitResult(worldIn, playerIn, RayTraceContext.FluidMode.SOURCE_ONLY);
if (raytraceresult.getType() != RayTraceResult.Type.BLOCK)
{
return ActionResult.pass(itemstack);
}
else if (worldIn.isClientSide)
{
return ActionResult.success(itemstack);
}
else
{
BlockPos blockpos = raytraceresult.getBlockPos();
if (!(worldIn.getBlockState(blockpos).getBlock() instanceof FlowingFluidBlock))
{
return ActionResult.pass(itemstack);
}
else if (worldIn.mayInteract(playerIn, blockpos) && playerIn.mayUseItemAt(blockpos, raytraceresult.getDirection(), itemstack))
{
EntityType<?> entitytype = this.getType(itemstack.getTag());
if (entitytype.spawn((ServerWorld) worldIn, itemstack, playerIn, blockpos, SpawnReason.SPAWN_EGG, false, false) == null)
{
return ActionResult.pass(itemstack);
}
else
{
if (!playerIn.abilities.instabuild)
{
itemstack.shrink(1);
}
playerIn.awardStat(Stats.ITEM_USED.get(this));
return ActionResult.success(itemstack);
}
}
else
{
return ActionResult.fail(itemstack);
}
}
}
@OnlyIn(Dist.CLIENT)
public int getColor(int p_195983_1_)
{
return p_195983_1_ == 0 ? this.primaryColor : this.secondaryColor;
}
public EntityType<?> getType(@Nullable CompoundNBT compound)
{
if (compound != null && compound.contains("EntityTag", 10))
{
CompoundNBT lvt_2_1_ = compound.getCompound("EntityTag");
if (lvt_2_1_.contains("id", 8))
{
return EntityType.byString(lvt_2_1_.getString("id")).orElse(this.typeIn.get());
}
}
return this.typeIn.get();
}
}