From 594e6c9fbf1e459e01eebf08fcd1e6997ffa1321 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 14 Mar 2023 16:19:00 +0700 Subject: [PATCH] Androids don't need to breathe oxygen --- build.gradle.kts | 11 +++++-- gradle.properties | 1 + .../mc/otm/OverdriveThatMatters.java | 7 +++++ .../ad_astra/EntityOxygenSystemMixin.java | 31 +++++++++++++++++++ .../compat/ad_astra/OxygenUtilsMixin.java | 31 +++++++++++++++++++ .../mc/otm/compat/adastra/AdAstraCompat.kt | 28 +++++++++++++++++ .../mc/otm/config/ServerCompatConfig.kt | 21 +++++++++++++ ...verdrive_that_matters.ad_astra.mixins.json | 12 +++++++ 8 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/EntityOxygenSystemMixin.java create mode 100644 src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/OxygenUtilsMixin.java create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/compat/adastra/AdAstraCompat.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/config/ServerCompatConfig.kt create mode 100644 src/main/resources/overdrive_that_matters.ad_astra.mixins.json diff --git a/build.gradle.kts b/build.gradle.kts index 361d035c9..55a604fcb 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -185,6 +185,7 @@ dependencies { val deps_mc_version: String by project val jei_mc_version: String by project val curios_mc_version: String by project + val ad_astra_id: String by project implementation(fg.deobf("top.theillusivec4.curios:curios-forge:${curios_mc_version}-${curios_version}")) implementation(fg.deobf("curse.maven:cosmetic-armor-reworked-237307:$cosmetic_armor_reworked_id")) @@ -196,6 +197,11 @@ dependencies { runtimeOnly(fg.deobf("curse.maven:jade-324717:${jade_id}")) runtimeOnly(fg.deobf("curse.maven:configured-457570:${configured_id}")) + implementation(fg.deobf("curse.maven:ad-astra-635042:${ad_astra_id}")) + implementation(fg.deobf("curse.maven:resourceful-lib-570073:4378849")) + implementation(fg.deobf("curse.maven:resourceful-config-714059:4394154")) + implementation(fg.deobf("curse.maven:botarium-704113:4416456")) + // runtimeOnly(fg.deobf("curse.maven:worldedit-225608:${worldedit_fileid}")) // runtimeOnly(fg.deobf("at.ridgo8.moreoverlays:MoreOverlays-updated:${more_overlays_version}")) @@ -256,8 +262,6 @@ minecraft { } else { args("--username", "Dev_${System.getProperty("user.name")}") } - - args("-mixin.config=$mod_id.mixins.json") } create("server") { @@ -267,7 +271,7 @@ minecraft { } } - args("nogui", "-mixin.config=$mod_id.mixins.json") + args("nogui") } create("data") { @@ -287,6 +291,7 @@ minecraft { mixin { add(sourceSets.main.get(), "$mod_id.refmap.json") config("$mod_id.mixins.json") + config("$mod_id.ad_astra.mixins.json") } minecraft.runs.all { diff --git a/gradle.properties b/gradle.properties index af6b696a1..da9732d31 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,6 +29,7 @@ jupiter_version=5.8.2 mekanism_version=10.3.5.homebaked curios_version=5.1.4.0 cosmetic_armor_reworked_id=4145717 +ad_astra_id=4390126 jade_id=4330163 configured_id=4166861 worldedit_fileid=3922622 diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index 46bf4ab8b..5915b8e75 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -33,12 +33,14 @@ import ru.dbotthepony.mc.otm.client.model.TritaniumArmorModel; import ru.dbotthepony.mc.otm.client.render.ShockwaveRenderer; import ru.dbotthepony.mc.otm.client.render.blockentity.BatteryBankRenderer; import ru.dbotthepony.mc.otm.client.render.blockentity.MatterBatteryBankRenderer; +import ru.dbotthepony.mc.otm.compat.adastra.AdAstraCompatKt; import ru.dbotthepony.mc.otm.compat.mekanism.QIOKt; import ru.dbotthepony.mc.otm.compat.mekanism.TooltipsKt; import ru.dbotthepony.mc.otm.config.AndroidConfig; import ru.dbotthepony.mc.otm.config.ClientConfig; import ru.dbotthepony.mc.otm.config.ItemsConfig; import ru.dbotthepony.mc.otm.config.MachinesConfig; +import ru.dbotthepony.mc.otm.config.ServerCompatConfig; import ru.dbotthepony.mc.otm.config.ServerConfig; import ru.dbotthepony.mc.otm.config.ToolsConfig; import ru.dbotthepony.mc.otm.core.math.Decimal; @@ -130,6 +132,7 @@ public final class OverdriveThatMatters { ClientConfig.INSTANCE.register(); ServerConfig.INSTANCE.register(); + ServerCompatConfig.INSTANCE.register(); AndroidConfig.INSTANCE.register(); ItemsConfig.INSTANCE.register(); MachinesConfig.INSTANCE.register(); @@ -195,6 +198,10 @@ public final class OverdriveThatMatters { if (ModList.get().isLoaded("mekanism")) { EVENT_BUS.addGenericListener(BlockEntity.class, EventPriority.NORMAL, QIOKt::attachCapabilities); } + + if (AdAstraCompatKt.isAdAstraLoaded()) { + EVENT_BUS.addListener(EventPriority.NORMAL, AdAstraCompatKt::onDamageEvent); + } } private void setupClient(final FMLClientSetupEvent event) { diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/EntityOxygenSystemMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/EntityOxygenSystemMixin.java new file mode 100644 index 000000000..846e5b221 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/EntityOxygenSystemMixin.java @@ -0,0 +1,31 @@ +package ru.dbotthepony.mc.otm.mixin.compat.ad_astra; + +import earth.terrarium.ad_astra.common.entity.system.EntityOxygenSystem; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import ru.dbotthepony.mc.otm.config.ServerCompatConfig; + +@Mixin(EntityOxygenSystem.class) +public class EntityOxygenSystemMixin { + @Inject( + method = "oxygenTick()V", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void oxygenTick(LivingEntity entity, ServerLevel level, CallbackInfo hook) { + if (entity instanceof Player && ServerCompatConfig.AdAstra.INSTANCE.getANDROIDS_DO_NOT_NEED_OXYGEN()) { + entity.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresent(it -> { + if (it.isAndroid()) { + hook.cancel(); + } + }); + } + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/OxygenUtilsMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/OxygenUtilsMixin.java new file mode 100644 index 000000000..30f8e465d --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/compat/ad_astra/OxygenUtilsMixin.java @@ -0,0 +1,31 @@ +package ru.dbotthepony.mc.otm.mixin.compat.ad_astra; + +import earth.terrarium.ad_astra.common.util.OxygenUtils; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; +import ru.dbotthepony.mc.otm.config.ServerCompatConfig; + +@Mixin(OxygenUtils.class) +public class OxygenUtilsMixin { + @Inject( + method = "entityHasOxygen()Z", + at = @At("HEAD"), + cancellable = true, + remap = false + ) + private static void entityHasOxygen(Level level, LivingEntity entity, CallbackInfoReturnable hook) { + if (entity instanceof Player && ServerCompatConfig.AdAstra.INSTANCE.getANDROIDS_DO_NOT_NEED_OXYGEN()) { + entity.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresent(it -> { + if (it.isAndroid()) { + hook.setReturnValue(true); + } + }); + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/adastra/AdAstraCompat.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/adastra/AdAstraCompat.kt new file mode 100644 index 000000000..61d89098b --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/adastra/AdAstraCompat.kt @@ -0,0 +1,28 @@ +package ru.dbotthepony.mc.otm.compat.adastra + +import earth.terrarium.ad_astra.AdAstra +import earth.terrarium.ad_astra.common.registry.ModDamageSource +import net.minecraft.world.entity.player.Player +import net.minecraftforge.event.entity.living.LivingHurtEvent +import net.minecraftforge.fml.ModList +import ru.dbotthepony.mc.otm.capability.matteryPlayer +import ru.dbotthepony.mc.otm.config.ServerCompatConfig + +val isAdAstraLoaded by lazy { + ModList.get().isLoaded(AdAstra.MOD_ID) +} + +// для надёжности +fun onDamageEvent(event: LivingHurtEvent) { + check(isAdAstraLoaded) { "Ad Astra is not loaded!" } + val ply = event.entity as? Player ?: return + + if (ServerCompatConfig.AdAstra.ANDROIDS_DO_NOT_NEED_OXYGEN) { + if (ply.matteryPlayer?.isAndroid != true) return + + if (event.source === ModDamageSource.OXYGEN) { + event.amount = 0f + event.isCanceled = true + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/config/ServerCompatConfig.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/config/ServerCompatConfig.kt new file mode 100644 index 000000000..7c300186f --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/config/ServerCompatConfig.kt @@ -0,0 +1,21 @@ +package ru.dbotthepony.mc.otm.config + +object ServerCompatConfig : AbstractConfig("compat-server") { + object AdAstra { + init { + builder.push("AD_ASTRA") + } + + val ANDROIDS_DO_NOT_NEED_OXYGEN: Boolean by builder + .comment("Android do not need oxygen in space") + .define("ANDROIDS_DO_NOT_NEED_OXYGEN", true) + + init { + builder.pop() + } + } + + init { + AdAstra + } +} diff --git a/src/main/resources/overdrive_that_matters.ad_astra.mixins.json b/src/main/resources/overdrive_that_matters.ad_astra.mixins.json new file mode 100644 index 000000000..9ee2f082a --- /dev/null +++ b/src/main/resources/overdrive_that_matters.ad_astra.mixins.json @@ -0,0 +1,12 @@ + +{ + "required": false, + "package": "ru.dbotthepony.mc.otm.mixin.compat.ad_astra", + "compatibilityLevel": "JAVA_17", + "minVersion": "0.8", + "refmap": "overdrive_that_matters.refmap.json", + "mixins": [ + "EntityOxygenSystemMixin", + "OxygenUtilsMixin" + ] +}