mirror of
https://github.com/Sollace/Unicopia.git
synced 2025-02-17 10:24:23 +01:00
We no longer replace the vanilla apple item.
This commit is contained in:
parent
cbec2e2d96
commit
abe8142482
16 changed files with 86 additions and 114 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)));
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
"MixinFallingBlockEntity",
|
||||
"MixinItem",
|
||||
"MixinItemEntity",
|
||||
"MixinItems",
|
||||
"MixinLivingEntity",
|
||||
"MixinMilkBucketItem",
|
||||
"MixinMobEntity",
|
||||
|
|
Loading…
Reference in a new issue