Sfoglia il codice sorgente

Allow adding supplied effects to FoodProperties

Leo40Git 4 anni fa
parent
commit
b682f3d9b7

+ 28 - 0
common/src/main/java/me/shedaniel/architectury/hooks/FoodPropertiesBuilderAccess.java

@@ -0,0 +1,28 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package dev.architectury.hooks.item;
+
+import net.minecraft.world.effect.MobEffectInstance;
+
+import java.util.function.Supplier;
+
+public interface FoodPropertiesBuilderAccess {
+    void effect(Supplier<? extends MobEffectInstance> effectSupplier, float chance);
+}

+ 36 - 0
common/src/main/java/me/shedaniel/architectury/hooks/FoodPropertiesHooks.java

@@ -0,0 +1,36 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package dev.architectury.hooks.item;
+
+import net.minecraft.world.effect.MobEffectInstance;
+import net.minecraft.world.food.FoodProperties;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.function.Supplier;
+
+public final class FoodPropertiesHooks {
+    private FoodPropertiesHooks() {
+    }
+    
+    public static void effect(@NotNull FoodProperties.Builder builder,
+                              @NotNull Supplier<? extends MobEffectInstance> effectSupplier, float chance) {
+        ((FoodPropertiesBuilderAccess) builder).effect(effectSupplier, chance);
+    }
+}

+ 30 - 0
fabric/src/main/java/me/shedaniel/architectury/impl/fabric/FoodPropertiesAccess.java

@@ -0,0 +1,30 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package dev.architectury.impl.fabric;
+
+import com.mojang.datafixers.util.Pair;
+import net.minecraft.world.effect.MobEffectInstance;
+
+import java.util.List;
+import java.util.function.Supplier;
+
+public interface FoodPropertiesAccess {
+    void setSuppliedEffects(List<Pair<Supplier<? extends MobEffectInstance>, Float>> list);
+}

+ 59 - 0
fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinFoodProperties.java

@@ -0,0 +1,59 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package dev.architectury.mixin.fabric;
+
+import com.mojang.datafixers.util.Pair;
+import dev.architectury.impl.fabric.FoodPropertiesAccess;
+import net.minecraft.world.effect.MobEffectInstance;
+import net.minecraft.world.food.FoodProperties;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Supplier;
+
+@Mixin(FoodProperties.class)
+public class MixinFoodProperties implements FoodPropertiesAccess {
+    @Unique
+    private List<Pair<Supplier<? extends MobEffectInstance>, Float>> suppliedEffects;
+    @Unique
+    private List<Pair<MobEffectInstance, Float>> suppliedEffectCache;
+    
+    @Override
+    public void setSuppliedEffects(List<Pair<Supplier<? extends MobEffectInstance>, Float>> list) {
+        this.suppliedEffects = list;
+        suppliedEffectCache = null;
+    }
+    
+    @Inject(method = "getEffects", at = @At("RETURN"))
+    private void addSuppliedEffects(CallbackInfoReturnable<List<Pair<MobEffectInstance, Float>>> cir) {
+        if (suppliedEffectCache == null) {
+            suppliedEffectCache = new ArrayList<>();
+            for (Pair<Supplier<? extends MobEffectInstance>, Float> suppliedEffect : suppliedEffects) {
+                suppliedEffectCache.add(suppliedEffect.mapFirst(Supplier::get));
+            }
+        }
+        cir.getReturnValue().addAll(suppliedEffectCache);
+    }
+}

+ 51 - 0
fabric/src/main/java/me/shedaniel/architectury/mixin/fabric/MixinFoodPropertiesBuilder.java

@@ -0,0 +1,51 @@
+/*
+ * This file is part of architectury.
+ * Copyright (C) 2020, 2021 architectury
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package dev.architectury.mixin.fabric;
+
+import com.mojang.datafixers.util.Pair;
+import dev.architectury.hooks.item.FoodPropertiesBuilderAccess;
+import dev.architectury.impl.fabric.FoodPropertiesAccess;
+import net.minecraft.world.effect.MobEffectInstance;
+import net.minecraft.world.food.FoodProperties;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Unique;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
+
+import java.util.ArrayList;
+import java.util.function.Supplier;
+
+@Mixin(FoodProperties.Builder.class)
+public class MixinFoodPropertiesBuilder implements FoodPropertiesBuilderAccess {
+    @Unique
+    private final ArrayList<Pair<Supplier<? extends MobEffectInstance>, Float>> suppliedEffects
+            = new ArrayList<>();
+    
+    @Override
+    public void effect(Supplier<? extends MobEffectInstance> effectSupplier, float chance) {
+        suppliedEffects.add(Pair.of(effectSupplier, chance));
+    }
+    
+    @Inject(method = "build", at = @At("RETURN"))
+    public void passSuppliedEffectsToProps(CallbackInfoReturnable<FoodProperties> cir) {
+        ((FoodPropertiesAccess) cir.getReturnValue()).setSuppliedEffects(suppliedEffects);
+    }
+}

+ 2 - 0
fabric/src/main/resources/architectury.mixins.json

@@ -34,6 +34,8 @@
     "MixinEntityCollisionContext",
     "MixinExplosion",
     "MixinFarmBlock",
+    "MixinFoodProperties",
+    "MixinFoodPropertiesBuilder",
     "MixinFurnaceResultSlot",
     "MixinInventory",
     "MixinItemEntity",