We no longer replace the vanilla apple item.

This commit is contained in:
Sollace 2022-03-26 23:51:34 +02:00
parent cbec2e2d96
commit abe8142482
16 changed files with 86 additions and 114 deletions

View file

@ -1,5 +1,6 @@
package com.minelittlepony.unicopia.entity;
import java.util.List;
import java.util.Random;
import org.jetbrains.annotations.NotNull;
@ -113,8 +114,8 @@ public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
}
}
if (stack.getItem() instanceof TickableItem) {
return ((TickableItem)stack.getItem()).onGroundTick(i) == ActionResult.SUCCESS;
if (stack.getItem() instanceof GroundTickCallback) {
return ((GroundTickCallback)stack.getItem()).onGroundTick(i).isAccepted();
}
}
@ -165,7 +166,32 @@ public class ItemImpl implements Equine<ItemEntity>, Owned<ItemEntity> {
return owner;
}
public interface TickableItem {
public static <T extends Item> T registerTickCallback(T item, GroundTickCallback callback) {
((ItemImpl.TickableItem)item).addGroundTickCallback(callback);
return item;
}
public interface TickableItem extends GroundTickCallback {
List<GroundTickCallback> getCallbacks();
default void addGroundTickCallback(GroundTickCallback callback) {
getCallbacks().add(callback);
}
@Override
default ActionResult onGroundTick(IItemEntity entity) {
for (var callback : getCallbacks()) {
ActionResult result = callback.onGroundTick(entity);
if (result.isAccepted()) {
return result;
}
}
return ActionResult.PASS;
}
}
public interface GroundTickCallback {
ActionResult onGroundTick(IItemEntity entity);
}

View file

@ -11,7 +11,6 @@ import com.minelittlepony.unicopia.AwaitTickQueue;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.entity.IItemEntity;
import com.minelittlepony.unicopia.entity.ItemImpl;
import com.minelittlepony.unicopia.entity.ItemImpl.TickableItem;
import com.minelittlepony.unicopia.entity.effect.UEffects;
import com.minelittlepony.unicopia.entity.player.MagicReserves;
import com.minelittlepony.unicopia.entity.player.PlayerCharmTracker;
@ -47,7 +46,7 @@ import net.minecraft.world.LocalDifficulty;
import net.minecraft.world.World;
import net.minecraft.world.explosion.Explosion.DestructionType;
public class AlicornAmuletItem extends AmuletItem implements PlayerCharmTracker.Charm, ItemImpl.ClingyItem, TickableItem {
public class AlicornAmuletItem extends AmuletItem implements PlayerCharmTracker.Charm, ItemImpl.ClingyItem, ItemImpl.GroundTickCallback {
public AlicornAmuletItem(FabricItemSettings settings) {
super(settings, 0, new AmuletItem.ModifiersBuilder()

View file

@ -1,33 +1,28 @@
package com.minelittlepony.unicopia.item;
import java.util.List;
import org.jetbrains.annotations.Nullable;
import com.minelittlepony.unicopia.USounds;
import com.minelittlepony.unicopia.entity.IItemEntity;
import com.minelittlepony.unicopia.entity.ItemImpl;
import com.minelittlepony.unicopia.item.toxin.Toxicity;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.entity.Entity.RemovalReason;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.ItemEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.particle.ParticleTypes;
import net.minecraft.text.Text;
import net.minecraft.util.ActionResult;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.World;
public class AppleItem extends Item implements ItemImpl.TickableItem {
public class AppleItem {
private static final ItemImpl.GroundTickCallback TICK_CALLBACK = AppleItem::onGroundTick;
public AppleItem(Settings settings) {
super(settings);
private AppleItem() { }
public static <T extends Item> T registerTickCallback(T item) {
return ItemImpl.registerTickCallback(item, TICK_CALLBACK);
}
@Override
public ActionResult onGroundTick(IItemEntity item) {
private static ActionResult onGroundTick(IItemEntity item) {
ItemEntity entity = item.get().getMaster();
if (!entity.isRemoved() && item.getPickupDelay() == 0 && item.getAge() > 2030 && entity.world.random.nextInt(150) < 10) {
@ -62,13 +57,4 @@ public class AppleItem extends Item implements ItemImpl.TickableItem {
return ActionResult.PASS;
}
@Override
public void appendTooltip(ItemStack stack, @Nullable World worldIn, List<Text> tooltip, TooltipContext context) {
tooltip.add(getToxicity(stack).getTooltip());
}
public Toxicity getToxicity(ItemStack stack) {
return Toxicity.SAFE;
}
}

View file

@ -29,7 +29,7 @@ public class DrinkableItem extends Item {
stack.decrement(1);
}
((ToxicHolder)this).getToxic().ifPresent(t -> t.finishUsing(stack, world, user));
((ToxicHolder)this).getToxic(stack).ifPresent(t -> t.finishUsing(stack, world, user));
return stack.isEmpty() ? new ItemStack(getRecipeRemainder()) : stack;
}

View file

@ -33,7 +33,7 @@ import net.minecraft.world.Heightmap;
import net.minecraft.world.World;
import net.minecraft.world.WorldEvents;
public class JarItem extends Item implements ProjectileDelegate, ItemImpl.TickableItem {
public class JarItem extends Item implements ProjectileDelegate, ItemImpl.GroundTickCallback {
private final boolean rain;
private final boolean thunder;

View file

@ -1,19 +1,12 @@
package com.minelittlepony.unicopia.item;
import com.minelittlepony.unicopia.entity.IItemEntity;
import net.fabricmc.fabric.api.registry.FuelRegistry;
import net.minecraft.util.ActionResult;
import net.minecraft.item.Item;
public class RottenAppleItem extends AppleItem {
public class RottenAppleItem extends Item {
public RottenAppleItem(Settings settings) {
super(settings);
FuelRegistry.INSTANCE.add(this, 150);
}
@Override
public ActionResult onGroundTick(IItemEntity item) {
return ActionResult.PASS;
}
}

View file

@ -6,6 +6,7 @@ import com.minelittlepony.unicopia.item.toxin.ToxicHolder;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
import net.minecraft.util.Identifier;
import net.minecraft.util.collection.DefaultedList;
@ -13,7 +14,7 @@ import net.minecraft.util.registry.Registry;
public interface UItemGroups {
ItemGroup ALL_ITEMS = FabricItemGroupBuilder.create(new Identifier("unicopia", "items")).appendItems(list -> {
list.addAll(VanillaOverrides.REGISTRY.stream().map(Item::getDefaultStack).collect(Collectors.toList()));
list.add(Items.APPLE.getDefaultStack());
DefaultedList<ItemStack> defs = DefaultedList.of();
UItems.ITEMS.stream()
@ -25,8 +26,8 @@ public interface UItemGroups {
}).icon(UItems.EMPTY_JAR::getDefaultStack).build();
ItemGroup HORSE_FEED = FabricItemGroupBuilder.create(new Identifier("unicopia", "horsefeed")).appendItems(list -> {
list.addAll(Registry.ITEM.stream()
.filter(item -> item instanceof ToxicHolder && ((ToxicHolder)item).getToxic().isPresent())
.map(Item::getDefaultStack)
.filter(item -> item.getItem() instanceof ToxicHolder && ((ToxicHolder)item.getItem()).getToxic(item).isPresent())
.collect(Collectors.toList()));
}).icon(UItems.ZAP_APPLE::getDefaultStack).build();

View file

@ -28,14 +28,14 @@ public interface UItems {
List<Item> ITEMS = new ArrayList<>();
AppleItem GREEN_APPLE = register("green_apple", new AppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
AppleItem SWEET_APPLE = register("sweet_apple", new AppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
AppleItem SOUR_APPLE = register("sour_apple", new AppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
Item GREEN_APPLE = register("green_apple", AppleItem.registerTickCallback(new Item(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE))));
Item SWEET_APPLE = register("sweet_apple", AppleItem.registerTickCallback(new Item(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE))));
Item SOUR_APPLE = register("sour_apple", AppleItem.registerTickCallback(new Item(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE))));
ZapAppleItem ZAP_APPLE = register("zap_apple", new ZapAppleItem(new Item.Settings().group(ItemGroup.FOOD).food(UFoodComponents.ZAP_APPLE)));
ZapAppleItem ZAP_APPLE = register("zap_apple", AppleItem.registerTickCallback(new ZapAppleItem(new Item.Settings().group(ItemGroup.FOOD).food(UFoodComponents.ZAP_APPLE))));
AppleItem ROTTEN_APPLE = register("rotten_apple", new RottenAppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
AppleItem COOKED_ZAP_APPLE = register("cooked_zap_apple", new AppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
Item ROTTEN_APPLE = register("rotten_apple", new RottenAppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
Item COOKED_ZAP_APPLE = register("cooked_zap_apple", new Item(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
Item MUSIC_DISC_CRUSADE = register("music_disc_crusade", USounds.RECORD_CRUSADE);
Item MUSIC_DISC_PET = register("music_disc_pet", USounds.RECORD_PET);
@ -114,6 +114,8 @@ public interface UItems {
}
static void bootstrap() {
AppleItem.registerTickCallback(Items.APPLE);
UEnchantments.bootstrap();
URecipes.bootstrap();
UItemGroups.bootstrap();

View file

@ -1,22 +0,0 @@
package com.minelittlepony.unicopia.item;
import com.minelittlepony.unicopia.util.Registries;
import net.minecraft.item.FoodComponents;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
public final class VanillaOverrides {
public static final Registry<Item> REGISTRY = Registries.createSimple(new Identifier("unicopia", "overrides"));
private static <T extends Item> T register(String name, T newItem) {
return Registry.register(REGISTRY, new Identifier(name), newItem);
}
static {
register("apple", new AppleItem(new Item.Settings().group(ItemGroup.FOOD).food(FoodComponents.APPLE)));
}
}

View file

@ -1,11 +1,16 @@
package com.minelittlepony.unicopia.item;
import static com.minelittlepony.unicopia.item.toxin.Toxin.INNERT;
import java.util.Optional;
import com.minelittlepony.unicopia.UTags;
import com.minelittlepony.unicopia.Unicopia;
import com.minelittlepony.unicopia.advancement.UCriteria;
import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.item.toxin.Ailment;
import com.minelittlepony.unicopia.item.toxin.Toxic;
import com.minelittlepony.unicopia.item.toxin.ToxicHolder;
import com.minelittlepony.unicopia.item.toxin.Toxicity;
import com.minelittlepony.unicopia.particle.ParticleUtils;
import com.minelittlepony.unicopia.particle.UParticles;
@ -21,6 +26,7 @@ import net.minecraft.entity.mob.CreeperEntity;
import net.minecraft.entity.passive.PigEntity;
import net.minecraft.entity.passive.VillagerEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.predicate.entity.EntityPredicates;
@ -37,7 +43,9 @@ import net.minecraft.util.registry.Registry;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
public class ZapAppleItem extends AppleItem implements ChameleonItem {
public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder {
private static final Optional<Toxic> TOXIC = Optional.of(new Toxic.Builder(Ailment.of(Toxicity.SEVERE, INNERT)).build("zap"));
private static final Optional<Toxic> HIDDEN_TOXIC = Optional.of(new Toxic.Builder(Ailment.of(Toxicity.SAFE, INNERT)).build("zap_hidden"));
public ZapAppleItem(Settings settings) {
super(settings);
@ -128,8 +136,8 @@ public class ZapAppleItem extends AppleItem implements ChameleonItem {
}
@Override
public Toxicity getToxicity(ItemStack stack) {
return hasAppearance(stack) ? Toxicity.SEVERE : Toxicity.SAFE;
public Optional<Toxic> getToxic(ItemStack stack) {
return hasAppearance(stack) ? TOXIC : HIDDEN_TOXIC;
}
@Override

View file

@ -2,8 +2,10 @@ package com.minelittlepony.unicopia.item.toxin;
import java.util.Optional;
import net.minecraft.item.ItemStack;
public interface ToxicHolder {
default Optional<Toxic> getToxic() {
default Optional<Toxic> getToxic(ItemStack stack) {
return Optional.empty();
}
}

View file

@ -18,14 +18,14 @@ abstract class MixinBlockItem extends Item implements ToxicHolder {
@Override
public UseAction getUseAction(ItemStack stack) {
return getToxic()
return getToxic(stack)
.map(t -> t.getUseAction(stack))
.orElseGet(() -> super.getUseAction(stack));
}
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity player, Hand hand) {
return getToxic()
return getToxic(player.getStackInHand(hand))
.map(t -> t.use(world, player, hand))
.orElseGet(() -> super.use(world, player, hand));
}

View file

@ -1,11 +1,8 @@
package com.minelittlepony.unicopia.mixin;
import java.io.OutputStream;
import java.io.PrintStream;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Stream;
import org.jetbrains.annotations.Nullable;
@ -15,12 +12,13 @@ import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.minelittlepony.unicopia.item.toxin.Toxic;
import com.minelittlepony.unicopia.item.toxin.ToxicHolder;
import com.minelittlepony.unicopia.item.toxin.Toxics;
import com.minelittlepony.unicopia.entity.ItemImpl;
import com.minelittlepony.unicopia.entity.ItemImpl.GroundTickCallback;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.FoodComponent;
@ -29,7 +27,7 @@ import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
@Mixin(Item.class)
abstract class MixinItem implements ToxicHolder {
abstract class MixinItem implements ToxicHolder, ItemImpl.TickableItem {
private boolean foodLoaded;
@Nullable
@ -38,8 +36,18 @@ abstract class MixinItem implements ToxicHolder {
@Shadow @Mutable
private @Final FoodComponent foodComponent;
private List<ItemImpl.GroundTickCallback> tickCallbacks;
@Override
public Optional<Toxic> getToxic() {
public List<GroundTickCallback> getCallbacks() {
if (tickCallbacks == null) {
tickCallbacks = new ArrayList<>();
}
return tickCallbacks;
}
@Override
public Optional<Toxic> getToxic(ItemStack stack) {
if (!foodLoaded) {
foodLoaded = true;
originalFoodComponent = ((Item)(Object)this).getFoodComponent();
@ -63,6 +71,6 @@ abstract class MixinItem implements ToxicHolder {
@Inject(method = "finishUsing", at = @At("HEAD"), cancellable = true)
private void finishUsing(ItemStack stack, World world, LivingEntity entity, CallbackInfoReturnable<ItemStack> info) {
getToxic().ifPresent(t -> t.finishUsing(stack, world, entity));
getToxic(stack).ifPresent(t -> t.finishUsing(stack, world, entity));
}
}

View file

@ -1,30 +0,0 @@
package com.minelittlepony.unicopia.mixin;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import com.minelittlepony.unicopia.item.VanillaOverrides;
import net.minecraft.item.Item;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry;
@Mixin(Items.class)
abstract class MixinItems {
@ModifyVariable(method = "register(Lnet/minecraft/util/Identifier;Lnet/minecraft/item/Item;)Lnet/minecraft/item/Item;",
at = @At("HEAD"),
index = 1,
argsOnly = true)
private static Item modifyItem(Item item, Identifier id, Item itemAlso) {
// Registry#containsId is client-only :thonkjang:
// TODO: Move onGroundTick() event to MixinItem and make it a registerable event so we don't have to do this
Item replacement = VanillaOverrides.REGISTRY.get(id);
if (replacement != null) {
Registry.register(Registry.ITEM, new Identifier("unicopia_overriden", id.getPath()), item);
return replacement;
}
return item;
}
}

View file

@ -21,6 +21,6 @@ import net.minecraft.world.World;
abstract class MixinItem implements ToxicHolder {
@Inject(method = "appendTooltip", at = @At("RETURN"))
private void onAppendTooltip(ItemStack stack, @Nullable World world, List<Text> tooltip, TooltipContext context, CallbackInfo into) {
getToxic().ifPresent(t -> t.getAilmentFor(MinecraftClient.getInstance().player).appendTooltip(tooltip, context));
getToxic(stack).ifPresent(t -> t.getAilmentFor(MinecraftClient.getInstance().player).appendTooltip(tooltip, context));
}
}

View file

@ -16,7 +16,6 @@
"MixinFallingBlockEntity",
"MixinItem",
"MixinItemEntity",
"MixinItems",
"MixinLivingEntity",
"MixinMilkBucketItem",
"MixinMobEntity",