Added custom item entity support via mixin.

This commit is contained in:
Sebastian Hartte
2020-08-03 15:10:25 +02:00
parent 541f07a7e3
commit 63c251294e
9 changed files with 133 additions and 59 deletions
@@ -24,13 +24,15 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import net.minecraft.util.TypedActionResult;
@@ -45,12 +47,14 @@ import appeng.api.implementations.items.IUpgradeModule;
import appeng.api.implementations.tiles.ISegmentedInventory;
import appeng.api.parts.IPartHost;
import appeng.api.parts.SelectedPart;
import appeng.hooks.AECustomEntityItem;
import appeng.hooks.AEToolItem;
import appeng.items.AEBaseItem;
import appeng.util.InventoryAdaptor;
import appeng.util.inv.AdaptorFixedInv;
public final class MaterialItem extends AEBaseItem implements IStorageComponent, IUpgradeModule, AEToolItem {
public final class MaterialItem extends AEBaseItem
implements IStorageComponent, IUpgradeModule, AEToolItem, AECustomEntityItem {
/**
* NBT property used by the name press to store the name to be inscribed.
@@ -147,31 +151,30 @@ public final class MaterialItem extends AEBaseItem implements IStorageComponent,
return ActionResult.PASS;
}
// FIXME FABRIC @Override
// FIXME FABRIC public boolean hasCustomEntity(final ItemStack is) {
// FIXME FABRIC return materialType.hasCustomEntity();
// FIXME FABRIC }
@Override
public Entity replaceItemEntity(ServerWorld world, ItemEntity itemEntity, ItemStack itemStack) {
if (!materialType.hasCustomEntity()) {
return itemEntity;
}
// FIXME FABRIC @Override
// FIXME FABRIC public Entity createEntity(final World w, final Entity location, final ItemStack itemstack) {
// FIXME FABRIC final Class<? extends Entity> droppedEntity = materialType.getCustomEntityClass();
// FIXME FABRIC final Entity eqi;
final Class<? extends Entity> droppedEntity = materialType.getCustomEntityClass();
final Entity eqi;
// FIXME FABRIC try {
// FIXME FABRIC eqi = droppedEntity.getConstructor(World.class, double.class, double.class, double.class, ItemStack.class)
// FIXME FABRIC .newInstance(w, location.getX(), location.getY(), location.getZ(), itemstack);
// FIXME FABRIC } catch (final Throwable t) {
// FIXME FABRIC throw new IllegalStateException(t);
// FIXME FABRIC }
try {
eqi = droppedEntity.getConstructor(World.class, double.class, double.class, double.class, ItemStack.class)
.newInstance(world, itemEntity.getX(), itemEntity.getY(), itemEntity.getZ(), itemStack);
} catch (final Throwable t) {
throw new IllegalStateException(t);
}
// FIXME FABRIC eqi.setVelocity(location.getVelocity());
eqi.setVelocity(itemEntity.getVelocity());
// FIXME FABRIC if (location instanceof ItemEntity && eqi instanceof ItemEntity) {
// FIXME FABRIC ((ItemEntity) eqi).setDefaultPickupDelay();
// FIXME FABRIC }
if (eqi instanceof ItemEntity) {
((ItemEntity) eqi).setToDefaultPickupDelay();
}
// FIXME FABRIC return eqi;
// FIXME FABRIC }
return eqi;
}
@Override
public int getBytes(final ItemStack is) {
@@ -29,10 +29,13 @@ import net.fabricmc.api.Environment;
import net.minecraft.block.Block;
import net.minecraft.block.Material;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity;
import net.minecraft.entity.ItemEntity;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.util.collection.DefaultedList;
@@ -41,13 +44,15 @@ import net.minecraft.world.World;
import appeng.api.implementations.items.IGrowableCrystal;
import appeng.core.localization.ButtonToolTips;
import appeng.entity.GrowingCrystalEntity;
import appeng.hooks.AECustomEntityItem;
import appeng.items.AEBaseItem;
/**
* This item reprents one of the seeds used to grow various forms of quartz by
* throwing them into water (for that behavior, see the linked entity)
*/
public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal {
public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal, AECustomEntityItem {
/**
* Name of NBT tag used to store the growth progress value.
@@ -111,25 +116,19 @@ public class CrystalSeedItem extends AEBaseItem implements IGrowableCrystal {
return new LiteralText(Math.round(100 * progress / (float) GROWTH_TICKS_REQUIRED) + "%");
}
// FIXME FABRIC Needs custom mixin
// FIXME FABRIC @Override
// FIXME FABRIC public boolean hasCustomEntity(final ItemStack stack) {
// FIXME FABRIC return true;
// FIXME FABRIC }
// FIXME FABRIC
// FIXME FABRIC @Override
// FIXME FABRIC public Entity createEntity(final World world, final Entity location, final ItemStack itemstack) {
// FIXME FABRIC final GrowingCrystalEntity egc = new GrowingCrystalEntity(world, location.getX(), location.getY(),
// FIXME FABRIC location.getZ(), itemstack);
// FIXME FABRIC
// FIXME FABRIC egc.setVelocity(location.getVelocity());
// FIXME FABRIC
// FIXME FABRIC // Cannot read the pickup delay of the original item, so we
// FIXME FABRIC // use the pickup delay used for items dropped by a player instead
// FIXME FABRIC egc.setPickupDelay(40);
// FIXME FABRIC
// FIXME FABRIC return egc;
// FIXME FABRIC }
@Override
public Entity replaceItemEntity(ServerWorld world, ItemEntity itemEntity, ItemStack itemStack) {
final GrowingCrystalEntity egc = new GrowingCrystalEntity(world, itemEntity.getX(), itemEntity.getY(),
itemEntity.getZ(), itemStack);
egc.setVelocity(itemEntity.getVelocity());
// Cannot read the pickup delay of the original item, so we
// use the pickup delay used for items dropped by a player instead
egc.setPickupDelay(40);
return egc;
}
@Override
public void appendStacks(ItemGroup group, DefaultedList<ItemStack> items) {