diff --git a/.gitignore b/.gitignore index 12f8644..c05f1f6 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ run # Files from Forge MDK forge*changelog.txt +/run-data/ diff --git a/gradle.properties b/gradle.properties index 34bae32..f46160b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -44,7 +44,7 @@ mapping_version=1.20.1 # Must match the String constant located in the main mod class annotated with @Mod. mod_id=contraptions_are_safe # The human-readable display name for the mod. -mod_name=ContraptionsAreSafe +mod_name=Contraptions Are Safe # The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. mod_license=MIT # The mod version. See https://semver.org/ @@ -56,7 +56,7 @@ mod_group_id=com.bipolarexpedition.java.contraptions_are_safe # The authors of the mod. This is a simple text string that is used for display purposes in the mod list. mod_authors=BipolarExpedition # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. -mod_description=Example mod description.\nNewline characters can be used and will be replaced properly. +mod_description=Protects players riding contraptions. \nEnsures players seated/riding on a contraption can not be targeted by mobs in most cases. create_version = 6.0.8-289 ponder_version = 1.0.91 diff --git a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/Config.java b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/Config.java index 55692ac..19a0af3 100644 --- a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/Config.java +++ b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/Config.java @@ -1,17 +1,17 @@ package com.bipolarexpedition.java.contraptions_are_safe; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.world.item.Item; import net.minecraftforge.common.ForgeConfigSpec; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.config.ModConfigEvent; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; +//import net.minecraftforge.registries.ForgeRegistries; +// +//import java.util.Collections; +//import java.util.List; +//import java.util.Set; +//import java.util.stream.Collectors; // An example config class. This is not required, but it's a good idea to have one to keep your config organized. // Demonstrates how to use Forge's config APIs @@ -19,46 +19,30 @@ import java.util.stream.Collectors; public class Config { private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); - - private static final ForgeConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER - .comment("Whether to log the dirt block on common setup") - .define("logDirtBlock", true); - - private static final ForgeConfigSpec.IntValue MAGIC_NUMBER = BUILDER - .comment("A magic number") - .defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE); - - public static final ForgeConfigSpec.ConfigValue MAGIC_NUMBER_INTRODUCTION = BUILDER - .comment("What you want the introduction message to be for the magic number") - .define("magicNumberIntroduction", "The magic number is... "); - - // a list of strings that are treated as resource locations for items - private static final ForgeConfigSpec.ConfigValue> ITEM_STRINGS = BUILDER - .comment("A list of items to log on common setup.") - .defineListAllowEmpty("items", List.of("minecraft:iron_ingot"), Config::validateItemName); +// +// private static final ForgeConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER +// .comment("Whether to log the dirt block on common setup") +// .define("logDirtBlock", true); +// +// private static final ForgeConfigSpec.IntValue MAGIC_NUMBER = BUILDER +// .comment("A magic number") +// .defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE); +// +// public static final ForgeConfigSpec.ConfigValue MAGIC_NUMBER_INTRODUCTION = BUILDER +// .comment("What you want the introduction message to be for the magic number") +// .define("magicNumberIntroduction", "The magic number is... "); static final ForgeConfigSpec SPEC = BUILDER.build(); - public static boolean logDirtBlock; - public static int magicNumber; - public static String magicNumberIntroduction; - public static Set items; - - private static boolean validateItemName(final Object obj) - { - return obj instanceof final String itemName && ForgeRegistries.ITEMS.containsKey(new ResourceLocation(itemName)); - } +// public static boolean logDirtBlock; +// public static int magicNumber; +// public static String magicNumberIntroduction; @SubscribeEvent static void onLoad(final ModConfigEvent event) { - logDirtBlock = LOG_DIRT_BLOCK.get(); - magicNumber = MAGIC_NUMBER.get(); - magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get(); - - // convert the list of strings into a set of items - items = ITEM_STRINGS.get().stream() - .map(itemName -> ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemName))) - .collect(Collectors.toSet()); +// logDirtBlock = LOG_DIRT_BLOCK.get(); +// magicNumber = MAGIC_NUMBER.get(); +// magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get(); } } diff --git a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/ContraptionsAreSafe.java b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/ContraptionsAreSafe.java index 72d2181..1debf33 100644 --- a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/ContraptionsAreSafe.java +++ b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/ContraptionsAreSafe.java @@ -1,31 +1,31 @@ package com.bipolarexpedition.java.contraptions_are_safe; import com.mojang.logging.LogUtils; -import net.minecraft.client.Minecraft; -import net.minecraft.core.registries.Registries; -import net.minecraft.world.food.FoodProperties; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.CreativeModeTabs; -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.state.BlockBehaviour; -import net.minecraft.world.level.material.MapColor; -import net.minecraftforge.api.distmarker.Dist; +//import net.minecraft.client.Minecraft; +//import net.minecraft.core.registries.Registries; +//import net.minecraft.world.food.FoodProperties; +//import net.minecraft.world.item.BlockItem; +//import net.minecraft.world.item.CreativeModeTab; +//import net.minecraft.world.item.CreativeModeTabs; +//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.state.BlockBehaviour; +//import net.minecraft.world.level.material.MapColor; +//import net.minecraftforge.api.distmarker.Dist; +//import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +//import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; +//import net.minecraftforge.registries.DeferredRegister; +//import net.minecraftforge.registries.ForgeRegistries; +//import net.minecraftforge.registries.RegistryObject; import org.slf4j.Logger; // The value here should match an entry in the META-INF/mods.toml file @@ -37,28 +37,6 @@ public class ContraptionsAreSafe // Directly reference a slf4j logger private static final Logger LOGGER = LogUtils.getLogger(); // Create a Deferred Register to hold Blocks which will all be registered under the "contraptions_are_safe" namespace - public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID); - // Create a Deferred Register to hold Items which will all be registered under the "contraptions_are_safe" namespace - public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); - // Create a Deferred Register to hold CreativeModeTabs which will all be registered under the "contraptions_are_safe" namespace - public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID); - - // Creates a new Block with the id "contraptions_are_safe:example_block", combining the namespace and path - public static final RegistryObject EXAMPLE_BLOCK = BLOCKS.register("example_block", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.STONE))); - // Creates a new BlockItem with the id "contraptions_are_safe:example_block", combining the namespace and path - public static final RegistryObject EXAMPLE_BLOCK_ITEM = ITEMS.register("example_block", () -> new BlockItem(EXAMPLE_BLOCK.get(), new Item.Properties())); - - // Creates a new food item with the id "contraptions_are_safe:example_id", nutrition 1 and saturation 2 - public static final RegistryObject EXAMPLE_ITEM = ITEMS.register("example_item", () -> new Item(new Item.Properties().food(new FoodProperties.Builder() - .alwaysEat().nutrition(1).saturationMod(2f).build()))); - - // Creates a creative tab with the id "contraptions_are_safe:example_tab" for the example item, that is placed after the combat tab - public static final RegistryObject EXAMPLE_TAB = CREATIVE_MODE_TABS.register("example_tab", () -> CreativeModeTab.builder() - .withTabsBefore(CreativeModeTabs.COMBAT) - .icon(() -> EXAMPLE_ITEM.get().getDefaultInstance()) - .displayItems((parameters, output) -> { - output.accept(EXAMPLE_ITEM.get()); // Add the example item to the tab. For your own tabs, this method is preferred over the event - }).build()); public ContraptionsAreSafe(FMLJavaModLoadingContext context) { @@ -67,19 +45,9 @@ public class ContraptionsAreSafe // Register the commonSetup method for modloading modEventBus.addListener(this::commonSetup); - // Register the Deferred Register to the mod event bus so blocks get registered - BLOCKS.register(modEventBus); - // Register the Deferred Register to the mod event bus so items get registered - ITEMS.register(modEventBus); - // Register the Deferred Register to the mod event bus so tabs get registered - CREATIVE_MODE_TABS.register(modEventBus); - // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); - // Register the item to a creative tab - modEventBus.addListener(this::addCreative); - // Register our mod's ForgeConfigSpec so that Forge can create and load the config file for us context.registerConfig(ModConfig.Type.COMMON, Config.SPEC); } @@ -87,21 +55,7 @@ public class ContraptionsAreSafe private void commonSetup(final FMLCommonSetupEvent event) { // Some common setup code - LOGGER.info("HELLO FROM COMMON SETUP"); - - if (Config.logDirtBlock) - LOGGER.info("DIRT BLOCK >> {}", ForgeRegistries.BLOCKS.getKey(Blocks.DIRT)); - - LOGGER.info(Config.magicNumberIntroduction + Config.magicNumber); - - Config.items.forEach((item) -> LOGGER.info("ITEM >> {}", item.toString())); - } - - // Add the example block item to the building blocks tab - private void addCreative(BuildCreativeModeTabContentsEvent event) - { - if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) - event.accept(EXAMPLE_BLOCK_ITEM); + LOGGER.debug("HELLO FROM COMMON SETUP for Contraptions Are Safe"); } // You can use SubscribeEvent and let the Event Bus discover methods to call @@ -109,19 +63,6 @@ public class ContraptionsAreSafe public void onServerStarting(ServerStartingEvent event) { // Do something when the server starts - LOGGER.info("HELLO from server starting"); - } - - // You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent - @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) - public static class ClientModEvents - { - @SubscribeEvent - public static void onClientSetup(FMLClientSetupEvent event) - { - // Some client setup code - LOGGER.info("HELLO FROM CLIENT SETUP"); - LOGGER.info("MINECRAFT NAME >> {}", Minecraft.getInstance().getUser().getName()); - } + LOGGER.debug("HELLO from Contraptions Are Safe for server starting"); } } diff --git a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/DebugTicker.java b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/DebugTicker.java new file mode 100644 index 0000000..4f37d19 --- /dev/null +++ b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/DebugTicker.java @@ -0,0 +1,35 @@ +package com.bipolarexpedition.java.contraptions_are_safe; + +import com.simibubi.create.content.contraptions.AbstractContraptionEntity; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraft.server.level.ServerPlayer; + +//@Mod.EventBusSubscriber( +// modid = "contraptions_are_safe", +// bus = Mod.EventBusSubscriber.Bus.FORGE +//) +public final class DebugTicker { + private DebugTicker() {} + +// @SubscribeEvent + public static void onPlayerTick(TickEvent.PlayerTickEvent event) { + if (event.phase != TickEvent.Phase.END) return; + if (!(event.player instanceof ServerPlayer player)) return; + if (player.tickCount % 20 != 0) return; + + player.sendSystemMessage(Component.literal( + "Debug: riding=" + player.isPassenger() + + ", vehicle=" + player.getVehicle() + + ", isContraption=" + isSittingContraption(player) + )); + } + public static boolean isSittingContraption(ServerPlayer player) { + Entity player_vehicle = player.getVehicle(); + + return (player_vehicle instanceof AbstractContraptionEntity); + } +} \ No newline at end of file diff --git a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/mixin/IgnoreContraptionRidersMixin.java b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/mixin/IgnoreContraptionRidersMixin.java new file mode 100644 index 0000000..7b7a751 --- /dev/null +++ b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/mixin/IgnoreContraptionRidersMixin.java @@ -0,0 +1,22 @@ +package com.bipolarexpedition.java.contraptions_are_safe.mixin; + +import com.simibubi.create.content.contraptions.AbstractContraptionEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.targeting.TargetingConditions; +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.CallbackInfoReturnable; + +@Mixin(TargetingConditions.class) +public class IgnoreContraptionRidersMixin { + + @Inject(method = "test", at = @At("HEAD"), cancellable = true) + private void skipRiders(LivingEntity attacker, LivingEntity target, CallbackInfoReturnable ci) { + if ((target instanceof Player) && (target.getVehicle() instanceof AbstractContraptionEntity)) { + ci.setReturnValue(false); + return; + } + } +} diff --git a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/mixin/MobTargetingMixin.java b/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/mixin/MobTargetingMixin.java deleted file mode 100644 index a4a2561..0000000 --- a/src/main/java/com/bipolarexpedition/java/contraptions_are_safe/mixin/MobTargetingMixin.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.bipolarexpedition.java.contraptions_are_safe.mixin; - -import com.bipolarexpedition.java.contraptions_are_safe.ContraptionsAreSafe; -import com.simibubi.create.content.contraptions.AbstractContraptionEntity; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.Mob; -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; - -@Mixin(Mob.class) -public class MobTargetingMixin { - - @Inject(method = "canAttack(Lnet/minecraft/world/entity/LivingEntity;)Z", at = @At("HEAD"), cancellable = true) - private void preventContraptionTargeting(LivingEntity target, CallbackInfoReturnable cir) { - if (target != null && isOnContraption(target)) { - cir.setReturnValue(false); - } - } - - private boolean isOnContraption(Entity entity) { - Entity vehicle = entity.getVehicle(); - while (vehicle != null) { - if (vehicle instanceof AbstractContraptionEntity) { - return true; - } - vehicle = vehicle.getVehicle(); - } - return false; - } -} \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index f2733b2..4bdea18 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -40,7 +40,7 @@ authors="${mod_authors}" #optional # NONE means that no display test is set on your mod. You need to do this yourself, see IExtensionPoint.DisplayTest for more information. You can define any scheme you wish with this value. # IMPORTANT NOTE: this is NOT an instruction as to which environments (CLIENT or DEDICATED SERVER) your mod loads on. Your mod should load (and maybe do nothing!) whereever it finds itself. #displayTest="MATCH_VERSION" # if nothing is specified, MATCH_VERSION is the default when clientSideOnly=false, otherwise IGNORE_ALL_VERSION when clientSideOnly=true (#optional) - +displayTest = "IGNORE_SERVER_VERSION" mixinConfig = "contraptionsaresafe.mixins.json" # Access Transformers diff --git a/src/main/resources/contraptionsaresafe.mixins.json b/src/main/resources/contraptionsaresafe.mixins.json index 11ee5f6..d44eab1 100644 --- a/src/main/resources/contraptionsaresafe.mixins.json +++ b/src/main/resources/contraptionsaresafe.mixins.json @@ -5,8 +5,9 @@ "compatibilityLevel": "JAVA_17", "refmap": "contraptionsaresafe.refmap.json", "mixins": [ - "MobTargetingMixin" + "IgnoreContraptionRidersMixin" ], "client": [], - "server": [] + "server": [ + ] } \ No newline at end of file