Skip to content

Commit

Permalink
Upload current changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Hiiragi283 committed Aug 10, 2024
1 parent 10b0df6 commit 283e7dd
Show file tree
Hide file tree
Showing 53 changed files with 800 additions and 255 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package io.github.hiiragi283.mixin;

import com.llamalad7.mixinextras.sugar.Local;
import io.github.hiiragi283.api.event.HTItemEvent;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(EnchantmentHelper.class)
public abstract class EnchantmentHelperMixin {

@Redirect(method = {
"calculateRequiredExperienceLevel",
"generateEnchantments"
}, at = @At(value = "INVOKE", target = "Lnet/minecraft/item/Item;getEnchantability()I"))
private static int ht_api$getEnchantability(Item instance, @Local(argsOnly = true) ItemStack stack) {
Integer enchantability = HTItemEvent.ENCHANTABILITY.invoker().getEnchantability(stack);
return enchantability == null ? stack.getItem().getEnchantability() : enchantability;
}

}
16 changes: 11 additions & 5 deletions api/src/main/java/io/github/hiiragi283/mixin/LootManagerMixin.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package io.github.hiiragi283.mixin;

import com.google.common.collect.ImmutableMap;
import com.google.gson.JsonElement;
import io.github.hiiragi283.impl.HTMixinImpls;
import com.llamalad7.mixinextras.sugar.Local;
import io.github.hiiragi283.api.resource.HTRuntimeDataRegistry;
import net.minecraft.loot.LootManager;
import net.minecraft.loot.LootTable;
import net.minecraft.loot.condition.LootConditionManager;
Expand All @@ -27,10 +29,14 @@ public abstract class LootManagerMixin {
@Final
private LootConditionManager conditionManager;

@Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/util/profiler/Profiler;)V", at = @At("HEAD"), cancellable = true)
private void ht_api$putTable(Map<Identifier, JsonElement> map, ResourceManager resourceManager, Profiler profiler, CallbackInfo ci) {
tables = HTMixinImpls.loadLootTables(map, conditionManager);
ci.cancel();
@Inject(
method = "apply(Ljava/util/Map;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/util/profiler/Profiler;)V",
at = @At(value = "INVOKE", target = "Ljava/util/Map;remove(Ljava/lang/Object;)Ljava/lang/Object;")
)
private void ht_api$putTable(Map<Identifier, JsonElement> map, ResourceManager resourceManager, Profiler profiler, CallbackInfo ci, @Local ImmutableMap.Builder<Identifier, LootTable> builder) {
HTRuntimeDataRegistry.getLootTables().forEach((id, table) -> {
builder.put(id, table.build());
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package io.github.hiiragi283.mixin;

import io.github.hiiragi283.api.event.HTPlayerEvents;
import net.minecraft.entity.player.PlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(PlayerEntity.class)
public abstract class PlayerEntityMixin {

@Unique
private PlayerEntity self() {
return (PlayerEntity) (Object) this;
}

@Inject(method = "tick", at = @At("HEAD"))
private void ht_api$startTick(CallbackInfo ci) {
HTPlayerEvents.START_TICK.invoker().onStartTick(self());
}

@Inject(method = "tick", at = @At("TAIL"))
private void ht_api$endTick(CallbackInfo ci) {
HTPlayerEvents.END_TICK.invoker().onEndTick(self());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package io.github.hiiragi283.api.block.entity
import io.github.hiiragi283.api.storage.HTSlottedStorage
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant
import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant
import net.minecraft.fluid.Fluid
import net.minecraft.item.Item
import net.minecraft.util.math.Direction

@Suppress("UnstableApiUsage")
interface HTStorageProvider {
fun getItemStorage(side: Direction?): HTSlottedStorage<ItemVariant>? = null
fun getItemStorage(side: Direction?): HTSlottedStorage<Item, ItemVariant>? = null

fun getFluidStorage(side: Direction?): HTSlottedStorage<FluidVariant>? = null
fun getFluidStorage(side: Direction?): HTSlottedStorage<Fluid, FluidVariant>? = null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package io.github.hiiragi283.api.effect

import net.minecraft.entity.effect.StatusEffect
import net.minecraft.entity.effect.StatusEffectType
import java.awt.Color

class HTStatusEffect(type: StatusEffectType, color: Int) : StatusEffect(type, color) {
constructor(type: StatusEffectType, color: Color) : this(type, color.rgb)
}
26 changes: 26 additions & 0 deletions api/src/main/kotlin/io/github/hiiragi283/api/event/HTItemEvent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package io.github.hiiragi283.api.event

import net.fabricmc.fabric.api.event.Event
import net.fabricmc.fabric.api.event.EventFactory
import net.minecraft.item.ItemStack

object HTItemEvent {

@JvmField
val ENCHANTABILITY: Event<CalculateEnchantability> = EventFactory.createArrayBacked(CalculateEnchantability::class.java) { listeners ->
CalculateEnchantability { stack ->
var ret: Int = stack.item.enchantability
listeners.forEach { event ->
event.getEnchantability(stack)?.let { ret = it }
}
ret
}
}

// CalculateEnchantability //

fun interface CalculateEnchantability {
fun getEnchantability(stack: ItemStack): Int?
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package io.github.hiiragi283.api.event
import io.github.hiiragi283.api.event.HTPlayerEvents.Pickup
import net.fabricmc.fabric.api.event.Event
import net.fabricmc.fabric.api.event.EventFactory
import net.minecraft.entity.player.PlayerEntity
import net.minecraft.item.ItemStack

object HTPlayerEvents {
// Pickup //

@JvmField
val PICKUP: Event<Pickup> = EventFactory.createArrayBacked(Pickup::class.java) { listeners ->
Expand All @@ -20,7 +20,31 @@ object HTPlayerEvents {
}
}

@JvmField
val START_TICK: Event<StartTick> = EventFactory.createArrayBacked(StartTick::class.java) { listeners ->
StartTick { player -> listeners.forEach { it.onStartTick(player) } }
}

@JvmField
val END_TICK: Event<EndTick> = EventFactory.createArrayBacked(EndTick::class.java) { listeners ->
EndTick { player -> listeners.forEach { it.onEndTick(player) } }
}

// Pickup //

fun interface Pickup {
fun onPickup(stack: ItemStack): ItemStack
}
}

// StartTick //

fun interface StartTick {
fun onStartTick(player: PlayerEntity)
}

// EndTick //

fun interface EndTick {
fun onEndTick(player: PlayerEntity)
}
}
30 changes: 23 additions & 7 deletions api/src/main/kotlin/io/github/hiiragi283/api/extension/Storage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ package io.github.hiiragi283.api.extension

import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import io.github.hiiragi283.api.module.HTLogger
import io.github.hiiragi283.api.storage.HTStorageIO
import net.fabricmc.fabric.api.transfer.v1.storage.Storage
import net.fabricmc.fabric.api.transfer.v1.storage.TransferVariant
import net.fabricmc.fabric.api.transfer.v1.storage.base.ResourceAmount
import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleVariantStorage
import net.minecraft.nbt.NbtCompound
import net.minecraft.nbt.NbtOps

fun Storage<*>.getIOType() = when {
supportsInsertion() && supportsExtraction() -> HTStorageIO.GENERIC
Expand All @@ -17,10 +20,23 @@ fun Storage<*>.getIOType() = when {
else -> HTStorageIO.INTERNAL
}

fun <T : TransferVariant<*>> resourceAmountCodec(fromNbt: (NbtCompound) -> T): Codec<ResourceAmount<T>> =
RecordCodecBuilder.create { instance ->
instance.group(
NbtCompound.CODEC.fieldOf("resource").forGetter { it.resource().toNbt() },
Codec.LONG.fieldOf("amount").forGetter { it.amount() },
).apply(instance) { resource, amount -> ResourceAmount(fromNbt(resource), amount) }
}
fun <T : TransferVariant<*>> resourceAmountCodec(codec: Codec<T>): Codec<ResourceAmount<T>> = RecordCodecBuilder.create { instance ->
instance.group(
codec.fieldOf("resource").forGetter(ResourceAmount<T>::resource),
Codec.LONG.fieldOf("amount").forGetter(ResourceAmount<T>::amount),
).apply(instance, ::ResourceAmount)
}

fun <T : TransferVariant<*>> SingleVariantStorage<T>.readNbt(codec: Codec<T>, fallback: () -> T, nbt: NbtCompound) {
this.variant = codec.decodeResult(NbtOps.INSTANCE, nbt.getCompound("variant"))
.onFailure {
HTLogger.debug { it.warn("Failed to load an ItemVariant from NBT: {}", it) }
}
.getOrDefault(fallback())
this.amount = nbt.getLong("amount")
}

fun <T : TransferVariant<*>> SingleVariantStorage<T>.writeNbt(codec: Codec<T>, nbt: NbtCompound) {
nbt.put("variant", codec.encodeResult(NbtOps.INSTANCE, this.variant).getOrThrow())
nbt.putLong("amount", this.amount)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package io.github.hiiragi283.api.extension

import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import io.github.hiiragi283.api.module.HTModuleType
import io.github.hiiragi283.api.network.HTPacketCodec
import io.github.hiiragi283.api.storage.HTSingleVariantStorage
import io.github.hiiragi283.api.storage.HTStorageIO
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant
import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant
import net.fabricmc.fabric.api.transfer.v1.storage.TransferVariant
import net.minecraft.fluid.Fluid
import net.minecraft.item.Item
import net.minecraft.nbt.NbtCompound
import net.minecraft.util.registry.Registry

@Suppress("UnstableApiUsage")
sealed class VariantContext<O : Any, T : TransferVariant<O>> private constructor(
val key: String,
val codec: Codec<T>,
val packetCodec: HTPacketCodec<T>,
val blank: () -> T,
val simple: (O) -> T,
val full: (O, NbtCompound) -> T,
val storage: (HTStorageIO, Long) -> HTSingleVariantStorage<T>,
) {
data object ITEM : VariantContext<Item, ItemVariant>(
"item",
RecordCodecBuilder.create { instance ->
instance.group(
Registry.ITEM.fieldOf("item").forGetter(ItemVariant::getItem),
NbtCompound.CODEC.orElse(NbtCompound()).fieldOf("nbt").forGetter(ItemVariant::getNbt),
).apply(instance, ItemVariant::of)
},
HTPacketCodec.createSimple(
HTModuleType.API.id("variant/item"),
ItemVariant::toPacket,
ItemVariant::fromPacket,
),
ItemVariant::blank,
ItemVariant::of,
ItemVariant::of,
HTSingleVariantStorage.Companion::ofItem,
)

data object FLUID : VariantContext<Fluid, FluidVariant>(
"fluid",
RecordCodecBuilder.create { instance ->
instance.group(
Registry.FLUID.fieldOf("fluid").forGetter(FluidVariant::getFluid),
NbtCompound.CODEC.orElse(NbtCompound()).fieldOf("nbt").forGetter(FluidVariant::getNbt),
).apply(instance, FluidVariant::of)
},
HTPacketCodec.createSimple(
HTModuleType.API.id("variant/fluid"),
FluidVariant::toPacket,
FluidVariant::fromPacket,
),
FluidVariant::blank,
FluidVariant::of,
FluidVariant::of,
HTSingleVariantStorage.Companion::ofFluid,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class HTMaterialFluidManager(
) {
companion object {
@JvmField
val EMPTY = HTMaterialFluidManager(mapOf(), HashBasedTable.create())
val EMPTY = HTMaterialFluidManager(emptyMap(), HashBasedTable.create())
}

// Fluid -> HTPhasedMaterial //
Expand Down Expand Up @@ -48,7 +48,7 @@ class HTMaterialFluidManager(

operator fun get(phasedMaterial: HTPhasedMaterial): Set<Fluid> = get(phasedMaterial.materialKey, phasedMaterial.phase)

operator fun get(materialKey: HTMaterialKey, phase: HTFluidPhase): Set<Fluid> = phasedToFluids.get(materialKey, phase) ?: setOf()
operator fun get(materialKey: HTMaterialKey, phase: HTFluidPhase): Set<Fluid> = phasedToFluids.get(materialKey, phase) ?: emptySet()

operator fun contains(phasedMaterial: HTPhasedMaterial): Boolean = contains(phasedMaterial.materialKey, phasedMaterial.phase)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class HTMaterialItemManager(
) {
companion object {
@JvmField
val EMPTY = HTMaterialItemManager(mapOf(), HashBasedTable.create(), setOf())
val EMPTY = HTMaterialItemManager(emptyMap(), HashBasedTable.create(), emptySet())
}

// Item -> HTShapedMaterial //
Expand Down Expand Up @@ -52,7 +52,7 @@ class HTMaterialItemManager(
?.takeUnless(unificationBlacklist::contains)
?.let(::get)
?.let(::get)
?: setOf()
?: emptySet()

fun getOrEmpty(shapedMaterial: HTShapedMaterial): Item = getOrEmpty(shapedMaterial.materialKey, shapedMaterial.shapeKey)

Expand All @@ -75,7 +75,7 @@ class HTMaterialItemManager(

operator fun get(shapedMaterial: HTShapedMaterial): Set<Item> = get(shapedMaterial.materialKey, shapedMaterial.shapeKey)

operator fun get(materialKey: HTMaterialKey, shapeKey: HTShapeKey): Set<Item> = shapedToItems.get(materialKey, shapeKey) ?: setOf()
operator fun get(materialKey: HTMaterialKey, shapeKey: HTShapeKey): Set<Item> = shapedToItems.get(materialKey, shapeKey) ?: emptySet()

operator fun contains(shapedMaterial: HTShapedMaterial): Boolean = contains(shapedMaterial.materialKey, shapedMaterial.shapeKey)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ class HTMaterialRegistry(private val biMap: BiMap<HTMaterialKey, HTPropertyHolde
.apply { key.validated = true }
}

fun create(key: HTMaterialKey, type: HTMaterialType, builderAction: HTMaterialBuilder.() -> Unit) {
create(key, type).apply(builderAction)
}

fun createGas(key: HTMaterialKey) = create(key, HTMaterialType.Fluid.GAS)

fun createGem(key: HTMaterialKey, gemType: HTMaterialType.Gem) = create(key, gemType)
Expand All @@ -71,4 +75,4 @@ class HTMaterialRegistry(private val biMap: BiMap<HTMaterialKey, HTPropertyHolde

fun getBuilder(key: HTMaterialKey): HTMaterialBuilder? = map[key]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ data class HTMaterialComposition(
}

/*private data object Empty : HTMaterialComposition() {
override val componentMap: Map<HTElement, Int> = mapOf()
override val componentMap: Map<HTElement, Int> = emptyMap()
override val color: Color = HTColor.WHITE
override val formula: String = ""
override val molar: Double = 0.0
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package io.github.hiiragi283.api.material.content

import io.github.hiiragi283.api.material.HTMaterialKey

class HTMaterialFluidContent(
val materialKey: HTMaterialKey,
)
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ sealed interface HTMaterialType {
override val itemSet: Set<HTShapeKey> = emptySet()
}

enum class Gem(val hasOverlay: Boolean) : HTMaterialType, HTBlockProperty {
enum class Gem(private val hasOverlay: Boolean) : HTMaterialType, HTBlockProperty {
AMETHYST(true),
COAL(false),
DIAMOND(true),
Expand Down Expand Up @@ -150,4 +150,4 @@ sealed interface HTMaterialType {

override fun layer1(shapeKey: HTShapeKey): Identifier? = null
}
}
}
Loading

0 comments on commit 283e7dd

Please sign in to comment.