diff --git a/build.gradle b/build.gradle index bf54849..e79a7dc 100644 --- a/build.gradle +++ b/build.gradle @@ -22,6 +22,10 @@ repositories { // Loom adds the essential maven repositories to download Minecraft and libraries from automatically. // See https://docs.gradle.org/current/userguide/declaring_repositories.html // for more information about repositories. + + flatDir { + dir "libs" + } } loom { @@ -32,6 +36,8 @@ dependencies { minecraft "net.minecraft:minecraft:$project.minecraft_version" mappings loom.officialMojangMappings() neoForge "net.neoforged:neoforge:$project.neoforge_version" + + modImplementation "libs:l2backpack:3.0.10" } processResources { diff --git a/gradle.properties b/gradle.properties index c484977..2d1dfc3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G loom.platform = neoforge # Mod properties -mod_version = 0.1.0 +mod_version = 0.1.1 maven_group = org.teacon archives_name = gimmeman diff --git a/libs/l2backpack-3.0.10.jar b/libs/l2backpack-3.0.10.jar new file mode 100644 index 0000000..e7e2335 Binary files /dev/null and b/libs/l2backpack-3.0.10.jar differ diff --git a/src/main/java/org/teacon/gimmeman/GimmeMan.java b/src/main/java/org/teacon/gimmeman/GimmeMan.java deleted file mode 100644 index 58a3a45..0000000 --- a/src/main/java/org/teacon/gimmeman/GimmeMan.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teacon.gimmeman; - -import net.neoforged.fml.common.Mod; - -import java.util.List; - -@Mod(GimmeMan.MOD_ID) -public final class GimmeMan { - public static final String MOD_ID = "gimmeman"; - - public GimmeMan() { - - } - - public static final List modsToRemoveAdvancements = List.of("l2backpack"); -} diff --git a/src/main/java/org/teacon/gimmeman/GiveMeMan.java b/src/main/java/org/teacon/gimmeman/GiveMeMan.java new file mode 100644 index 0000000..8b2ecb6 --- /dev/null +++ b/src/main/java/org/teacon/gimmeman/GiveMeMan.java @@ -0,0 +1,18 @@ +package org.teacon.gimmeman; + +import net.minecraft.resources.ResourceLocation; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.fml.common.Mod; + +@Mod(GiveMeMan.MOD_ID) +public final class GiveMeMan { + public static final String MOD_ID = "gimmeman"; + + public GiveMeMan(IEventBus eventBus) { + + } + + public static ResourceLocation id(String path) { + return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); + } +} diff --git a/src/main/java/org/teacon/gimmeman/mixin/AdvancementManagerMixin.java b/src/main/java/org/teacon/gimmeman/mixin/AdvancementManagerMixin.java deleted file mode 100644 index 104e61c..0000000 --- a/src/main/java/org/teacon/gimmeman/mixin/AdvancementManagerMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.teacon.gimmeman.mixin; - -import com.google.gson.JsonElement; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.ServerAdvancementManager; -import net.minecraft.server.packs.resources.ResourceManager; -import net.minecraft.util.profiling.ProfilerFiller; -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 org.teacon.gimmeman.GimmeMan; - -import java.util.Map; - -@Mixin(ServerAdvancementManager.class) -public class AdvancementManagerMixin { - - @Inject( - method = "apply(Ljava/util/Map;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/util/profiling/ProfilerFiller;)V", - at = @At("HEAD") - ) - void preventAdvancementAddition(Map map, ResourceManager resourceManager, ProfilerFiller profilerFiller, CallbackInfo ci) { - map.entrySet().removeIf((entry) -> GimmeMan.modsToRemoveAdvancements.contains(entry.getKey().getNamespace())); - } -} \ No newline at end of file diff --git a/src/main/java/org/teacon/gimmeman/mixin/AdvancementRewardsMixin.java b/src/main/java/org/teacon/gimmeman/mixin/AdvancementRewardsMixin.java deleted file mode 100644 index 9a56540..0000000 --- a/src/main/java/org/teacon/gimmeman/mixin/AdvancementRewardsMixin.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.teacon.gimmeman.mixin; - -import net.minecraft.advancements.AdvancementRewards; -import net.minecraft.commands.CacheableFunction; -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.level.storage.loot.LootTable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.teacon.gimmeman.GimmeMan; - -import java.util.List; -import java.util.Optional; - -@Mixin(AdvancementRewards.class) -public class AdvancementRewardsMixin { - - @Shadow @Final private Optional function; - - @Shadow @Final private List> loot; - - @Inject(method = "grant", at = @At("HEAD"), cancellable = true) - private void cancelGrant(ServerPlayer arg, CallbackInfo ci) { - if (loot.stream().anyMatch(lootTableResourceKey -> lootTableResourceKey.location().getNamespace().equals(GimmeMan.MOD_ID))) - return; - - MinecraftServer minecraftserver = arg.server; - this.function - .flatMap(argx -> argx.get(minecraftserver.getFunctions())) - .ifPresent(arg2 -> minecraftserver.getFunctions().execute(arg2, arg.createCommandSourceStack().withSuppressedOutput().withPermission(2))); - - ci.cancel(); - } -} diff --git a/src/main/java/org/teacon/gimmeman/mixin/DisplayInfoMixin.java b/src/main/java/org/teacon/gimmeman/mixin/DisplayInfoMixin.java deleted file mode 100644 index d1236a1..0000000 --- a/src/main/java/org/teacon/gimmeman/mixin/DisplayInfoMixin.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.teacon.gimmeman.mixin; - -import net.minecraft.advancements.DisplayInfo; -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(DisplayInfo.class) -public class DisplayInfoMixin { - - @Inject(method = "shouldAnnounceChat", at = @At("HEAD"), cancellable = true) - void shouldAnnounceChat(CallbackInfoReturnable cir) { - cir.setReturnValue(false); - } -} diff --git a/src/main/java/org/teacon/gimmeman/mixin/L2BackpackMixin.java b/src/main/java/org/teacon/gimmeman/mixin/L2BackpackMixin.java new file mode 100644 index 0000000..67d0b45 --- /dev/null +++ b/src/main/java/org/teacon/gimmeman/mixin/L2BackpackMixin.java @@ -0,0 +1,34 @@ +package org.teacon.gimmeman.mixin; + +import dev.xkmc.l2backpack.events.StartUpGiveItemEvents; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; +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 org.teacon.gimmeman.GiveMeMan; + +@Mixin(StartUpGiveItemEvents.class) +public class L2BackpackMixin { + + @Inject(method = "onPlayerTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Inventory;placeItemBackInInventory(Lnet/minecraft/world/item/ItemStack;)V", shift = At.Shift.AFTER)) + private static void afterBackpackGiven(PlayerTickEvent.Post event, CallbackInfo ci) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + LootTable lootTable = player.server.reloadableRegistries().getLootTable( + ResourceKey.create(Registries.LOOT_TABLE, GiveMeMan.id("startup_items"))); + LootParams lootParams = (new LootParams.Builder(player.serverLevel())) + .withLuck(player.getLuck()) + .create(LootContextParamSet.builder().build()); + lootTable.getRandomItems(lootParams).forEach(itemStack -> { + if (!player.getInventory().add(itemStack)) { + player.drop(itemStack, false); + } + }); + } +} diff --git a/src/main/java/org/teacon/gimmeman/mixin/MixinClientAdvancements.java b/src/main/java/org/teacon/gimmeman/mixin/MixinClientAdvancements.java new file mode 100644 index 0000000..92af1e8 --- /dev/null +++ b/src/main/java/org/teacon/gimmeman/mixin/MixinClientAdvancements.java @@ -0,0 +1,20 @@ +package org.teacon.gimmeman.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.toasts.Toast; +import net.minecraft.client.gui.components.toasts.ToastComponent; +import net.minecraft.client.multiplayer.ClientAdvancements; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ClientAdvancements.class) +public class MixinClientAdvancements { + + @Redirect(method = "update",at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/toasts/ToastComponent;addToast(Lnet/minecraft/client/gui/components/toasts/Toast;)V")) + public void onAddToast(ToastComponent instance, Toast arg){ + assert Minecraft.getInstance().player != null; + if (Minecraft.getInstance().player.tickCount < 100) return; + instance.addToast(arg); + } +} diff --git a/src/main/java/org/teacon/gimmeman/mixin/MixinPlayerAdvancements.java b/src/main/java/org/teacon/gimmeman/mixin/MixinPlayerAdvancements.java new file mode 100644 index 0000000..831ddfb --- /dev/null +++ b/src/main/java/org/teacon/gimmeman/mixin/MixinPlayerAdvancements.java @@ -0,0 +1,25 @@ +package org.teacon.gimmeman.mixin; + +import net.minecraft.advancements.DisplayInfo; +import net.minecraft.server.PlayerAdvancements; +import net.minecraft.server.level.ServerPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Optional; +import java.util.function.Consumer; + +@Mixin(PlayerAdvancements.class) +public class MixinPlayerAdvancements { + + @Shadow private ServerPlayer player; + + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + @Redirect(method = "award", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V")) + public void onBoardCastMessage(Optional instance, Consumer action){ + if (player.tickCount < 100) return; + instance.ifPresent(action); + } +} diff --git a/src/main/resources/data/gimmeman/advancement/give_startup_items.json b/src/main/resources/data/gimmeman/advancement/give_startup_items.json deleted file mode 100644 index 0d7f5e2..0000000 --- a/src/main/resources/data/gimmeman/advancement/give_startup_items.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "criteria": { - "tick": { - "trigger": "minecraft:tick" - } - }, - "rewards": { - "loot": [ - "gimmeman:give_startup_items" - ] - } -} \ No newline at end of file diff --git a/src/main/resources/data/gimmeman/loot_table/give_startup_items.json b/src/main/resources/data/gimmeman/loot_table/startup_items.json similarity index 100% rename from src/main/resources/data/gimmeman/loot_table/give_startup_items.json rename to src/main/resources/data/gimmeman/loot_table/startup_items.json diff --git a/src/main/resources/gimmeman.mixins.json b/src/main/resources/gimmeman.mixins.json index 39a0277..3bfe08d 100644 --- a/src/main/resources/gimmeman.mixins.json +++ b/src/main/resources/gimmeman.mixins.json @@ -4,11 +4,11 @@ "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "client": [ + "MixinClientAdvancements" ], "mixins": [ - "AdvancementManagerMixin", - "AdvancementRewardsMixin", - "DisplayInfoMixin" + "L2BackpackMixin", + "MixinPlayerAdvancements" ], "injectors": { "defaultRequire": 1