Skip to content

Commit

Permalink
feat: added support for draconic evolution (#37)
Browse files Browse the repository at this point in the history
  • Loading branch information
GoryMoon authored Sep 16, 2024
1 parent afe246c commit f3eaef7
Show file tree
Hide file tree
Showing 9 changed files with 265 additions and 15 deletions.
14 changes: 5 additions & 9 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -124,19 +124,13 @@ tasks.jarJar.finalizedBy('reobfJarJar')

repositories {
mavenCentral()
maven { url = "https://maven.covers1624.net/" }
maven { // curios
url "https://maven.theillusivec4.top/"
}
maven { // Registrate
url "https://maven.tterrag.com/"
}
maven { // Immersive Engineering
url "https://modmaven.dev/"
content {
includeGroup 'blusunrize.immersiveengineering'
includeGroup 'malte0811'
}
}
}

dependencies {
Expand All @@ -148,10 +142,12 @@ dependencies {
runtimeOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}")
compileOnly fg.deobf("top.theillusivec4.curios:curios-forge:${curios_version}:api")

runtimeOnly fg.deobf("io.codechicken:CodeChickenLib:${mc_version}-${ccl_version}:universal")
runtimeOnly fg.deobf("com.brandon3055.draconicevolution:Draconic-Evolution:${mc_version}-3.1.2.588:universal")
implementation fg.deobf("com.brandon3055.brandonscore:BrandonsCore:${mc_version}-${brandon_core_version}:universal")

implementation fg.deobf("com.tterrag.registrate:Registrate:${registrate_version}")
jarJar(group: 'com.tterrag.registrate', name: 'Registrate', version: "[MC1.20,MC1.21)")

//runtimeOnly fg.deobf("blusunrize.immersiveengineering:ImmersiveEngineering:1.19.4-9.4.0-166.4")
}

reobf {
Expand Down
7 changes: 5 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,8 @@ mappings_channel=parchment
mappings_version=2023.09.03-1.20.1
mc_version=1.20.1

curios_version=5.2.0-beta.3+1.20.1
registrate_version=MC1.20-1.3.11
curios_version=5.10.0+1.20.1
registrate_version=MC1.20-1.3.11

ccl_version=4.4.0.+
brandon_core_version=3.2.1.+
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package se.gory_moon.chargers.block.entity;

import it.unimi.dsi.fastutil.Pair;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
Expand All @@ -11,18 +12,27 @@
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import se.gory_moon.chargers.compat.bc.BrandonsCoreCompat;
import se.gory_moon.chargers.inventory.ChargerData;
import se.gory_moon.chargers.power.CustomEnergyStorage;

import java.util.HashMap;
import java.util.Map;

public abstract class EnergyHolderBlockEntity extends BlockEntity {

public static final String STORAGE_TAG = "Storage";

@Nullable
private CustomEnergyStorage storage = null;
private LazyOptional<CustomEnergyStorage> lazyStorage = LazyOptional.of(() -> storage);

private final Map<Capability<?>, Pair<IEnergyStorage, LazyOptional<IEnergyStorage>>> compatWrappers = new HashMap<>();

protected final ChargerData energyData = new ChargerData() {
public long get(int index) {
return switch (index) {
Expand All @@ -32,12 +42,13 @@ public long get(int index) {
case 3 -> storage.getMaxOutput();
case 4 -> storage.getAverageIn();
case 5 -> storage.getAverageOut();
case 6 -> storage.isCreative() ? 1: 0;
case 6 -> storage.isCreative() ? 1 : 0;
default -> 0;
};
}

public void set(int index, long value) {}
public void set(int index, long value) {
}

public int getCount() {
return 7;
Expand All @@ -52,6 +63,10 @@ public void setStorage(CustomEnergyStorage storage) {
this.storage = storage;
lazyStorage.invalidate();
lazyStorage = LazyOptional.of(() -> storage);

if (BrandonsCoreCompat.INSTANCE.isLoaded()) {
BrandonsCoreCompat.INSTANCE.createOpWrapper(storage, compatWrappers);
}
}

@Nullable
Expand Down Expand Up @@ -92,8 +107,13 @@ public ClientboundBlockEntityDataPacket getUpdatePacket() {
@NotNull
@Override
public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {

if (BrandonsCoreCompat.INSTANCE.isOpCapability(cap))
return compatWrappers.get(cap).second().cast();

if (cap == ForgeCapabilities.ENERGY)
return lazyStorage.cast();

return super.getCapability(cap, side);
}

Expand Down
23 changes: 23 additions & 0 deletions src/main/java/se/gory_moon/chargers/compat/ChargeCompat.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
import net.minecraftforge.common.capabilities.ForgeCapabilities;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
import se.gory_moon.chargers.compat.bc.BrandonsCoreCompat;
import se.gory_moon.chargers.power.CustomEnergyStorage;

import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;

Expand Down Expand Up @@ -98,6 +100,13 @@ private long extractAmount(IEnergyStorage storage, long extractAmount) {
return customEnergyStorage.extractLongEnergy(extractAmount, false);
}

if (BrandonsCoreCompat.INSTANCE.isLoaded()) {
Optional<Long> amount = BrandonsCoreCompat.INSTANCE.extractAmount(storage, extractAmount);
if (amount.isPresent()) {
return amount.get();
}
}

return storage.extractEnergy(cap(extractAmount), false);
}

Expand All @@ -112,6 +121,13 @@ private long receiveAmount(IEnergyStorage storage, long receiveAmount) {
return customEnergyStorage.receiveLongEnergy(receiveAmount, false);
}

if (BrandonsCoreCompat.INSTANCE.isLoaded()) {
Optional<Long> amount = BrandonsCoreCompat.INSTANCE.receiveAmount(storage, receiveAmount);
if (amount.isPresent()) {
return amount.get();
}
}

return storage.receiveEnergy(cap(receiveAmount), false);
}

Expand All @@ -125,6 +141,13 @@ private boolean isStorageFull(IEnergyStorage storage) {
return customEnergyStorage.getLongEnergyStored() >= customEnergyStorage.getLongMaxEnergyStored();
}

if (BrandonsCoreCompat.INSTANCE.isLoaded()) {
Optional<Boolean> isFull = BrandonsCoreCompat.INSTANCE.isStorageFull(storage);
if (isFull.isPresent()) {
return isFull.get();
}
}

return storage.getEnergyStored() >= storage.getMaxEnergyStored();
}
}
2 changes: 1 addition & 1 deletion src/main/java/se/gory_moon/chargers/compat/Curios.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public int getMaxStackSize() {
public boolean chargeItems(Player player, WirelessChargerBlockEntity charger) {
AtomicBoolean result = new AtomicBoolean(false);
if (isLoaded()) {
LazyOptional<ICuriosItemHandler> lazyOptional = CuriosApi.getCuriosHelper().getCuriosHandler(player);
LazyOptional<ICuriosItemHandler> lazyOptional = CuriosApi.getCuriosInventory(player);
lazyOptional.ifPresent(handler -> {
NonNullList<ItemStack> chargeList = NonNullList.create();
chargeList.add(ItemStack.EMPTY);
Expand Down
102 changes: 102 additions & 0 deletions src/main/java/se/gory_moon/chargers/compat/bc/BrandonsCoreCompat.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package se.gory_moon.chargers.compat.bc;

import com.brandon3055.brandonscore.api.power.IOPStorage;
import com.brandon3055.brandonscore.capability.CapabilityOP;
import it.unimi.dsi.fastutil.Pair;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.energy.IEnergyStorage;
import net.minecraftforge.fml.ModList;
import org.jetbrains.annotations.NotNull;
import se.gory_moon.chargers.power.CustomEnergyStorage;

import java.util.Map;
import java.util.Optional;

public class BrandonsCoreCompat {
public static BrandonsCoreCompat INSTANCE = new BrandonsCoreCompat();
private final boolean loaded;

private BrandonsCoreCompat() {
loaded = ModList.get().isLoaded("brandonscore");
}

/**
* Returns if BrandonsCore is loaded or not
*
* @return The mod is loaded or not
*/
public boolean isLoaded() {
return loaded;
}

/**
* Tries to extract from an OP Storage
*
* @param storage The storage to check
* @param extractAmount The max amount to extract
* @return The amount that was successfully extracted, or empty if the storage wasn't an IOPStorage
*/
public Optional<Long> extractAmount(IEnergyStorage storage, long extractAmount) {
if (storage instanceof IOPStorage opStorage) {
return Optional.of(opStorage.extractOP(extractAmount, false));
}
return Optional.empty();
}

/**
* Tries to receive energy into an OP Storage
*
* @param storage The storage to check
* @param receiveAmount The max amount to insert
* @return The amount that was successfully inserted, or empty if the storage wasn't an IOPStorage
*/
public Optional<Long> receiveAmount(IEnergyStorage storage, long receiveAmount) {
if (storage instanceof IOPStorage opStorage) {
return Optional.of(opStorage.receiveOP(receiveAmount, false));
}
return Optional.empty();
}

/**
* Checks if the storage is full or not
*
* @param storage The storage to check
* @return If the storage is full or not, or empty if the storage wasn't an IOPStorage
*/
public Optional<Boolean> isStorageFull(IEnergyStorage storage) {
if (storage instanceof IOPStorage opStorage) {
return Optional.of(opStorage.getOPStored() >= opStorage.getMaxOPStored());
}
return Optional.empty();
}

/**
* Checks if BrandonsCore is loaded and that the provided capability is an OP cap
*
* @param cap The cap to check
* @param <T> The cap type
* @return If the provided cap is a OP cap
*/
public <T> boolean isOpCapability(@NotNull Capability<T> cap) {
if (loaded) {
return cap == CapabilityOP.OP;
}

return false;
}

/**
* Creates a wrapper around the provided storage, invalidates any previous lazy optionals if available.
*
* @param storage The storage to wrap
* @param compatWrappers The map holding the wrappers
*/
public void createOpWrapper(CustomEnergyStorage storage, Map<Capability<?>, Pair<IEnergyStorage, LazyOptional<IEnergyStorage>>> compatWrappers) {
if (compatWrappers.containsKey(CapabilityOP.OP)) {
compatWrappers.get(CapabilityOP.OP).second().invalidate();
}
var opWrapper = new OpStorageWrapper(storage);
compatWrappers.put(CapabilityOP.OP, Pair.of(opWrapper, LazyOptional.of(() -> opWrapper)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package se.gory_moon.chargers.compat.bc;

import com.brandon3055.brandonscore.api.power.IOInfo;
import com.brandon3055.brandonscore.api.power.IOPStorage;
import org.jetbrains.annotations.Nullable;
import se.gory_moon.chargers.power.CustomEnergyStorage;

public class OpStorageWrapper implements IOPStorage {
private final CustomEnergyStorage storage;
private final CustomIOInfo info;

public OpStorageWrapper(CustomEnergyStorage storage) {
this.storage = storage;
this.info = new CustomIOInfo(storage);
}

@Override
public long receiveOP(long maxReceive, boolean simulate) {
return storage.receiveLongEnergy(maxReceive, simulate);
}

@Override
public long extractOP(long maxExtract, boolean simulate) {
return storage.extractLongEnergy(maxExtract, simulate);
}

@Override
public int receiveEnergy(int maxReceive, boolean simulate) {
return storage.receiveEnergy(maxReceive, simulate);
}

@Override
public int extractEnergy(int maxExtract, boolean simulate) {
return storage.extractEnergy(maxExtract, simulate);
}

@Override
public long getMaxOPStored() {
return storage.getLongMaxEnergyStored();
}

@Override
public long getOPStored() {
return storage.getLongEnergyStored();
}

@Override
public int getEnergyStored() {
return storage.getEnergyStored();
}

@Override
public int getMaxEnergyStored() {
return storage.getMaxEnergyStored();
}

@Override
public boolean canExtract() {
return storage.canExtract();
}

@Override
public boolean canReceive() {
return storage.canReceive();
}

@Override
public long maxExtract() {
return storage.getMaxOutput();
}

@Override
public long maxReceive() {
return storage.getMaxInput();
}

@Override
public long modifyEnergyStored(long amount) {
storage.setEnergy(amount);
return Math.abs(amount);
}

@Override
public @Nullable IOInfo getIOInfo() {
return info;
}

public record CustomIOInfo(CustomEnergyStorage storage) implements IOInfo {
@Override
public long currentInput() {
return storage.getAverageIn();
}

@Override
public long currentOutput() {
return storage.getAverageOut();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public void tick() {
energyOut = BigInteger.ZERO;
}

private void setEnergy(long energy) {
public void setEnergy(long energy) {
if (energy > 0)
energyIn = energyIn.add(BigInteger.valueOf(energy));
else
Expand Down
Loading

0 comments on commit f3eaef7

Please sign in to comment.