.dat
- * 单文件损坏只影响单元件,降低风险。
+ * uuid -> {@link SavedData} 数据的管理类
+ *
+ * 每个元件单独对应一个文件: data/ae_universal_cell_data/.dat
+ *
+ * 单文件损坏只影响单元件,降低风险。
*
* @author Frostbite
*/
@@ -84,15 +88,13 @@ private AEUniversalCellData(@NotNull Object2LongOpenHashMap storage,
this.pendingReadErrors = pendingReadErrors;
}
- public static final SavedData.Factory FACTORY =
- new SavedData.Factory<>(
- () -> {
- Object2LongOpenHashMap s = new Object2LongOpenHashMap<>();
- s.defaultReturnValue(0L);
- return new AEUniversalCellData(s, new ObjectArrayList<>());
- },
- AEUniversalCellData::load
- );
+ public static final Factory FACTORY = new Factory<>(
+ () -> {
+ Object2LongOpenHashMap s = new Object2LongOpenHashMap<>();
+ s.defaultReturnValue(0L);
+ return new AEUniversalCellData(s, new ObjectArrayList<>());
+ },
+ AEUniversalCellData::load);
/**
* 获取原始存储数据(fastutil 原生 Map,便于无装箱访问)
@@ -182,8 +184,8 @@ private AEUniversalCellData(@NotNull Object2LongOpenHashMap storage,
entriesList.add(entry);
} catch (Throwable ex) {
// 序列化失败:无法可靠得到要保存的信息 -> 打印并略过
- System.err.println("[AEUniversalCellData] Failed to serialize entry: key=" + key
- + ", amount=" + amount + " ; cause=" + ex);
+ System.err.println("[AEUniversalCellData] Failed to serialize entry: key=" + key + ", amount=" +
+ amount + " ; cause=" + ex);
}
}
invTag.put(ENTRIES_TAG, entriesList);
@@ -282,4 +284,4 @@ private static void ensureSaveDirExists(@NotNull MinecraftServer server) {
System.err.println("[AEUniversalCellData] Failed to create save directory: " + dir + " : " + e);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/AEUniversalCellHandler.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/AEUniversalCellHandler.java
similarity index 92%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/AEUniversalCellHandler.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/AEUniversalCellHandler.java
index 80943279..5935fa37 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/AEUniversalCellHandler.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/AEUniversalCellHandler.java
@@ -1,10 +1,11 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me;
+
+import net.minecraft.world.item.ItemStack;
+import net.neoforged.neoforge.server.ServerLifecycleHooks;
import appeng.api.storage.cells.ICellHandler;
import appeng.api.storage.cells.ISaveProvider;
import appeng.api.storage.cells.StorageCell;
-import net.minecraft.world.item.ItemStack;
-import net.neoforged.neoforge.server.ServerLifecycleHooks;
import org.jetbrains.annotations.Nullable;
/**
@@ -13,10 +14,10 @@
* @author Frostbite
*/
public class AEUniversalCellHandler implements ICellHandler {
+
public static final AEUniversalCellHandler INSTANCE = new AEUniversalCellHandler();
- private AEUniversalCellHandler() {
- }
+ private AEUniversalCellHandler() {}
@Override
public boolean isCell(ItemStack itemStack) {
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/AEUniversalCellInventory.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/AEUniversalCellInventory.java
similarity index 97%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/AEUniversalCellInventory.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/AEUniversalCellInventory.java
index 0098406a..b6cd88e5 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/AEUniversalCellInventory.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/AEUniversalCellInventory.java
@@ -1,10 +1,17 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me;
+
+import net.minecraft.network.chat.Component;
+import net.minecraft.world.item.ItemStack;
import appeng.api.config.Actionable;
import appeng.api.config.FuzzyMode;
import appeng.api.config.IncludeExclude;
import appeng.api.networking.security.IActionSource;
-import appeng.api.stacks.*;
+import appeng.api.stacks.AEItemKey;
+import appeng.api.stacks.AEKey;
+import appeng.api.stacks.AEKeyType;
+import appeng.api.stacks.GenericStack;
+import appeng.api.stacks.KeyCounter;
import appeng.api.storage.StorageCells;
import appeng.api.storage.cells.CellState;
import appeng.api.storage.cells.ICellWorkbenchItem;
@@ -18,8 +25,6 @@
import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2LongMap;
import it.unimi.dsi.fastutil.objects.ReferenceArraySet;
-import net.minecraft.network.chat.Component;
-import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -254,11 +259,11 @@ public long insert(AEKey what, long amount, Actionable mode, IActionSource sourc
// 新开类型:需满足“有类型名额”
if (openingNewType) {
if (storage.size() >= totalTypesEff) {
- return handleOverflowVoidOnInsert(what, amount, /*inserted*/ 0);
+ return handleOverflowVoidOnInsert(what, amount, /* inserted */ 0);
}
// 若 freeBytes==0 但 apb 桶存在碎片,allowedUnits 仍可能>0(允许借碎片完成首字节)
if (allowedUnits <= 0) {
- return handleOverflowVoidOnInsert(what, amount, /*inserted*/ 0);
+ return handleOverflowVoidOnInsert(what, amount, /* inserted */ 0);
}
}
@@ -268,14 +273,14 @@ public long insert(AEKey what, long amount, Actionable mode, IActionSource sourc
long canGrowBy = Math.max(0, maxPerTypeCap - current);
allowedUnits = Math.min(allowedUnits, canGrowBy);
if (allowedUnits <= 0) {
- return handleOverflowVoidOnInsert(what, amount, /*inserted*/ 0);
+ return handleOverflowVoidOnInsert(what, amount, /* inserted */ 0);
}
}
// 这次实际能塞多少
final long toInsert = Math.min(amount, allowedUnits);
if (toInsert <= 0) {
- return handleOverflowVoidOnInsert(what, amount, /*inserted*/ 0);
+ return handleOverflowVoidOnInsert(what, amount, /* inserted */ 0);
}
if (mode == Actionable.MODULATE) {
@@ -299,7 +304,7 @@ public long insert(AEKey what, long amount, Actionable mode, IActionSource sourc
// 客户端状态 + 标脏
markChanged();
}
- return handleOverflowVoidOnInsert(what, amount, /*inserted*/ toInsert);
+ return handleOverflowVoidOnInsert(what, amount, /* inserted */ toInsert);
}
/**
@@ -364,7 +369,6 @@ public void getAvailableStacks(KeyCounter out) {
}
}
-
@Override
public Component getDescription() {
return this.itemStack.getHoverName();
@@ -413,8 +417,7 @@ private long remainingUnitsIntoExistingFor(long amountPerByte, long freeBytes) {
/**
* 递归盘保护:若 what 是“另一个存储盘”且该盘声明不能嵌入,则拒收。
*/
- private boolean canNestStorageCells(AEKey what
- ) {
+ private boolean canNestStorageCells(AEKey what) {
if (what instanceof AEItemKey itemKey) {
ItemStack s = itemKey.toStack();
StorageCell nested = StorageCells.getCellInventory(s, null);
@@ -627,4 +630,4 @@ private static long safeMul(long a, long b) {
if (a > Long.MAX_VALUE / b) return Long.MAX_VALUE;
return a * b;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/IAEUniversalCell.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/IAEUniversalCell.java
similarity index 95%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/IAEUniversalCell.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/IAEUniversalCell.java
index 38bc2865..96081221 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/IAEUniversalCell.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/IAEUniversalCell.java
@@ -1,10 +1,12 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me;
+
+import committee.nova.mods.avaritia_integration.integrations.ae2.registry.AE2IntegrationDataComponents;
+
+import net.minecraft.world.item.ItemStack;
import appeng.api.stacks.GenericStack;
import appeng.api.storage.cells.CellState;
import appeng.api.upgrades.IUpgradeableItem;
-import committee.nova.mods.avaritia_integration.module.ae2.registry.AE2IntegrationDataComponents;
-import net.minecraft.world.item.ItemStack;
import java.util.ArrayList;
import java.util.Collections;
@@ -100,4 +102,4 @@ static void setTooltipShowStacks(ItemStack stack, List showStacks)
stack.set(AE2IntegrationDataComponents.CELL_SHOW_TOOLTIP_STACKS.get(), cleaned);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellData.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellData.java
similarity index 93%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellData.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellData.java
index f2244026..de80e457 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellData.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellData.java
@@ -1,10 +1,7 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me.biginteger;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me.biginteger;
+
+import committee.nova.mods.avaritia_integration.integrations.ae2.registry.AE2IntegrationDataComponents;
-import appeng.api.stacks.AEKey;
-import committee.nova.mods.avaritia_integration.module.ae2.registry.AE2IntegrationDataComponents;
-import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
-import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
-import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.core.HolderLookup;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
@@ -14,6 +11,11 @@
import net.minecraft.world.level.saveddata.SavedData;
import net.minecraft.world.level.storage.LevelResource;
import net.neoforged.neoforge.server.ServerLifecycleHooks;
+
+import appeng.api.stacks.AEKey;
+import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -30,6 +32,7 @@
* @author Frostbite
*/
public class AEBigIntegerCellData extends SavedData {
+
/**
* 主容器子标签
*/
@@ -83,15 +86,13 @@ private AEBigIntegerCellData(@NotNull Object2ObjectMap storag
this.pendingReadErrors = pendingReadErrors;
}
- public static final SavedData.Factory FACTORY =
- new SavedData.Factory<>(
- () -> {
- Object2ObjectOpenHashMap s = new Object2ObjectOpenHashMap<>();
- s.defaultReturnValue(BigInteger.ZERO);
- return new AEBigIntegerCellData(s, new ObjectArrayList<>());
- },
- AEBigIntegerCellData::load
- );
+ public static final Factory FACTORY = new Factory<>(
+ () -> {
+ Object2ObjectOpenHashMap s = new Object2ObjectOpenHashMap<>();
+ s.defaultReturnValue(BigInteger.ZERO);
+ return new AEBigIntegerCellData(s, new ObjectArrayList<>());
+ },
+ AEBigIntegerCellData::load);
/**
* 获取原始存储数据
@@ -181,8 +182,8 @@ private AEBigIntegerCellData(@NotNull Object2ObjectMap storag
entriesList.add(entry);
} catch (Throwable ex) {
// 序列化失败:无法可靠得到要保存的信息 -> 打印并略过
- System.err.println("[AEUniversalCellData] Failed to serialize entry: key=" + key
- + ", amount=" + amount + " ; cause=" + ex);
+ System.err.println("[AEUniversalCellData] Failed to serialize entry: key=" + key + ", amount=" +
+ amount + " ; cause=" + ex);
}
}
invTag.put(ENTRIES_TAG, entriesList);
@@ -296,5 +297,4 @@ private static void addTo(Object2ObjectMap map, AEKey key, Bi
map.put(key, now);
}
}
-
}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellHandler.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellHandler.java
similarity index 91%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellHandler.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellHandler.java
index 9842abca..06accb9f 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellHandler.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellHandler.java
@@ -1,17 +1,18 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me.biginteger;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me.biginteger;
+
+import net.minecraft.world.item.ItemStack;
+import net.neoforged.neoforge.server.ServerLifecycleHooks;
import appeng.api.storage.cells.ICellHandler;
import appeng.api.storage.cells.ISaveProvider;
import appeng.api.storage.cells.StorageCell;
-import net.minecraft.world.item.ItemStack;
-import net.neoforged.neoforge.server.ServerLifecycleHooks;
import org.jetbrains.annotations.Nullable;
public class AEBigIntegerCellHandler implements ICellHandler {
+
public static final AEBigIntegerCellHandler INSTANCE = new AEBigIntegerCellHandler();
- private AEBigIntegerCellHandler() {
- }
+ private AEBigIntegerCellHandler() {}
@Override
public boolean isCell(ItemStack itemStack) {
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellInventory.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellInventory.java
similarity index 98%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellInventory.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellInventory.java
index 235970be..5322153d 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/AEBigIntegerCellInventory.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/AEBigIntegerCellInventory.java
@@ -1,10 +1,17 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me.biginteger;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me.biginteger;
+
+import net.minecraft.network.chat.Component;
+import net.minecraft.world.item.ItemStack;
import appeng.api.config.Actionable;
import appeng.api.config.FuzzyMode;
import appeng.api.config.IncludeExclude;
import appeng.api.networking.security.IActionSource;
-import appeng.api.stacks.*;
+import appeng.api.stacks.AEItemKey;
+import appeng.api.stacks.AEKey;
+import appeng.api.stacks.AEKeyType;
+import appeng.api.stacks.GenericStack;
+import appeng.api.stacks.KeyCounter;
import appeng.api.storage.StorageCells;
import appeng.api.storage.cells.CellState;
import appeng.api.storage.cells.ICellWorkbenchItem;
@@ -18,8 +25,6 @@
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectMap;
import it.unimi.dsi.fastutil.objects.ReferenceArraySet;
-import net.minecraft.network.chat.Component;
-import net.minecraft.world.item.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -453,4 +458,4 @@ private static BigInteger minBI(BigInteger a, BigInteger b) {
private static BigInteger maxBI(BigInteger a, BigInteger b) {
return a.compareTo(b) >= 0 ? a : b;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/IAEBigIntegerCell.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/IAEBigIntegerCell.java
similarity index 94%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/IAEBigIntegerCell.java
rename to integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/IAEBigIntegerCell.java
index 8ee08ae9..f5c6777d 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/ae2/me/biginteger/IAEBigIntegerCell.java
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/me/biginteger/IAEBigIntegerCell.java
@@ -1,10 +1,12 @@
-package committee.nova.mods.avaritia_integration.module.ae2.me.biginteger;
+package committee.nova.mods.avaritia_integration.integrations.ae2.me.biginteger;
+
+import committee.nova.mods.avaritia_integration.integrations.ae2.registry.AE2IntegrationDataComponents;
+
+import net.minecraft.world.item.ItemStack;
import appeng.api.stacks.GenericStack;
import appeng.api.storage.cells.CellState;
import appeng.api.upgrades.IUpgradeableItem;
-import committee.nova.mods.avaritia_integration.module.ae2.registry.AE2IntegrationDataComponents;
-import net.minecraft.world.item.ItemStack;
import java.math.BigInteger;
import java.util.ArrayList;
diff --git a/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/registry/AE2IntegrationDataComponents.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/registry/AE2IntegrationDataComponents.java
new file mode 100644
index 00000000..d7f38a6b
--- /dev/null
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/registry/AE2IntegrationDataComponents.java
@@ -0,0 +1,99 @@
+package committee.nova.mods.avaritia_integration.integrations.ae2.registry;
+
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+
+import net.minecraft.core.UUIDUtil;
+import net.minecraft.core.component.DataComponentType;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.network.RegistryFriendlyByteBuf;
+import net.minecraft.network.codec.ByteBufCodecs;
+import net.minecraft.network.codec.StreamCodec;
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.neoforge.registries.DeferredHolder;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import appeng.api.stacks.GenericStack;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.DataResult;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+import java.util.function.UnaryOperator;
+
+public class AE2IntegrationDataComponents {
+
+ public static final DeferredRegister> DATA_COMPONENTS = DeferredRegister
+ .create(Registries.DATA_COMPONENT_TYPE, AvaritiaIntegration.MOD_ID);
+
+ private static DeferredHolder, DataComponentType> register(
+ String name,
+ UnaryOperator> builder) {
+ return DATA_COMPONENTS.register(name, () -> builder.apply(DataComponentType.builder()).build());
+ }
+
+ // 已用字节
+ public static final DeferredHolder, DataComponentType> CELL_BYTES_USAGE = register(
+ "cell_bytes_usage", b -> b
+ .persistent(Codec.LONG)
+ .networkSynchronized(ByteBufCodecs.VAR_LONG)
+ .cacheEncoding());
+
+ // 已用字节-BigInteger版
+ public static final DeferredHolder, DataComponentType> CELL_BYTE_USAGE_BIG = register(
+ "cell_byte_usage_big", b -> b
+ .persistent(Codec.STRING.comapFlatMap(
+ s -> {
+ try {
+ return DataResult.success(new BigInteger(s));
+ } catch (NumberFormatException e) {
+ return DataResult.error(() -> "Invalid BigInteger: " + s);
+ }
+ },
+ BigInteger::toString))
+ .networkSynchronized(StreamCodec.of(
+ (RegistryFriendlyByteBuf buf, BigInteger v) -> {
+ byte[] arr = v.toByteArray();
+ buf.writeByteArray(arr);
+ },
+ (RegistryFriendlyByteBuf buf) -> {
+ byte[] arr = buf.readByteArray();
+ return new BigInteger(arr);
+ })));
+
+ // 已用类型
+ public static final DeferredHolder, DataComponentType> CELL_TYPES_USAGE = register(
+ "cell_types_usage", b -> b
+ .persistent(Codec.INT)
+ .networkSynchronized(ByteBufCodecs.VAR_INT) // 亦可省略
+ .cacheEncoding());
+
+ // 单元状态(字符串存枚举名)
+ public static final DeferredHolder, DataComponentType> CELL_STATE = register(
+ "cell_state", b -> b
+ .persistent(Codec.STRING)
+ .networkSynchronized(ByteBufCodecs.STRING_UTF8)
+ .cacheEncoding());
+
+ // Tooltip 展示栈:持久化用 AE 的容错 List,网络用内置 list 编解码 + AE 的 STREAM_CODEC
+ public static final DeferredHolder, DataComponentType>> CELL_SHOW_TOOLTIP_STACKS = register(
+ "cell_show_tooltip_stacks", b -> b
+ .persistent(GenericStack.FAULT_TOLERANT_LIST_CODEC)
+ .networkSynchronized(
+ ByteBufCodecs.collection(
+ ArrayList::new,
+ GenericStack.STREAM_CODEC))
+ .cacheEncoding());
+
+ // 组件唯一仓库 UUID
+ public static final DeferredHolder, DataComponentType> CELL_UUID = register("cell_uuid",
+ b -> b
+ .persistent(UUIDUtil.CODEC)
+ .networkSynchronized(UUIDUtil.STREAM_CODEC)
+ .cacheEncoding());
+
+ public static void register(IEventBus eventBus) {
+ DATA_COMPONENTS.register(eventBus);
+ }
+}
diff --git a/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/registry/AE2IntegrationItems.java b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/registry/AE2IntegrationItems.java
new file mode 100644
index 00000000..430decaf
--- /dev/null
+++ b/integrations/ae2/src/main/java/committee/nova/mods/avaritia_integration/integrations/ae2/registry/AE2IntegrationItems.java
@@ -0,0 +1,43 @@
+package committee.nova.mods.avaritia_integration.integrations.ae2.registry;
+
+import committee.nova.mods.avaritia.api.common.item.BaseItem;
+import committee.nova.mods.avaritia.init.registry.ModRarities;
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+import committee.nova.mods.avaritia_integration.integrations.ae2.AIAE2IntegrationMod;
+import committee.nova.mods.avaritia_integration.integrations.ae2.item.AEBigIntegerCellItem;
+import committee.nova.mods.avaritia_integration.integrations.ae2.item.InfiniteCellItem;
+
+import net.minecraft.world.item.Item;
+import net.neoforged.fml.ModList;
+import net.neoforged.neoforge.registries.DeferredItem;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import java.util.function.Supplier;
+
+public final class AE2IntegrationItems {
+
+ public static final DeferredRegister.Items REGISTRY = DeferredRegister.createItems(AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredItem- INFINITY_ME_STORAGE_COMPONENT = register("infinity_me_storage_component",
+ () -> new BaseItem(p -> p.rarity(ModRarities.EPIC)));
+
+ public static final DeferredItem
- INFINITY_ME_STORAGE_CELL = register("infinity_me_storage_cell",
+ () -> {
+ if (ModList.get().isLoaded(AIAE2IntegrationMod.DEPENDENCY_MOD_ID))
+ return new InfiniteCellItem(new Item.Properties().stacksTo(1).rarity(ModRarities.EPIC), 8);
+ else
+ return new BaseItem(p -> p.rarity(ModRarities.EPIC));
+ });
+
+ public static final DeferredItem
- INFINITY_ME_STORAGE_CELL_BIG = register("infinity_me_storage_cell_big",
+ () -> {
+ if (ModList.get().isLoaded(AIAE2IntegrationMod.DEPENDENCY_MOD_ID))
+ return new AEBigIntegerCellItem(new Item.Properties().stacksTo(1).rarity(ModRarities.EPIC), 64);
+ else
+ return new BaseItem(p -> p.rarity(ModRarities.EPIC));
+ });
+
+ public static DeferredItem register(String id, Supplier obj) {
+ return REGISTRY.register(id, obj);
+ }
+}
diff --git a/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_cell.json b/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_cell.json
new file mode 100644
index 00000000..175a44a8
--- /dev/null
+++ b/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_cell.json
@@ -0,0 +1,7 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/infinity_me_storage_cell",
+ "layer1": "avaritia_integration:item/items/storage_cell_led"
+ }
+}
diff --git a/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_cell_big.json b/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_cell_big.json
new file mode 100644
index 00000000..a34b0552
--- /dev/null
+++ b/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_cell_big.json
@@ -0,0 +1,7 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/infinity_me_storage_cell_big",
+ "layer1": "ae2:item/storage_cell_led"
+ }
+}
diff --git a/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_component.json b/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_component.json
new file mode 100644
index 00000000..5a1c0445
--- /dev/null
+++ b/integrations/ae2/src/main/resources/assets/avaritia_integration/models/item/infinity_me_storage_component.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/infinity_me_storage_component"
+ }
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell.png b/integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell.png
rename to integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_1_21.png b/integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_1_21.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_1_21.png
rename to integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_1_21.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_big.png b/integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_big.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_big.png
rename to integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_cell_big.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component.png b/integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component.png
rename to integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component_1_21.png b/integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component_1_21.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component_1_21.png
rename to integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_me_storage_component_1_21.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/storage_cell_led.png b/integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/storage_cell_led.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/storage_cell_led.png
rename to integrations/ae2/src/main/resources/assets/avaritia_integration/textures/item/items/storage_cell_led.png
diff --git a/integrations/ae2/src/main/resources/integration_packs/server_data/data/avaritia_integration/recipe/ae/disassembly/infinity_me_storage_cell.json b/integrations/ae2/src/main/resources/integration_packs/server_data/data/avaritia_integration/recipe/ae/disassembly/infinity_me_storage_cell.json
new file mode 100644
index 00000000..7dc1d21b
--- /dev/null
+++ b/integrations/ae2/src/main/resources/integration_packs/server_data/data/avaritia_integration/recipe/ae/disassembly/infinity_me_storage_cell.json
@@ -0,0 +1,14 @@
+{
+ "type": "ae2:storage_cell_disassembly",
+ "cell": "avaritia_integration:infinity_me_storage_cell",
+ "cell_disassembly_items": [
+ {
+ "count": 1,
+ "id": "ae2:item_cell_housing"
+ },
+ {
+ "count": 1,
+ "id": "avaritia_integration:infinity_me_storage_component"
+ }
+ ]
+}
diff --git a/integrations/ae2/src/main/resources/integration_packs/server_data/pack.mcmeta b/integrations/ae2/src/main/resources/integration_packs/server_data/pack.mcmeta
new file mode 100644
index 00000000..290dbc46
--- /dev/null
+++ b/integrations/ae2/src/main/resources/integration_packs/server_data/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 48,
+ "description": "Avaritia Integration AE2 Data"
+ }
+}
diff --git a/integrations/ae2/src/main/templates/META-INF/neoforge.mods.toml b/integrations/ae2/src/main/templates/META-INF/neoforge.mods.toml
new file mode 100644
index 00000000..7b7f232a
--- /dev/null
+++ b/integrations/ae2/src/main/templates/META-INF/neoforge.mods.toml
@@ -0,0 +1,33 @@
+modLoader = "javafml"
+loaderVersion = "${loader_version_range}"
+license = "${mod_license}"
+
+[[mods]]
+modId = "${mod_id}"
+version = "${mod_version}"
+displayName = "${mod_name}"
+authors = "${mod_authors}"
+description = '''${mod_description}'''
+
+[[dependencies."${mod_id}"]]
+modId = "neoforge"
+type = "required"
+versionRange = "${neo_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "minecraft"
+type = "required"
+versionRange = "${minecraft_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "avaritia_integration"
+type = "required"
+versionRange = "[${mod_version},)"
+ordering = "AFTER"
+side = "BOTH"
+
+${dependency_blocks}
diff --git a/integrations/botania/build.gradle b/integrations/botania/build.gradle
new file mode 100644
index 00000000..a8c5b39e
--- /dev/null
+++ b/integrations/botania/build.gradle
@@ -0,0 +1,11 @@
+ext.ai_mod_id = 'avaritia_integration_botania'
+ext.ai_mod_name = 'Avaritia Integration Botania'
+ext.ai_mod_description = 'Avaritia Integration module for Botania.'
+ext.ai_run_directory = 'integrations/botania'
+apply from: rootProject.file('gradle/scripts/mod-project.gradle')
+
+dependencies {
+ implementation forge.reAvaritia
+ implementation project(':core')
+ implementation forge.botania
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/AIBotaniaIntegrationMod.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/AIBotaniaIntegrationMod.java
new file mode 100644
index 00000000..78b6a6a6
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/AIBotaniaIntegrationMod.java
@@ -0,0 +1,27 @@
+package committee.nova.mods.avaritia_integration.integrations.botania;
+
+import committee.nova.mods.avaritia_integration.api.load.IntegrationDataPackRegistrar;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRule;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRuntime;
+import committee.nova.mods.avaritia_integration.module.ModModule;
+
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.fml.ModContainer;
+import net.neoforged.fml.common.Mod;
+
+@Mod(AIBotaniaIntegrationMod.MOD_ID)
+public final class AIBotaniaIntegrationMod implements ModModule {
+
+ public static final String MOD_ID = "avaritia_integration_botania";
+ private static final String DEPENDENCY_MOD_ID = "botania";
+
+ public AIBotaniaIntegrationMod(IEventBus bus, ModContainer modContainer) {
+ IntegrationDataPackRegistrar.register(bus, MOD_ID, "Avaritia Integration Botania Data");
+ if (IntegrationRuntime.shouldLoad(MOD_ID, this)) IntegrationRuntime.load(MOD_ID, bus, new BotaniaModule());
+ }
+
+ @Override
+ public IntegrationRule defaultLoadRule() {
+ return ModModule.rule(ModModule.dependency(DEPENDENCY_MOD_ID));
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/BotaniaModule.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/BotaniaModule.java
new file mode 100644
index 00000000..972b0fc9
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/BotaniaModule.java
@@ -0,0 +1,138 @@
+package committee.nova.mods.avaritia_integration.integrations.botania;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.behavor.AlphaSparkBehavior;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.AlphaSparkEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityManaPoolBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlocks;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationEntities;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationItems;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.render.AlphaSparkRender;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.render.InfinityManaPoolBlockEntityRender;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.render.InfinityTinyPotatoBlockEntityRender;
+import committee.nova.mods.avaritia_integration.module.Module;
+
+import net.minecraft.client.renderer.ItemBlockRenderTypes;
+import net.minecraft.client.renderer.RenderType;
+import net.minecraft.client.renderer.blockentity.BlockEntityRenderers;
+import net.minecraft.client.renderer.entity.EntityRenderers;
+import net.minecraft.world.item.CreativeModeTab;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.DispenserBlock;
+import net.minecraft.world.level.block.FlowerPotBlock;
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent;
+import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent;
+
+import vazkii.botania.api.BotaniaForgeCapabilities;
+import vazkii.botania.api.BotaniaForgeClientCapabilities;
+import vazkii.botania.api.block_entity.BindableSpecialFlowerBlockEntity;
+import vazkii.botania.client.render.block_entity.SpecialFlowerBlockEntityRenderer;
+
+public final class BotaniaModule implements Module {
+
+ public static final String MOD_ID = "botania";
+
+ @Override
+ public void init(IEventBus registryBus) {
+ BotaniaIntegrationBlocks.REGISTRY.register(registryBus);
+ BotaniaIntegrationBlockEntities.REGISTRY.register(registryBus);
+ BotaniaIntegrationEntities.REGISTRY.register(registryBus);
+ BotaniaIntegrationItems.REGISTRY.register(registryBus);
+ }
+
+ @Override
+ public void process() {
+ ((FlowerPotBlock) Blocks.FLOWER_POT).addPlant(BotaniaIntegrationBlocks.ASGARD_DANDELION.getId(),
+ BotaniaIntegrationBlocks.POTTED_ASGARD_DANDELION);
+ ((FlowerPotBlock) Blocks.FLOWER_POT).addPlant(BotaniaIntegrationBlocks.SOARLEANDER.getId(),
+ BotaniaIntegrationBlocks.POTTED_SOARLEANDER);
+ }
+
+ @Override
+ public void registerEvent(IEventBus modBus, IEventBus gameBus) {
+ modBus.addListener(BotaniaModule::addDispenserBehaviours);
+ modBus.addListener(BotaniaModule::registerCapabilities);
+ }
+
+ public static void addDispenserBehaviours(FMLCommonSetupEvent event) {
+ event.enqueueWork(() -> {
+ DispenserBlock.registerBehavior(BotaniaIntegrationItems.ALPHA_SPARK.get(), new AlphaSparkBehavior());
+ });
+ }
+
+ public static void registerCapabilities(RegisterCapabilitiesEvent e) {
+ e.registerBlockEntity(
+ BotaniaForgeCapabilities.MANA_RECEIVER,
+ BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(),
+ (be, direction) -> be);
+ e.registerBlockEntity(
+ BotaniaForgeCapabilities.WANDABLE,
+ BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(),
+ (be, direction) -> be);
+ e.registerBlockEntity(
+ BotaniaForgeCapabilities.SPARK_ATTACHABLE,
+ BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(),
+ (be, direction) -> be);
+ }
+
+ @Override
+ public void processClient() {
+ EntityRenderers.register(BotaniaIntegrationEntities.ALPHA_SPARK_ENTITIES.get(), AlphaSparkRender::new);
+ BlockEntityRenderers.register(BotaniaIntegrationBlockEntities.ASGARD_DANDELION.get(),
+ SpecialFlowerBlockEntityRenderer::new);
+ BlockEntityRenderers.register(BotaniaIntegrationBlockEntities.SOARLEANDER.get(),
+ SpecialFlowerBlockEntityRenderer::new);
+ BlockEntityRenderers.register(BotaniaIntegrationBlockEntities.INFINITY_TINY_POTATO.get(),
+ InfinityTinyPotatoBlockEntityRender::new);
+ BlockEntityRenderers.register(BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(),
+ InfinityManaPoolBlockEntityRender::new);
+ ItemBlockRenderTypes.setRenderLayer(BotaniaIntegrationBlocks.ASGARD_DANDELION.get(), RenderType.cutout());
+ ItemBlockRenderTypes.setRenderLayer(BotaniaIntegrationBlocks.ASGARD_DANDELION_FLOATING.get(),
+ RenderType.cutout());
+ ItemBlockRenderTypes.setRenderLayer(BotaniaIntegrationBlocks.SOARLEANDER.get(), RenderType.cutout());
+ ItemBlockRenderTypes.setRenderLayer(BotaniaIntegrationBlocks.SOARLEANDER_FLOATING.get(), RenderType.cutout());
+ }
+
+ @Override
+ public void registerClientEvent(IEventBus modBus, IEventBus gameBus) {
+ modBus.addListener(BotaniaModule::registerBlockEntityClientCapability);
+ modBus.addListener(BotaniaModule::registerEntityClientCapabilities);
+ }
+
+ public static void registerBlockEntityClientCapability(RegisterCapabilitiesEvent e) {
+ e.registerBlockEntity(
+ BotaniaForgeClientCapabilities.BLOCK_WAND_HUD,
+ BotaniaIntegrationBlockEntities.ASGARD_DANDELION.get(),
+ (be, unused) -> new BindableSpecialFlowerBlockEntity.BindableFlowerWandHud<>(be));
+ e.registerBlockEntity(
+ BotaniaForgeClientCapabilities.BLOCK_WAND_HUD,
+ BotaniaIntegrationBlockEntities.SOARLEANDER.get(),
+ (be, unused) -> new BindableSpecialFlowerBlockEntity.BindableFlowerWandHud<>(be));
+ e.registerBlockEntity(
+ BotaniaForgeClientCapabilities.BLOCK_WAND_HUD,
+ BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(),
+ (be, unused) -> new InfinityManaPoolBlockEntity.WandHud(be));
+ }
+
+ private static void registerEntityClientCapabilities(RegisterCapabilitiesEvent e) {
+ e.registerEntity(
+ BotaniaForgeClientCapabilities.ENTITY_WAND_HUD,
+ BotaniaIntegrationEntities.ALPHA_SPARK_ENTITIES.get(),
+ (entity, unused) -> new AlphaSparkEntity.WandHud(entity));
+ }
+
+ @Override
+ public void collectCreativeTabItems(CreativeModeTab.ItemDisplayParameters parameters,
+ CreativeModeTab.Output output) {
+ output.accept(BotaniaIntegrationBlocks.ASGARD_DANDELION.get());
+ output.accept(BotaniaIntegrationBlocks.ASGARD_DANDELION_FLOATING.get());
+
+ output.accept(BotaniaIntegrationBlocks.SOARLEANDER.get());
+ output.accept(BotaniaIntegrationBlocks.SOARLEANDER_FLOATING.get());
+
+ output.accept(BotaniaIntegrationBlocks.INFINITY_MANA_POOL.get());
+ output.accept(BotaniaIntegrationBlocks.INFINITY_POTATO.get());
+ output.accept(BotaniaIntegrationItems.ALPHA_SPARK.get());
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/AsgardDandelionBlock.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/AsgardDandelionBlock.java
new file mode 100644
index 00000000..fc40be88
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/AsgardDandelionBlock.java
@@ -0,0 +1,41 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.block;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.AsgardDandelionBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Holder;
+import net.minecraft.world.effect.MobEffect;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityTicker;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import vazkii.botania.api.block_entity.SpecialFlowerBlockEntity;
+import vazkii.botania.common.block.BotaniaBlock;
+import vazkii.botania.common.block.flower.SpecialFlowerBlock;
+
+import java.util.function.Supplier;
+
+public class AsgardDandelionBlock extends SpecialFlowerBlock {
+
+ public AsgardDandelionBlock(Holder stewEffect, int stewDuration, Properties props,
+ Supplier> blockEntityType) {
+ super(stewEffect, stewDuration, props, blockEntityType);
+ }
+
+ @Override
+ public @Nullable BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
+ return new AsgardDandelionBlockEntity(pos, state);
+ }
+
+ @Override
+ public @Nullable BlockEntityTicker getTicker(Level level, BlockState state,
+ BlockEntityType type) {
+ return BotaniaBlock.createTickerHelper(type, BotaniaIntegrationBlockEntities.ASGARD_DANDELION.get(),
+ AsgardDandelionBlockEntity::commonTick);
+ }
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/block/InfinityManaPoolBlock.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/InfinityManaPoolBlock.java
similarity index 81%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/block/InfinityManaPoolBlock.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/InfinityManaPoolBlock.java
index 64daa8a8..8832cdac 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/block/InfinityManaPoolBlock.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/InfinityManaPoolBlock.java
@@ -1,7 +1,8 @@
-package committee.nova.mods.avaritia_integration.module.botania.block;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.block;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityManaPoolBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
-import committee.nova.mods.avaritia_integration.module.botania.entity.InfinityManaPoolBlockEntity;
-import committee.nova.mods.avaritia_integration.module.botania.registry.BotaniaIntegrationBlockEntities;
import net.minecraft.ChatFormatting;
import net.minecraft.Util;
import net.minecraft.core.BlockPos;
@@ -28,7 +29,12 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.phys.BlockHitResult;
-import net.minecraft.world.phys.shapes.*;
+import net.minecraft.world.phys.shapes.BooleanOp;
+import net.minecraft.world.phys.shapes.CollisionContext;
+import net.minecraft.world.phys.shapes.EntityCollisionContext;
+import net.minecraft.world.phys.shapes.Shapes;
+import net.minecraft.world.phys.shapes.VoxelShape;
+
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.internal.Colored;
import vazkii.botania.api.internal.OptionallyColored;
@@ -45,16 +51,18 @@
* 改自{@link vazkii.botania.common.block.mana.ManaPoolBlock}
*/
public class InfinityManaPoolBlock extends BotaniaWaterloggedBlock implements EntityBlock, OptionallyColored {
+
public static final int MAX_MANA = Integer.MAX_VALUE;
private static final VoxelShape NORMAL_SHAPE_INTERACT = box(0, 0, 0, 16, 8, 16);
private static final VoxelShape NORMAL_SHAPE_CUTOUT = box(2, 2, 2, 14, 16, 14);
- private static final VoxelShape NORMAL_SHAPE = Shapes.join(NORMAL_SHAPE_INTERACT, NORMAL_SHAPE_CUTOUT, BooleanOp.ONLY_FIRST);
+ private static final VoxelShape NORMAL_SHAPE = Shapes.join(NORMAL_SHAPE_INTERACT, NORMAL_SHAPE_CUTOUT,
+ BooleanOp.ONLY_FIRST);
- public record ShapeVariant(VoxelShape interactionShape, VoxelShape cutoutShape, VoxelShape collisionShape) {
- }
+ public record ShapeVariant(VoxelShape interactionShape, VoxelShape cutoutShape, VoxelShape collisionShape) {}
- public static final ShapeVariant NORMAL_SHAPE_VARIANT = new ShapeVariant(NORMAL_SHAPE_INTERACT, NORMAL_SHAPE_CUTOUT, NORMAL_SHAPE);
+ public static final ShapeVariant NORMAL_SHAPE_VARIANT = new ShapeVariant(NORMAL_SHAPE_INTERACT, NORMAL_SHAPE_CUTOUT,
+ NORMAL_SHAPE);
public final boolean creative = false;
public final boolean fabulous = false;
@@ -109,7 +117,8 @@ public MutableComponent getName() {
}
@Override
- public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag flag) {
+ public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip,
+ TooltipFlag flag) {
super.appendHoverText(stack, context, tooltip, flag);
if (creative) {
for (int i = 0; i < 2; i++) {
@@ -130,9 +139,8 @@ public VoxelShape getInnerShape(BlockState state) {
@Override
public VoxelShape getCollisionShape(BlockState state, BlockGetter world, BlockPos pos, CollisionContext context) {
// Sometimes the pool's collision box is too thin for bursts shot straight up.
- return context instanceof EntityCollisionContext ecc && ecc.getEntity() instanceof ManaBurstEntity
- ? getInteractionShape(state, world, pos)
- : super.getCollisionShape(state, world, pos, context);
+ return context instanceof EntityCollisionContext ecc && ecc.getEntity() instanceof ManaBurstEntity ?
+ getInteractionShape(state, world, pos) : super.getCollisionShape(state, world, pos, context);
}
@Override
@@ -167,9 +175,9 @@ protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Lev
@Override
protected void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean movedByPiston) {
- if (state.getBlock() instanceof InfinityManaPoolBlock oldBlock
- && newState.getBlock() instanceof InfinityManaPoolBlock newBlock
- && InfinityManaPoolBlock.getUndyedBlock(oldBlock) == InfinityManaPoolBlock.getUndyedBlock(newBlock)) {
+ if (state.getBlock() instanceof InfinityManaPoolBlock oldBlock &&
+ newState.getBlock() instanceof InfinityManaPoolBlock newBlock &&
+ InfinityManaPoolBlock.getUndyedBlock(oldBlock) == InfinityManaPoolBlock.getUndyedBlock(newBlock)) {
// don't delete block entity if it's the same pool type
return;
}
@@ -183,13 +191,16 @@ public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
@Nullable
@Override
- public BlockEntityTicker getTicker(Level level, BlockState state, BlockEntityType type) {
- return createTickerHelper(type, BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(), level.isClientSide ? InfinityManaPoolBlockEntity::clientTick : InfinityManaPoolBlockEntity::serverTick);
+ public BlockEntityTicker getTicker(Level level, BlockState state,
+ BlockEntityType type) {
+ return createTickerHelper(type, BotaniaIntegrationBlockEntities.INFINITY_MANA_POOL.get(),
+ level.isClientSide ? InfinityManaPoolBlockEntity::clientTick : InfinityManaPoolBlockEntity::serverTick);
}
@Override
public void entityInside(BlockState state, Level world, BlockPos pos, Entity entity) {
- if (entity instanceof ItemEntity item && world.getBlockEntity(pos) instanceof InfinityManaPoolBlockEntity pool) {
+ if (entity instanceof ItemEntity item &&
+ world.getBlockEntity(pos) instanceof InfinityManaPoolBlockEntity pool) {
pool.collideEntityItem(item);
}
}
@@ -210,9 +221,8 @@ public boolean hasAnalogOutputSignal(BlockState state) {
@Override
public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) {
- return world.getBlockEntity(pos) instanceof InfinityManaPoolBlockEntity pool
- ? InfinityManaPoolBlockEntity.calculateComparatorLevel(pool.getCurrentMana(), pool.getMaxMana())
- : 0;
+ return world.getBlockEntity(pos) instanceof InfinityManaPoolBlockEntity pool ?
+ InfinityManaPoolBlockEntity.calculateComparatorLevel(pool.getCurrentMana(), pool.getMaxMana()) : 0;
}
@Override
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/InfinityTinyPotatoBlock.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/InfinityTinyPotatoBlock.java
new file mode 100644
index 00000000..43cbbcd8
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/InfinityTinyPotatoBlock.java
@@ -0,0 +1,163 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.block;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityTinyPotatoBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Direction;
+import net.minecraft.core.component.DataComponents;
+import net.minecraft.core.particles.ParticleTypes;
+import net.minecraft.util.RandomSource;
+import net.minecraft.world.Containers;
+import net.minecraft.world.InteractionHand;
+import net.minecraft.world.InteractionResult;
+import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.inventory.AbstractContainerMenu;
+import net.minecraft.world.item.ItemStack;
+import net.minecraft.world.item.context.BlockPlaceContext;
+import net.minecraft.world.level.BlockGetter;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.EntityBlock;
+import net.minecraft.world.level.block.Mirror;
+import net.minecraft.world.level.block.RenderShape;
+import net.minecraft.world.level.block.Rotation;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityTicker;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.block.state.StateDefinition;
+import net.minecraft.world.level.block.state.properties.BlockStateProperties;
+import net.minecraft.world.phys.BlockHitResult;
+import net.minecraft.world.phys.shapes.CollisionContext;
+import net.minecraft.world.phys.shapes.VoxelShape;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import vazkii.botania.common.block.BotaniaBlocks;
+import vazkii.botania.common.block.BotaniaWaterloggedBlock;
+import vazkii.botania.common.block.block_entity.SimpleInventoryBlockEntity;
+import vazkii.botania.common.block.block_entity.TinyPotatoBlockEntity;
+
+public class InfinityTinyPotatoBlock extends BotaniaWaterloggedBlock implements EntityBlock {
+
+ private static final VoxelShape SHAPE = box(4.0, 0.0, 4.0, 12.0, 12.0, 12.0);
+
+ public InfinityTinyPotatoBlock() {
+ super(Properties.ofFullCopy(BotaniaBlocks.tinyPotato));
+ this.registerDefaultState(
+ this.defaultBlockState().setValue(BlockStateProperties.HORIZONTAL_FACING, Direction.SOUTH));
+ }
+
+ @Override
+ protected void createBlockStateDefinition(StateDefinition.Builder builder) {
+ super.createBlockStateDefinition(builder);
+ builder.add(BlockStateProperties.HORIZONTAL_FACING);
+ }
+
+ @Override
+ public boolean hasAnalogOutputSignal(@NotNull BlockState state) {
+ return true;
+ }
+
+ @Override
+ public int getAnalogOutputSignal(@NotNull BlockState state, Level level, @NotNull BlockPos pos) {
+ BlockEntity var5 = level.getBlockEntity(pos);
+ if (var5 instanceof TinyPotatoBlockEntity tater) {
+ return AbstractContainerMenu.getRedstoneSignalFromContainer(tater);
+ } else {
+ return 0;
+ }
+ }
+
+ @Override
+ public void onRemove(@NotNull BlockState state, @NotNull Level world, @NotNull BlockPos pos,
+ @NotNull BlockState newState, boolean isMoving) {
+ if (!state.is(newState.getBlock())) {
+ BlockEntity be = world.getBlockEntity(pos);
+ if (be instanceof SimpleInventoryBlockEntity inventory) {
+ Containers.dropContents(world, pos, inventory.getItemHandler());
+ world.updateNeighbourForOutputSignal(pos, this);
+ }
+
+ super.onRemove(state, world, pos, newState, isMoving);
+ }
+ }
+
+ @Override
+ public @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter world, @NotNull BlockPos pos,
+ @NotNull CollisionContext ctx) {
+ return SHAPE;
+ }
+
+ @Override
+ protected InteractionResult useWithoutItem(BlockState state, Level world, BlockPos pos, Player player,
+ BlockHitResult hit) {
+ if (world.getBlockEntity(pos) instanceof InfinityTinyPotatoBlockEntity potatoTile) {
+ InteractionHand hand = player.getUsedItemHand();
+ ItemStack heldItem = player.getItemInHand(hand);
+ potatoTile.interact(player, hand, heldItem, hit.getDirection());
+
+ // 粒子和音效
+ double x = pos.getX();
+ double y = pos.getY();
+ double z = pos.getZ();
+ RandomSource rand = world.random;
+ for (int i = 0; i < 10; i++)
+ world.addParticle(ParticleTypes.HEART, x + rand.nextDouble(), y + rand.nextDouble(),
+ z + rand.nextDouble(), 0.0D, 0.1D + rand.nextDouble(), 0.0D);
+ // if (heldItem.isEmpty() && player.isCrouching()) {
+ // world.playSound(player, pos, SoundEvents.GENERIC_EXPLODE, SoundSource.BLOCKS, 1.0f, 1.0f);
+ // for (int i = 0; i < 5; i++)
+ // world.addParticle(ParticleTypes.EXPLOSION, x + rand.nextDouble(), y + rand.nextDouble(), z +
+ // rand.nextDouble(), 0.1D, 0.1D + rand.nextDouble(), 0.1D);
+ // }
+ }
+ return InteractionResult.sidedSuccess(world.isClientSide());
+ }
+
+ @Override
+ public @NotNull BlockState getStateForPlacement(BlockPlaceContext ctx) {
+ return super.getStateForPlacement(ctx).setValue(BlockStateProperties.HORIZONTAL_FACING,
+ ctx.getHorizontalDirection());
+ }
+
+ @Override
+ public @NotNull BlockState mirror(@NotNull BlockState state, Mirror mirror) {
+ return state.setValue(BlockStateProperties.HORIZONTAL_FACING,
+ mirror.mirror(state.getValue(BlockStateProperties.HORIZONTAL_FACING)));
+ }
+
+ @Override
+ public @NotNull BlockState rotate(@NotNull BlockState state, Rotation rot) {
+ return state.setValue(BlockStateProperties.HORIZONTAL_FACING,
+ rot.rotate(state.getValue(BlockStateProperties.HORIZONTAL_FACING)));
+ }
+
+ @Override
+ public void setPlacedBy(Level world, BlockPos pos, BlockState state,
+ @Nullable LivingEntity living, ItemStack stack) {
+ if (stack.has(DataComponents.CUSTOM_NAME) && world.getBlockEntity(pos) instanceof TinyPotatoBlockEntity tater) {
+ tater.name = stack.getHoverName();
+ }
+ }
+
+ @Override
+ public @NotNull RenderShape getRenderShape(BlockState state) {
+ return RenderShape.ENTITYBLOCK_ANIMATED;
+ }
+
+ @Override
+ public @NotNull BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
+ return new InfinityTinyPotatoBlockEntity(pos, state);
+ }
+
+ @Override
+ public @Nullable BlockEntityTicker getTicker(@NotNull Level level,
+ @NotNull BlockState state,
+ @NotNull BlockEntityType type) {
+ return createTickerHelper(type, BotaniaIntegrationBlockEntities.INFINITY_TINY_POTATO.get(),
+ InfinityTinyPotatoBlockEntity::commonTick);
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/SoarleanderBlock.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/SoarleanderBlock.java
new file mode 100644
index 00000000..b7975b88
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/SoarleanderBlock.java
@@ -0,0 +1,41 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.block;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.SoarleanderBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
+
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.Holder;
+import net.minecraft.world.effect.MobEffect;
+import net.minecraft.world.level.Level;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityTicker;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.minecraft.world.level.block.state.BlockState;
+
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import vazkii.botania.api.block_entity.SpecialFlowerBlockEntity;
+import vazkii.botania.common.block.BotaniaBlock;
+import vazkii.botania.common.block.flower.SpecialFlowerBlock;
+
+import java.util.function.Supplier;
+
+public class SoarleanderBlock extends SpecialFlowerBlock {
+
+ public SoarleanderBlock(Holder stewEffect, int stewDuration, Properties props,
+ Supplier> blockEntityType) {
+ super(stewEffect, stewDuration, props, blockEntityType);
+ }
+
+ @Override
+ public @Nullable BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) {
+ return new SoarleanderBlockEntity(pos, state);
+ }
+
+ @Override
+ public @Nullable BlockEntityTicker getTicker(Level level, BlockState state,
+ BlockEntityType type) {
+ return BotaniaBlock.createTickerHelper(type, BotaniaIntegrationBlockEntities.SOARLEANDER.get(),
+ SoarleanderBlockEntity::commonTick);
+ }
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/block/behavor/AlphaSparkBehavior.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/behavor/AlphaSparkBehavior.java
similarity index 81%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/block/behavor/AlphaSparkBehavior.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/behavor/AlphaSparkBehavior.java
index b78cd5ae..192610b7 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/block/behavor/AlphaSparkBehavior.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/block/behavor/AlphaSparkBehavior.java
@@ -1,6 +1,7 @@
-package committee.nova.mods.avaritia_integration.module.botania.block.behavor;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.block.behavor;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.item.AlphaSparkItem;
-import committee.nova.mods.avaritia_integration.module.botania.item.AlphaSparkItem;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.dispenser.BlockSource;
@@ -8,6 +9,7 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.DispenserBlock;
+
import org.jetbrains.annotations.NotNull;
/**
@@ -26,4 +28,4 @@ protected ItemStack execute(BlockSource source, @NotNull ItemStack stack) {
return stack;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/AlphaSparkEntity.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/AlphaSparkEntity.java
similarity index 87%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/AlphaSparkEntity.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/AlphaSparkEntity.java
index 6c8e4132..690deb57 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/AlphaSparkEntity.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/AlphaSparkEntity.java
@@ -1,7 +1,7 @@
-package committee.nova.mods.avaritia_integration.module.botania.entity;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.entity;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationEntities;
-import com.mojang.blaze3d.platform.Window;
-import committee.nova.mods.avaritia_integration.module.botania.registry.BotaniaIntegrationEntities;
import net.minecraft.ChatFormatting;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
@@ -24,6 +24,8 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.AABB;
+
+import com.mojang.blaze3d.platform.Window;
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.BotaniaAPI;
import vazkii.botania.api.block.WandHUD;
@@ -46,15 +48,26 @@
import vazkii.botania.network.clientbound.BotaniaEffectPacket;
import vazkii.botania.xplat.XplatAbstractions;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
/**
* @author cnlimiter
*/
public class AlphaSparkEntity extends SparkBaseEntity implements ManaSpark {
+
private static final int TRANSFER_RATE = 100000;
private static final String TAG_UPGRADE = "upgrade";
- private static final EntityDataAccessor UPGRADE = SynchedEntityData.defineId(AlphaSparkEntity.class, EntityDataSerializers.INT);
+ private static final EntityDataAccessor UPGRADE = SynchedEntityData.defineId(AlphaSparkEntity.class,
+ EntityDataSerializers.INT);
private final Set outgoingTransfers = Collections.newSetFromMap(new WeakHashMap<>());
@@ -109,7 +122,8 @@ public void tick() {
AABB aabb = VecHelper.boxForRange(
this.position().with(Direction.Axis.Y, getY() + (getBbHeight() / 2.0)),
SparkHelper.SPARK_SCAN_RANGE);
- List players = level().getEntitiesOfClass(Player.class, aabb, EntitySelector.ENTITY_STILL_ALIVE);
+ List players = level().getEntitiesOfClass(Player.class, aabb,
+ EntitySelector.ENTITY_STILL_ALIVE);
Map> receivingPlayers = new HashMap<>();
@@ -140,7 +154,8 @@ public void tick() {
receivingStacks = receivingPlayers.get(player);
}
- int recv = Math.min(receiver.getCurrentMana(), Math.min(TRANSFER_RATE, manaItem.getMaxMana() - manaItem.getMana()));
+ int recv = Math.min(receiver.getCurrentMana(),
+ Math.min(TRANSFER_RATE, manaItem.getMaxMana() - manaItem.getMana()));
if (recv > 0) {
receivingStacks.put(manaItem, recv);
if (add) {
@@ -172,7 +187,8 @@ public void tick() {
updateTransfers();
}
if (!transfersTowardsSelfToRegister.isEmpty()) {
- transfersTowardsSelfToRegister.remove(transfersTowardsSelfToRegister.size() - 1).registerTransfer(this);
+ transfersTowardsSelfToRegister.remove(transfersTowardsSelfToRegister.size() - 1)
+ .registerTransfer(this);
}
}
// Recessive does not need to be handled because recessive sparks get notified in all relevant cases
@@ -200,7 +216,8 @@ public void tick() {
count--;
SparkAttachable attached = spark.getAttachedTile();
var attachedReceiver = spark.getAttachedManaReceiver();
- if (attached == null || attachedReceiver == null || attachedReceiver.isFull() || spark.areIncomingTransfersDone()) {
+ if (attached == null || attachedReceiver == null || attachedReceiver.isFull() ||
+ spark.areIncomingTransfersDone()) {
shouldFilterTransfers = true;
continue;
}
@@ -234,23 +251,24 @@ public void updateTransfers() {
transfersTowardsSelfToRegister.clear();
switch (getUpgrade()) {
case RECESSIVE -> {
- var otherSparks = SparkHelper.getSparksAround(level(), getX(), getY() + (getBbHeight() / 2), getZ(), getNetwork());
+ var otherSparks = SparkHelper.getSparksAround(level(), getX(), getY() + (getBbHeight() / 2), getZ(),
+ getNetwork());
Collections.shuffle(otherSparks);
for (var otherSpark : otherSparks) {
SparkUpgradeType otherUpgrade = otherSpark.getUpgrade();
- if (otherSpark != this
- && otherUpgrade != SparkUpgradeType.DOMINANT
- && otherUpgrade != SparkUpgradeType.RECESSIVE
- && otherUpgrade != SparkUpgradeType.ISOLATED) {
+ if (otherSpark != this && otherUpgrade != SparkUpgradeType.DOMINANT &&
+ otherUpgrade != SparkUpgradeType.RECESSIVE && otherUpgrade != SparkUpgradeType.ISOLATED) {
outgoingTransfers.add(otherSpark);
}
}
}
case DOMINANT -> {
- List validSparks = SparkHelper.getSparksAround(level(), getX(), getY() + (getBbHeight() / 2), getZ(), getNetwork());
+ List validSparks = SparkHelper.getSparksAround(level(), getX(), getY() + (getBbHeight() / 2),
+ getZ(), getNetwork());
for (var spark : validSparks) {
SparkUpgradeType otherUpgrade = spark.getUpgrade();
- if (spark != this && otherUpgrade == SparkUpgradeType.NONE && spark.getAttachedManaReceiver() instanceof ManaPool) {
+ if (spark != this && otherUpgrade == SparkUpgradeType.NONE &&
+ spark.getAttachedManaReceiver() instanceof ManaPool) {
transfersTowardsSelfToRegister.add(spark);
}
}
@@ -261,8 +279,9 @@ public void updateTransfers() {
}
private void particlesTowards(Entity e) {
- XplatAbstractions.INSTANCE.sendToTracking(this, new BotaniaEffectPacket(EffectType.SPARK_MANA_FLOW, getX(), getY(), getZ(),
- getId(), e.getId(), getNetwork().getTextureDiffuseColor()));
+ XplatAbstractions.INSTANCE.sendToTracking(this,
+ new BotaniaEffectPacket(EffectType.SPARK_MANA_FLOW, getX(), getY(), getZ(),
+ getId(), e.getId(), getNetwork().getTextureDiffuseColor()));
}
public static void particleBeam(Player player, Entity e1, Entity e2) {
@@ -358,7 +377,8 @@ protected void addAdditionalSaveData(CompoundTag cmp) {
@Nullable
@Override
public SparkAttachable getAttachedTile() {
- return XplatAbstractions.INSTANCE.findSparkAttachable(level(), getAttachPos(), level().getBlockState(getAttachPos()), level().getBlockEntity(getAttachPos()), Direction.UP);
+ return XplatAbstractions.INSTANCE.findSparkAttachable(level(), getAttachPos(),
+ level().getBlockState(getAttachPos()), level().getBlockEntity(getAttachPos()), Direction.UP);
}
@Nullable
@@ -375,15 +395,12 @@ private void filterTransfers() {
SparkUpgradeType supgr = spark.getUpgrade();
ManaReceiver arecv = spark.getAttachedManaReceiver();
- if (spark == this
- || !((Entity) spark).isAlive()
- || spark.areIncomingTransfersDone()
- || getNetwork() != spark.getNetwork()
- || arecv == null
- || arecv.isFull()
- || !(upgr == SparkUpgradeType.NONE && supgr == SparkUpgradeType.DOMINANT
- || upgr == SparkUpgradeType.RECESSIVE && (supgr == SparkUpgradeType.NONE || supgr == SparkUpgradeType.DISPERSIVE)
- || !(arecv instanceof ManaPool))) {
+ if (spark == this || !((Entity) spark).isAlive() || spark.areIncomingTransfersDone() ||
+ getNetwork() != spark.getNetwork() || arecv == null || arecv.isFull() ||
+ !(upgr == SparkUpgradeType.NONE && supgr == SparkUpgradeType.DOMINANT ||
+ upgr == SparkUpgradeType.RECESSIVE &&
+ (supgr == SparkUpgradeType.NONE || supgr == SparkUpgradeType.DISPERSIVE) ||
+ !(arecv instanceof ManaPool))) {
iter.remove();
}
}
@@ -446,6 +463,7 @@ public boolean areIncomingTransfersDone() {
}
public record WandHud(AlphaSparkEntity entity) implements WandHUD {
+
@Override
public void renderHUD(GuiGraphics gui, Window window, Font font, float partialTick) {
ItemStack sparkStack = new ItemStack(entity.getSparkItem());
@@ -458,8 +476,7 @@ public void renderHUD(GuiGraphics gui, Window window, Font font, float partialTi
int width = 4 + Collections.max(Arrays.asList(
font.width(networkColorName),
RenderHelper.itemWithNameWidth(sparkStack, font),
- RenderHelper.itemWithNameWidth(augmentStack, font)
- ));
+ RenderHelper.itemWithNameWidth(augmentStack, font)));
int height = augmentStack.isEmpty() ? 30 : 50;
int networkColorTextStart = font.width(networkColorName) / 2;
@@ -470,7 +487,8 @@ public void renderHUD(GuiGraphics gui, Window window, Font font, float partialTi
RenderHelper.renderItemWithNameCentered(gui, window, font, sparkStack, centerY + 10, textColor);
RenderHelper.renderItemWithNameCentered(gui, window, font, augmentStack, centerY + 28, textColor);
- gui.drawString(font, networkColorName, centerX - networkColorTextStart, centerY + (augmentStack.isEmpty() ? 28 : 46), textColor);
+ gui.drawString(font, networkColorName, centerX - networkColorTextStart,
+ centerY + (augmentStack.isEmpty() ? 28 : 46), textColor);
}
}
}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/AsgardDandelionBlockEntity.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/AsgardDandelionBlockEntity.java
similarity index 90%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/AsgardDandelionBlockEntity.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/AsgardDandelionBlockEntity.java
index 9b6ca3b1..3669061e 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/AsgardDandelionBlockEntity.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/AsgardDandelionBlockEntity.java
@@ -1,10 +1,12 @@
-package committee.nova.mods.avaritia_integration.module.botania.entity;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.entity;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
-import committee.nova.mods.avaritia_integration.module.botania.registry.BotaniaIntegrationBlockEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.Vec3;
+
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.BotaniaAPI;
import vazkii.botania.api.block_entity.GeneratingFlowerBlockEntity;
@@ -16,6 +18,7 @@
import java.awt.*;
public class AsgardDandelionBlockEntity extends GeneratingFlowerBlockEntity {
+
private static final int RANGE = 8;
public AsgardDandelionBlockEntity(BlockPos pos, BlockState state) {
@@ -78,7 +81,7 @@ public void tickFlower() {
long gameTime = this.level.getGameTime();
float hue = (gameTime % 100) / 100.0f;
- int color = java.awt.Color.HSBtoRGB(hue, 1.0f, 1.0f);
+ int color = Color.HSBtoRGB(hue, 1.0f, 1.0f);
float red = (color >> 16 & 0xFF) / 255F;
float green = (color >> 8 & 0xFF) / 255F;
float blue = (color & 0xFF) / 255F;
@@ -87,7 +90,8 @@ public void tickFlower() {
double x = this.getBlockPos().getX() + offset.x;
double y = this.getBlockPos().getY() + offset.y;
double z = this.getBlockPos().getZ() + offset.z;
- BotaniaAPI.instance().sparkleFX(this.level, x + 0.3 + Math.random() * 0.5, y + 0.5 + Math.random() * 0.5, z + 0.3 + Math.random() * 0.5, red, green, blue, (float) Math.random(), 5);
+ BotaniaAPI.instance().sparkleFX(this.level, x + 0.3 + Math.random() * 0.5, y + 0.5 + Math.random() * 0.5,
+ z + 0.3 + Math.random() * 0.5, red, green, blue, (float) Math.random(), 5);
}
}
@@ -112,4 +116,4 @@ public int getColor() {
public boolean isOvergrowthAffected() {
return true;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/InfinityManaPoolBlockEntity.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/InfinityManaPoolBlockEntity.java
similarity index 91%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/InfinityManaPoolBlockEntity.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/InfinityManaPoolBlockEntity.java
index fc9a0799..dcba0b41 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/InfinityManaPoolBlockEntity.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/InfinityManaPoolBlockEntity.java
@@ -1,11 +1,8 @@
-package committee.nova.mods.avaritia_integration.module.botania.entity;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.entity;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.InfinityManaPoolBlock;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
-import com.mojang.blaze3d.platform.Window;
-import com.mojang.blaze3d.systems.RenderSystem;
-import committee.nova.mods.avaritia_integration.module.botania.block.InfinityManaPoolBlock;
-import committee.nova.mods.avaritia_integration.module.botania.registry.BotaniaIntegrationBlockEntities;
-import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
-import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.core.BlockPos;
@@ -24,6 +21,11 @@
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
+
+import com.mojang.blaze3d.platform.Window;
+import com.mojang.blaze3d.systems.RenderSystem;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import org.apache.commons.lang3.mutable.MutableInt;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnknownNullability;
@@ -62,7 +64,8 @@
* 改自{@link vazkii.botania.common.block.block_entity.mana.ManaPoolBlockEntity}
*/
public class InfinityManaPoolBlockEntity extends BotaniaBlockEntity implements ManaPool, KeyLocked, SparkAttachable,
- ThrottledPacket, Wandable {
+ ThrottledPacket, Wandable {
+
public static final int PARTICLE_COLOR = 0x00C6FF;
public static final float PARTICLE_COLOR_BLUE = (PARTICLE_COLOR & 0xFF) / 255F;
public static final float PARTICLE_COLOR_GREEN = (PARTICLE_COLOR >> 8 & 0xFF) / 255F;
@@ -142,7 +145,8 @@ public RecipeHolder getMatchingRecipe(ItemStack stack, Block
}
// Recipes with matching catalyst take priority above recipes with no catalyst specified
- return !matchingCatRecipes.isEmpty() ? matchingCatRecipes.getFirst() : !matchingNonCatRecipes.isEmpty() ? matchingNonCatRecipes.getFirst() : null;
+ return !matchingCatRecipes.isEmpty() ? matchingCatRecipes.getFirst() :
+ !matchingNonCatRecipes.isEmpty() ? matchingNonCatRecipes.getFirst() : null;
}
public boolean collideEntityItem(ItemEntity item) {
@@ -169,9 +173,10 @@ public boolean collideEntityItem(ItemEntity item) {
ItemStack output = recipe.value().getRecipeOutput(level.registryAccess(), stack);
EntityHelper.shrinkItem(item);
- item.setOnGround(false); //Force entity collision update to run every tick if crafting is in progress
+ item.setOnGround(false); // Force entity collision update to run every tick if crafting is in progress
- ItemEntity outputItem = new ItemEntity(level, worldPosition.getX() + 0.5, worldPosition.getY() + 1.5, worldPosition.getZ() + 0.5, output);
+ ItemEntity outputItem = new ItemEntity(level, worldPosition.getX() + 0.5, worldPosition.getY() + 1.5,
+ worldPosition.getZ() + 0.5, output);
XplatAbstractions.INSTANCE.itemFlagsComponent(outputItem).manaInfusionSpawned = true;
if (item.getOwner() instanceof Player player) {
player.triggerRecipeCrafted(recipe, List.of(output));
@@ -208,8 +213,11 @@ public boolean triggerEvent(int event, int param) {
float red = (float) Math.random();
float green = (float) Math.random();
float blue = (float) Math.random();
- SparkleParticleData data = SparkleParticleData.sparkle((float) Math.random(), red, green, blue, 10);
- level.addParticle(data, worldPosition.getX() + 0.5 + Math.random() * 0.4 - 0.2, worldPosition.getY() + 0.75, worldPosition.getZ() + 0.5 + Math.random() * 0.4 - 0.2, 0, 0, 0);
+ SparkleParticleData data = SparkleParticleData.sparkle((float) Math.random(), red, green, blue,
+ 10);
+ level.addParticle(data, worldPosition.getX() + 0.5 + Math.random() * 0.4 - 0.2,
+ worldPosition.getY() + 0.75, worldPosition.getZ() + 0.5 + Math.random() * 0.4 - 0.2, 0,
+ 0, 0);
}
}
@@ -238,7 +246,8 @@ private void initManaCapAndNetwork() {
}
}
- public static void clientTick(Level level, BlockPos worldPosition, BlockState state, InfinityManaPoolBlockEntity self) {
+ public static void clientTick(Level level, BlockPos worldPosition, BlockState state,
+ InfinityManaPoolBlockEntity self) {
self.initManaCapAndNetwork();
double particleChance = 1F - (double) self.getCurrentMana() / (double) self.getMaxMana() * 0.1;
if (Math.random() > particleChance) {
@@ -277,8 +286,8 @@ private static void displayChargingParticles(Level level, BlockPos worldPosition
}
} else {
Vec3 itemPosRel = randomizeItemPos(itemPosRelBase);
- Vec3 poolPosRel =
- new Vec3(0.05 + 0.9 * Math.random(), 0.35 * relativeMana, 0.05 + 0.9 * Math.random());
+ Vec3 poolPosRel = new Vec3(0.05 + 0.9 * Math.random(), 0.35 * relativeMana,
+ 0.05 + 0.9 * Math.random());
addManaFlowParticle(level, worldPosition, itemPosRel, poolPosRel);
}
}
@@ -321,8 +330,8 @@ private static void addManaFlowParticle(Level level, BlockPos worldPosition, Vec
worldPosition.getZ() + startPos.z, v0.x, v0.y, v0.z);
}
- public static void serverTick(Level level, BlockPos worldPosition, BlockState state, InfinityManaPoolBlockEntity self) {
-
+ public static void serverTick(Level level, BlockPos worldPosition, BlockState state,
+ InfinityManaPoolBlockEntity self) {
self.initManaCapAndNetwork();
boolean wasDoingTransfer = self.isDoingTransfer;
self.isDoingTransfer = false;
@@ -346,7 +355,8 @@ public static void serverTick(Level level, BlockPos worldPosition, BlockState st
var mana = XplatAbstractions.INSTANCE.findManaItem(stack);
if (!stack.isEmpty() && mana != null) {
boolean isOutputting = self.isOutputtingPower();
- if (isOutputting && mana.canReceiveManaFromPool(self) || !isOutputting && mana.canDrainManaToPool(self)) {
+ if (isOutputting && mana.canReceiveManaFromPool(self) ||
+ !isOutputting && mana.canDrainManaToPool(self)) {
boolean didSomething = false;
int bellowCount = isOutputting ? getBellowCount(level, worldPosition, self) : 0;
@@ -358,7 +368,8 @@ public static void serverTick(Level level, BlockPos worldPosition, BlockState st
didSomething = true;
}
- int manaVal = Math.min(transfRate, Math.min(self.getCurrentMana(), mana.getMaxMana() - mana.getMana()));
+ int manaVal = Math.min(transfRate,
+ Math.min(self.getCurrentMana(), mana.getMaxMana() - mana.getMana()));
mana.addMana(manaVal);
self.receiveMana(-manaVal);
}
@@ -368,8 +379,10 @@ public static void serverTick(Level level, BlockPos worldPosition, BlockState st
didSomething = true;
}
- int manaVal = Math.min(transfRate, Math.min(self.getMaxMana() - self.getCurrentMana(), mana.getMana()));
- if (manaVal == 0 && self.level.getBlockState(worldPosition.below()).is(BotaniaBlocks.manaVoid)) {
+ int manaVal = Math.min(transfRate,
+ Math.min(self.getMaxMana() - self.getCurrentMana(), mana.getMana()));
+ if (manaVal == 0 &&
+ self.level.getBlockState(worldPosition.below()).is(BotaniaBlocks.manaVoid)) {
manaVal = Math.min(transfRate, mana.getMana());
}
mana.addMana(-manaVal);
@@ -478,6 +491,7 @@ public boolean onUsedByWand(@Nullable Player player, ItemStack stack, Direction
}
public static class WandHud implements WandHUD {
+
private final InfinityManaPoolBlockEntity pool;
public WandHud(InfinityManaPoolBlockEntity pool) {
@@ -496,14 +510,16 @@ public void renderHUD(GuiGraphics gui, Window window, Font font, float partialTi
RenderHelper.renderHUDBox(gui, centerX - width / 2, centerY + 8, centerX + width / 2, centerY + 48);
- BotaniaAPIClient.instance().drawSimpleManaHUD(gui, window, font, 0x0095FF, pool.getCurrentMana(), pool.getMaxMana(), name);
+ BotaniaAPIClient.instance().drawSimpleManaHUD(gui, window, font, 0x0095FF, pool.getCurrentMana(),
+ pool.getMaxMana(), name);
RenderSystem.enableBlend();
RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
int arrowU = pool.isOutputtingPower() ? 22 : 0;
int arrowV = 38;
- RenderHelper.drawTexturedModalRect(gui, HUDHandler.manaBar, centerX - 11, centerY + 30, arrowU, arrowV, 22, 15);
+ RenderHelper.drawTexturedModalRect(gui, HUDHandler.manaBar, centerX - 11, centerY + 30, arrowU, arrowV, 22,
+ 15);
RenderSystem.setShaderColor(1F, 1F, 1F, 1F);
ItemStack tablet = new ItemStack(BotaniaItems.manaTablet);
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/InfinityTinyPotatoBlockEntity.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/InfinityTinyPotatoBlockEntity.java
similarity index 76%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/InfinityTinyPotatoBlockEntity.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/InfinityTinyPotatoBlockEntity.java
index b1fb5cb4..36ed9a8e 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/InfinityTinyPotatoBlockEntity.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/InfinityTinyPotatoBlockEntity.java
@@ -1,7 +1,7 @@
-package committee.nova.mods.avaritia_integration.module.botania.entity;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.entity;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
-import committee.nova.mods.avaritia_integration.module.botania.registry.BotaniaIntegrationBlockEntities;
-import it.unimi.dsi.fastutil.ints.IntArrayList;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Holder;
@@ -36,6 +36,8 @@
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
+
+import it.unimi.dsi.fastutil.ints.IntArrayList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.internal.VanillaPacketDispatcher;
@@ -48,21 +50,38 @@
import java.time.LocalDateTime;
import java.time.Month;
-import java.util.*;
-
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
public class InfinityTinyPotatoBlockEntity extends BlockEntity implements Nameable {
- private static final ResourceLocation BIRTHDAY_ADVANCEMENT = ResourceLocation.fromNamespaceAndPath("botania", "challenge/tiny_potato_birthday");
+
+ private static final ResourceLocation BIRTHDAY_ADVANCEMENT = ResourceLocation.fromNamespaceAndPath("botania",
+ "challenge/tiny_potato_birthday");
private static final boolean IS_BIRTHDAY = isTinyPotatoBirthday();
private static final String TAG_NAME = "name";
private static final int JUMP_EVENT = 0;
- private static final Map GENDER = new HashMap(Map.ofEntries(Map.entry("girlstater", "daughter"), Map.entry("lesbiabtater", "daughter"), Map.entry("lesbiamtater", "daughter"), Map.entry("lesbiantater", "daughter"), Map.entry("lesbitater", "daughter"), Map.entry("lessbientater", "daughter"), Map.entry("agendertater", "child"), Map.entry("enbytater", "child"), Map.entry("nbtater", "child"), Map.entry("nonbinarytater", "child"), Map.entry("robotater", "child"), Map.entry("wiretater", "child"), Map.entry("eutrotater", "child"), Map.entry("bob", "child"), Map.entry("snences", "child"), Map.entry("genderfluidtater", "child"), Map.entry("taterfluid", "child"), Map.entry("eggtater", "child"), Map.entry("tategg", "child"), Map.entry("transtater", "child"), Map.entry("manytater", "children"), Map.entry("pluraltater", "children"), Map.entry("snorps", "children"), Map.entry("systater", "children"), Map.entry("systemtater", "children"), Map.entry("tomater", "tomato")));
+ private static final Map GENDER = new HashMap(Map.ofEntries(Map.entry("girlstater", "daughter"),
+ Map.entry("lesbiabtater", "daughter"), Map.entry("lesbiamtater", "daughter"),
+ Map.entry("lesbiantater", "daughter"), Map.entry("lesbitater", "daughter"),
+ Map.entry("lessbientater", "daughter"), Map.entry("agendertater", "child"), Map.entry("enbytater", "child"),
+ Map.entry("nbtater", "child"), Map.entry("nonbinarytater", "child"), Map.entry("robotater", "child"),
+ Map.entry("wiretater", "child"), Map.entry("eutrotater", "child"), Map.entry("bob", "child"),
+ Map.entry("snences", "child"), Map.entry("genderfluidtater", "child"), Map.entry("taterfluid", "child"),
+ Map.entry("eggtater", "child"), Map.entry("tategg", "child"), Map.entry("transtater", "child"),
+ Map.entry("manytater", "children"), Map.entry("pluraltater", "children"), Map.entry("snorps", "children"),
+ Map.entry("systater", "children"), Map.entry("systemtater", "children"), Map.entry("tomater", "tomato")));
public int jumpTicks = 0;
public Component name = Component.literal("");
private int nextDoIt = 0;
private int birthdayTick = 0;
- private static final List ALL_CANDLE_CAKES = List.of(Blocks.WHITE_CANDLE_CAKE, Blocks.ORANGE_CANDLE_CAKE, Blocks.MAGENTA_CANDLE_CAKE, Blocks.LIGHT_BLUE_CANDLE_CAKE, Blocks.YELLOW_CANDLE_CAKE, Blocks.LIME_CANDLE_CAKE, Blocks.PINK_CANDLE_CAKE, Blocks.GRAY_CANDLE_CAKE, Blocks.LIGHT_GRAY_CANDLE_CAKE, Blocks.CYAN_CANDLE_CAKE, Blocks.PURPLE_CANDLE_CAKE, Blocks.BLUE_CANDLE_CAKE, Blocks.BROWN_CANDLE_CAKE, Blocks.GREEN_CANDLE_CAKE, Blocks.RED_CANDLE_CAKE, Blocks.BLACK_CANDLE_CAKE, Blocks.CANDLE_CAKE);
-
+ private static final List ALL_CANDLE_CAKES = List.of(Blocks.WHITE_CANDLE_CAKE, Blocks.ORANGE_CANDLE_CAKE,
+ Blocks.MAGENTA_CANDLE_CAKE, Blocks.LIGHT_BLUE_CANDLE_CAKE, Blocks.YELLOW_CANDLE_CAKE,
+ Blocks.LIME_CANDLE_CAKE, Blocks.PINK_CANDLE_CAKE, Blocks.GRAY_CANDLE_CAKE, Blocks.LIGHT_GRAY_CANDLE_CAKE,
+ Blocks.CYAN_CANDLE_CAKE, Blocks.PURPLE_CANDLE_CAKE, Blocks.BLUE_CANDLE_CAKE, Blocks.BROWN_CANDLE_CAKE,
+ Blocks.GREEN_CANDLE_CAKE, Blocks.RED_CANDLE_CAKE, Blocks.BLACK_CANDLE_CAKE, Blocks.CANDLE_CAKE);
public InfinityTinyPotatoBlockEntity(BlockPos pos, BlockState state) {
super(BotaniaIntegrationBlockEntities.INFINITY_TINY_POTATO.get(), pos, state);
@@ -80,7 +99,8 @@ public void interact(Player player, InteractionHand hand, ItemStack stack, Direc
this.level.playSound(null, this.worldPosition, BotaniaSounds.doit, SoundSource.BLOCKS, 1.0F, 1.0F);
}
player.awardStat(BotaniaStats.TINY_POTATOES_PETTED);
- PlayerHelper.grantCriterion((ServerPlayer) player, ResourceLocation.fromNamespaceAndPath("botania", "main/tiny_potato_pet"), "code_triggered");
+ PlayerHelper.grantCriterion((ServerPlayer) player,
+ ResourceLocation.fromNamespaceAndPath("botania", "main/tiny_potato_pet"), "code_triggered");
}
}
@@ -98,8 +118,7 @@ private void addEffects(Level world, BlockPos pos, Player player) {
int lv = 1;
AABB bb = new AABB(
Vec3.atLowerCornerOf(pos.offset(-radius, -2, -radius)),
- Vec3.atLowerCornerOf(pos.offset(radius, 2, radius))
- );
+ Vec3.atLowerCornerOf(pos.offset(radius, 2, radius)));
List entityList = world.getEntitiesOfClass(LivingEntity.class, bb);
for (LivingEntity living : entityList) {
double sq = living.distanceToSqr(pos.getX(), pos.getY(), pos.getZ());
@@ -118,7 +137,6 @@ private void jump() {
if (this.jumpTicks == 0) {
this.level.blockEvent(this.getBlockPos(), this.getBlockState().getBlock(), 0, 20);
}
-
}
@Override
@@ -146,7 +164,6 @@ public static void commonTick(Level level, BlockPos pos, BlockState state, Infin
self.tickBirthday();
}
}
-
}
private void tickBirthday() {
@@ -155,14 +172,17 @@ private void tickBirthday() {
if (this.level.hasChunkAt(facingPos)) {
BlockState facingState = this.level.getBlockState(facingPos);
DyeColor cakeColor = getLitCakeColor(facingState, this.level.getRandom());
- List players = PlayerHelper.getRealPlayersIn(this.level, VecHelper.boxForRange(Vec3.atCenterOf(this.getBlockPos()), 8.0));
+ List players = PlayerHelper.getRealPlayersIn(this.level,
+ VecHelper.boxForRange(Vec3.atCenterOf(this.getBlockPos()), 8.0));
if (cakeColor != null && !players.isEmpty()) {
++this.birthdayTick;
List messageTimes = List.of(100, 170, 240, 310, 380);
int messageIndex = messageTimes.indexOf(this.birthdayTick);
if (messageIndex != -1) {
- Object[] args = messageIndex == 1 ? new Object[]{getTinyPotatoAge()} : new int[][]{new int[]{0}};
- MutableComponent message = Component.literal("<").append(this.getDisplayName()).append("> ").append(Component.translatable("botania.tater_birthday." + messageIndex, args));
+ Object[] args = messageIndex == 1 ? new Object[] { getTinyPotatoAge() } :
+ new int[][] { new int[] { 0 } };
+ MutableComponent message = Component.literal("<").append(this.getDisplayName()).append("> ")
+ .append(Component.translatable("botania.tater_birthday." + messageIndex, args));
Iterator var10 = players.iterator();
while (var10.hasNext()) {
@@ -177,7 +197,7 @@ private void tickBirthday() {
if (messageIndex == messageTimes.size() - 1) {
FireworkExplosion explosion = new FireworkExplosion(
FireworkExplosion.Shape.LARGE_BALL,
- new IntArrayList(new int[]{
+ new IntArrayList(new int[] {
cakeColor.getFireworkColor(),
13787301,
14987213,
@@ -186,17 +206,17 @@ private void tickBirthday() {
}),
new IntArrayList(),
true,
- true
- );
+ true);
ItemStack rocket = new ItemStack(Items.FIREWORK_ROCKET);
rocket.set(DataComponents.FIREWORKS, new Fireworks(
0,
- List.of(explosion)
- ));
- this.level.addFreshEntity(new FireworkRocketEntity(this.level, (double) facingPos.getX() + 0.5, (double) facingPos.getY() + 0.5, (double) facingPos.getZ() + 0.5, rocket));
+ List.of(explosion)));
+ this.level.addFreshEntity(new FireworkRocketEntity(this.level, (double) facingPos.getX() + 0.5,
+ (double) facingPos.getY() + 0.5, (double) facingPos.getZ() + 0.5, rocket));
this.level.removeBlock(facingPos, false);
this.level.levelEvent(2001, facingPos, Block.getId(facingState));
- this.level.playSound(null, this.getBlockPos(), SoundEvents.GENERIC_EAT, SoundSource.BLOCKS, 1.0F, 0.5F + (float) Math.random() * 0.5F);
+ this.level.playSound(null, this.getBlockPos(), SoundEvents.GENERIC_EAT, SoundSource.BLOCKS, 1.0F,
+ 0.5F + (float) Math.random() * 0.5F);
Iterator var12 = players.iterator();
while (var12.hasNext()) {
@@ -206,7 +226,6 @@ private void tickBirthday() {
}
}
}
-
}
@Override
@@ -215,17 +234,15 @@ public void setChanged() {
if (this.level != null && !this.level.isClientSide) {
VanillaPacketDispatcher.dispatchTEToNearbyPlayers(this);
}
-
}
-
@Override
public @NotNull Component getName() {
return BotaniaBlocks.tinyPotato.getName();
}
@Override
- public @org.jetbrains.annotations.Nullable Component getCustomName() {
+ public @Nullable Component getCustomName() {
return this.name.getString().isEmpty() ? null : this.name;
}
@@ -254,4 +271,4 @@ private static int getTinyPotatoAge() {
LocalDateTime now = LocalDateTime.now();
return now.getYear() - 2014;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/SoarleanderBlockEntity.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/SoarleanderBlockEntity.java
similarity index 82%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/SoarleanderBlockEntity.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/SoarleanderBlockEntity.java
index bbf07d8e..54e5ac09 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/entity/SoarleanderBlockEntity.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/entity/SoarleanderBlockEntity.java
@@ -1,6 +1,7 @@
-package committee.nova.mods.avaritia_integration.module.botania.entity;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.entity;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.registry.BotaniaIntegrationBlockEntities;
-import committee.nova.mods.avaritia_integration.module.botania.registry.BotaniaIntegrationBlockEntities;
import net.minecraft.core.BlockPos;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.LivingEntity;
@@ -10,12 +11,14 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
+
import org.jetbrains.annotations.Nullable;
import vazkii.botania.api.BotaniaAPI;
import vazkii.botania.api.block_entity.GeneratingFlowerBlockEntity;
import vazkii.botania.api.block_entity.RadiusDescriptor;
public class SoarleanderBlockEntity extends GeneratingFlowerBlockEntity {
+
private static final int MANA_PER_DAMAGE = 32;
private static final int MANA_PER_KILL = 1500;
private static final int MANA_PER_CHICKEN_KILL = 5000;
@@ -45,13 +48,13 @@ public void tickFlower() {
super.tickFlower();
if (this.level == null || this.level.isClientSide) return;
-
if (this.level.getGameTime() % 5 == 0) {
Vec3 offset = this.level.getBlockState(this.getBlockPos()).getOffset(this.level, this.getBlockPos());
double x = this.getBlockPos().getX() + offset.x;
double y = this.getBlockPos().getY() + offset.y;
double z = this.getBlockPos().getZ() + offset.z;
- BotaniaAPI.instance().sparkleFX(this.level, x + 0.3 + Math.random() * 0.5, y + 0.5 + Math.random() * 0.5, z + 0.3 + Math.random() * 0.5, 1.0f, 0.0f, 0.0f, 1.0f, 5);
+ BotaniaAPI.instance().sparkleFX(this.level, x + 0.3 + Math.random() * 0.5, y + 0.5 + Math.random() * 0.5,
+ z + 0.3 + Math.random() * 0.5, 1.0f, 0.0f, 0.0f, 1.0f, 5);
}
if (this.level.getGameTime() % 20 != 0) return;
@@ -59,8 +62,9 @@ public void tickFlower() {
BlockPos pos = this.getBlockPos();
AABB area = new AABB(pos).inflate(15.0);
- this.level.getEntitiesOfClass(LivingEntity.class, area, entity ->
- !(entity instanceof Player) && !(entity instanceof ArmorStand) && entity.isAlive())
+ this.level
+ .getEntitiesOfClass(LivingEntity.class, area,
+ entity -> !(entity instanceof Player) && !(entity instanceof ArmorStand) && entity.isAlive())
.forEach(this::attackEntity);
double particleChance = 1F - (double) this.getMana() / (double) this.getMaxMana() / 3.5F;
int color = this.getColor();
@@ -72,7 +76,9 @@ public void tickFlower() {
double x = this.getBlockPos().getX() + offset.x;
double y = this.getBlockPos().getY() + offset.y;
double z = this.getBlockPos().getZ() + offset.z;
- BotaniaAPI.instance().sparkleFX(this.getLevel(), x + 0.3 + Math.random() * 0.5, y + 0.5 + Math.random() * 0.5, z + 0.3 + Math.random() * 0.5, red, green, blue, (float) Math.random(), 5);
+ BotaniaAPI.instance().sparkleFX(this.getLevel(), x + 0.3 + Math.random() * 0.5,
+ y + 0.5 + Math.random() * 0.5, z + 0.3 + Math.random() * 0.5, red, green, blue,
+ (float) Math.random(), 5);
}
}
@@ -94,4 +100,4 @@ private void attackEntity(LivingEntity entity) {
this.sync();
}
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/item/AlphaSparkItem.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/item/AlphaSparkItem.java
similarity index 75%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/item/AlphaSparkItem.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/item/AlphaSparkItem.java
index 7cecedd3..43641b54 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/item/AlphaSparkItem.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/item/AlphaSparkItem.java
@@ -1,6 +1,7 @@
-package committee.nova.mods.avaritia_integration.module.botania.item;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.item;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.AlphaSparkEntity;
-import committee.nova.mods.avaritia_integration.module.botania.entity.AlphaSparkEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionResult;
@@ -8,6 +9,7 @@
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level;
+
import org.jetbrains.annotations.NotNull;
import vazkii.botania.api.mana.spark.SparkAttachable;
import vazkii.botania.xplat.XplatAbstractions;
@@ -16,20 +18,21 @@
* @author cnlimiter
*/
public class AlphaSparkItem extends Item {
- public AlphaSparkItem(Item.Properties builder) {
+
+ public AlphaSparkItem(Properties builder) {
super(builder);
}
@NotNull
@Override
public InteractionResult useOn(UseOnContext ctx) {
- return attachSpark(ctx.getLevel(), ctx.getClickedPos(), ctx.getItemInHand())
- ? InteractionResult.sidedSuccess(ctx.getLevel().isClientSide)
- : InteractionResult.PASS;
+ return attachSpark(ctx.getLevel(), ctx.getClickedPos(), ctx.getItemInHand()) ?
+ InteractionResult.sidedSuccess(ctx.getLevel().isClientSide) : InteractionResult.PASS;
}
public static boolean attachSpark(Level world, BlockPos pos, ItemStack stack) {
- var attach = XplatAbstractions.INSTANCE.findSparkAttachable(world, pos, world.getBlockState(pos), world.getBlockEntity(pos), Direction.UP);
+ var attach = XplatAbstractions.INSTANCE.findSparkAttachable(world, pos, world.getBlockState(pos),
+ world.getBlockEntity(pos), Direction.UP);
if (attach != null) {
if (attach.canAttachSpark(stack) && SparkAttachable.getAttachedSpark(world, pos) == null) {
if (!world.isClientSide) {
@@ -44,4 +47,4 @@ public static boolean attachSpark(Level world, BlockPos pos, ItemStack stack) {
}
return false;
}
-}
\ No newline at end of file
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationBlockEntities.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationBlockEntities.java
new file mode 100644
index 00000000..a198052b
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationBlockEntities.java
@@ -0,0 +1,50 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.registry;
+
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.AsgardDandelionBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityManaPoolBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityTinyPotatoBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.SoarleanderBlockEntity;
+
+import net.minecraft.core.registries.Registries;
+import net.minecraft.world.level.block.entity.BlockEntity;
+import net.minecraft.world.level.block.entity.BlockEntityType;
+import net.neoforged.neoforge.registries.DeferredHolder;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import java.util.function.Supplier;
+
+public final class BotaniaIntegrationBlockEntities {
+
+ public static final DeferredRegister> REGISTRY = DeferredRegister
+ .create(Registries.BLOCK_ENTITY_TYPE, AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredHolder, BlockEntityType> ASGARD_DANDELION = register(
+ "asgard_dandelion",
+ () -> BlockEntityType.Builder.of(
+ AsgardDandelionBlockEntity::new,
+ BotaniaIntegrationBlocks.ASGARD_DANDELION.get(),
+ BotaniaIntegrationBlocks.ASGARD_DANDELION_FLOATING.get()).build(null));
+ public static final DeferredHolder, BlockEntityType> SOARLEANDER = register(
+ "soarleander",
+ () -> BlockEntityType.Builder.of(
+ SoarleanderBlockEntity::new,
+ BotaniaIntegrationBlocks.SOARLEANDER.get(), BotaniaIntegrationBlocks.SOARLEANDER_FLOATING.get())
+ .build(null));
+ public static final DeferredHolder, BlockEntityType> INFINITY_MANA_POOL = register(
+ "infinity_mana_pool",
+ () -> BlockEntityType.Builder.of(
+ InfinityManaPoolBlockEntity::new,
+ BotaniaIntegrationBlocks.INFINITY_MANA_POOL.get()).build(null));
+ public static final DeferredHolder, BlockEntityType> INFINITY_TINY_POTATO = register(
+ "infinity_tiny_potato",
+ () -> BlockEntityType.Builder.of(
+ InfinityTinyPotatoBlockEntity::new,
+ BotaniaIntegrationBlocks.INFINITY_POTATO.get()).build(null));
+
+ private static <
+ T extends BlockEntity> DeferredHolder, BlockEntityType> register(String id,
+ Supplier> obj) {
+ return REGISTRY.register(id, obj);
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationBlocks.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationBlocks.java
new file mode 100644
index 00000000..109b68da
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationBlocks.java
@@ -0,0 +1,85 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.registry;
+
+import committee.nova.mods.avaritia.init.registry.ModRarities;
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.AsgardDandelionBlock;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.InfinityManaPoolBlock;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.InfinityTinyPotatoBlock;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.SoarleanderBlock;
+
+import net.minecraft.world.effect.MobEffects;
+import net.minecraft.world.item.BlockItem;
+import net.minecraft.world.item.Item;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.block.FlowerPotBlock;
+import net.minecraft.world.level.block.state.BlockBehaviour;
+import net.minecraft.world.level.material.PushReaction;
+import net.neoforged.neoforge.registries.DeferredBlock;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import vazkii.botania.common.block.BotaniaBlocks;
+import vazkii.botania.common.block.flower.FloatingSpecialFlowerBlock;
+
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+public final class BotaniaIntegrationBlocks {
+
+ public static final DeferredRegister.Blocks REGISTRY = DeferredRegister.createBlocks(AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredBlock ASGARD_DANDELION = register("asgard_dandelion",
+ () -> new AsgardDandelionBlock(MobEffects.HUNGER, 0, BlockBehaviour.Properties.ofFullCopy(Blocks.POPPY),
+ BotaniaIntegrationBlockEntities.ASGARD_DANDELION::get));
+ public static final DeferredBlock ASGARD_DANDELION_FLOATING = register("asgard_dandelion_floating",
+ () -> new FloatingSpecialFlowerBlock(BotaniaBlocks.FLOATING_PROPS,
+ BotaniaIntegrationBlockEntities.ASGARD_DANDELION::get));
+ public static final DeferredBlock POTTED_ASGARD_DANDELION = register("potted_asgard_dandelion", false,
+ () -> flowerPot(ASGARD_DANDELION.get(), 15));
+ public static final DeferredBlock SOARLEANDER = register("soarleander",
+ () -> new SoarleanderBlock(MobEffects.WITHER, 1,
+ BlockBehaviour.Properties.ofFullCopy(Blocks.POPPY).lightLevel(level -> 5),
+ BotaniaIntegrationBlockEntities.SOARLEANDER::get));
+ public static final DeferredBlock SOARLEANDER_FLOATING = register("soarleander_floating",
+ () -> new FloatingSpecialFlowerBlock(BotaniaBlocks.FLOATING_PROPS.lightLevel(level -> 5),
+ BotaniaIntegrationBlockEntities.SOARLEANDER::get));
+ public static final DeferredBlock POTTED_SOARLEANDER = register("potted_soarleander", false,
+ () -> flowerPot(SOARLEANDER.get(), 5));
+ public static final DeferredBlock INFINITY_MANA_POOL = register("infinity_mana_pool",
+ () -> new InfinityManaPoolBlock(
+ BlockBehaviour.Properties.ofFullCopy(BotaniaBlocks.livingrock).lightLevel(level -> 15)),
+ new Item.Properties().rarity(ModRarities.COSMIC.getValue()));
+ public static final DeferredBlock INFINITY_POTATO = register("infinity_potato",
+ InfinityTinyPotatoBlock::new);
+
+ private static DeferredBlock register(String id, Supplier obj) {
+ return register(id, obj, true, b -> new BlockItem(b, new Item.Properties()));
+ }
+
+ private static DeferredBlock register(String id, boolean hasItem, Supplier obj) {
+ return register(id, obj, hasItem, b -> new BlockItem(b, new Item.Properties()));
+ }
+
+ private static DeferredBlock register(String id, Supplier obj, Item.Properties properties) {
+ return register(id, obj, true, b -> new BlockItem(b, properties));
+ }
+
+ private static DeferredBlock register(String id, Supplier obj, boolean hasItem,
+ Item.Properties properties) {
+ return register(id, obj, hasItem, b -> new BlockItem(b, properties));
+ }
+
+ private static DeferredBlock register(String id, Supplier obj, boolean hasItem,
+ Function itemBuilder) {
+ DeferredBlock r = REGISTRY.register(id, obj);
+ if (hasItem) BotaniaIntegrationItems.register(id, () -> itemBuilder.apply(r.get()));
+ return r;
+ }
+
+ static FlowerPotBlock flowerPot(Block block, int lightLevel) {
+ BlockBehaviour.Properties properties = BlockBehaviour.Properties.of().instabreak().noOcclusion()
+ .pushReaction(PushReaction.DESTROY);
+ return new FlowerPotBlock(block,
+ lightLevel > 0 ? properties.lightLevel((blockState) -> lightLevel) : properties);
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationEntities.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationEntities.java
new file mode 100644
index 00000000..f5d99ddf
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationEntities.java
@@ -0,0 +1,35 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.registry;
+
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.AlphaSparkEntity;
+
+import net.minecraft.core.registries.Registries;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.MobCategory;
+import net.neoforged.neoforge.registries.DeferredHolder;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import java.util.function.Supplier;
+
+public final class BotaniaIntegrationEntities {
+
+ public static final DeferredRegister> REGISTRY = DeferredRegister.create(Registries.ENTITY_TYPE,
+ AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredHolder, EntityType> ALPHA_SPARK_ENTITIES = register(
+ "alpha_spark",
+ () -> EntityType.Builder.of(AlphaSparkEntity::new, MobCategory.MISC)
+ .sized(0.2F, 0.5F)
+ .fireImmune()
+ .clientTrackingRange(4)
+ .updateInterval(10)
+ .build(ResourceLocation.tryBuild(AvaritiaIntegration.MOD_ID, "alpha_spark").toString()));
+
+ private static <
+ T extends Entity> DeferredHolder, EntityType> register(String id,
+ Supplier> obj) {
+ return REGISTRY.register(id, obj);
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationItems.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationItems.java
new file mode 100644
index 00000000..7a2bfcaf
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/registry/BotaniaIntegrationItems.java
@@ -0,0 +1,23 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.registry;
+
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.item.AlphaSparkItem;
+
+import net.minecraft.world.item.Item;
+import net.neoforged.neoforge.registries.DeferredItem;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import java.util.function.Supplier;
+
+public final class BotaniaIntegrationItems {
+
+ public static final DeferredRegister.Items REGISTRY = DeferredRegister.createItems(AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredItem
- ALPHA_SPARK = register(
+ "alpha_spark",
+ () -> new AlphaSparkItem(new Item.Properties()));
+
+ public static DeferredItem register(String id, Supplier obj) {
+ return REGISTRY.register(id, obj);
+ }
+}
diff --git a/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/AlphaSparkRender.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/AlphaSparkRender.java
new file mode 100644
index 00000000..49b96c5f
--- /dev/null
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/AlphaSparkRender.java
@@ -0,0 +1,48 @@
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.render;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.AlphaSparkEntity;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.entity.EntityRendererProvider;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.resources.ResourceLocation;
+import net.minecraft.world.inventory.InventoryMenu;
+
+import vazkii.botania.client.render.entity.BaseSparkRenderer;
+
+import java.util.Objects;
+
+/**
+ * @author cnlimiter
+ */
+public class AlphaSparkRender extends BaseSparkRenderer {
+
+ private final TextureAtlasSprite dispersiveIcon;
+ private final TextureAtlasSprite dominantIcon;
+ private final TextureAtlasSprite recessiveIcon;
+ private final TextureAtlasSprite isolatedIcon;
+
+ public AlphaSparkRender(EntityRendererProvider.Context ctx) {
+ super(ctx);
+ var atlas = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS);
+ this.dispersiveIcon = Objects.requireNonNull(
+ atlas.apply(ResourceLocation.fromNamespaceAndPath("botania", "item/spark_upgrade_rune_dispersive")));
+ this.dominantIcon = Objects.requireNonNull(
+ atlas.apply(ResourceLocation.fromNamespaceAndPath("botania", "item/spark_upgrade_rune_dominant")));
+ this.recessiveIcon = Objects.requireNonNull(
+ atlas.apply(ResourceLocation.fromNamespaceAndPath("botania", "item/spark_upgrade_rune_recessive")));
+ this.isolatedIcon = Objects.requireNonNull(
+ atlas.apply(ResourceLocation.fromNamespaceAndPath("botania", "item/spark_upgrade_rune_isolated")));
+ }
+
+ @Override
+ public TextureAtlasSprite getSpinningIcon(AlphaSparkEntity entity) {
+ return switch (entity.getUpgrade()) {
+ case NONE -> null;
+ case DISPERSIVE -> this.dispersiveIcon;
+ case DOMINANT -> this.dominantIcon;
+ case RECESSIVE -> this.recessiveIcon;
+ case ISOLATED -> this.isolatedIcon;
+ };
+ }
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/render/InfinityManaPoolBlockEntityRender.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/InfinityManaPoolBlockEntityRender.java
similarity index 90%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/render/InfinityManaPoolBlockEntityRender.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/InfinityManaPoolBlockEntityRender.java
index 7e1b7fa7..cd655353 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/render/InfinityManaPoolBlockEntityRender.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/InfinityManaPoolBlockEntityRender.java
@@ -1,9 +1,8 @@
-package committee.nova.mods.avaritia_integration.module.botania.render;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.render;
+
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.block.InfinityManaPoolBlock;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityManaPoolBlockEntity;
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
-import committee.nova.mods.avaritia_integration.module.botania.block.InfinityManaPoolBlock;
-import committee.nova.mods.avaritia_integration.module.botania.entity.InfinityManaPoolBlockEntity;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.MultiBufferSource;
@@ -20,6 +19,9 @@
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.shapes.VoxelShape;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.VertexConsumer;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnknownNullability;
import vazkii.botania.api.mana.PoolOverlayProvider;
@@ -46,12 +48,12 @@ public InfinityManaPoolBlockEntityRender(BlockEntityRendererProvider.Context ctx
this.blockRenderDispatcher = ctx.getBlockRenderDispatcher();
this.waterSprite = Objects.requireNonNull(
Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS)
- .apply(botaniaRL("block/mana_water"))
- );
+ .apply(botaniaRL("block/mana_water")));
}
@Override
- public void render(@Nullable InfinityManaPoolBlockEntity pool, float partialTick, PoseStack ms, MultiBufferSource buffers, int light, int overlay) {
+ public void render(@Nullable InfinityManaPoolBlockEntity pool, float partialTick, PoseStack ms,
+ MultiBufferSource buffers, int light, int overlay) {
ms.pushPose();
Minecraft minecraft = Minecraft.getInstance();
@@ -109,7 +111,8 @@ public void render(@Nullable InfinityManaPoolBlockEntity pool, float partialTick
var overlayIcon = minecraft.getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(overlaySpriteId);
ms.pushPose();
- float alpha = (float) ((Mth.sin((ClientTickHandler.getEntityTicksInGame() + partialTick) / 20.0f) + 1) * 0.3 + 0.2);
+ float alpha = (float) ((Mth.sin((ClientTickHandler.getEntityTicksInGame() + partialTick) / 20.0f) + 1) *
+ 0.3 + 0.2);
ms.translate(0, poolBottom, 0);
ms.mulPose(VecHelper.rotateX(90F));
@@ -118,8 +121,7 @@ public void render(@Nullable InfinityManaPoolBlockEntity pool, float partialTick
RenderHelper.renderIconCropped(
ms, buffer,
uvStartX, uvStartY, uvEndX, uvEndY,
- overlayIcon, 0xFFFFFF, alpha, light
- );
+ overlayIcon, 0xFFFFFF, alpha, light);
ms.popPose();
}
@@ -145,5 +147,4 @@ public void render(@Nullable InfinityManaPoolBlockEntity pool, float partialTick
cartMaxMana = -1;
cartBlock = null;
}
-
}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/render/InfinityTinyPotatoBlockEntityRender.java b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/InfinityTinyPotatoBlockEntityRender.java
similarity index 90%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/botania/render/InfinityTinyPotatoBlockEntityRender.java
rename to integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/InfinityTinyPotatoBlockEntityRender.java
index f93e9fbb..77e39238 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/botania/render/InfinityTinyPotatoBlockEntityRender.java
+++ b/integrations/botania/src/main/java/committee/nova/mods/avaritia_integration/integrations/botania/render/InfinityTinyPotatoBlockEntityRender.java
@@ -1,9 +1,8 @@
-package committee.nova.mods.avaritia_integration.module.botania.render;
+package committee.nova.mods.avaritia_integration.integrations.botania.botania.render;
-import com.mojang.blaze3d.vertex.PoseStack;
-import com.mojang.blaze3d.vertex.VertexConsumer;
import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
-import committee.nova.mods.avaritia_integration.module.botania.entity.InfinityTinyPotatoBlockEntity;
+import committee.nova.mods.avaritia_integration.integrations.botania.botania.entity.InfinityTinyPotatoBlockEntity;
+
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font.DisplayMode;
import net.minecraft.client.renderer.MultiBufferSource;
@@ -19,12 +18,17 @@
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
import net.minecraft.world.phys.HitResult.Type;
+
+import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.VertexConsumer;
import vazkii.botania.common.helper.VecHelper;
-import javax.annotation.Nonnull;
import java.util.regex.Pattern;
+import javax.annotation.Nonnull;
+
public class InfinityTinyPotatoBlockEntityRender implements BlockEntityRenderer {
+
public static final String DEFAULT = "default";
private static final Pattern ESCAPED = Pattern.compile("[^a-z0-9/._-]");
private final BlockRenderDispatcher blockRenderDispatcher;
@@ -38,7 +42,8 @@ private static ResourceLocation taterLocation(String name) {
}
@Override
- public void render(@Nonnull InfinityTinyPotatoBlockEntity potato, float partialTicks, PoseStack ms, @Nonnull MultiBufferSource buffers, int light, int overlay) {
+ public void render(@Nonnull InfinityTinyPotatoBlockEntity potato, float partialTicks, PoseStack ms,
+ @Nonnull MultiBufferSource buffers, int light, int overlay) {
ms.pushPose();
// 基础数据
@@ -86,8 +91,8 @@ private void renderName(InfinityTinyPotatoBlockEntity potato, PoseStack ms, Mult
HitResult pos = mc.hitResult;
String name = potato.name.getString();
- if (Minecraft.renderNames() && !name.isEmpty() && pos != null && pos.getType() == Type.BLOCK
- && potato.getBlockPos().equals(((BlockHitResult) pos).getBlockPos())) {
+ if (Minecraft.renderNames() && !name.isEmpty() && pos != null && pos.getType() == Type.BLOCK &&
+ potato.getBlockPos().equals(((BlockHitResult) pos).getBlockPos())) {
ms.pushPose();
ms.translate(0.0F, -0.6F, 0.0F);
@@ -112,4 +117,4 @@ private void renderModel(PoseStack ms, VertexConsumer buffer, int light, int ove
this.blockRenderDispatcher.getModelRenderer().renderModel(ms.last(), buffer, null, model,
1.0F, 1.0F, 1.0F, light, overlay);
}
-}
\ No newline at end of file
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/asgard_dandelion.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/asgard_dandelion.json
new file mode 100644
index 00000000..81b4ba5a
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/asgard_dandelion.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/asgard_dandelion"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/asgard_dandelion_floating.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/asgard_dandelion_floating.json
new file mode 100644
index 00000000..d68909b5
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/asgard_dandelion_floating.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/asgard_dandelion_floating"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/infinity_mana_pool.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/infinity_mana_pool.json
new file mode 100644
index 00000000..b27ce017
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/infinity_mana_pool.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/infinity_mana_pool"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/infinity_potato.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/infinity_potato.json
new file mode 100644
index 00000000..4c16d545
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/infinity_potato.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/infinity_potato"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/potted_asgard_dandelion.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/potted_asgard_dandelion.json
new file mode 100644
index 00000000..bca0ab5e
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/potted_asgard_dandelion.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/potted_asgard_dandelion"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/potted_soarleander.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/potted_soarleander.json
new file mode 100644
index 00000000..30abbaab
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/potted_soarleander.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/potted_soarleander"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/soarleander.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/soarleander.json
new file mode 100644
index 00000000..bc177922
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/soarleander.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/soarleander"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/soarleander_floating.json b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/soarleander_floating.json
new file mode 100644
index 00000000..ad633020
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/blockstates/soarleander_floating.json
@@ -0,0 +1,7 @@
+{
+ "variants": {
+ "": {
+ "model": "avaritia_integration:block/botania/soarleander_floating"
+ }
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/asgard_dandelion.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/asgard_dandelion.json
new file mode 100644
index 00000000..f3fd08e5
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/asgard_dandelion.json
@@ -0,0 +1,6 @@
+{
+ "parent": "botania:block/shapes/cross",
+ "textures": {
+ "cross": "avaritia_integration:item/botania/asgard_dandelion"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/asgard_dandelion_floating.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/asgard_dandelion_floating.json
new file mode 100644
index 00000000..6b5fcab8
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/asgard_dandelion_floating.json
@@ -0,0 +1,7 @@
+{
+ "parent": "minecraft:block/block",
+ "loader": "botania:floating_flower",
+ "flower": {
+ "parent": "avaritia_integration:block/botania/asgard_dandelion"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_mana_pool.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_mana_pool.json
new file mode 100644
index 00000000..937244b1
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_mana_pool.json
@@ -0,0 +1,502 @@
+{
+ "format_version": "1.9.0",
+ "credit": "Made with Blockbench, made by TedXenon",
+ "parent": "block/block",
+ "texture_size": [64, 64],
+ "textures": {
+ "0": "avaritia_integration:block/botania/infinity_mana_pool",
+ "particle": "avaritia_integration:block/botania/infinity_mana_pool"
+ },
+ "elements": [
+ {
+ "name": "east",
+ "from": [14, 2, 2],
+ "to": [16, 8, 14],
+ "faces": {
+ "east": {
+ "uv": [8.5, 0, 11.5, 1.5],
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "west": { "uv": [11.5, 1.5, 8.5, 3], "texture": "#0", "tintindex": 0 },
+ "up": { "uv": [3.5, 3.5, 4, 6.5], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "west",
+ "from": [0, 2, 2],
+ "to": [2, 8, 14],
+ "faces": {
+ "east": { "uv": [3.5, 1.5, 0.5, 3], "texture": "#0", "tintindex": 0 },
+ "west": {
+ "uv": [0.5, 0, 3.5, 1.5],
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 3.5, 0.5, 6.5], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "north",
+ "from": [0, 2, 0],
+ "to": [16, 8, 2],
+ "faces": {
+ "north": {
+ "uv": [12, 0, 16, 1.5],
+ "texture": "#0",
+ "cullface": "north",
+ "tintindex": 0
+ },
+ "east": {
+ "uv": [11.5, 0, 12, 1.5],
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "south": { "uv": [16, 1.5, 12, 3], "texture": "#0", "tintindex": 0 },
+ "west": {
+ "uv": [0, 0, 0.5, 1.5],
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 3, 4, 3.5], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "south",
+ "from": [0, 2, 14],
+ "to": [16, 8, 16],
+ "faces": {
+ "north": { "uv": [8, 1.5, 4, 3], "texture": "#0", "tintindex": 0 },
+ "east": {
+ "uv": [8, 0, 8.5, 1.5],
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "south": {
+ "uv": [4, 0, 8, 1.5],
+ "texture": "#0",
+ "cullface": "south",
+ "tintindex": 0
+ },
+ "west": {
+ "uv": [3.5, 0, 4, 1.5],
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 6.5, 4, 7], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "base",
+ "from": [0, 0, 0],
+ "to": [16, 2, 16],
+ "faces": {
+ "north": {
+ "uv": [8, 3.5, 4, 3],
+ "texture": "#0",
+ "cullface": "north",
+ "tintindex": 0
+ },
+ "east": {
+ "uv": [7.5, 3, 8, 7],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "south": {
+ "uv": [4, 6.5, 8, 7],
+ "texture": "#0",
+ "cullface": "south",
+ "tintindex": 0
+ },
+ "west": {
+ "uv": [4.5, 7, 4, 3],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 3, 4, 7], "texture": "#0", "tintindex": 0 },
+ "down": {
+ "uv": [4, 7, 8, 3],
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [6, 2.99, -1],
+ "to": [10, 8.99, 1],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "east": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "south": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "west": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "texture": "#0" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [-1, 2.99, 6],
+ "to": [1, 8.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "east": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "south": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "west": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "rotation": 270, "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "rotation": 90, "texture": "#0" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [6, 2.99, 15],
+ "to": [10, 8.99, 17],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "east": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "south": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "west": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "rotation": 180, "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "rotation": 180, "texture": "#0" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [15, 2.99, 6],
+ "to": [17, 8.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "east": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "south": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "west": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "rotation": 90, "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "rotation": 270, "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [7, 2.99, -3.5],
+ "to": [9, 10.99, -1.5],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "east": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "south": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "west": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [-3.5, 2.99, 7],
+ "to": [-1.5, 10.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "east": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "south": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "west": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "rotation": 270, "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "rotation": 90, "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [7, 2.99, 17.5],
+ "to": [9, 10.99, 19.5],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "east": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "south": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "west": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "rotation": 180, "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "rotation": 180, "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [17.5, 2.99, 7],
+ "to": [19.5, 10.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "east": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "south": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "west": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "rotation": 90, "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "rotation": 270, "texture": "#0" }
+ }
+ },
+ {
+ "name": "base",
+ "from": [-4, -0.01, 7],
+ "to": [-2, 1.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [13, 3, 13.5, 3.5],
+ "rotation": 270,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [6, -0.01, 15],
+ "to": [10, 1.99, 17],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "east": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "west": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "rotation": 180,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "rotation": 180,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "base",
+ "from": [7, -0.01, 18],
+ "to": [9, 1.99, 20],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [13, 3, 13.5, 3.5],
+ "rotation": 180,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "rotation": 180,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [15, -0.01, 6],
+ "to": [17, 1.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "rotation": 90,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "rotation": 270,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "base",
+ "from": [18, -0.01, 7],
+ "to": [20, 1.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [13, 3, 13.5, 3.5],
+ "rotation": 90,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "rotation": 270,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [6, -0.01, -1],
+ "to": [10, 1.99, 1],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "east": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "west": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "base",
+ "from": [7, -0.01, -4],
+ "to": [9, 1.99, -2],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [-1, -0.01, 6],
+ "to": [1, 1.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "rotation": 270,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ }
+ ],
+ "groups": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ {
+ "name": "side",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [5, 6, 7, 8]
+ },
+ {
+ "name": "corners",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [9]
+ },
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [10]
+ },
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [11]
+ },
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [12]
+ }
+ ]
+ },
+ {
+ "name": "tint",
+ "origin": [8, 0, 8],
+ "color": 0,
+ "children": [13, 14, 15, 16, 17, 18, 19, 20]
+ }
+ ]
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_mana_pool_full.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_mana_pool_full.json
new file mode 100644
index 00000000..a312cc53
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_mana_pool_full.json
@@ -0,0 +1,513 @@
+{
+ "format_version": "1.9.0",
+ "credit": "Made with Blockbench, made by TedXenon",
+ "parent": "block/block",
+ "render_type": "translucent",
+ "texture_size": [64, 64],
+ "textures": {
+ "0": "avaritia_integration:block/botania/infinity_mana_pool",
+ "particle": "avaritia_integration:block/botania/infinity_mana_pool",
+ "1": "botania:block/mana_water"
+ },
+ "elements": [
+ {
+ "name": "east",
+ "from": [14, 2, 2],
+ "to": [16, 8, 14],
+ "faces": {
+ "east": {
+ "uv": [8.5, 0, 11.5, 1.5],
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "west": { "uv": [11.5, 1.5, 8.5, 3], "texture": "#0", "tintindex": 0 },
+ "up": { "uv": [3.5, 3.5, 4, 6.5], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "west",
+ "from": [0, 2, 2],
+ "to": [2, 8, 14],
+ "faces": {
+ "east": { "uv": [3.5, 1.5, 0.5, 3], "texture": "#0", "tintindex": 0 },
+ "west": {
+ "uv": [0.5, 0, 3.5, 1.5],
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 3.5, 0.5, 6.5], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "north",
+ "from": [0, 2, 0],
+ "to": [16, 8, 2],
+ "faces": {
+ "north": {
+ "uv": [12, 0, 16, 1.5],
+ "texture": "#0",
+ "cullface": "north",
+ "tintindex": 0
+ },
+ "east": {
+ "uv": [11.5, 0, 12, 1.5],
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "south": { "uv": [16, 1.5, 12, 3], "texture": "#0", "tintindex": 0 },
+ "west": {
+ "uv": [0, 0, 0.5, 1.5],
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 3, 4, 3.5], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "south",
+ "from": [0, 2, 14],
+ "to": [16, 8, 16],
+ "faces": {
+ "north": { "uv": [8, 1.5, 4, 3], "texture": "#0", "tintindex": 0 },
+ "east": {
+ "uv": [8, 0, 8.5, 1.5],
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "south": {
+ "uv": [4, 0, 8, 1.5],
+ "texture": "#0",
+ "cullface": "south",
+ "tintindex": 0
+ },
+ "west": {
+ "uv": [3.5, 0, 4, 1.5],
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 6.5, 4, 7], "texture": "#0", "tintindex": 0 }
+ }
+ },
+ {
+ "name": "base",
+ "from": [0, 0, 0],
+ "to": [16, 2, 16],
+ "faces": {
+ "north": {
+ "uv": [8, 3.5, 4, 3],
+ "texture": "#0",
+ "cullface": "north",
+ "tintindex": 0
+ },
+ "east": {
+ "uv": [7.5, 3, 8, 7],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "east",
+ "tintindex": 0
+ },
+ "south": {
+ "uv": [4, 6.5, 8, 7],
+ "texture": "#0",
+ "cullface": "south",
+ "tintindex": 0
+ },
+ "west": {
+ "uv": [4.5, 7, 4, 3],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "west",
+ "tintindex": 0
+ },
+ "up": { "uv": [0, 3, 4, 7], "texture": "#0", "tintindex": 0 },
+ "down": {
+ "uv": [4, 7, 8, 3],
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "mana",
+ "from": [2, 7, 2],
+ "to": [14, 7, 14],
+ "faces": {
+ "up": { "uv": [2, 2, 14, 14], "texture": "#1" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [6, 2.99, -1],
+ "to": [10, 8.99, 1],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "east": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "south": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "west": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "texture": "#0" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [-1, 2.99, 6],
+ "to": [1, 8.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "east": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "south": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "west": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "rotation": 270, "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "rotation": 90, "texture": "#0" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [6, 2.99, 15],
+ "to": [10, 8.99, 17],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "east": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "south": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "west": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "rotation": 180, "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "rotation": 180, "texture": "#0" }
+ }
+ },
+ {
+ "name": "side_b",
+ "from": [15, 2.99, 6],
+ "to": [17, 8.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [11, 3, 11.5, 4.5], "texture": "#0" },
+ "east": { "uv": [10, 3, 11, 4.5], "texture": "#0" },
+ "south": { "uv": [11.5, 3, 11, 4.5], "texture": "#0" },
+ "west": { "uv": [11.5, 3, 12.5, 4.5], "texture": "#0" },
+ "up": { "uv": [10, 4.5, 11, 5], "rotation": 90, "texture": "#0" },
+ "down": { "uv": [11, 4.5, 12, 5], "rotation": 270, "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [7, 2.99, -3.5],
+ "to": [9, 10.99, -1.5],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "east": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "south": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "west": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [-3.5, 2.99, 7],
+ "to": [-1.5, 10.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "east": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "south": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "west": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "rotation": 270, "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "rotation": 90, "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [7, 2.99, 17.5],
+ "to": [9, 10.99, 19.5],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "east": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "south": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "west": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "rotation": 180, "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "rotation": 180, "texture": "#0" }
+ }
+ },
+ {
+ "name": "corner",
+ "from": [17.5, 2.99, 7],
+ "to": [19.5, 10.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [8.5, 3, 9, 5], "texture": "#0" },
+ "east": { "uv": [8, 3, 8.5, 5], "texture": "#0" },
+ "south": { "uv": [9.5, 3, 10, 5], "texture": "#0" },
+ "west": { "uv": [9, 3, 9.5, 5], "texture": "#0" },
+ "up": { "uv": [8.5, 5, 8, 5.5], "rotation": 90, "texture": "#0" },
+ "down": { "uv": [8.5, 5, 9, 5.5], "rotation": 270, "texture": "#0" }
+ }
+ },
+ {
+ "name": "base",
+ "from": [-4, -0.01, 7],
+ "to": [-2, 1.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [13, 3, 13.5, 3.5],
+ "rotation": 270,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [6, -0.01, 15],
+ "to": [10, 1.99, 17],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "east": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "west": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "rotation": 180,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "rotation": 180,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "base",
+ "from": [7, -0.01, 18],
+ "to": [9, 1.99, 20],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [13, 3, 13.5, 3.5],
+ "rotation": 180,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "rotation": 180,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [15, -0.01, 6],
+ "to": [17, 1.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "rotation": 90,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "rotation": 270,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "base",
+ "from": [18, -0.01, 7],
+ "to": [20, 1.99, 9],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [13, 3, 13.5, 3.5],
+ "rotation": 90,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "rotation": 270,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [6, -0.01, -1],
+ "to": [10, 1.99, 1],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "east": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "west": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "base",
+ "from": [7, -0.01, -4],
+ "to": [9, 1.99, -2],
+ "rotation": { "angle": 45, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [13.5, 3, 14, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [13, 3, 12.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "up": { "uv": [13, 3, 13.5, 3.5], "texture": "#0", "tintindex": 0 },
+ "down": {
+ "uv": [13.5, 3.5, 14, 3],
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ },
+ {
+ "name": "side_a",
+ "from": [-1, -0.01, 6],
+ "to": [1, 1.99, 10],
+ "rotation": { "angle": 0, "axis": "y", "origin": [8, 0, 8] },
+ "faces": {
+ "north": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "east": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "south": { "uv": [12.5, 3, 13, 3.5], "texture": "#0", "tintindex": 0 },
+ "west": { "uv": [12.5, 3.5, 13.5, 4], "texture": "#0", "tintindex": 0 },
+ "up": {
+ "uv": [12.5, 3.5, 13.5, 4],
+ "rotation": 270,
+ "texture": "#0",
+ "tintindex": 0
+ },
+ "down": {
+ "uv": [13.5, 4, 14.5, 3.5],
+ "rotation": 90,
+ "texture": "#0",
+ "cullface": "down",
+ "tintindex": 0
+ }
+ }
+ }
+ ],
+ "groups": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ {
+ "name": "side",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [6, 7, 8, 9]
+ },
+ {
+ "name": "corners",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [10]
+ },
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [11]
+ },
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [12]
+ },
+ {
+ "name": "corner",
+ "origin": [8, 8, 8],
+ "color": 0,
+ "children": [13]
+ }
+ ]
+ },
+ {
+ "name": "tint",
+ "origin": [8, 0, 8],
+ "color": 0,
+ "children": [14, 15, 16, 17, 18, 19, 20, 21]
+ }
+ ]
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_potato.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_potato.json
new file mode 100644
index 00000000..8d750270
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/infinity_potato.json
@@ -0,0 +1,25 @@
+{
+ "format_version": "1.9.0",
+ "credit": "Made with Blockbench",
+ "parent": "block/block",
+ "texture_size": [32, 32],
+ "textures": {
+ "0": "avaritia_integration:block/botania/infinity_potato",
+ "particle": "avaritia_integration:block/botania/infinity_potato"
+ },
+ "elements": [
+ {
+ "name": "main",
+ "from": [4, 0, 4],
+ "to": [12, 12, 12],
+ "faces": {
+ "north": { "uv": [4, 4, 8, 10], "texture": "#0" },
+ "east": { "uv": [0, 4, 4, 10], "texture": "#0" },
+ "south": { "uv": [12, 4, 16, 10], "texture": "#0" },
+ "west": { "uv": [8, 4, 12, 10], "texture": "#0" },
+ "up": { "uv": [4, 0, 8, 4], "texture": "#0" },
+ "down": { "uv": [8, 0, 12, 4], "texture": "#0" }
+ }
+ }
+ ]
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/potted_asgard_dandelion.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/potted_asgard_dandelion.json
new file mode 100644
index 00000000..efee781b
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/potted_asgard_dandelion.json
@@ -0,0 +1,7 @@
+{
+ "parent": "minecraft:block/flower_pot_cross",
+ "render_type": "minecraft:cutout",
+ "textures": {
+ "plant": "avaritia_integration:item/botania/asgard_dandelion"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/potted_soarleander.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/potted_soarleander.json
new file mode 100644
index 00000000..7046cdbb
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/potted_soarleander.json
@@ -0,0 +1,7 @@
+{
+ "parent": "minecraft:block/flower_pot_cross",
+ "render_type": "minecraft:cutout",
+ "textures": {
+ "plant": "avaritia_integration:item/botania/soarleander"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/soarleander.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/soarleander.json
new file mode 100644
index 00000000..c9bd4956
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/soarleander.json
@@ -0,0 +1,6 @@
+{
+ "parent": "botania:block/shapes/cross",
+ "textures": {
+ "cross": "avaritia_integration:item/botania/soarleander"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/soarleander_floating.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/soarleander_floating.json
new file mode 100644
index 00000000..fbc29b0e
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/block/botania/soarleander_floating.json
@@ -0,0 +1,7 @@
+{
+ "parent": "minecraft:block/block",
+ "loader": "botania:floating_flower",
+ "flower": {
+ "parent": "avaritia_integration:block/botania/soarleander"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/alpha_spark.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/alpha_spark.json
new file mode 100644
index 00000000..b9a48ecf
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/alpha_spark.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/botania/alpha_spark"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/asgard_dandelion.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/asgard_dandelion.json
new file mode 100644
index 00000000..7367d83d
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/asgard_dandelion.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/botania/asgard_dandelion"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/asgard_dandelion_floating.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/asgard_dandelion_floating.json
new file mode 100644
index 00000000..b74b647e
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/asgard_dandelion_floating.json
@@ -0,0 +1,3 @@
+{
+ "parent": "avaritia_integration:block/botania/asgard_dandelion_floating"
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/infinity_mana_pool.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/infinity_mana_pool.json
new file mode 100644
index 00000000..96b43a9a
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/infinity_mana_pool.json
@@ -0,0 +1,11 @@
+{
+ "parent": "avaritia_integration:block/botania/infinity_mana_pool",
+ "overrides": [
+ {
+ "model": "avaritia_integration:block/botania/infinity_mana_pool_full",
+ "predicate": {
+ "botania:full": 1.0
+ }
+ }
+ ]
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/infinity_potato.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/infinity_potato.json
new file mode 100644
index 00000000..76c933f8
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/infinity_potato.json
@@ -0,0 +1,3 @@
+{
+ "parent": "avaritia_integration:block/botania/infinity_potato"
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/soarleander.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/soarleander.json
new file mode 100644
index 00000000..f63fe79d
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/soarleander.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/botania/soarleander"
+ }
+}
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/soarleander_floating.json b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/soarleander_floating.json
new file mode 100644
index 00000000..710a2bee
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/models/item/soarleander_floating.json
@@ -0,0 +1,3 @@
+{
+ "parent": "avaritia_integration:block/botania/soarleander_floating"
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png.mcmeta b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png.mcmeta
similarity index 97%
rename from src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png.mcmeta
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png.mcmeta
index 711b8b73..8188be08 100644
--- a/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png.mcmeta
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_mana_pool.png.mcmeta
@@ -4,4 +4,4 @@
"interpolate": true,
"frames": [0, 1]
}
-}
\ No newline at end of file
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png.mcmeta b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png.mcmeta
similarity index 97%
rename from src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png.mcmeta
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png.mcmeta
index 711b8b73..8188be08 100644
--- a/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png.mcmeta
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/block/botania/infinity_potato.png.mcmeta
@@ -4,4 +4,4 @@
"interpolate": true,
"frames": [0, 1]
}
-}
\ No newline at end of file
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png.mcmeta b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png.mcmeta
new file mode 100644
index 00000000..059759dc
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/alpha_spark.png.mcmeta
@@ -0,0 +1,5 @@
+{
+ "animation": {
+ "frames": [0, 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 0]
+ }
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png
diff --git a/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png.mcmeta b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png.mcmeta
new file mode 100644
index 00000000..2291883f
--- /dev/null
+++ b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/asgard_dandelion.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frames": [{ "index": 0, "time": 16 }, { "index": 1, "time": 16 }]
+ }
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/botania/soarleander.png b/integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/soarleander.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/botania/soarleander.png
rename to integrations/botania/src/main/resources/assets/avaritia_integration/textures/item/botania/soarleander.png
diff --git a/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/block/generating_special_flowers.json b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/block/generating_special_flowers.json
new file mode 100644
index 00000000..c130fefd
--- /dev/null
+++ b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/block/generating_special_flowers.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "avaritia_integration:asgard_dandelion",
+ "avaritia_integration:soarleander"
+ ]
+}
diff --git a/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/block/special_floating_flowers.json b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/block/special_floating_flowers.json
new file mode 100644
index 00000000..86000737
--- /dev/null
+++ b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/block/special_floating_flowers.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "avaritia_integration:asgard_dandelion_floating",
+ "avaritia_integration:soarleander_floating"
+ ]
+}
diff --git a/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/item/generating_special_flowers.json b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/item/generating_special_flowers.json
new file mode 100644
index 00000000..c130fefd
--- /dev/null
+++ b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/item/generating_special_flowers.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "avaritia_integration:asgard_dandelion",
+ "avaritia_integration:soarleander"
+ ]
+}
diff --git a/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/item/special_floating_flowers.json b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/item/special_floating_flowers.json
new file mode 100644
index 00000000..86000737
--- /dev/null
+++ b/integrations/botania/src/main/resources/integration_packs/server_data/data/botania/tags/item/special_floating_flowers.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "avaritia_integration:asgard_dandelion_floating",
+ "avaritia_integration:soarleander_floating"
+ ]
+}
diff --git a/integrations/botania/src/main/resources/integration_packs/server_data/data/minecraft/tags/blocks/flower_pots.json b/integrations/botania/src/main/resources/integration_packs/server_data/data/minecraft/tags/blocks/flower_pots.json
new file mode 100644
index 00000000..605413cc
--- /dev/null
+++ b/integrations/botania/src/main/resources/integration_packs/server_data/data/minecraft/tags/blocks/flower_pots.json
@@ -0,0 +1,7 @@
+{
+ "replace": false,
+ "values": [
+ "avaritia_integration:potted_asgard_dandelion",
+ "avaritia_integration:potted_soarleander"
+ ]
+}
diff --git a/integrations/botania/src/main/resources/integration_packs/server_data/pack.mcmeta b/integrations/botania/src/main/resources/integration_packs/server_data/pack.mcmeta
new file mode 100644
index 00000000..7a8991d7
--- /dev/null
+++ b/integrations/botania/src/main/resources/integration_packs/server_data/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 48,
+ "description": "Avaritia Integration Botania Data"
+ }
+}
diff --git a/integrations/botania/src/main/templates/META-INF/neoforge.mods.toml b/integrations/botania/src/main/templates/META-INF/neoforge.mods.toml
new file mode 100644
index 00000000..7b7f232a
--- /dev/null
+++ b/integrations/botania/src/main/templates/META-INF/neoforge.mods.toml
@@ -0,0 +1,33 @@
+modLoader = "javafml"
+loaderVersion = "${loader_version_range}"
+license = "${mod_license}"
+
+[[mods]]
+modId = "${mod_id}"
+version = "${mod_version}"
+displayName = "${mod_name}"
+authors = "${mod_authors}"
+description = '''${mod_description}'''
+
+[[dependencies."${mod_id}"]]
+modId = "neoforge"
+type = "required"
+versionRange = "${neo_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "minecraft"
+type = "required"
+versionRange = "${minecraft_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "avaritia_integration"
+type = "required"
+versionRange = "[${mod_version},)"
+ordering = "AFTER"
+side = "BOTH"
+
+${dependency_blocks}
diff --git a/integrations/create/build.gradle b/integrations/create/build.gradle
new file mode 100644
index 00000000..5c5f96bb
--- /dev/null
+++ b/integrations/create/build.gradle
@@ -0,0 +1,11 @@
+ext.ai_mod_id = 'avaritia_integration_create'
+ext.ai_mod_name = 'Avaritia Integration Create'
+ext.ai_mod_description = 'Avaritia Integration module for Create.'
+ext.ai_run_directory = 'integrations/create'
+apply from: rootProject.file('gradle/scripts/mod-project.gradle')
+
+dependencies {
+ implementation forge.reAvaritia
+ implementation project(':core')
+ implementation forge.create
+}
diff --git a/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/AICreateIntegrationMod.java b/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/AICreateIntegrationMod.java
new file mode 100644
index 00000000..0f9224fe
--- /dev/null
+++ b/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/AICreateIntegrationMod.java
@@ -0,0 +1,25 @@
+package committee.nova.mods.avaritia_integration.integrations.create;
+
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRule;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRuntime;
+import committee.nova.mods.avaritia_integration.module.ModModule;
+
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.fml.ModContainer;
+import net.neoforged.fml.common.Mod;
+
+@Mod(AICreateIntegrationMod.MOD_ID)
+public final class AICreateIntegrationMod implements ModModule {
+
+ public static final String MOD_ID = "avaritia_integration_create";
+ private static final String DEPENDENCY_MOD_ID = "create";
+
+ public AICreateIntegrationMod(IEventBus bus, ModContainer modContainer) {
+ if (IntegrationRuntime.shouldLoad(MOD_ID, this)) IntegrationRuntime.load(MOD_ID, bus, new CreateModule());
+ }
+
+ @Override
+ public IntegrationRule defaultLoadRule() {
+ return ModModule.rule(ModModule.dependency(DEPENDENCY_MOD_ID));
+ }
+}
diff --git a/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/CreateModule.java b/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/CreateModule.java
new file mode 100644
index 00000000..3ecb1bb4
--- /dev/null
+++ b/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/CreateModule.java
@@ -0,0 +1,24 @@
+package committee.nova.mods.avaritia_integration.integrations.create;
+
+import committee.nova.mods.avaritia_integration.integrations.create.registry.CreateIntegrationItems;
+import committee.nova.mods.avaritia_integration.module.Module;
+
+import net.minecraft.world.item.CreativeModeTab;
+import net.neoforged.bus.api.IEventBus;
+
+public final class CreateModule implements Module {
+
+ public static final String MOD_ID = "create";
+
+ @Override
+ public void init(IEventBus registryBus) {
+ CreateIntegrationItems.REGISTRY.register(registryBus);
+ }
+
+ @Override
+ public void collectCreativeTabItems(CreativeModeTab.ItemDisplayParameters parameters,
+ CreativeModeTab.Output output) {
+ output.accept(CreateIntegrationItems.CREATIVE_MECHANISM.get());
+ output.accept(CreateIntegrationItems.CREATIVE_COMPOUND.get());
+ }
+}
diff --git a/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/registry/CreateIntegrationItems.java b/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/registry/CreateIntegrationItems.java
new file mode 100644
index 00000000..63af32b9
--- /dev/null
+++ b/integrations/create/src/main/java/committee/nova/mods/avaritia_integration/integrations/create/registry/CreateIntegrationItems.java
@@ -0,0 +1,25 @@
+package committee.nova.mods.avaritia_integration.integrations.create.registry;
+
+import committee.nova.mods.avaritia.api.common.item.BaseItem;
+import committee.nova.mods.avaritia.init.registry.ModRarities;
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+
+import net.minecraft.world.item.Item;
+import net.neoforged.neoforge.registries.DeferredItem;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import java.util.function.Supplier;
+
+public final class CreateIntegrationItems {
+
+ public static final DeferredRegister.Items REGISTRY = DeferredRegister.createItems(AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredItem
- CREATIVE_MECHANISM = register("creative_mechanism",
+ () -> new BaseItem(pro -> pro.rarity(ModRarities.EPIC)));
+ public static final DeferredItem
- CREATIVE_COMPOUND = register("creative_compound",
+ () -> new BaseItem(pro -> pro.rarity(ModRarities.EPIC)));
+
+ public static DeferredItem register(String id, Supplier obj) {
+ return REGISTRY.register(id, obj);
+ }
+}
diff --git a/integrations/create/src/main/resources/assets/avaritia_integration/models/item/creative_compound.json b/integrations/create/src/main/resources/assets/avaritia_integration/models/item/creative_compound.json
new file mode 100644
index 00000000..3bb89b77
--- /dev/null
+++ b/integrations/create/src/main/resources/assets/avaritia_integration/models/item/creative_compound.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/creative_compound"
+ }
+}
diff --git a/integrations/create/src/main/resources/assets/avaritia_integration/models/item/creative_mechanism.json b/integrations/create/src/main/resources/assets/avaritia_integration/models/item/creative_mechanism.json
new file mode 100644
index 00000000..d725dc97
--- /dev/null
+++ b/integrations/create/src/main/resources/assets/avaritia_integration/models/item/creative_mechanism.json
@@ -0,0 +1,6 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/creative_mechanism"
+ }
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/creative_compound.png b/integrations/create/src/main/resources/assets/avaritia_integration/textures/item/items/creative_compound.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/creative_compound.png
rename to integrations/create/src/main/resources/assets/avaritia_integration/textures/item/items/creative_compound.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/creative_mechanism.png b/integrations/create/src/main/resources/assets/avaritia_integration/textures/item/items/creative_mechanism.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/creative_mechanism.png
rename to integrations/create/src/main/resources/assets/avaritia_integration/textures/item/items/creative_mechanism.png
diff --git a/integrations/create/src/main/templates/META-INF/neoforge.mods.toml b/integrations/create/src/main/templates/META-INF/neoforge.mods.toml
new file mode 100644
index 00000000..7b7f232a
--- /dev/null
+++ b/integrations/create/src/main/templates/META-INF/neoforge.mods.toml
@@ -0,0 +1,33 @@
+modLoader = "javafml"
+loaderVersion = "${loader_version_range}"
+license = "${mod_license}"
+
+[[mods]]
+modId = "${mod_id}"
+version = "${mod_version}"
+displayName = "${mod_name}"
+authors = "${mod_authors}"
+description = '''${mod_description}'''
+
+[[dependencies."${mod_id}"]]
+modId = "neoforge"
+type = "required"
+versionRange = "${neo_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "minecraft"
+type = "required"
+versionRange = "${minecraft_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "avaritia_integration"
+type = "required"
+versionRange = "[${mod_version},)"
+ordering = "AFTER"
+side = "BOTH"
+
+${dependency_blocks}
diff --git a/integrations/enderio/build.gradle b/integrations/enderio/build.gradle
new file mode 100644
index 00000000..239b0d8b
--- /dev/null
+++ b/integrations/enderio/build.gradle
@@ -0,0 +1,13 @@
+ext.ai_mod_id = 'avaritia_integration_enderio'
+ext.ai_mod_name = 'Avaritia Integration Ender IO'
+ext.ai_mod_description = 'Avaritia Integration module for Ender IO.'
+ext.ai_run_directory = 'integrations/enderio'
+ext.ai_data_output_root = 'src/generated/resources/integration_packs/server_data'
+ext.ai_data_existing_root = 'src/main/resources/integration_packs/server_data'
+apply from: rootProject.file('gradle/scripts/mod-project.gradle')
+
+dependencies {
+ implementation forge.reAvaritia
+ implementation project(':core')
+ implementation forge.enderIo
+}
diff --git a/src/generated/resources/data/avaritia_integration/advancement/recipes/misc/infinity_grinding_ball.json b/integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/advancement/recipes/misc/infinity_grinding_ball.json
similarity index 100%
rename from src/generated/resources/data/avaritia_integration/advancement/recipes/misc/infinity_grinding_ball.json
rename to integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/advancement/recipes/misc/infinity_grinding_ball.json
diff --git a/src/generated/resources/data/avaritia_integration/advancement/recipes/misc/neutron_grinding_ball.json b/integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/advancement/recipes/misc/neutron_grinding_ball.json
similarity index 100%
rename from src/generated/resources/data/avaritia_integration/advancement/recipes/misc/neutron_grinding_ball.json
rename to integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/advancement/recipes/misc/neutron_grinding_ball.json
diff --git a/src/generated/resources/data/avaritia_integration/recipe/infinity_grinding_ball.json b/integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/recipe/infinity_grinding_ball.json
similarity index 100%
rename from src/generated/resources/data/avaritia_integration/recipe/infinity_grinding_ball.json
rename to integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/recipe/infinity_grinding_ball.json
diff --git a/src/generated/resources/data/avaritia_integration/recipe/neutron_grinding_ball.json b/integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/recipe/neutron_grinding_ball.json
similarity index 100%
rename from src/generated/resources/data/avaritia_integration/recipe/neutron_grinding_ball.json
rename to integrations/enderio/src/generated/resources/integration_packs/server_data/data/avaritia_integration/recipe/neutron_grinding_ball.json
diff --git a/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/AIEnderIOIntegrationMod.java b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/AIEnderIOIntegrationMod.java
new file mode 100644
index 00000000..b85ff190
--- /dev/null
+++ b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/AIEnderIOIntegrationMod.java
@@ -0,0 +1,30 @@
+package committee.nova.mods.avaritia_integration.integrations.enderio;
+
+import committee.nova.mods.avaritia_integration.api.load.IntegrationDataPackRegistrar;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRule;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRuntime;
+import committee.nova.mods.avaritia_integration.integrations.enderio.datagen.EnderIODataGen;
+import committee.nova.mods.avaritia_integration.module.ModModule;
+
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.fml.ModContainer;
+import net.neoforged.fml.common.Mod;
+
+@Mod(AIEnderIOIntegrationMod.MOD_ID)
+public final class AIEnderIOIntegrationMod implements ModModule {
+
+ public static final String MOD_ID = "avaritia_integration_enderio";
+ private static final String DEPENDENCY_MOD_ID = "enderio";
+
+ public AIEnderIOIntegrationMod(IEventBus bus, ModContainer modContainer) {
+ IntegrationDataPackRegistrar.register(bus, MOD_ID, "Avaritia Integration Ender IO Data");
+ if (IntegrationRuntime.shouldLoad(MOD_ID, this) && IntegrationRuntime.load(MOD_ID, bus, new EnderIOModule())) {
+ bus.addListener(EnderIODataGen::gatherData);
+ }
+ }
+
+ @Override
+ public IntegrationRule defaultLoadRule() {
+ return ModModule.rule(ModModule.dependency(DEPENDENCY_MOD_ID));
+ }
+}
diff --git a/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/EnderIOModule.java b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/EnderIOModule.java
new file mode 100644
index 00000000..3dc33659
--- /dev/null
+++ b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/EnderIOModule.java
@@ -0,0 +1,25 @@
+package committee.nova.mods.avaritia_integration.integrations.enderio;
+
+import committee.nova.mods.avaritia_integration.integrations.enderio.registry.EnderIOIntegrationItems;
+import committee.nova.mods.avaritia_integration.module.Module;
+
+import net.minecraft.world.item.CreativeModeTab;
+import net.neoforged.bus.api.IEventBus;
+
+public final class EnderIOModule implements Module {
+
+ public static final String MOD_ID = "enderio";
+
+ @Override
+ public void init(IEventBus registryBus) {
+ EnderIOIntegrationItems.REGISTRY.register(registryBus);
+ }
+
+ @Override
+ public void collectCreativeTabItems(CreativeModeTab.ItemDisplayParameters parameters,
+ CreativeModeTab.Output output) {
+ output.accept(EnderIOIntegrationItems.INFINITY_CAPACITOR.get());
+ output.accept(EnderIOIntegrationItems.INFINITY_GRINDING_BALL.get());
+ output.accept(EnderIOIntegrationItems.NEUTRON_GRINDING_BALL.get());
+ }
+}
diff --git a/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/datagen/EnderIODataGen.java b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/datagen/EnderIODataGen.java
new file mode 100644
index 00000000..1cb36f3d
--- /dev/null
+++ b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/datagen/EnderIODataGen.java
@@ -0,0 +1,23 @@
+package committee.nova.mods.avaritia_integration.integrations.enderio.datagen;
+
+import net.minecraft.core.HolderLookup;
+import net.minecraft.data.DataGenerator;
+import net.minecraft.data.PackOutput;
+import net.neoforged.neoforge.data.event.GatherDataEvent;
+
+import java.util.concurrent.CompletableFuture;
+
+public final class EnderIODataGen {
+
+ private EnderIODataGen() {}
+
+ public static void gatherData(GatherDataEvent event) {
+ if (!event.includeServer()) {
+ return;
+ }
+ DataGenerator generator = event.getGenerator();
+ PackOutput output = generator.getPackOutput();
+ CompletableFuture future = event.getLookupProvider();
+ generator.addProvider(true, new EnderIORecipes(output, future));
+ }
+}
diff --git a/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/datagen/EnderIORecipes.java b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/datagen/EnderIORecipes.java
new file mode 100644
index 00000000..e70cc143
--- /dev/null
+++ b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/datagen/EnderIORecipes.java
@@ -0,0 +1,40 @@
+package committee.nova.mods.avaritia_integration.integrations.enderio.datagen;
+
+import committee.nova.mods.avaritia.init.registry.ModItems;
+import committee.nova.mods.avaritia_integration.integrations.enderio.registry.EnderIOIntegrationItems;
+
+import net.minecraft.core.HolderLookup;
+import net.minecraft.data.PackOutput;
+import net.minecraft.data.recipes.RecipeCategory;
+import net.minecraft.data.recipes.RecipeOutput;
+import net.minecraft.data.recipes.RecipeProvider;
+import net.minecraft.data.recipes.ShapedRecipeBuilder;
+import net.neoforged.neoforge.common.conditions.IConditionBuilder;
+
+import java.util.concurrent.CompletableFuture;
+
+public class EnderIORecipes extends RecipeProvider implements IConditionBuilder {
+
+ public EnderIORecipes(PackOutput output, CompletableFuture registries) {
+ super(output, registries);
+ }
+
+ @Override
+ protected void buildRecipes(RecipeOutput consumer) {
+ ShapedRecipeBuilder.shaped(RecipeCategory.MISC, EnderIOIntegrationItems.INFINITY_GRINDING_BALL.get())
+ .pattern(" a ")
+ .pattern("aaa")
+ .pattern(" a ")
+ .define('a', ModItems.infinity_ingot.get())
+ .unlockedBy("has_item", has(ModItems.infinity_ingot.get()))
+ .save(consumer);
+
+ ShapedRecipeBuilder.shaped(RecipeCategory.MISC, EnderIOIntegrationItems.NEUTRON_GRINDING_BALL.get())
+ .pattern(" a ")
+ .pattern("aaa")
+ .pattern(" a ")
+ .define('a', ModItems.neutron_ingot.get())
+ .unlockedBy("has_item", has(ModItems.neutron_ingot.get()))
+ .save(consumer);
+ }
+}
diff --git a/src/main/java/committee/nova/mods/avaritia_integration/module/enderio/item/InfinityCapacitorItem.java b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/item/InfinityCapacitorItem.java
similarity index 92%
rename from src/main/java/committee/nova/mods/avaritia_integration/module/enderio/item/InfinityCapacitorItem.java
rename to integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/item/InfinityCapacitorItem.java
index a06f0548..feb8058e 100644
--- a/src/main/java/committee/nova/mods/avaritia_integration/module/enderio/item/InfinityCapacitorItem.java
+++ b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/item/InfinityCapacitorItem.java
@@ -1,6 +1,5 @@
-package committee.nova.mods.avaritia_integration.module.enderio.item;
+package committee.nova.mods.avaritia_integration.integrations.enderio.item;
-import com.enderio.enderio.foundation.block.entity.MachineInstallable;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.item.Item;
@@ -9,6 +8,8 @@
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
+import com.enderio.enderio.foundation.block.entity.MachineInstallable;
+
public class InfinityCapacitorItem extends Item {
public InfinityCapacitorItem(Properties properties) {
@@ -25,5 +26,4 @@ public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) {
return super.onItemUseFirst(stack, context);
}
}
-
}
diff --git a/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/registry/EnderIOIntegrationItems.java b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/registry/EnderIOIntegrationItems.java
new file mode 100644
index 00000000..51127662
--- /dev/null
+++ b/integrations/enderio/src/main/java/committee/nova/mods/avaritia_integration/integrations/enderio/registry/EnderIOIntegrationItems.java
@@ -0,0 +1,32 @@
+package committee.nova.mods.avaritia_integration.integrations.enderio.registry;
+
+import committee.nova.mods.avaritia.api.common.item.BaseItem;
+import committee.nova.mods.avaritia.init.registry.ModRarities;
+import committee.nova.mods.avaritia_integration.AvaritiaIntegration;
+import committee.nova.mods.avaritia_integration.integrations.enderio.item.InfinityCapacitorItem;
+
+import net.minecraft.world.item.Item;
+import net.neoforged.neoforge.registries.DeferredItem;
+import net.neoforged.neoforge.registries.DeferredRegister;
+
+import com.enderio.enderio.api.capacitor.CapacitorData;
+import com.enderio.enderio.init.EIODataComponents;
+
+import java.util.function.Supplier;
+
+public final class EnderIOIntegrationItems {
+
+ public static final DeferredRegister.Items REGISTRY = DeferredRegister.createItems(AvaritiaIntegration.MOD_ID);
+
+ public static final DeferredItem
- INFINITY_CAPACITOR = register("infinity_capacitor",
+ () -> new InfinityCapacitorItem(new Item.Properties().rarity(ModRarities.EPIC)
+ .component(EIODataComponents.CAPACITOR_DATA, CapacitorData.simple(9.999999046325684F))));
+ public static final DeferredItem
- INFINITY_GRINDING_BALL = register("infinity_grinding_ball",
+ () -> new BaseItem(pro -> pro.rarity(ModRarities.EPIC)));
+ public static final DeferredItem
- NEUTRON_GRINDING_BALL = register("neutron_grinding_ball",
+ () -> new BaseItem(pro -> pro.rarity(ModRarities.RARE)));
+
+ public static DeferredItem register(String id, Supplier obj) {
+ return REGISTRY.register(id, obj);
+ }
+}
diff --git a/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/infinity_capacitor.json b/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/infinity_capacitor.json
new file mode 100644
index 00000000..b4283a71
--- /dev/null
+++ b/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/infinity_capacitor.json
@@ -0,0 +1,14 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/infinity_capacitor",
+ "halo": "avaritia:misc/halo"
+ },
+ "loader": "avaritia:halo",
+ "halo": {
+ "texture": "#halo",
+ "color": -16777216,
+ "size": 10,
+ "pulse": true
+ }
+}
diff --git a/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/infinity_grinding_ball.json b/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/infinity_grinding_ball.json
new file mode 100644
index 00000000..40773d25
--- /dev/null
+++ b/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/infinity_grinding_ball.json
@@ -0,0 +1,14 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/infinity_grinding_ball",
+ "halo": "avaritia:misc/halo"
+ },
+ "loader": "avaritia:halo",
+ "halo": {
+ "texture": "#halo",
+ "color": -16777216,
+ "size": 10,
+ "pulse": true
+ }
+}
diff --git a/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/neutron_grinding_ball.json b/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/neutron_grinding_ball.json
new file mode 100644
index 00000000..d35e934c
--- /dev/null
+++ b/integrations/enderio/src/main/resources/assets/avaritia_integration/models/item/neutron_grinding_ball.json
@@ -0,0 +1,14 @@
+{
+ "parent": "minecraft:item/generated",
+ "textures": {
+ "layer0": "avaritia_integration:item/items/neutron_grinding_ball",
+ "halo": "avaritia:misc/halo_noise"
+ },
+ "loader": "avaritia:halo",
+ "halo": {
+ "texture": "#halo",
+ "color": -1711276033,
+ "size": 6,
+ "pulse": false
+ }
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_capacitor.png b/integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_capacitor.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_capacitor.png
rename to integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_capacitor.png
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png b/integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png
rename to integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png
diff --git a/integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png.mcmeta b/integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png.mcmeta
new file mode 100644
index 00000000..2291883f
--- /dev/null
+++ b/integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/infinity_grinding_ball.png.mcmeta
@@ -0,0 +1,6 @@
+{
+ "animation": {
+ "interpolate": true,
+ "frames": [{ "index": 0, "time": 16 }, { "index": 1, "time": 16 }]
+ }
+}
diff --git a/src/main/resources/assets/avaritia_integration/textures/item/items/neutron_grinding_ball.png b/integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/neutron_grinding_ball.png
similarity index 100%
rename from src/main/resources/assets/avaritia_integration/textures/item/items/neutron_grinding_ball.png
rename to integrations/enderio/src/main/resources/assets/avaritia_integration/textures/item/items/neutron_grinding_ball.png
diff --git a/integrations/enderio/src/main/resources/integration_packs/server_data/data/enderio/data_maps/item/grinding_ball.json b/integrations/enderio/src/main/resources/integration_packs/server_data/data/enderio/data_maps/item/grinding_ball.json
new file mode 100644
index 00000000..4f476823
--- /dev/null
+++ b/integrations/enderio/src/main/resources/integration_packs/server_data/data/enderio/data_maps/item/grinding_ball.json
@@ -0,0 +1,17 @@
+{
+ "values": {
+ "avaritia_integration:neutron_grinding_ball": {
+ "BonusMultiplier": 1.0,
+ "Durability": 40000,
+ "OutputMultiplier": 5.0,
+ "PowerUse": 0.1
+ },
+
+ "avaritia_integration:infinity_grinding_ball": {
+ "BonusMultiplier": 5.0,
+ "Durability": 2147483647,
+ "OutputMultiplier": 5.0,
+ "PowerUse": 0.01
+ }
+ }
+}
diff --git a/integrations/enderio/src/main/resources/integration_packs/server_data/pack.mcmeta b/integrations/enderio/src/main/resources/integration_packs/server_data/pack.mcmeta
new file mode 100644
index 00000000..43da8d41
--- /dev/null
+++ b/integrations/enderio/src/main/resources/integration_packs/server_data/pack.mcmeta
@@ -0,0 +1,6 @@
+{
+ "pack": {
+ "pack_format": 48,
+ "description": "Avaritia Integration Ender IO Data"
+ }
+}
diff --git a/integrations/enderio/src/main/templates/META-INF/neoforge.mods.toml b/integrations/enderio/src/main/templates/META-INF/neoforge.mods.toml
new file mode 100644
index 00000000..7b7f232a
--- /dev/null
+++ b/integrations/enderio/src/main/templates/META-INF/neoforge.mods.toml
@@ -0,0 +1,33 @@
+modLoader = "javafml"
+loaderVersion = "${loader_version_range}"
+license = "${mod_license}"
+
+[[mods]]
+modId = "${mod_id}"
+version = "${mod_version}"
+displayName = "${mod_name}"
+authors = "${mod_authors}"
+description = '''${mod_description}'''
+
+[[dependencies."${mod_id}"]]
+modId = "neoforge"
+type = "required"
+versionRange = "${neo_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "minecraft"
+type = "required"
+versionRange = "${minecraft_version_range}"
+ordering = "NONE"
+side = "BOTH"
+
+[[dependencies."${mod_id}"]]
+modId = "avaritia_integration"
+type = "required"
+versionRange = "[${mod_version},)"
+ordering = "AFTER"
+side = "BOTH"
+
+${dependency_blocks}
diff --git a/integrations/ifeu/build.gradle b/integrations/ifeu/build.gradle
new file mode 100644
index 00000000..ab769acb
--- /dev/null
+++ b/integrations/ifeu/build.gradle
@@ -0,0 +1,16 @@
+ext.ai_mod_id = 'avaritia_integration_ifeu'
+ext.ai_mod_name = 'Avaritia Integration IFEU'
+ext.ai_mod_description = 'Avaritia Integration module for Industrial Foregoing Extra Upgrades.'
+ext.ai_run_directory = 'integrations/ifeu'
+ext.ai_data_output_root = 'src/generated/resources/integration_packs/server_data'
+ext.ai_data_existing_root = 'src/main/resources/integration_packs/server_data'
+apply from: rootProject.file('gradle/scripts/mod-project.gradle')
+
+dependencies {
+ implementation forge.reAvaritia
+ implementation project(':core')
+ implementation forge.titanium
+ implementation forge.industrialForegoing
+ implementation forge.industrialForegoingExtraUpgrades
+ implementation project(':integrations:industrialforegoing')
+}
diff --git a/src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_blaze_cube.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_blaze_cube.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_blaze_cube.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_blaze_cube.json
diff --git a/src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_crystal_matrix.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_crystal_matrix.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_crystal_matrix.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_crystal_matrix.json
diff --git a/src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_infinity.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_infinity.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_infinity.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_infinity.json
diff --git a/src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_neutron.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_neutron.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_neutron.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/advancement/dissolution_chamber/energy_addon_neutron.json
diff --git a/src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_blaze_cube.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_blaze_cube.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_blaze_cube.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_blaze_cube.json
diff --git a/src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_crystal_matrix.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_crystal_matrix.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_crystal_matrix.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_crystal_matrix.json
diff --git a/src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_infinity.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_infinity.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_infinity.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_infinity.json
diff --git a/src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_neutron.json b/integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_neutron.json
similarity index 100%
rename from src/generated/resources/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_neutron.json
rename to integrations/ifeu/src/generated/resources/integration_packs/server_data/data/industrialforegoing/recipe/dissolution_chamber/energy_addon_neutron.json
diff --git a/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/AIIFEUIntegrationMod.java b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/AIIFEUIntegrationMod.java
new file mode 100644
index 00000000..6111f2cd
--- /dev/null
+++ b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/AIIFEUIntegrationMod.java
@@ -0,0 +1,30 @@
+package committee.nova.mods.avaritia_integration.integrations.ifeu;
+
+import committee.nova.mods.avaritia_integration.api.load.IntegrationDataPackRegistrar;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRule;
+import committee.nova.mods.avaritia_integration.api.load.IntegrationRuntime;
+import committee.nova.mods.avaritia_integration.integrations.ifeu.datagen.IFEUDataGen;
+import committee.nova.mods.avaritia_integration.module.ModModule;
+
+import net.neoforged.bus.api.IEventBus;
+import net.neoforged.fml.ModContainer;
+import net.neoforged.fml.common.Mod;
+
+@Mod(AIIFEUIntegrationMod.MOD_ID)
+public final class AIIFEUIntegrationMod implements ModModule {
+
+ public static final String MOD_ID = "avaritia_integration_ifeu";
+ private static final String DEPENDENCY_MOD_ID = "ifeu";
+
+ public AIIFEUIntegrationMod(IEventBus bus, ModContainer modContainer) {
+ IntegrationDataPackRegistrar.register(bus, MOD_ID, "Avaritia Integration IFEU Data");
+ if (IntegrationRuntime.shouldLoad(MOD_ID, this) && IntegrationRuntime.load(MOD_ID, bus, new IFEUModule())) {
+ bus.addListener(IFEUDataGen::gatherData);
+ }
+ }
+
+ @Override
+ public IntegrationRule defaultLoadRule() {
+ return ModModule.rule(ModModule.dependency(DEPENDENCY_MOD_ID));
+ }
+}
diff --git a/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/IFEUModule.java b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/IFEUModule.java
new file mode 100644
index 00000000..dde73f02
--- /dev/null
+++ b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/IFEUModule.java
@@ -0,0 +1,25 @@
+package committee.nova.mods.avaritia_integration.integrations.ifeu;
+
+import committee.nova.mods.avaritia_integration.integrations.ifeu.registry.IFEUIntegrationItems;
+import committee.nova.mods.avaritia_integration.module.Module;
+
+import net.minecraft.world.item.CreativeModeTab;
+import net.neoforged.bus.api.IEventBus;
+
+public class IFEUModule implements Module {
+
+ public static final String MOD_ID = "ifeu";
+
+ @Override
+ public void init(IEventBus registryBus) {
+ IFEUIntegrationItems.ITEMS.register(registryBus);
+ }
+
+ @Override
+ public void collectCreativeTabItems(CreativeModeTab.ItemDisplayParameters parameters,
+ CreativeModeTab.Output output) {
+ IFEUIntegrationItems.ITEMS.getEntries().forEach(itemDeferredHolder -> {
+ output.accept(itemDeferredHolder.get());
+ });
+ }
+}
diff --git a/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/datagen/IFEUDataGen.java b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/datagen/IFEUDataGen.java
new file mode 100644
index 00000000..1bfa98c2
--- /dev/null
+++ b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/datagen/IFEUDataGen.java
@@ -0,0 +1,23 @@
+package committee.nova.mods.avaritia_integration.integrations.ifeu.datagen;
+
+import net.minecraft.core.HolderLookup;
+import net.minecraft.data.DataGenerator;
+import net.minecraft.data.PackOutput;
+import net.neoforged.neoforge.data.event.GatherDataEvent;
+
+import java.util.concurrent.CompletableFuture;
+
+public final class IFEUDataGen {
+
+ private IFEUDataGen() {}
+
+ public static void gatherData(GatherDataEvent event) {
+ if (!event.includeServer()) {
+ return;
+ }
+ DataGenerator generator = event.getGenerator();
+ PackOutput output = generator.getPackOutput();
+ CompletableFuture future = event.getLookupProvider();
+ generator.addProvider(true, new IFEURecipes(output, future));
+ }
+}
diff --git a/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/datagen/IFEURecipes.java b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/datagen/IFEURecipes.java
new file mode 100644
index 00000000..eea94008
--- /dev/null
+++ b/integrations/ifeu/src/main/java/committee/nova/mods/avaritia_integration/integrations/ifeu/datagen/IFEURecipes.java
@@ -0,0 +1,27 @@
+package committee.nova.mods.avaritia_integration.integrations.ifeu.datagen;
+
+import committee.nova.mods.avaritia_integration.integrations.ifeu.registry.IFEUIntegrationItems;
+
+import net.minecraft.core.HolderLookup;
+import net.minecraft.data.PackOutput;
+import net.minecraft.data.recipes.RecipeOutput;
+import net.minecraft.data.recipes.RecipeProvider;
+
+import com.hrznstudio.titanium.api.IRecipeProvider;
+
+import java.util.concurrent.CompletableFuture;
+
+public class IFEURecipes extends RecipeProvider {
+
+ public IFEURecipes(PackOutput output, CompletableFuture