From 2a1c8b8f83077941db02c3eb104f4f2365a66e7e Mon Sep 17 00:00:00 2001 From: zenfyr Date: Sun, 23 Nov 2025 17:12:03 +0700 Subject: [PATCH] move to mojmap --- build.gradle | 2 +- .../andromeda/api/ModuleDeclarations.java | 16 +- .../melontini/andromeda/common/Andromeda.java | 44 ++-- .../andromeda/common/config/DataConfigs.java | 32 +-- .../andromeda/common/mixin/EntityMixin.java | 26 +-- .../common/mixin/RegistryLoaderMixin.java | 22 +- .../mixin/SubCategoryListEntryMixin.java | 2 +- .../mixin/configs/ServerWorldMixin.java | 44 ++-- .../common/mixin/configs/WorldMixin.java | 4 +- .../common/util/AndromedaItemGroup.java | 40 ++-- .../util/ConstantLootContextAccessor.java | 4 +- .../common/util/IdentifiedJsonDataLoader.java | 12 +- .../common/util/LazyLootParameterSet.java | 50 ++--- .../common/util/LootContextBuilder.java | 100 +++++---- .../andromeda/common/util/MiscUtil.java | 30 +-- .../commander/bool/BooleanIntermediary.java | 2 +- .../bool/CommanderBooleanIntermediary.java | 2 +- .../bool/ConstantBooleanIntermediary.java | 2 +- .../commander/number/DoubleIntermediary.java | 2 +- .../commander/number/LongIntermediary.java | 2 +- .../constant/ConstantDoubleIntermediary.java | 2 +- .../constant/ConstantLongIntermediary.java | 2 +- .../CommanderDoubleIntermediary.java | 2 +- .../expression/CommanderLongIntermediary.java | 2 +- .../blocks/bed/power/mixin/BedBlockMixin.java | 26 +-- .../blocks/bed/safe/mixin/BedBlockMixin.java | 46 ++-- .../bed/unsafe/mixin/BedBlockMixin.java | 24 +- .../FletchingScreen.java | 46 ++-- .../FletchingScreenHandler.java | 120 +++++----- .../mixin/BowItemMixin.java | 26 +-- .../mixin/FletchingTableBlockMixin.java | 54 ++--- .../blocks/cactus_bottle_filling/Main.java | 4 +- .../mixin/AbstractBlockMixin.java | 84 +++---- .../mixin/CactusBlockMixin.java | 12 +- .../campfire_effects/CampfireEffects.java | 6 +- .../mixin/CampfireBlockEntityMixin.java | 38 ++-- .../mixin/PropaguleBlockMixin.java | 30 +-- .../modules/blocks/guarded_loot/Main.java | 64 +++--- .../LootableContainerBlockEntityMixin.java | 28 +-- .../blocks/incubator/IncubatorBlock.java | 152 ++++++------- .../incubator/IncubatorBlockEntity.java | 172 +++++++------- .../incubator/IncubatorBlockRenderer.java | 96 ++++---- .../incubator/data/EggProcessingData.java | 36 +-- .../leaf_slowdown/mixin/EntityMixin.java | 56 ++--- .../mixin/AdvancementTabMixin.java | 20 +- .../mixin/BeeEntityMixin.java | 82 +++---- .../mixin/BoneMealItemMixin.java | 22 +- .../mixin/FurnaceMinecartIntakeMixin.java | 46 ++-- .../mixin/FurnaceMinecartMixin.java | 44 ++-- .../modules/entities/boats/BoatEntities.java | 22 +- .../modules/entities/boats/BoatItems.java | 32 +-- .../boats/client/BoatWithBlockRenderer.java | 86 +++---- .../modules/entities/boats/client/Client.java | 14 +- .../boats/client/ClientSoundHolder.java | 58 ++--- .../boats/entities/BoatEntityWithBlock.java | 12 +- .../boats/entities/FurnaceBoatEntity.java | 104 ++++----- .../boats/entities/HopperBoatEntity.java | 88 ++++---- .../boats/entities/JukeboxBoatEntity.java | 128 +++++------ .../boats/entities/TNTBoatEntity.java | 138 ++++++------ .../boats/items/AndromedaBoatItem.java | 128 ++++++----- .../modules/entities/ghast_tweaks/Main.java | 12 +- .../ghast_tweaks/mixin/ExplosionMixin.java | 24 +- .../mixin/FireballEntityMixin.java | 62 ++--- .../mixin/AbstractMinecartEntityMixin.java | 16 +- .../mixin/FurnaceMinecartEntityMixin.java | 22 +- .../entities/minecarts/MinecartEntities.java | 20 +- .../entities/minecarts/MinecartItems.java | 86 +++---- .../entities/minecarts/client/Client.java | 10 +- .../entities/AnvilMinecartEntity.java | 68 +++--- .../entities/JukeboxMinecartEntity.java | 140 ++++++------ .../entities/NoteBlockMinecartEntity.java | 136 +++++------ .../items/AndromedaMinecartItem.java | 120 +++++----- .../minecarts/items/JukeboxMinecartItem.java | 10 +- .../items/NoteBlockMinecartItem.java | 8 +- .../minecarts/items/SpawnerMinecartItem.java | 52 ++--- .../slimes/mixin/flee/MobEntityMixin.java | 30 +-- .../slimes/mixin/merge/SlimeEntityMixin.java | 50 ++--- .../mixin/slowness/SlimeEntityMixin.java | 48 ++-- .../mixin/cooldown/SnowballItemMixin.java | 28 +-- .../mixin/freeze/SnowballEntityMixin.java | 30 +-- .../mixin/layers/SnowballEntityMixin.java | 85 +++---- .../mixin/melt/SnowballEntityMixin.java | 27 +-- .../put_out_fire/SnowballEntityMixin.java | 32 +-- .../entities/vehicle_unentrapment/Main.java | 30 +-- .../VillagerTemptGoal.java | 38 ++-- .../mixin/VillagerEntityMixin.java | 36 +-- .../all_pick_up/mixin/ZombieEntityMixin.java | 44 ++-- .../zombie/clean_pickup/PickupTag.java | 8 +- .../clean_pickup/mixin/ZombieEntityMixin.java | 28 +-- .../modules/gui/gui_particles/Client.java | 10 +- .../CustomItemStackParticle.java | 28 +-- .../mixin/AnvilScreenHandlerMixin.java | 60 ++--- .../gui_particles/mixin/BundleItemMixin.java | 32 +-- .../mixin/CreativeInventoryScreenMixin.java | 48 ++-- .../mixin/EnchantmentScreenMixin.java | 24 +- .../mixin/GameModeSelectionScreenMixin.java | 76 +++---- .../gui/item_frame_tooltips/Client.java | 72 +++--- .../name_tooltips/mixin/InGameHudMixin.java | 72 +++--- .../mixin/GameModeSelectionMixin.java | 14 +- .../mixin/GameModeSelectionScreenMixin.java | 24 +- .../mixin/DrawContextMixin.java | 66 +++--- .../mixin/AnvilScreenHandlerMixin.java | 34 +-- .../mixin/AnvilScreenMixin.java | 26 +-- .../mixin/ExperienceOrbMixin.java | 10 +- .../mixin/ItemStackMixin.java | 10 +- .../better_names/mixin/ItemStackMixin.java | 36 +-- .../items/infinite_totem/BeaconUtil.java | 12 +- .../modules/items/infinite_totem/Main.java | 26 +-- .../items/infinite_totem/client/Client.java | 38 ++-- .../client/KnockoffTotemParticle.java | 62 ++--- .../infinite_totem/mixin/ItemEntityMixin.java | 114 +++++----- .../mixin/LivingEntityMixin.java | 70 +++--- .../lava_disintegrator/mixin/ItemMixin.java | 70 +++--- .../modules/items/lockpick/LockpickItem.java | 66 +++--- .../lockpick/MerchantInventoryScreen.java | 36 +-- .../MerchantInventoryScreenHandler.java | 56 ++--- .../lockpick/mixin/PlayerEntityMixin.java | 32 +-- .../modules/items/magnet/MagnetItem.java | 212 +++++++++--------- .../PickUpBehaviorHandler.java | 36 +-- .../PlaceBehaviorHandler.java | 50 ++--- .../mixin/ItemDispenserBehaviorMixin.java | 38 ++-- .../mixin/MinecartItemMixin.java | 72 +++--- .../andromeda/modules/items/pouches/Main.java | 80 +++---- .../modules/items/pouches/Trades.java | 14 +- .../modules/items/pouches/client/Client.java | 4 +- .../items/pouches/entities/PouchEntity.java | 140 ++++++------ .../items/pouches/items/PouchItem.java | 98 ++++---- .../items/tooltips/mixin/clock/ItemMixin.java | 34 +-- .../tooltips/mixin/compass/ItemMixin.java | 58 ++--- .../mixin/recovery_compass/ItemMixin.java | 52 ++--- .../dragon_fight/EnderDragonManager.java | 68 +++--- .../dragon_fight/mixin/EndCrystalMixin.java | 36 +-- .../dragon_fight/mixin/EnderDragonMixin.java | 6 +- .../dragon_fight/mixin/SpikeCacheMixin.java | 2 +- .../throwable_items/FlyingItemEntity.java | 40 ++-- .../throwable_items/ItemBehavior.java | 38 ++-- .../throwable_items/ItemThrowerMob.java | 2 +- .../mechanics/throwable_items/Main.java | 82 +++---- .../ThrowableItemAttackGoal.java | 60 ++--- .../throwable_items/client/Client.java | 58 ++--- .../throwable_items/client/DyeParticle.java | 26 +-- .../client/FlyingItemEntityRenderer.java | 70 +++--- .../data/DefaultBehaviors.java | 96 ++++---- .../data/ItemBehaviorData.java | 60 ++--- .../data/ItemBehaviorManager.java | 14 +- .../throwable_items/data/ItemPlopEffect.java | 24 +- .../throwable_items/data/ParticleCommand.java | 30 +-- .../mixin/DispenserBlockMixin.java | 16 +- .../throwable_items/mixin/ItemStackMixin.java | 68 +++--- .../mixin/ZombieEntityMixin.java | 62 ++--- .../CustomTraderManager.java | 101 +++++---- .../mechanics/trading_goat_horn/GoatHorn.java | 4 +- .../mixin/GoatHornMixin.java | 52 ++--- .../mechanics/villager_gifting/GiftTags.java | 26 +-- .../mixin/VillagerEntityMixin.java | 74 +++--- .../mixin/PlayerEntityMixin.java | 54 ++--- .../AdvancementGeneration.java | 4 +- .../recipe_advancements_generation/Main.java | 78 +++---- .../mixin/PlayerManagerMixin.java | 6 +- .../modules/misc/tiny_storage/Main.java | 16 +- .../tiny_storage/mixin/PlayerEntityMixin.java | 42 ++-- .../mixin/PlayerScreenHandlerMixin.java | 18 +- .../mixin/MinecraftClientMixin.java | 14 +- .../ReloadableResourceManagerImplMixin.java | 26 ++- .../modules/misc/unknown/RoseOfTheValley.java | 76 +++---- .../modules/misc/unknown/UnknownUtil.java | 24 +- .../nice_level/LevelLoadingScreenMixin.java | 4 +- .../mixin/rose_of_the_valley/ItemMixin.java | 36 +-- .../mixin/useless_info/DebugHudMixin.java | 14 +- .../mixin/wakeup/PlayerEntityMixin.java | 46 ++-- .../world/auto_planting/AutoPlanting.java | 2 +- .../auto_planting/mixin/ItemEntityMixin.java | 46 ++-- .../PlantTemperatureData.java | 45 ++-- .../mixin/BoneMealItemMixin.java | 28 +-- .../mixin/ServerWorldMixin.java | 16 +- .../world/falling_beenests/BeeUtil.java | 56 ++--- .../mixin/BeehiveBlockEntityMixin.java | 46 ++-- .../mixin/BeehiveBlockMixin.java | 38 ++-- .../mixin/FallingBlockMixin.java | 82 +++---- .../PersistentProjectileEntityMixin.java | 42 ++-- .../world/loot_barrels/LootBarrelFeature.java | 90 ++++---- .../moist_control/mixin/FarmlandMixin.java | 26 +-- .../mixin/AbstractFireBlockMixin.java | 50 ++--- src/main/resources/andromeda.accesswidener | 50 ++--- 184 files changed, 4113 insertions(+), 4079 deletions(-) diff --git a/build.gradle b/build.gradle index a28ea2b4..c979d383 100644 --- a/build.gradle +++ b/build.gradle @@ -53,7 +53,7 @@ loom { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + mappings loom.officialMojangMappings() modImplementation libs.fabric.loader def dm = libs.dark.matter diff --git a/src/main/java/me/melontini/andromeda/api/ModuleDeclarations.java b/src/main/java/me/melontini/andromeda/api/ModuleDeclarations.java index 4ba3ab89..1386b469 100644 --- a/src/main/java/me/melontini/andromeda/api/ModuleDeclarations.java +++ b/src/main/java/me/melontini/andromeda/api/ModuleDeclarations.java @@ -1,10 +1,10 @@ package me.melontini.andromeda.api; import java.util.function.BiPredicate; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.recipe.Recipe; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.resources.ResourceLocation; public class ModuleDeclarations { @@ -14,16 +14,16 @@ public class ModuleDeclarations { public static final ApiDeclaration ADVANCEMENT_RECIPE_FILTER = new ApiDeclaration<>(ApiDeclaration.Status.STABLE); - public interface RecipeFilter extends BiPredicate> { + public interface RecipeFilter extends BiPredicate> { @Override - boolean test(Identifier identifier, Recipe recipe); + boolean test(ResourceLocation identifier, Recipe recipe); } public static final ApiDeclaration LOOT_UNLOCKER = new ApiDeclaration<>(ApiDeclaration.Status.STABLE); - public interface LootUnlocker extends BiPredicate { + public interface LootUnlocker extends BiPredicate { @Override - boolean test(BlockEntity be, PlayerEntity player); + boolean test(BlockEntity be, Player player); } } diff --git a/src/main/java/me/melontini/andromeda/common/Andromeda.java b/src/main/java/me/melontini/andromeda/common/Andromeda.java index 21acc479..339a9122 100644 --- a/src/main/java/me/melontini/andromeda/common/Andromeda.java +++ b/src/main/java/me/melontini/andromeda/common/Andromeda.java @@ -20,16 +20,16 @@ import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Block; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroup; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; import org.jetbrains.annotations.Nullable; public class Andromeda implements ModInitializer { @@ -39,7 +39,7 @@ public class Andromeda implements ModInitializer { public static final MultiConfigHandler MAIN; public static final MultiConfigHandler GAME; - public static final Keeper GROUP = Keeper.create(); + public static final Keeper GROUP = Keeper.create(); @Getter private @Nullable MinecraftServer currentServer; @@ -60,12 +60,12 @@ public class Andromeda implements ModInitializer { RegisterConfigEvent.GAME); } - public static Identifier id(String path) { - return new Identifier(MODID, path); + public static ResourceLocation id(String path) { + return new ResourceLocation(MODID, path); } - public static RegistryKey key(RegistryKey> registry, String path) { - return RegistryKey.of(registry, id(path)); + public static ResourceKey key(ResourceKey> registry, String path) { + return ResourceKey.create(registry, id(path)); } public static Gson buildGson() { @@ -86,12 +86,12 @@ public class Andromeda implements ModInitializer { InitEvents.MAIN.invoker().onModuleMainInit().runEntrypoint(); ResourceConditions.register( - id("items_registered"), object -> JsonHelper.getArray(object, "values").asList().stream() + id("items_registered"), object -> GsonHelper.getAsJsonArray(object, "values").asList().stream() .filter(JsonElement::isJsonPrimitive) - .allMatch(e -> Registries.ITEM.containsId(new Identifier(e.getAsString())))); + .allMatch(e -> BuiltInRegistries.ITEM.containsKey(new ResourceLocation(e.getAsString())))); ResourceConditions.register( - id("modules_loaded"), object -> JsonHelper.getArray(object, "values").asList().stream() + id("modules_loaded"), object -> GsonHelper.getAsJsonArray(object, "values").asList().stream() .filter(JsonElement::isJsonPrimitive) .allMatch(e -> ModuleManager.get().get(e.getAsString()).isPresent())); @@ -121,13 +121,13 @@ public class Andromeda implements ModInitializer { public static void appendCommonGsonTypes(GsonBuilder builder) { IntermediaryTypes.initialize(builder); // Commander support - builder.registerTypeHierarchyAdapter(Identifier.class, GsonCodecContext.of(Identifier.CODEC)); - builder.registerTypeHierarchyAdapter(Identifier.class, GsonCodecContext.of(Identifier.CODEC)); + builder.registerTypeHierarchyAdapter(ResourceLocation.class, GsonCodecContext.of(ResourceLocation.CODEC)); + builder.registerTypeHierarchyAdapter(ResourceLocation.class, GsonCodecContext.of(ResourceLocation.CODEC)); builder.registerTypeHierarchyAdapter( - StatusEffect.class, GsonCodecContext.of(Registries.STATUS_EFFECT.getCodec())); + MobEffect.class, GsonCodecContext.of(BuiltInRegistries.MOB_EFFECT.byNameCodec())); builder.registerTypeHierarchyAdapter( - Item.class, GsonCodecContext.of(Registries.ITEM.getCodec())); + Item.class, GsonCodecContext.of(BuiltInRegistries.ITEM.byNameCodec())); builder.registerTypeHierarchyAdapter( - Block.class, GsonCodecContext.of(Registries.BLOCK.getCodec())); + Block.class, GsonCodecContext.of(BuiltInRegistries.BLOCK.byNameCodec())); } } diff --git a/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java b/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java index 29c3cd12..26dcecf2 100644 --- a/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java +++ b/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java @@ -22,18 +22,18 @@ import me.melontini.andromeda.util.Util; import me.melontini.dark_matter.api.data.loading.ReloaderType; import me.melontini.dark_matter.api.data.loading.ServerReloadersEvent; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.resource.ResourceManager; +import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; -import net.minecraft.world.World; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.Level; // Loads and applies custom config overrides from data packs @CustomLog public final class DataConfigs extends IdentifiedJsonDataLoader { - public static final Identifier DEFAULT = Andromeda.id("default"); + public static final ResourceLocation DEFAULT = Andromeda.id("default"); public static final ReloaderType RELOADER = ReloaderType.create(Andromeda.id("scoped_config")); @@ -42,7 +42,7 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { } private final ModuleManager moduleManager; - public Map>> configs; + public Map>> configs; public Map> defaultConfigs; public DataConfigs(ModuleManager moduleManager) { @@ -52,11 +52,11 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { @Override protected void apply( - Map data, ResourceManager manager, Profiler profiler) { - Map>> parsed = new HashMap<>(); + Map data, ResourceManager manager, ProfilerFiller profiler) { + Map>> parsed = new HashMap<>(); for (var entry : Maps.transformValues(data, JsonElement::getAsJsonObject).entrySet()) { - Identifier id = entry.getKey(); + ResourceLocation id = entry.getKey(); JsonObject json = entry.getValue(); // Modules must be loaded to apply their configs. var module = this.moduleManager @@ -66,7 +66,7 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { var type = Andromeda.GAME.getDefinition(module).supplier().get(); Maps.transformValues(json.asMap(), JsonElement::getAsJsonObject).forEach((string, value) -> { - var dimension = new Identifier(string); + var dimension = new ResourceLocation(string); var cfg = Andromeda.GAME.gson().fromJson(value, type); // Parse the fields that must be modified during `apply` @@ -90,7 +90,7 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { this.configs = parsed; } - public void applyConfigs(AttachmentGetter getter, Identifier dimension) { + public void applyConfigs(AttachmentGetter getter, ResourceLocation dimension) { Objects.requireNonNull(configs); var handler = getter.andromeda$getConfigs(); @@ -98,7 +98,7 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { handler.forEach((module, baseConfig) -> this.applyDataPacks(baseConfig, module, dimension)); } - void applyDataPacks(BaseConfig config, Module module, Identifier dimension) { + void applyDataPacks(BaseConfig config, Module module, ResourceLocation dimension) { if (defaultConfigs != null) { var forModule = defaultConfigs.get(module); if (forModule != null) for (Data data : forModule) this.apply(config, data); @@ -131,7 +131,7 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { default T am$get(ConfigDefinition definition) { log.error( "Scoped configs requested on client in world '{}'! Returning un-scoped!", - ((World) this).getRegistryKey().getValue()); + ((Level) this).dimension().location()); return Andromeda.MAIN.get(definition); // Stub implementation. DNI } } @@ -147,8 +147,8 @@ public final class DataConfigs extends IdentifiedJsonDataLoader { if (!success) return; var configs = DataConfigs.get(server); - for (ServerWorld world : server.getWorlds()) { - configs.applyConfigs((AttachmentGetter) world, world.getRegistryKey().getValue()); + for (ServerLevel world : server.getAllLevels()) { + configs.applyConfigs((AttachmentGetter) world, world.dimension().location()); } }); } diff --git a/src/main/java/me/melontini/andromeda/common/mixin/EntityMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/EntityMixin.java index ba35b3a3..ecb8186c 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/EntityMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/EntityMixin.java @@ -6,13 +6,13 @@ import me.melontini.andromeda.common.util.LazyLootParameterSet; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.base.util.functions.Memoize; -import net.minecraft.entity.Entity; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.loot.context.LootContextTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -21,16 +21,16 @@ import org.spongepowered.asm.mixin.Unique; abstract class EntityMixin implements ConstantLootContextAccessor { @Shadow - public abstract Vec3d getPos(); + public abstract Vec3 position(); @Shadow - public abstract World getWorld(); + public abstract Level level(); @Unique private final Supplier andromeda$context = Utilities.supply(() -> { - var c = new LazyLootParameterSet.Builder(() -> (ServerWorld) getWorld()) - .add(LootContextParameters.ORIGIN, this::getPos) - .add(LootContextParameters.THIS_ENTITY, () -> (Entity) (Object) this) - .build(LootContextTypes.COMMAND); + var c = new LazyLootParameterSet.Builder(() -> (ServerLevel) level()) + .add(LootContextParams.ORIGIN, this::position) + .add(LootContextParams.THIS_ENTITY, () -> (Entity) (Object) this) + .build(LootContextParamSets.COMMAND); return Memoize.supplier(() -> LootContextBuilder.build(c)); }); diff --git a/src/main/java/me/melontini/andromeda/common/mixin/RegistryLoaderMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/RegistryLoaderMixin.java index b6c5f25b..d36d5dbe 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/RegistryLoaderMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/RegistryLoaderMixin.java @@ -11,19 +11,19 @@ import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Lifecycle; import java.util.function.Consumer; import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions; -import net.minecraft.registry.MutableRegistry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryLoader; -import net.minecraft.util.Identifier; +import net.minecraft.core.WritableRegistry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.RegistryDataLoader; +import net.minecraft.resources.ResourceLocation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(RegistryLoader.class) +@Mixin(RegistryDataLoader.class) abstract class RegistryLoaderMixin { @WrapOperation( method = - "load(Lnet/minecraft/registry/RegistryOps$RegistryInfoGetter;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/RegistryKey;Lnet/minecraft/registry/MutableRegistry;Lcom/mojang/serialization/Decoder;Ljava/util/Map;)V", + "loadRegistryContents(Lnet/minecraft/resources/RegistryOps$RegistryInfoLookup;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/WritableRegistry;Lcom/mojang/serialization/Decoder;Ljava/util/Map;)V", at = @At( value = "INVOKE", @@ -35,7 +35,7 @@ abstract class RegistryLoaderMixin { DynamicOps ops, Object input, Operation> original, - @Local Identifier identifier, + @Local ResourceLocation identifier, @Local JsonElement json) { // Only applying to Andromeda because this is very untested. if (identifier.getNamespace().equals("andromeda") @@ -47,7 +47,7 @@ abstract class RegistryLoaderMixin { @WrapOperation( method = - "load(Lnet/minecraft/registry/RegistryOps$RegistryInfoGetter;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/RegistryKey;Lnet/minecraft/registry/MutableRegistry;Lcom/mojang/serialization/Decoder;Ljava/util/Map;)V", + "loadRegistryContents(Lnet/minecraft/resources/RegistryOps$RegistryInfoLookup;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/WritableRegistry;Lcom/mojang/serialization/Decoder;Ljava/util/Map;)V", at = @At( value = "INVOKE", @@ -64,14 +64,14 @@ abstract class RegistryLoaderMixin { @WrapWithCondition( method = - "load(Lnet/minecraft/registry/RegistryOps$RegistryInfoGetter;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/RegistryKey;Lnet/minecraft/registry/MutableRegistry;Lcom/mojang/serialization/Decoder;Ljava/util/Map;)V", + "loadRegistryContents(Lnet/minecraft/resources/RegistryOps$RegistryInfoLookup;Lnet/minecraft/server/packs/resources/ResourceManager;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/WritableRegistry;Lcom/mojang/serialization/Decoder;Ljava/util/Map;)V", at = @At( value = "INVOKE", target = - "Lnet/minecraft/registry/MutableRegistry;add(Lnet/minecraft/registry/RegistryKey;Ljava/lang/Object;Lcom/mojang/serialization/Lifecycle;)Lnet/minecraft/registry/entry/RegistryEntry$Reference;")) + "Lnet/minecraft/core/WritableRegistry;register(Lnet/minecraft/resources/ResourceKey;Ljava/lang/Object;Lcom/mojang/serialization/Lifecycle;)Lnet/minecraft/core/Holder$Reference;")) private static boolean andromeda$cancelEntryAddition( - MutableRegistry instance, RegistryKey tRegistryKey, Object t, Lifecycle lifecycle) { + WritableRegistry instance, ResourceKey tRegistryKey, Object t, Lifecycle lifecycle) { return t != null; } } diff --git a/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java index 3de1e352..abd505e0 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java @@ -23,7 +23,7 @@ abstract class SubCategoryListEntryMixin { @At( value = "INVOKE", target = - "Lme/shedaniel/clothconfig2/api/AbstractConfigListEntry;isRequiresRestart()Z")) + "Lme/shedaniel/clothconfig2/api/AbstractConfigListEntry;isRequiresRestart()Z")) private boolean andromeda$isEdited(boolean original, @Local AbstractConfigListEntry e) { return original && e.isEdited(); } diff --git a/src/main/java/me/melontini/andromeda/common/mixin/configs/ServerWorldMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/configs/ServerWorldMixin.java index cf51c6fa..38136921 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/configs/ServerWorldMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/configs/ServerWorldMixin.java @@ -8,15 +8,15 @@ import me.melontini.andromeda.bootstrap.config.RegisterConfigEvent; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.common.config.DataConfigs; import me.melontini.andromeda.common.config.handler.GameConfigHandler; -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceKey; +import net.minecraft.core.Holder; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.profiler.Profiler; -import net.minecraft.world.MutableWorldProperties; -import net.minecraft.world.World; -import net.minecraft.world.dimension.DimensionType; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.storage.WritableLevelData; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -25,19 +25,19 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ServerWorld.class) -abstract class ServerWorldMixin extends World implements DataConfigs.AttachmentGetter { +@Mixin(ServerLevel.class) +abstract class ServerWorldMixin extends Level implements DataConfigs.AttachmentGetter { protected ServerWorldMixin( - MutableWorldProperties properties, - RegistryKey registryRef, - DynamicRegistryManager registryManager, - RegistryEntry dimensionEntry, - Supplier profiler, - boolean isClient, - boolean debugWorld, - long biomeAccess, - int maxChainedNeighborUpdates) { + WritableLevelData properties, + ResourceKey registryRef, + RegistryAccess registryManager, + Holder dimensionEntry, + Supplier profiler, + boolean isClient, + boolean debugWorld, + long biomeAccess, + int maxChainedNeighborUpdates) { super( properties, registryRef, @@ -60,7 +60,7 @@ abstract class ServerWorldMixin extends World implements DataConfigs.AttachmentG @At( value = "FIELD", target = - "Lnet/minecraft/server/world/ServerWorld;chunkManager:Lnet/minecraft/server/world/ServerChunkManager;", + "Lnet/minecraft/server/level/ServerLevel;chunkSource:Lnet/minecraft/server/level/ServerChunkCache;", ordinal = 0, shift = At.Shift.AFTER), method = "") @@ -69,10 +69,10 @@ abstract class ServerWorldMixin extends World implements DataConfigs.AttachmentG this.andromeda$configs = new GameConfigHandler( manager, Andromeda.GAME, - getServer().session.getWorldDirectory(this.getRegistryKey()).resolve("world_config"), + getServer().storageSource.getDimensionPath(this.dimension()).resolve("world_config"), RegisterConfigEvent.GAME); - DataConfigs.get(this.getServer()).applyConfigs(this, this.getRegistryKey().getValue()); + DataConfigs.get(this.getServer()).applyConfigs(this, this.dimension().location()); } @Override diff --git a/src/main/java/me/melontini/andromeda/common/mixin/configs/WorldMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/configs/WorldMixin.java index 2b7b935a..69623bef 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/configs/WorldMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/configs/WorldMixin.java @@ -1,8 +1,8 @@ package me.melontini.andromeda.common.mixin.configs; import me.melontini.andromeda.common.config.DataConfigs; -import net.minecraft.world.World; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; -@Mixin(World.class) +@Mixin(Level.class) abstract class WorldMixin implements DataConfigs.WorldExtension {} diff --git a/src/main/java/me/melontini/andromeda/common/util/AndromedaItemGroup.java b/src/main/java/me/melontini/andromeda/common/util/AndromedaItemGroup.java index 80d65d3b..5df24a57 100644 --- a/src/main/java/me/melontini/andromeda/common/util/AndromedaItemGroup.java +++ b/src/main/java/me/melontini/andromeda/common/util/AndromedaItemGroup.java @@ -10,11 +10,11 @@ import me.melontini.andromeda.bootstrap.event.bus.Bus; import me.melontini.andromeda.common.Andromeda; import me.melontini.dark_matter.api.item_group.ItemGroupBuilder; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemGroup; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.registry.RegistryKey; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.resources.ResourceKey; public interface AndromedaItemGroup { @@ -26,7 +26,7 @@ public interface AndromedaItemGroup { void onCreateItemGroup(Acceptor acceptor); - static ItemGroup create() { + static CreativeModeTab create() { return ItemGroupBuilder.create(Andromeda.id("group")) .entries(entries -> { Map> stackMap = new LinkedHashMap<>(); @@ -56,7 +56,7 @@ public interface AndromedaItemGroup { List stacks = new ArrayList<>(); small.forEach((m, itemStacks) -> { ItemStack sign = new ItemStack(Items.SPRUCE_SIGN); - sign.setCustomName( + sign.setHoverName( TextUtil.translatable("config.andromeda.%s".formatted(ModuleHelper.dotted(m)))); stacks.add(sign); stacks.addAll(itemStacks); @@ -65,7 +65,7 @@ public interface AndromedaItemGroup { entries.appendStacks(stacks); big.forEach((m, itemStacks) -> { ItemStack sign = new ItemStack(Items.SPRUCE_SIGN); - sign.setCustomName( + sign.setHoverName( TextUtil.translatable("config.andromeda.%s".formatted(ModuleHelper.dotted(m)))); itemStacks.add(0, sign); entries.appendStacks(itemStacks); @@ -76,28 +76,28 @@ public interface AndromedaItemGroup { } interface Acceptor { - void stack(Module module, RegistryKey main, ItemStack stack); + void stack(Module module, ResourceKey main, ItemStack stack); - default void stacks(Module module, RegistryKey main, List stacks) { + default void stacks(Module module, ResourceKey main, List stacks) { for (ItemStack stack : stacks) { stack(module, main, stack); } } - default void items( - Module module, RegistryKey main, List items) { + default void items( + Module module, ResourceKey main, List items) { stacks(module, main, items.stream().map(ItemStack::new).toList()); } - default void item( - Module module, RegistryKey main, T item) { + default void item( + Module module, ResourceKey main, T item) { stack(module, main, new ItemStack(item)); } - default void keepers( - Module module, - RegistryKey main, - List> keepers) { + default void keepers( + Module module, + ResourceKey main, + List> keepers) { stacks( module, main, @@ -108,8 +108,8 @@ public interface AndromedaItemGroup { .toList()); } - default void keeper( - Module module, RegistryKey main, Keeper keeper) { + default void keeper( + Module module, ResourceKey main, Keeper keeper) { if (keeper.isPresent()) stack(module, main, new ItemStack(keeper.orThrow())); } } diff --git a/src/main/java/me/melontini/andromeda/common/util/ConstantLootContextAccessor.java b/src/main/java/me/melontini/andromeda/common/util/ConstantLootContextAccessor.java index 988d0470..031469bc 100644 --- a/src/main/java/me/melontini/andromeda/common/util/ConstantLootContextAccessor.java +++ b/src/main/java/me/melontini/andromeda/common/util/ConstantLootContextAccessor.java @@ -1,8 +1,8 @@ package me.melontini.andromeda.common.util; import java.util.function.Supplier; -import net.minecraft.entity.Entity; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.storage.loot.LootContext; public interface ConstantLootContextAccessor { diff --git a/src/main/java/me/melontini/andromeda/common/util/IdentifiedJsonDataLoader.java b/src/main/java/me/melontini/andromeda/common/util/IdentifiedJsonDataLoader.java index 70ba616c..69899eef 100644 --- a/src/main/java/me/melontini/andromeda/common/util/IdentifiedJsonDataLoader.java +++ b/src/main/java/me/melontini/andromeda/common/util/IdentifiedJsonDataLoader.java @@ -2,26 +2,26 @@ package me.melontini.andromeda.common.util; import com.google.gson.Gson; import net.fabricmc.fabric.api.resource.IdentifiableResourceReloadListener; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; -public abstract class IdentifiedJsonDataLoader extends net.minecraft.resource.JsonDataLoader +public abstract class IdentifiedJsonDataLoader extends net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener implements IdentifiableResourceReloadListener { protected final Gson gson; - private final Identifier id; + private final ResourceLocation id; - private IdentifiedJsonDataLoader(Gson gson, Identifier id) { + private IdentifiedJsonDataLoader(Gson gson, ResourceLocation id) { super(gson, id.toString().replace(':', '/')); this.gson = gson; this.id = id; } - protected IdentifiedJsonDataLoader(Identifier id) { + protected IdentifiedJsonDataLoader(ResourceLocation id) { this(new Gson(), id); } @Override - public final Identifier getFabricId() { + public final ResourceLocation getFabricId() { return this.id; } } diff --git a/src/main/java/me/melontini/andromeda/common/util/LazyLootParameterSet.java b/src/main/java/me/melontini/andromeda/common/util/LazyLootParameterSet.java index 748ec6fa..e460b300 100644 --- a/src/main/java/me/melontini/andromeda/common/util/LazyLootParameterSet.java +++ b/src/main/java/me/melontini/andromeda/common/util/LazyLootParameterSet.java @@ -7,22 +7,22 @@ import java.util.NoSuchElementException; import java.util.Set; import java.util.function.Supplier; import lombok.Getter; -import net.minecraft.loot.context.LootContextParameter; -import net.minecraft.loot.context.LootContextParameterSet; -import net.minecraft.loot.context.LootContextType; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; +import net.minecraft.world.level.storage.loot.parameters.LootContextParam; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; -public class LazyLootParameterSet extends LootContextParameterSet { +public class LazyLootParameterSet extends LootParams { - private final Supplier world; - private final Map, Supplier> parameters; + private final Supplier world; + private final Map, Supplier> parameters; public LazyLootParameterSet( - Supplier world, - Map, Supplier> parameters, - Map dynamicDrops, + Supplier world, + Map, Supplier> parameters, + Map dynamicDrops, float luck) { super(null, null, dynamicDrops, luck); this.world = world; @@ -30,48 +30,48 @@ public class LazyLootParameterSet extends LootContextParameterSet { } @Override - public ServerWorld getWorld() { + public ServerLevel getLevel() { return world.get(); } - public T get(LootContextParameter parameter) { + public T getParameter(LootContextParam parameter) { var object = this.parameters.get(parameter); if (object == null) { - throw new NoSuchElementException(parameter.getId().toString()); + throw new NoSuchElementException(parameter.getName().toString()); } else { return (T) object.get(); } } - @Nullable public T method_51868(LootContextParameter parameter) { + @Nullable public T getOptionalParameter(LootContextParam parameter) { var s = this.parameters.get(parameter); return s == null ? null : (T) s.get(); } - @Nullable public T getOptional(LootContextParameter parameter) { + @Nullable public T getParamOrNull(LootContextParam parameter) { var s = this.parameters.get(parameter); return s == null ? null : (T) s.get(); } public static class Builder { @Getter - private final Supplier world; + private final Supplier world; - private final Map, Supplier> parameters = + private final Map, Supplier> parameters = Maps.newIdentityHashMap(); - private final Map dynamicDrops = Maps.newHashMap(); + private final Map dynamicDrops = Maps.newHashMap(); private float luck; - public Builder(Supplier world) { + public Builder(Supplier world) { this.world = world; } - public Builder add(LootContextParameter parameter, Supplier value) { + public Builder add(LootContextParam parameter, Supplier value) { this.parameters.put(parameter, (Supplier) value); return this; } - public Builder addDynamicDrop(Identifier id, DynamicDrop dynamicDrop) { + public Builder addDynamicDrop(ResourceLocation id, DynamicDrop dynamicDrop) { DynamicDrop dynamicDrop2 = this.dynamicDrops.put(id, dynamicDrop); if (dynamicDrop2 != null) { throw new IllegalStateException("Duplicated dynamic drop '" + this.dynamicDrops + "'"); @@ -85,13 +85,13 @@ public class LazyLootParameterSet extends LootContextParameterSet { return this; } - public LootContextParameterSet build(LootContextType contextType) { - Set> set = + public LootParams build(LootContextParamSet contextType) { + Set> set = Sets.difference(this.parameters.keySet(), contextType.getAllowed()); if (!set.isEmpty()) { throw new IllegalArgumentException("Parameters not allowed in this parameter set: " + set); } else { - Set> set2 = + Set> set2 = Sets.difference(contextType.getRequired(), this.parameters.keySet()); if (!set2.isEmpty()) { throw new IllegalArgumentException("Missing required parameters: " + set2); diff --git a/src/main/java/me/melontini/andromeda/common/util/LootContextBuilder.java b/src/main/java/me/melontini/andromeda/common/util/LootContextBuilder.java index 57c727aa..720877b4 100644 --- a/src/main/java/me/melontini/andromeda/common/util/LootContextBuilder.java +++ b/src/main/java/me/melontini/andromeda/common/util/LootContextBuilder.java @@ -5,120 +5,124 @@ import java.util.Objects; import java.util.function.Supplier; import lombok.NonNull; import me.melontini.dark_matter.api.base.util.functions.Memoize; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.*; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; // Wrapper for a LootContextParameterSet.Builder to add our utility methods. public class LootContextBuilder { - LootContextParameterSet.Builder builder; + LootParams.Builder builder; - private LootContextBuilder(World world) { - this.builder = new LootContextParameterSet.Builder((ServerWorld) world); + private LootContextBuilder(Level world) { + this.builder = new LootParams.Builder((ServerLevel) world); } public static Supplier builder( - LootContextType type, World world, BuilderFunction function) { + LootContextParamSet type, Level world, BuilderFunction function) { return Memoize.supplier( - () -> build(function.apply(new LootContextBuilder(world)).builder.build(type))); + () -> build(function.apply(new LootContextBuilder(world)).builder.create(type))); } - public static Supplier block(World world, BuilderFunction function) { - return builder(LootContextTypes.BLOCK, world, function); + public static Supplier block(Level world, BuilderFunction function) { + return builder(LootContextParamSets.BLOCK, world, function); } - public static Supplier fishing(World world, BuilderFunction function) { - return builder(LootContextTypes.FISHING, world, function); + public static Supplier fishing(Level world, BuilderFunction function) { + return builder(LootContextParamSets.FISHING, world, function); } - public static Supplier command(World world, BuilderFunction function) { - return builder(LootContextTypes.COMMAND, world, function); + public static Supplier command(Level world, BuilderFunction function) { + return builder(LootContextParamSets.COMMAND, world, function); } - public static Supplier entity(World world, BuilderFunction function) { - return builder(LootContextTypes.ENTITY, world, function); + public static Supplier entity(Level world, BuilderFunction function) { + return builder(LootContextParamSets.ENTITY, world, function); } - public static LootContext build(LootContextParameterSet set) { - return new LootContext.Builder(set).build(null); + public static LootContext build(LootParams set) { + return new LootContext.Builder(set).create(null); } - public static List prepareLoot(@NonNull World world, @NonNull Identifier lootId) { - return ((ServerWorld) world) + public static List prepareLoot(@NonNull Level world, @NonNull ResourceLocation lootId) { + return ((ServerLevel) world) .getServer() - .getLootManager() + .getLootData() .getLootTable(lootId) - .generateLoot(new LootContextParameterSet.Builder(((ServerWorld) world)) - .build(LootContextTypes.EMPTY)); + .getRandomItems(new LootParams.Builder(((ServerLevel) world)) + .create(LootContextParamSets.EMPTY)); } public LootContextBuilder origin(BlockPos pos) { - return this.origin(Vec3d.ofCenter(pos)); + return this.origin(Vec3.atCenterOf(pos)); } public LootContextBuilder origin(Entity entity) { - return this.origin(entity.getPos()); + return this.origin(entity.position()); } - public LootContextBuilder origin(Vec3d pos) { - this.builder.addOptional(LootContextParameters.ORIGIN, pos); + public LootContextBuilder origin(Vec3 pos) { + this.builder.withOptionalParameter(LootContextParams.ORIGIN, pos); return this; } public LootContextBuilder state(BlockState state) { - this.builder.addOptional(LootContextParameters.BLOCK_STATE, state); + this.builder.withOptionalParameter(LootContextParams.BLOCK_STATE, state); return this; } - public LootContextBuilder tool(LivingEntity player, Hand hand) { - return this.tool(player.getStackInHand(hand)); + public LootContextBuilder tool(LivingEntity player, InteractionHand hand) { + return this.tool(player.getItemInHand(hand)); } public LootContextBuilder tool(@Nullable ItemStack stack) { - this.builder.addOptional( - LootContextParameters.TOOL, Objects.requireNonNullElse(stack, ItemStack.EMPTY)); + this.builder.withOptionalParameter( + LootContextParams.TOOL, Objects.requireNonNullElse(stack, ItemStack.EMPTY)); return this; } public LootContextBuilder thisEntity(Entity entity) { - this.builder.addOptional(LootContextParameters.THIS_ENTITY, entity); + this.builder.withOptionalParameter(LootContextParams.THIS_ENTITY, entity); return this; } public LootContextBuilder killer(Entity entity) { - this.builder.addOptional(LootContextParameters.KILLER_ENTITY, entity); + this.builder.withOptionalParameter(LootContextParams.KILLER_ENTITY, entity); return this; } public LootContextBuilder directKiller(Entity entity) { - this.builder.addOptional(LootContextParameters.DIRECT_KILLER_ENTITY, entity); + this.builder.withOptionalParameter(LootContextParams.DIRECT_KILLER_ENTITY, entity); return this; } public LootContextBuilder blockEntity(BlockEntity entity) { - this.builder.addOptional(LootContextParameters.BLOCK_ENTITY, entity); + this.builder.withOptionalParameter(LootContextParams.BLOCK_ENTITY, entity); return this; } public LootContextBuilder source(DamageSource source) { - this.builder.addOptional(LootContextParameters.DAMAGE_SOURCE, source); + this.builder.withOptionalParameter(LootContextParams.DAMAGE_SOURCE, source); return this; } public LootContextBuilder genericSource() { - return this.source(builder.getWorld().getDamageSources().generic()); + return this.source(builder.getLevel().damageSources().generic()); } public LootContextBuilder sourceOrGeneric(DamageSource source) { diff --git a/src/main/java/me/melontini/andromeda/common/util/MiscUtil.java b/src/main/java/me/melontini/andromeda/common/util/MiscUtil.java index caf6106d..a8ec8f44 100644 --- a/src/main/java/me/melontini/andromeda/common/util/MiscUtil.java +++ b/src/main/java/me/melontini/andromeda/common/util/MiscUtil.java @@ -1,35 +1,35 @@ package me.melontini.andromeda.common.util; import net.fabricmc.fabric.api.networking.v1.PlayerLookup; -import net.minecraft.entity.Entity; -import net.minecraft.network.packet.s2c.play.EntityVelocityUpdateS2CPacket; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.entity.Entity; +import net.minecraft.network.protocol.game.ClientboundSetEntityMotionPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; public class MiscUtil { - public static double horizontalDistanceTo(Vec3d owner, Vec3d target) { + public static double horizontalDistanceTo(Vec3 owner, Vec3 target) { double d = target.x - owner.x; double f = target.z - owner.z; return Math.sqrt(d * d + f * f); } - public static BlockPos vec3dAsBlockPos(Vec3d vec3d) { + public static BlockPos vec3dAsBlockPos(Vec3 vec3d) { return new BlockPos( - MathHelper.floor(vec3d.x), MathHelper.floor(vec3d.y), MathHelper.floor(vec3d.z)); + Mth.floor(vec3d.x), Mth.floor(vec3d.y), Mth.floor(vec3d.z)); } public static void crudeSetVelocity(Entity entity, double x, double y, double z) { - crudeSetVelocity(entity, new Vec3d(x, y, z)); + crudeSetVelocity(entity, new Vec3(x, y, z)); } - public static void crudeSetVelocity(Entity entity, Vec3d velocity) { - if (!entity.world.isClient) { - entity.setVelocity(velocity); - for (ServerPlayerEntity player : PlayerLookup.tracking(entity)) { - player.networkHandler.sendPacket(new EntityVelocityUpdateS2CPacket(entity)); + public static void crudeSetVelocity(Entity entity, Vec3 velocity) { + if (!entity.level.isClientSide) { + entity.setDeltaMovement(velocity); + for (ServerPlayer player : PlayerLookup.tracking(entity)) { + player.connection.send(new ClientboundSetEntityMotionPacket(entity)); } } else { throw new UnsupportedOperationException( diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/bool/BooleanIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/bool/BooleanIntermediary.java index bc6d540a..0282a65f 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/bool/BooleanIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/bool/BooleanIntermediary.java @@ -4,7 +4,7 @@ import java.util.function.Supplier; import me.melontini.commander.api.expression.BooleanExpression; import me.melontini.dark_matter.api.base.util.Support; import net.fabricmc.fabric.api.util.BooleanFunction; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; public interface BooleanIntermediary { BooleanFunction FACTORY = Support.support( diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/bool/CommanderBooleanIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/bool/CommanderBooleanIntermediary.java index e89648a5..fe6c79a9 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/bool/CommanderBooleanIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/bool/CommanderBooleanIntermediary.java @@ -6,7 +6,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import me.melontini.commander.api.expression.BooleanExpression; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; @EqualsAndHashCode @ToString diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/bool/ConstantBooleanIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/bool/ConstantBooleanIntermediary.java index 8783f36f..06652047 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/bool/ConstantBooleanIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/bool/ConstantBooleanIntermediary.java @@ -2,7 +2,7 @@ package me.melontini.andromeda.common.util.commander.bool; import com.mojang.serialization.Codec; import java.util.function.Supplier; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; public record ConstantBooleanIntermediary(boolean value) implements BooleanIntermediary { diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/number/DoubleIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/number/DoubleIntermediary.java index 7ac5d4b1..ec7776bf 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/number/DoubleIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/number/DoubleIntermediary.java @@ -6,7 +6,7 @@ import me.melontini.andromeda.common.util.commander.number.constant.ConstantDoub import me.melontini.andromeda.common.util.commander.number.expression.CommanderDoubleIntermediary; import me.melontini.commander.api.expression.Arithmetica; import me.melontini.dark_matter.api.base.util.Support; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; // We swap out this common interface to one of its impls. This allows us to support running with and // without commander. diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/number/LongIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/number/LongIntermediary.java index e964fe10..a9232cb8 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/number/LongIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/number/LongIntermediary.java @@ -6,7 +6,7 @@ import me.melontini.andromeda.common.util.commander.number.constant.ConstantLong import me.melontini.andromeda.common.util.commander.number.expression.CommanderLongIntermediary; import me.melontini.commander.api.expression.LongExpression; import me.melontini.dark_matter.api.base.util.Support; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; public interface LongIntermediary { diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantDoubleIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantDoubleIntermediary.java index ee3b9472..68597694 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantDoubleIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantDoubleIntermediary.java @@ -3,7 +3,7 @@ package me.melontini.andromeda.common.util.commander.number.constant; import com.mojang.serialization.Codec; import java.util.function.Supplier; import me.melontini.andromeda.common.util.commander.number.DoubleIntermediary; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; public record ConstantDoubleIntermediary(double value) implements DoubleIntermediary { diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantLongIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantLongIntermediary.java index fb590ac0..e170496d 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantLongIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/number/constant/ConstantLongIntermediary.java @@ -3,7 +3,7 @@ package me.melontini.andromeda.common.util.commander.number.constant; import com.mojang.serialization.Codec; import java.util.function.Supplier; import me.melontini.andromeda.common.util.commander.number.LongIntermediary; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; public record ConstantLongIntermediary(long value) implements LongIntermediary { diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderDoubleIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderDoubleIntermediary.java index 9bf18bfb..7f3adc52 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderDoubleIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderDoubleIntermediary.java @@ -7,7 +7,7 @@ import lombok.Getter; import lombok.ToString; import me.melontini.andromeda.common.util.commander.number.DoubleIntermediary; import me.melontini.commander.api.expression.Arithmetica; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; @EqualsAndHashCode @ToString diff --git a/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderLongIntermediary.java b/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderLongIntermediary.java index c39cc5b5..13e1e23d 100644 --- a/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderLongIntermediary.java +++ b/src/main/java/me/melontini/andromeda/common/util/commander/number/expression/CommanderLongIntermediary.java @@ -7,7 +7,7 @@ import lombok.Getter; import lombok.ToString; import me.melontini.andromeda.common.util.commander.number.LongIntermediary; import me.melontini.commander.api.expression.LongExpression; -import net.minecraft.loot.context.LootContext; +import net.minecraft.world.level.storage.loot.LootContext; @EqualsAndHashCode @ToString diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/mixin/BedBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/mixin/BedBlockMixin.java index f45554cd..0cd476a3 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/mixin/BedBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/mixin/BedBlockMixin.java @@ -4,32 +4,32 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.bed.power.Power; -import net.minecraft.block.BedBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(BedBlock.class) abstract class BedBlockMixin extends Block { - public BedBlockMixin(Settings settings) { + public BedBlockMixin(Properties settings) { super(settings); } - @ModifyExpressionValue(at = @At(value = "CONSTANT", args = "floatValue=5.0F"), method = "onUse") + @ModifyExpressionValue(at = @At(value = "CONSTANT", args = "floatValue=5.0F"), method = "use") public float andromeda$explosionRedirect( float power, - @Local(argsOnly = true) World world, + @Local(argsOnly = true) Level world, @Local(argsOnly = true) BlockPos pos, @Local(argsOnly = true) BlockState state, - @Local(argsOnly = true) PlayerEntity player, - @Local(argsOnly = true) Hand hand) { - if (world.isClient()) return power; + @Local(argsOnly = true) Player player, + @Local(argsOnly = true) InteractionHand hand) { + if (world.isClientSide()) return power; var supplier = LootContextBuilder.block( world, builder -> builder.origin(pos).state(state).tool(player, hand).thisEntity(player)); diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/mixin/BedBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/mixin/BedBlockMixin.java index ff4d6396..5886084a 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/mixin/BedBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/mixin/BedBlockMixin.java @@ -1,19 +1,19 @@ package me.melontini.andromeda.modules.blocks.bed.safe.mixin; -import static net.minecraft.block.BedBlock.isBedWorking; +import static net.minecraft.world.level.block.BedBlock.canSetSpawn; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.bed.safe.Safe; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.block.BedBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -23,27 +23,27 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BedBlock.class) abstract class BedBlockMixin extends Block { - public BedBlockMixin(Settings settings) { + public BedBlockMixin(Properties settings) { super(settings); } - @Inject(at = @At("HEAD"), method = "onUse", cancellable = true) + @Inject(at = @At("HEAD"), method = "use", cancellable = true) public void andromeda$onUse( - BlockState state, - @NotNull World world, - BlockPos pos, - PlayerEntity player, - Hand hand, - BlockHitResult hit, - CallbackInfoReturnable cir) { - if (world.isClient()) return; + BlockState state, + @NotNull Level world, + BlockPos pos, + Player player, + InteractionHand hand, + BlockHitResult hit, + CallbackInfoReturnable cir) { + if (world.isClientSide()) return; - if (!isBedWorking(world)) { + if (!canSetSpawn(world)) { var context = LootContextBuilder.block( world, builder -> builder.origin(pos).state(state).tool(player, hand).thisEntity(player)); if (world.am$get(Safe.CONFIG).available.asBoolean(context)) { - player.sendMessage(TextUtil.translatable("action.andromeda.safebeds"), true); - cir.setReturnValue(ActionResult.SUCCESS); + player.displayClientMessage(TextUtil.translatable("action.andromeda.safebeds"), true); + cir.setReturnValue(InteractionResult.SUCCESS); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/mixin/BedBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/mixin/BedBlockMixin.java index 04c284f9..0042f500 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/mixin/BedBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/mixin/BedBlockMixin.java @@ -4,12 +4,12 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.bed.unsafe.Unsafe; -import net.minecraft.block.BedBlock; -import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -20,16 +20,16 @@ abstract class BedBlockMixin { at = @At( value = "INVOKE", - target = "Lnet/minecraft/block/BedBlock;isBedWorking(Lnet/minecraft/world/World;)Z"), - method = "onUse") + target = "Lnet/minecraft/world/level/block/BedBlock;canSetSpawn(Lnet/minecraft/world/level/Level;)Z"), + method = "use") private boolean andromeda$explode( boolean original, - @Local(argsOnly = true) World world, + @Local(argsOnly = true) Level world, @Local(argsOnly = true) BlockPos pos, @Local(argsOnly = true) BlockState state, - @Local(argsOnly = true) PlayerEntity player, - @Local(argsOnly = true) Hand hand) { - if (world.isClient()) return original; + @Local(argsOnly = true) Player player, + @Local(argsOnly = true) InteractionHand hand) { + if (world.isClientSide()) return original; return original && !world diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreen.java b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreen.java index fb0cbd8e..66f6f4e0 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreen.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreen.java @@ -6,55 +6,55 @@ import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.ForgingScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreens; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.ItemCombinerScreen; +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.resources.ResourceLocation; @Environment(EnvType.CLIENT) -public class FletchingScreen extends ForgingScreen { +public class FletchingScreen extends ItemCombinerScreen { - private static final Identifier TEXTURE = Andromeda.id("textures/gui/fletching.png"); + private static final ResourceLocation TEXTURE = Andromeda.id("textures/gui/fletching.png"); public FletchingScreen( - FletchingScreenHandler handler, PlayerInventory playerInventory, Text title) { + FletchingScreenHandler handler, Inventory playerInventory, Component title) { super(handler, playerInventory, title, TEXTURE); - this.titleX = 60; - this.titleY = 18; + this.titleLabelX = 60; + this.titleLabelY = 18; } @Override - protected void drawForeground(DrawContext context, int mouseX, int mouseY) { + protected void renderLabels(GuiGraphics context, int mouseX, int mouseY) { RenderSystem.disableBlend(); - super.drawForeground(context, mouseX, mouseY); + super.renderLabels(context, mouseX, mouseY); } @Override - protected void drawInvalidRecipeArrow(DrawContext context, int x, int y) { - if (handler.getSlot(0).hasStack() - && handler.getSlot(1).hasStack() - && !handler.getSlot(2).hasStack()) { - context.drawTexture(TEXTURE, x + 99, y + 45, this.backgroundWidth, 0, 28, 21); + protected void renderErrorIcon(GuiGraphics context, int x, int y) { + if (menu.getSlot(0).hasItem() + && menu.getSlot(1).hasItem() + && !menu.getSlot(2).hasItem()) { + context.blit(TEXTURE, x + 99, y + 45, this.imageWidth, 0, 28, 21); } } public static void onClient() { if (FletchingScreenHandler.FLETCHING.isPresent()) { - HandledScreens.register(FletchingScreenHandler.FLETCHING.get(), FletchingScreen::new); + MenuScreens.register(FletchingScreenHandler.FLETCHING.get(), FletchingScreen::new); } ItemTooltipCallback.EVENT.register((stack, context, lines) -> { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); if (nbt == null) return; int i = nbt.getInt("AM-Tightened"); if (i > 0) lines.add( - TextUtil.translatable("tooltip.andromeda.bow.tight", i).formatted(Formatting.GRAY)); + TextUtil.translatable("tooltip.andromeda.bow.tight", i).withStyle(ChatFormatting.GRAY)); }); } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java index a55f0803..7193d121 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java @@ -10,55 +10,55 @@ import me.melontini.andromeda.bootstrap.ModuleManager; import me.melontini.andromeda.common.util.Keeper; import me.melontini.andromeda.util.Debug; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemConvertible; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.recipe.Ingredient; -import net.minecraft.registry.Registries; -import net.minecraft.screen.ForgingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.screen.slot.ForgingSlotsManager; -import net.minecraft.screen.slot.Slot; -import net.minecraft.util.Identifier; - -public class FletchingScreenHandler extends ForgingScreenHandler { - - public static final Keeper> FLETCHING = Keeper.create(); - - public FletchingScreenHandler(int syncId, PlayerInventory playerInventory) { - this(syncId, playerInventory, ScreenHandlerContext.EMPTY); +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.inventory.ItemCombinerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.ItemCombinerMenuSlotDefinition; +import net.minecraft.world.inventory.Slot; +import net.minecraft.resources.ResourceLocation; + +public class FletchingScreenHandler extends ItemCombinerMenu { + + public static final Keeper> FLETCHING = Keeper.create(); + + public FletchingScreenHandler(int syncId, Inventory playerInventory) { + this(syncId, playerInventory, ContainerLevelAccess.NULL); } public FletchingScreenHandler( - int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { + int syncId, Inventory playerInventory, ContainerLevelAccess context) { super(FLETCHING.orThrow(), syncId, playerInventory, context); } @Override - public boolean canTakeOutput(PlayerEntity player, boolean present) { - return !this.output.isEmpty(); + public boolean mayPickup(Player player, boolean present) { + return !this.resultSlots.isEmpty(); } @Override - protected void onTakeOutput(PlayerEntity player, ItemStack stack) { - stack.onCraft(player.getWorld(), player, stack.getCount()); - this.output.unlockLastRecipe(player, List.of(this.input.getStack(0), this.input.getStack(1))); + protected void onTake(Player player, ItemStack stack) { + stack.onCraftedBy(player.level(), player, stack.getCount()); + this.resultSlots.awardUsedRecipes(player, List.of(this.inputSlots.getItem(0), this.inputSlots.getItem(1))); this.decrementStack(0); this.decrementStack(1); - this.context.run((world, pos) -> world.syncWorldEvent(1044, pos, 0)); + this.access.execute((world, pos) -> world.levelEvent(1044, pos, 0)); } private void decrementStack(int slot) { - ItemStack itemStack = this.input.getStack(slot); - itemStack.decrement(1); - this.input.setStack(slot, itemStack); + ItemStack itemStack = this.inputSlots.getItem(slot); + itemStack.shrink(1); + this.inputSlots.setItem(slot, itemStack); } // This should probably be data-driven, but whatever. @@ -66,88 +66,88 @@ public class FletchingScreenHandler extends ForgingScreenHandler { new HashMap<>(); public static void addRecipe( - Function consumer, Ingredient ingredient, Ingredient input) { + Function consumer, Ingredient ingredient, Ingredient input) { RECIPES.computeIfAbsent(input, i -> new IdentityHashMap<>()).put(ingredient, consumer); } @Override - public void updateResult() { - ItemStack stack = getSlot(0).getStack(); + public void createResult() { + ItemStack stack = getSlot(0).getItem(); var lookup = RECIPES.entrySet().stream() .filter(e -> e.getKey().test(stack)) .flatMap(e -> e.getValue().entrySet().stream()) .collect(ImmutableMap.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue)); if (lookup.isEmpty()) { - getSlot(2).setStack(ItemStack.EMPTY); + getSlot(2).setByPlayer(ItemStack.EMPTY); return; } - ItemStack stack1 = getSlot(1).getStack(); + ItemStack stack1 = getSlot(1).getItem(); var recipe = lookup.entrySet().stream().filter(e -> e.getKey().test(stack1)).findFirst(); if (recipe.isEmpty()) { - getSlot(2).setStack(ItemStack.EMPTY); + getSlot(2).setByPlayer(ItemStack.EMPTY); return; } - getSlot(2).setStack(recipe.get().getValue().apply(stack)); + getSlot(2).setByPlayer(recipe.get().getValue().apply(stack)); } @Override - protected ForgingSlotsManager getForgingSlotsManager() { - return ForgingSlotsManager.create() - .input(0, 27, 47, stack -> true) - .input(1, 76, 47, stack -> true) - .output(0, 134, 47) + protected ItemCombinerMenuSlotDefinition createInputSlotDefinitions() { + return ItemCombinerMenuSlotDefinition.create() + .withSlot(0, 27, 47, stack -> true) + .withSlot(1, 76, 47, stack -> true) + .withResultSlot(0, 134, 47) .build(); } @Override - protected boolean canUse(BlockState state) { - return state.isOf(Blocks.FLETCHING_TABLE); + protected boolean isValidBlock(BlockState state) { + return state.is(Blocks.FLETCHING_TABLE); } @Override - public boolean canInsertIntoSlot(ItemStack stack, Slot slot) { - return slot.inventory != this.output && super.canInsertIntoSlot(stack, slot); + public boolean canTakeItemForPickAll(ItemStack stack, Slot slot) { + return slot.container != this.resultSlots && super.canTakeItemForPickAll(stack, slot); } static void init() { var module = ModuleManager.get().get(BetterFletchingTable.class).orElseThrow(); FletchingScreenHandler.FLETCHING.init(RegistryUtil.register( - Registries.SCREEN_HANDLER, + BuiltInRegistries.MENU, id("fletching"), RegistryUtil.screenHandlerType(FletchingScreenHandler::new))); Set tightable = Sets.newHashSet(Items.BOW, Items.CROSSBOW); if (Debug.get().isModLoaded(module, "additionaladditions")) { - Registries.ITEM - .getOrEmpty(Identifier.of("additionaladditions", "crossbow_with_spyglass")) + BuiltInRegistries.ITEM + .getOptional(ResourceLocation.tryBuild("additionaladditions", "crossbow_with_spyglass")) .ifPresent(item -> { tightable.add(item); FletchingScreenHandler.addRecipe( stack -> { var result = new ItemStack(item, 1); - if (stack.getNbt() != null) result.setNbt(stack.getNbt()); + if (stack.getTag() != null) result.setTag(stack.getTag()); return result; }, - Ingredient.ofItems(Items.SPYGLASS), - Ingredient.ofItems(Items.CROSSBOW)); + Ingredient.of(Items.SPYGLASS), + Ingredient.of(Items.CROSSBOW)); }); } FletchingScreenHandler.addRecipe( stack -> { - NbtCompound nbt = stack.getOrCreateNbt(); + CompoundTag nbt = stack.getOrCreateTag(); int i = nbt.getInt("AM-Tightened"); if (i >= 32) return ItemStack.EMPTY; ItemStack newStack = stack.copy(); - newStack.getOrCreateNbt().putInt("AM-Tightened", Math.min(i + 2, 32)); + newStack.getOrCreateTag().putInt("AM-Tightened", Math.min(i + 2, 32)); return newStack; }, - Ingredient.ofItems(Items.STRING), - Ingredient.ofItems(tightable.toArray(ItemConvertible[]::new))); + Ingredient.of(Items.STRING), + Ingredient.of(tightable.toArray(ItemLike[]::new))); } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/BowItemMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/BowItemMixin.java index fd8cbf7f..04b6dcfe 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/BowItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/BowItemMixin.java @@ -4,19 +4,19 @@ import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.better_fletching_table.BetterFletchingTable; import me.melontini.dark_matter.api.data.nbt.NbtUtil; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BowItem; -import net.minecraft.item.ItemStack; -import net.minecraft.item.RangedWeaponItem; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BowItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ProjectileWeaponItem; +import net.minecraft.nbt.CompoundTag; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(BowItem.class) -abstract class BowItemMixin extends RangedWeaponItem { +abstract class BowItemMixin extends ProjectileWeaponItem { - public BowItemMixin(Settings settings) { + public BowItemMixin(Properties settings) { super(settings); } @@ -25,22 +25,22 @@ abstract class BowItemMixin extends RangedWeaponItem { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/projectile/PersistentProjectileEntity;setVelocity(Lnet/minecraft/entity/Entity;FFFFF)V"), - method = "onStoppedUsing", + "Lnet/minecraft/world/entity/projectile/AbstractArrow;shootFromRotation(Lnet/minecraft/world/entity/Entity;FFFFF)V"), + method = "releaseUsing", index = 5) public float andromeda$setVelocity( - float f, @Local(ordinal = 0, argsOnly = true) ItemStack stack, @Local PlayerEntity player) { - NbtCompound stackNbt = stack.getNbt(); + float f, @Local(ordinal = 0, argsOnly = true) ItemStack stack, @Local Player player) { + CompoundTag stackNbt = stack.getTag(); int a = NbtUtil.getInt(stackNbt, "AM-Tightened", 0); if (a > 0) { stackNbt.putInt("AM-Tightened", a - 1); return f * player - .world + .level .am$get(BetterFletchingTable.CONFIG) .divergenceModifier .asFloat(LootContextBuilder.fishing( - player.world, builder -> builder.origin(player).tool(stack).thisEntity(player))); + player.level, builder -> builder.origin(player).tool(stack).thisEntity(player))); } return f; } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/FletchingTableBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/FletchingTableBlockMixin.java index 7410ef9b..9ecb3adf 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/FletchingTableBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/mixin/FletchingTableBlockMixin.java @@ -2,18 +2,18 @@ package me.melontini.andromeda.modules.blocks.better_fletching_table.mixin; import me.melontini.andromeda.modules.blocks.better_fletching_table.FletchingScreenHandler; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.CraftingTableBlock; -import net.minecraft.block.FletchingTableBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.SimpleNamedScreenHandlerFactory; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.CraftingTableBlock; +import net.minecraft.world.level.block.FletchingTableBlock; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.BlockPos; +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; @@ -22,30 +22,30 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(FletchingTableBlock.class) abstract class FletchingTableBlockMixin extends CraftingTableBlock { - public FletchingTableBlockMixin(Settings settings) { + public FletchingTableBlockMixin(Properties settings) { super(settings); } - @Inject(at = @At("HEAD"), method = "onUse", cancellable = true) + @Inject(at = @At("HEAD"), method = "use", cancellable = true) private void andromeda$onUse( - BlockState state, - World world, - BlockPos pos, - PlayerEntity player, - Hand hand, - BlockHitResult hit, - CallbackInfoReturnable cir) { - if (state.isOf(Blocks.FLETCHING_TABLE)) { - if (player.world.isClient) { - cir.setReturnValue(ActionResult.SUCCESS); + BlockState state, + Level world, + BlockPos pos, + Player player, + InteractionHand hand, + BlockHitResult hit, + CallbackInfoReturnable cir) { + if (state.is(Blocks.FLETCHING_TABLE)) { + if (player.level.isClientSide) { + cir.setReturnValue(InteractionResult.SUCCESS); return; } - player.openHandledScreen(new SimpleNamedScreenHandlerFactory( + player.openMenu(new SimpleMenuProvider( (syncId, inv, player1) -> - new FletchingScreenHandler(syncId, inv, ScreenHandlerContext.create(world, pos)), + new FletchingScreenHandler(syncId, inv, ContainerLevelAccess.create(world, pos)), TextUtil.translatable("block.minecraft.fletching_table"))); - cir.setReturnValue(ActionResult.SUCCESS); + cir.setReturnValue(InteractionResult.SUCCESS); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/Main.java b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/Main.java index 635defe3..f835330b 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/Main.java @@ -1,7 +1,7 @@ package me.melontini.andromeda.modules.blocks.cactus_bottle_filling; -import net.minecraft.state.property.IntProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; public class Main { - public static final IntProperty WATER_LEVEL_3 = IntProperty.of("water_level", 1, 3); + public static final IntegerProperty WATER_LEVEL_3 = IntegerProperty.create("water_level", 1, 3); } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/AbstractBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/AbstractBlockMixin.java index 1bb72991..a96480e9 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/AbstractBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/AbstractBlockMixin.java @@ -4,47 +4,47 @@ import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.cactus_bottle_filling.CactusFiller; import me.melontini.andromeda.modules.blocks.cactus_bottle_filling.Main; import me.melontini.dark_matter.api.minecraft.util.ItemStackUtil; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.CactusBlock; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsage; -import net.minecraft.item.Items; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.potion.PotionUtil; -import net.minecraft.potion.Potions; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.stat.Stats; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.CactusBlock; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.ItemUtils; +import net.minecraft.world.item.Items; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.item.alchemy.PotionUtils; +import net.minecraft.world.item.alchemy.Potions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.BlockPos; +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; -@Mixin(AbstractBlock.class) +@Mixin(BlockBehaviour.class) abstract class AbstractBlockMixin { - @Inject(at = @At("HEAD"), method = "onUse", cancellable = true) + @Inject(at = @At("HEAD"), method = "use", cancellable = true) private void andromeda$onUse( - BlockState state, - World world, - BlockPos pos, - PlayerEntity player, - Hand hand, - BlockHitResult hit, - CallbackInfoReturnable cir) { + BlockState state, + Level world, + BlockPos pos, + Player player, + InteractionHand hand, + BlockHitResult hit, + CallbackInfoReturnable cir) { if (state.getBlock() instanceof CactusBlock) { - ItemStack stack = player.getStackInHand(hand); - if (stack.isOf(Items.GLASS_BOTTLE)) { + ItemStack stack = player.getItemInHand(hand); + if (stack.is(Items.GLASS_BOTTLE)) { BlockPos pos1 = pos; while (true) { - BlockState state1 = world.getBlockState(pos1 = pos1.up()); - if (state.isOf(state1.getBlock())) { + BlockState state1 = world.getBlockState(pos1 = pos1.above()); + if (state.is(state1.getBlock())) { state = state1; } else { break; @@ -52,7 +52,7 @@ abstract class AbstractBlockMixin { } BlockState finalState = state; - if (!world.isClient() + if (!world.isClientSide() && world .am$get(CactusFiller.CONFIG) .available @@ -61,22 +61,22 @@ abstract class AbstractBlockMixin { .state(finalState) .tool(player, hand) .thisEntity(player)))) { - player.setStackInHand( + player.setItemInHand( hand, - ItemUsage.exchangeStack( - stack, player, PotionUtil.setPotion(new ItemStack(Items.POTION), Potions.WATER))); - player.incrementStat(Stats.USED.getOrCreateStat(stack.getItem())); + ItemUtils.createFilledResult( + stack, player, PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.WATER))); + player.awardStat(Stats.ITEM_USED.get(stack.getItem())); - if (state.get(Main.WATER_LEVEL_3) == 3) { - world.breakBlock(pos1.down(), false, player); + if (state.getValue(Main.WATER_LEVEL_3) == 3) { + world.destroyBlock(pos1.below(), false, player); ItemStackUtil.spawnVelocity( - pos1, Items.DEAD_BUSH.getDefaultStack(), world, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2); + pos1, Items.DEAD_BUSH.getDefaultInstance(), world, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2); } else { - world.setBlockState(pos1.down(), state.cycle(Main.WATER_LEVEL_3)); + world.setBlockAndUpdate(pos1.below(), state.cycle(Main.WATER_LEVEL_3)); } - ((ServerWorld) world) - .spawnParticles( + ((ServerLevel) world) + .sendParticles( ParticleTypes.FALLING_WATER, pos.getX() + 0.5, pos.getY() + 0.5, @@ -88,7 +88,7 @@ abstract class AbstractBlockMixin { 0.5); } - cir.setReturnValue(ActionResult.SUCCESS); + cir.setReturnValue(InteractionResult.SUCCESS); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/CactusBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/CactusBlockMixin.java index 773eb7f5..2125a63b 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/CactusBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/mixin/CactusBlockMixin.java @@ -1,10 +1,10 @@ package me.melontini.andromeda.modules.blocks.cactus_bottle_filling.mixin; import me.melontini.andromeda.modules.blocks.cactus_bottle_filling.Main; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CactusBlock; -import net.minecraft.state.StateManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.CactusBlock; +import net.minecraft.world.level.block.state.StateDefinition; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -13,9 +13,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(CactusBlock.class) abstract class CactusBlockMixin { - @Inject(at = @At("TAIL"), method = "appendProperties") + @Inject(at = @At("TAIL"), method = "createBlockStateDefinition") private void andromeda$appendProperties( - StateManager.Builder builder, CallbackInfo ci) { + StateDefinition.Builder builder, CallbackInfo ci) { builder.add(Main.WATER_LEVEL_3); } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java b/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java index da9c48ca..03bf8db3 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java @@ -14,8 +14,8 @@ import me.melontini.andromeda.common.config.GameConfig; import me.melontini.andromeda.common.util.commander.bool.BooleanIntermediary; import me.melontini.andromeda.common.util.commander.number.DoubleIntermediary; import me.melontini.andromeda.common.util.commander.number.LongIntermediary; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffects; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffects; @ModuleInfo(name = "campfire_effects", category = "blocks", env = Environment.SERVER) public final class CampfireEffects extends Module { @@ -35,7 +35,7 @@ public final class CampfireEffects extends Module { @AllArgsConstructor @NoArgsConstructor public static final class Effect { - public StatusEffect identifier = StatusEffects.REGENERATION; + public MobEffect identifier = MobEffects.REGENERATION; public LongIntermediary amplifier = LongIntermediary.of(0); } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/mixin/CampfireBlockEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/mixin/CampfireBlockEntityMixin.java index e326c29a..4125b25f 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/mixin/CampfireBlockEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/mixin/CampfireBlockEntityMixin.java @@ -4,16 +4,16 @@ import java.util.ArrayList; import java.util.List; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.campfire_effects.CampfireEffects; -import net.minecraft.block.BlockState; -import net.minecraft.block.CampfireBlock; -import net.minecraft.block.entity.CampfireBlockEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.CampfireBlock; +import net.minecraft.world.level.block.entity.CampfireBlockEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; +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; @@ -22,11 +22,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(CampfireBlockEntity.class) abstract class CampfireBlockEntityMixin { - @Inject(at = @At("HEAD"), method = "litServerTick") + @Inject(at = @At("HEAD"), method = "cookTick") private static void andromeda$litServerTick( - World world, BlockPos pos, BlockState state, CampfireBlockEntity campfire, CallbackInfo ci) { - if (world.getTime() % 180 == 0) { - if (state.get(CampfireBlock.LIT)) { + Level world, BlockPos pos, BlockState state, CampfireBlockEntity campfire, CallbackInfo ci) { + if (world.getGameTime() % 180 == 0) { + if (state.getValue(CampfireBlock.LIT)) { var config = world.am$get(CampfireEffects.CONFIG); var supplier = LootContextBuilder.block( world, builder -> builder.origin(pos).state(state).blockEntity(campfire)); @@ -35,9 +35,9 @@ abstract class CampfireBlockEntityMixin { List entities = new ArrayList<>(); double rad = config.effectsRange.asDouble(supplier); boolean affectsPassive = config.affectsPassive.asBoolean(supplier); - world.getEntityLookup().forEachIntersects(new Box(pos).expand(rad), entity -> { - if ((entity instanceof PassiveEntity && affectsPassive) - || entity instanceof PlayerEntity) { + world.getEntities().get(new AABB(pos).inflate(rad), entity -> { + if ((entity instanceof AgeableMob && affectsPassive) + || entity instanceof Player) { entities.add((LivingEntity) entity); } }); @@ -45,9 +45,9 @@ abstract class CampfireBlockEntityMixin { for (LivingEntity player : entities) { for (CampfireEffects.Config.Effect effect : effects) { - StatusEffectInstance effectInstance = new StatusEffectInstance( + MobEffectInstance effectInstance = new MobEffectInstance( effect.identifier, 200, effect.amplifier.asInt(supplier), true, false, true); - player.addStatusEffect(effectInstance); + player.addEffect(effectInstance); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/mixin/PropaguleBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/mixin/PropaguleBlockMixin.java index f6bf84f0..97af3bbc 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/mixin/PropaguleBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/mixin/PropaguleBlockMixin.java @@ -2,21 +2,21 @@ package me.melontini.andromeda.modules.blocks.falling_propagule.mixin; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.falling_propagule.FallingPropagule; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.PropaguleBlock; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.property.Properties; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.MangrovePropaguleBlock; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; 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; -@Mixin(PropaguleBlock.class) +@Mixin(MangrovePropaguleBlock.class) abstract class PropaguleBlockMixin { @Shadow @@ -29,11 +29,11 @@ abstract class PropaguleBlockMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/block/PropaguleBlock;isFullyGrown(Lnet/minecraft/block/BlockState;)Z", + "Lnet/minecraft/world/level/block/MangrovePropaguleBlock;isFullyGrown(Lnet/minecraft/world/level/block/state/BlockState;)Z", shift = At.Shift.BEFORE), method = "randomTick") private void andromeda$randomTick( - BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { + BlockState state, ServerLevel world, BlockPos pos, RandomSource random, CallbackInfo ci) { if (isFullyGrown(state) && random.nextInt(40) == 0 && world @@ -46,11 +46,11 @@ abstract class PropaguleBlockMixin { pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, - state.contains(Properties.WATERLOGGED) - ? state.with(Properties.WATERLOGGED, Boolean.FALSE) + state.hasProperty(BlockStateProperties.WATERLOGGED) + ? state.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE) : state); - world.setBlockState(pos, state.getFluidState().getBlockState(), Block.NOTIFY_ALL); - world.spawnEntity(fallingBlock); + world.setBlock(pos, state.getFluidState().createLegacyBlock(), Block.UPDATE_ALL); + world.addFreshEntity(fallingBlock); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/Main.java b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/Main.java index 103f283b..67492913 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/Main.java @@ -11,26 +11,26 @@ import me.melontini.andromeda.bootstrap.ModuleManager; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.fabric.api.event.player.PlayerBlockBreakEvents; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.Monster; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.monster.Enemy; +import net.minecraft.world.entity.player.Player; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; public final class Main { - private static final List> UNLOCKERS = new ArrayList<>(); + private static final List> UNLOCKERS = new ArrayList<>(); static void init() { for (var listener : ModuleManager.get().getModuleApiListeners(LOOT_UNLOCKER)) { @@ -41,9 +41,9 @@ public final class Main { } PlayerBlockBreakEvents.BEFORE.register((world, player, pos, state, blockEntity) -> { - if (player.getAbilities().creativeMode) return true; + if (player.getAbilities().instabuild) return true; - if (blockEntity instanceof LootableContainerBlockEntity + if (blockEntity instanceof RandomizableContainerBlockEntity && world.am$get(GuardedLoot.CONFIG).breakingHandler == GuardedLoot.BreakingHandler.UNBREAKABLE) { var monsters = checkMonsterLock(world, state, player, pos, blockEntity); @@ -57,40 +57,40 @@ public final class Main { // TODO fix igloos. Maybe check reach? public static List checkMonsterLock( - World world, BlockState state, PlayerEntity player, BlockPos pos, BlockEntity be) { + Level world, BlockState state, Player player, BlockPos pos, BlockEntity be) { var config = world.am$get(GuardedLoot.CONFIG); var supplier = LootContextBuilder.block( world, builder -> builder.origin(pos).state(state).thisEntity(player).blockEntity(be)); if (!config.available.asBoolean(supplier)) return Collections.emptyList(); return world - .getEntitiesByClass( + .getEntitiesOfClass( LivingEntity.class, - new Box(pos).expand(config.range.asDouble(supplier)), + new AABB(pos).inflate(config.range.asDouble(supplier)), Entity::isAlive) .stream() - .filter(Monster.class::isInstance) + .filter(Enemy.class::isInstance) .toList(); } - public static boolean checkLockPicking(BlockEntity entity, PlayerEntity player) { + public static boolean checkLockPicking(BlockEntity entity, Player player) { if (UNLOCKERS.isEmpty()) return false; - for (BiPredicate unlocker : UNLOCKERS) { + for (BiPredicate unlocker : UNLOCKERS) { if (unlocker.test(entity, player)) return true; } return false; } - public static void handleLockedContainer(PlayerEntity player, Collection monsters) { - player.sendMessage( - TextUtil.translatable("andromeda.container.guarded").formatted(Formatting.RED), true); - player.playSound(SoundEvents.BLOCK_CHEST_LOCKED, SoundCategory.BLOCKS, 1.0F, 1.0F); - player.emitGameEvent(GameEvent.CONTAINER_OPEN); + public static void handleLockedContainer(Player player, Collection monsters) { + player.displayClientMessage( + TextUtil.translatable("andromeda.container.guarded").withStyle(ChatFormatting.RED), true); + player.playNotifySound(SoundEvents.CHEST_LOCKED, SoundSource.BLOCKS, 1.0F, 1.0F); + player.gameEvent(GameEvent.CONTAINER_OPEN); for (LivingEntity livingEntity : monsters) { - livingEntity.addStatusEffect( - new StatusEffectInstance(StatusEffects.GLOWING, 5 * 20, 0, false, false)); + livingEntity.addEffect( + new MobEffectInstance(MobEffects.GLOWING, 5 * 20, 0, false, false)); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java index 5905418c..5773445d 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java @@ -4,20 +4,20 @@ import static me.melontini.andromeda.modules.blocks.guarded_loot.Main.*; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.LockableContainerBlockEntity; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.BaseContainerBlockEntity; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.core.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(LootableContainerBlockEntity.class) -abstract class LootableContainerBlockEntityMixin extends LockableContainerBlockEntity { +@Mixin(RandomizableContainerBlockEntity.class) +abstract class LootableContainerBlockEntityMixin extends BaseContainerBlockEntity { protected LootableContainerBlockEntityMixin( - BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { + BlockEntityType blockEntityType, BlockPos blockPos, BlockState blockState) { super(blockEntityType, blockPos, blockState); } @@ -25,13 +25,13 @@ abstract class LootableContainerBlockEntityMixin extends LockableContainerBlockE at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/player/PlayerEntity;isSpectator()Z"), - method = "checkUnlocked") + target = "Lnet/minecraft/world/entity/player/Player;isSpectator()Z"), + method = "canOpen") private boolean lockedIfMonstersNearby( - boolean locked, @Local(argsOnly = true) PlayerEntity player) { + boolean locked, @Local(argsOnly = true) Player player) { var monsters = - checkMonsterLock(player.world, this.getCachedState(), player, this.getPos(), this); - if (monsters.isEmpty() || player.getAbilities().creativeMode || checkLockPicking(this, player)) + checkMonsterLock(player.level, this.getBlockState(), player, this.getBlockPos(), this); + if (monsters.isEmpty() || player.getAbilities().instabuild || checkLockPicking(this, player)) return locked; handleLockedContainer(player, monsters); diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java index 78c96543..bf4ffebc 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java @@ -15,68 +15,70 @@ import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.block.*; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityTicker; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.ai.pathing.NavigationType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemGroups; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.sound.BlockSoundGroup; -import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; -import net.minecraft.text.Text; +import net.minecraft.ChatFormatting; +import net.minecraft.world.*; +import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.pathfinder.PathComputationType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.DirectionProperty; +import net.minecraft.network.chat.Component; import net.minecraft.util.*; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.shape.VoxelShape; -import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.BlockView; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import org.jetbrains.annotations.Nullable; @SuppressWarnings("deprecation") -public class IncubatorBlock extends BlockWithEntity implements InventoryProvider { +public class IncubatorBlock extends BaseEntityBlock implements WorldlyContainerHolder { - public static final DirectionProperty FACING = HorizontalFacingBlock.FACING; + public static final DirectionProperty FACING = HorizontalDirectionalBlock.FACING; public static final Keeper INCUBATOR_BLOCK = Keeper.create(); public static final Keeper INCUBATOR = Keeper.create(); public static final Keeper> INCUBATOR_BLOCK_ENTITY = Keeper.create(); - private final VoxelShape BASE_SHAPE = Block.createCuboidShape(1.0, 0.0, 1.0, 15.0, 11.0, 15.0); - private final VoxelShape GLASS_SHAPE = Block.createCuboidShape(3.0, 11.0, 3.0, 13.0, 18.0, 13.0); + private final VoxelShape BASE_SHAPE = Block.box(1.0, 0.0, 1.0, 15.0, 11.0, 15.0); + private final VoxelShape GLASS_SHAPE = Block.box(3.0, 11.0, 3.0, 13.0, 18.0, 13.0); - public IncubatorBlock(Settings settings) { + public IncubatorBlock(Properties settings) { super(settings); - this.setDefaultState(this.stateManager.getDefaultState().with(FACING, Direction.NORTH)); + this.registerDefaultState(this.stateDefinition.any().setValue(FACING, Direction.NORTH)); } @Override public BlockEntityTicker getTicker( - World world, BlockState state, BlockEntityType type) { - return checkType(type, INCUBATOR_BLOCK_ENTITY.orThrow(), IncubatorBlockEntity::tick); + Level world, BlockState state, BlockEntityType type) { + return createTickerHelper(type, INCUBATOR_BLOCK_ENTITY.orThrow(), IncubatorBlockEntity::tick); } @Override - public ActionResult onUse( - BlockState state, - World world, - BlockPos pos, - PlayerEntity player, - Hand hand, - BlockHitResult hit) { - ItemStack stack = player.getStackInHand(hand); + public InteractionResult use( + BlockState state, + Level world, + BlockPos pos, + Player player, + InteractionHand hand, + BlockHitResult hit) { + ItemStack stack = player.getItemInHand(hand); IncubatorBlockEntity entity = (IncubatorBlockEntity) world.getBlockEntity(pos); - if (world.isClient || entity == null || !hand.equals(Hand.MAIN_HAND)) - return ActionResult.success(true); + if (world.isClientSide || entity == null || !hand.equals(InteractionHand.MAIN_HAND)) + return InteractionResult.sidedSuccess(true); if (requireNonNull(world.getServer()) .dm$getReloader(EggProcessingData.RELOADER) @@ -84,77 +86,77 @@ public class IncubatorBlock extends BlockWithEntity implements InventoryProvider != null) return entity.insertEgg(stack); if (stack.isEmpty()) return entity.extractEgg(player); - return ActionResult.success(false); + return InteractionResult.sidedSuccess(false); } @Override - public void appendTooltip( - ItemStack stack, @Nullable BlockView world, List tooltip, TooltipContext options) { + public void appendHoverText( + ItemStack stack, @Nullable BlockGetter world, List tooltip, TooltipFlag options) { if (ModuleManager.get().get(Unknown.class).isPresent()) tooltip.add( - TextUtil.translatable("tooltip.andromeda.incubator[1]").formatted(Formatting.GRAY)); + TextUtil.translatable("tooltip.andromeda.incubator[1]").withStyle(ChatFormatting.GRAY)); } @Override - public BlockState getPlacementState(ItemPlacementContext ctx) { - return this.getDefaultState().with(FACING, ctx.getHorizontalPlayerFacing().getOpposite()); + public BlockState getStateForPlacement(BlockPlaceContext ctx) { + return this.defaultBlockState().setValue(FACING, ctx.getHorizontalDirection().getOpposite()); } @Override - public void onStateReplaced( - BlockState state, World world, BlockPos pos, BlockState newState, boolean moved) { - if (!state.isOf(newState.getBlock())) { + public void onRemove( + BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) { + if (!state.is(newState.getBlock())) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof IncubatorBlockEntity incubatorBlockEntity) { - if (!world.isClient) { - ItemScatterer.spawn(world, pos, incubatorBlockEntity); + if (!world.isClientSide) { + Containers.dropContents(world, pos, incubatorBlockEntity); } - world.updateComparators(pos, this); + world.updateNeighbourForOutputSignal(pos, this); } - super.onStateReplaced(state, world, pos, newState, moved); + super.onRemove(state, world, pos, newState, moved); } } @Override - public BlockState rotate(BlockState state, BlockRotation rotation) { - return state.with(FACING, rotation.rotate(state.get(FACING))); + public BlockState rotate(BlockState state, Rotation rotation) { + return state.setValue(FACING, rotation.rotate(state.getValue(FACING))); } @Override - public BlockState mirror(BlockState state, BlockMirror mirror) { - return state.rotate(mirror.getRotation(state.get(FACING))); + public BlockState mirror(BlockState state, Mirror mirror) { + return state.rotate(mirror.getRotation(state.getValue(FACING))); } @Override - public BlockRenderType getRenderType(BlockState state) { - return BlockRenderType.MODEL; + public RenderShape getRenderShape(BlockState state) { + return RenderShape.MODEL; } @Override - protected void appendProperties(StateManager.Builder builder) { + protected void createBlockStateDefinition(StateDefinition.Builder builder) { builder.add(FACING); } @Override - public VoxelShape getOutlineShape( - BlockState state, BlockView view, BlockPos pos, ShapeContext context) { - return VoxelShapes.union(BASE_SHAPE, GLASS_SHAPE); + public VoxelShape getShape( + BlockState state, BlockGetter view, BlockPos pos, CollisionContext context) { + return Shapes.or(BASE_SHAPE, GLASS_SHAPE); } @Nullable @Override - public BlockEntity createBlockEntity(BlockPos pos, BlockState state) { + public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new IncubatorBlockEntity(pos, state); } @Override - public boolean canPathfindThrough( - BlockState state, BlockView world, BlockPos pos, NavigationType type) { + public boolean isPathfindable( + BlockState state, BlockGetter world, BlockPos pos, PathComputationType type) { return false; } @Override - public SidedInventory getInventory(BlockState state, WorldAccess world, BlockPos pos) { + public WorldlyContainer getContainer(BlockState state, LevelAccessor world, BlockPos pos) { BlockEntity blockEntity = world.getBlockEntity(pos); if (blockEntity instanceof IncubatorBlockEntity incubatorBlockEntity) return incubatorBlockEntity; @@ -167,22 +169,22 @@ public class IncubatorBlock extends BlockWithEntity implements InventoryProvider public static void init() { var module = ModuleManager.get().get(Incubator.class).orElseThrow(); IncubatorBlock.INCUBATOR_BLOCK.init(RegistryUtil.register( - Registries.BLOCK, + BuiltInRegistries.BLOCK, id("incubator"), () -> new IncubatorBlock( - FabricBlockSettings.create().strength(2.0F, 3.0F).sounds(BlockSoundGroup.WOOD)))); + FabricBlockSettings.create().strength(2.0F, 3.0F).sound(SoundType.WOOD)))); IncubatorBlock.INCUBATOR.init(RegistryUtil.register( - Registries.ITEM, + BuiltInRegistries.ITEM, id("incubator"), () -> new BlockItem(IncubatorBlock.INCUBATOR_BLOCK.orThrow(), new FabricItemSettings()))); IncubatorBlock.INCUBATOR_BLOCK_ENTITY.init(RegistryUtil.register( - Registries.BLOCK_ENTITY_TYPE, + BuiltInRegistries.BLOCK_ENTITY_TYPE, id("incubator"), () -> new BlockEntityType<>( IncubatorBlockEntity::new, Set.of(IncubatorBlock.INCUBATOR_BLOCK.orThrow()), null))); AndromedaItemGroup.BUS.listen( - acceptor -> acceptor.keeper(module, ItemGroups.FUNCTIONAL, IncubatorBlock.INCUBATOR)); + acceptor -> acceptor.keeper(module, CreativeModeTabs.FUNCTIONAL_BLOCKS, IncubatorBlock.INCUBATOR)); EggProcessingData.init(); } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java index 6fb172ca..98747796 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java @@ -18,33 +18,33 @@ import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.CampfireBlock; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventories; -import net.minecraft.inventory.SidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.listener.ClientPlayPacketListener; -import net.minecraft.network.packet.Packet; -import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.CampfireBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.ContainerHelper; +import net.minecraft.world.WorldlyContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.core.NonNullList; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; @SuppressWarnings("UnstableApiUsage") -public class IncubatorBlockEntity extends BlockEntity implements SidedInventory { +public class IncubatorBlockEntity extends BlockEntity implements WorldlyContainer { - public DefaultedList inventory = DefaultedList.ofSize(1, ItemStack.EMPTY); + public NonNullList inventory = NonNullList.withSize(1, ItemStack.EMPTY); public int processingTime = -1; public IncubatorBlockEntity(BlockPos pos, BlockState state) { @@ -53,14 +53,14 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory @SuppressWarnings("unused") public static void tick( - World world, BlockPos pos, BlockState state, IncubatorBlockEntity incubatorBlockEntity) { + Level world, BlockPos pos, BlockState state, IncubatorBlockEntity incubatorBlockEntity) { incubatorBlockEntity.tick(world, state); } - public void tick(World world, BlockState state) { + public void tick(Level world, BlockState state) { if (this.processingTime > 0) this.tickProcessingTime(world); - if (world.isClient()) return; + if (world.isClientSide()) return; ItemStack stack = this.inventory.get(0); if (!stack.isEmpty() && this.processingTime == -1) { EggProcessingData data = requireNonNull(world.getServer()) @@ -78,19 +78,19 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory this.update(state); } - if (this.processingTime == 0) this.spawnResult(stack, (ServerWorld) world, state); + if (this.processingTime == 0) this.spawnResult(stack, (ServerLevel) world, state); } private int getTime(Arithmetica arithmetica, ItemStack stack) { if (arithmetica.toSource().left().isPresent()) return arithmetica.asInt(null); var supplier = LootContextBuilder.block( - world, - builder -> builder.origin(pos).state(getCachedState()).tool(stack).blockEntity(this)); + level, + builder -> builder.origin(worldPosition).state(getBlockState()).tool(stack).blockEntity(this)); return arithmetica.asInt(supplier.get()); } - private void spawnResult(ItemStack stack, ServerWorld world, BlockState state) { + private void spawnResult(ItemStack stack, ServerLevel world, BlockState state) { EggProcessingData data = world.getServer().dm$getReloader(EggProcessingData.RELOADER).get(stack.getItem()); if (data != null) { @@ -98,15 +98,15 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory data.entity().shuffle().stream().findFirst().orElseThrow(); Entity entity = entry.type().create(world); if (entity != null) { - entity.readNbt(entry.nbt()); - BlockPos entityPos = pos.offset(state.get(IncubatorBlock.FACING)); - entity.setPos(entityPos.getX() + 0.5, entityPos.getY() + 0.5, entityPos.getZ() + 0.5); - if (entity instanceof PassiveEntity passive) passive.setBaby(true); + entity.load(entry.nbt()); + BlockPos entityPos = worldPosition.relative(state.getValue(IncubatorBlock.FACING)); + entity.setPosRaw(entityPos.getX() + 0.5, entityPos.getY() + 0.5, entityPos.getZ() + 0.5); + if (entity instanceof AgeableMob passive) passive.setBaby(true); - world.spawnEntity(entity); + world.addFreshEntity(entity); executeCommands(entry, world, stack, entity); - stack.decrement(1); + stack.shrink(1); } } this.processingTime = -1; @@ -114,12 +114,12 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory } private void executeCommands( - EggProcessingData.Entry entry, ServerWorld world, ItemStack stack, Entity entity) { + EggProcessingData.Entry entry, ServerLevel world, ItemStack stack, Entity entity) { if (entry.commands().isEmpty()) return; var supplier = LootContextBuilder.block(world, builder -> builder - .origin(getPos()) - .state(getCachedState()) + .origin(getBlockPos()) + .state(getBlockState()) .tool(stack) .thisEntity(entity) .blockEntity(this)); @@ -133,93 +133,93 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory private boolean isLitCampfire(BlockState state) { if (!(state.getBlock() instanceof CampfireBlock)) return false; - return state.get(CampfireBlock.LIT); + return state.getValue(CampfireBlock.LIT); } - private void tickProcessingTime(World world) { - BlockState state = world.getBlockState(pos.down()); - if (!isLitCampfire(state)) state = world.getBlockState(pos.down().down()); + private void tickProcessingTime(Level world) { + BlockState state = world.getBlockState(worldPosition.below()); + if (!isLitCampfire(state)) state = world.getBlockState(worldPosition.below().below()); if (!isLitCampfire(state)) return; - if (world.isClient && world.random.nextInt(4) == 0) { + if (world.isClientSide && world.random.nextInt(4) == 0) { double i = MathUtil.threadRandom().nextDouble(0.6) - 0.3; double j = MathUtil.threadRandom().nextDouble(0.6) - 0.3; world.addParticle( ParticleTypes.SMOKE, - (pos.getX() + 0.5) + i, - pos.getY() + 0.5, - (pos.getZ() + 0.5) + j, + (worldPosition.getX() + 0.5) + i, + worldPosition.getY() + 0.5, + (worldPosition.getZ() + 0.5) + j, 0F, 0.07F, 0F); return; } - if (!world.isClient) this.processingTime--; + if (!world.isClientSide) this.processingTime--; } private void update(BlockState state) { - MakeSure.notNull(world).updateListeners(pos, state, state, Block.NOTIFY_LISTENERS); - markDirty(); + MakeSure.notNull(level).sendBlockUpdated(worldPosition, state, state, Block.UPDATE_CLIENTS); + setChanged(); } @Override - public Packet toUpdatePacket() { - return BlockEntityUpdateS2CPacket.create(this); + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); } @Override - public NbtCompound toInitialChunkDataNbt() { - NbtCompound nbt = new NbtCompound(); - this.writeNbt(nbt); + public CompoundTag getUpdateTag() { + CompoundTag nbt = new CompoundTag(); + this.saveAdditional(nbt); return nbt; } - public ActionResult insertEgg(ItemStack stack) { + public InteractionResult insertEgg(ItemStack stack) { try (Transaction transaction = Transaction.openOuter()) { var storage = InventoryStorage.of(this, null); long i = StorageUtil.tryInsertStacking( storage, ItemVariant.of(stack), stack.getCount(), transaction); if (i > 0) { transaction.commit(); - this.markDirty(); + this.setChanged(); stack.setCount((int) (stack.getCount() - i)); - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } - return ActionResult.CONSUME; + return InteractionResult.CONSUME; } } - public ActionResult extractEgg(PlayerEntity player) { + public InteractionResult extractEgg(Player player) { try (Transaction transaction = Transaction.openOuter()) { var storage = InventoryStorage.of(this, null); var ra = StorageUtil.extractAny(storage, Long.MAX_VALUE, transaction); if (ra != null && ra.amount() > 0) { transaction.commit(); - this.markDirty(); - player.getInventory().offerOrDrop(ra.resource().toStack((int) ra.amount())); - return ActionResult.SUCCESS; + this.setChanged(); + player.getInventory().placeItemBackInInventory(ra.resource().toStack((int) ra.amount())); + return InteractionResult.SUCCESS; } - return ActionResult.CONSUME; + return InteractionResult.CONSUME; } } @Override - public void readNbt(NbtCompound nbt) { - super.readNbt(nbt); + public void load(CompoundTag nbt) { + super.load(nbt); this.processingTime = nbt.getInt("ProcessingTime"); - this.inventory = DefaultedList.ofSize(this.size(), ItemStack.EMPTY); + this.inventory = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); NbtUtil.readInventoryFromNbt(nbt, this); } @Override - public void writeNbt(NbtCompound nbt) { - super.writeNbt(nbt); + public void saveAdditional(CompoundTag nbt) { + super.saveAdditional(nbt); nbt.putInt("ProcessingTime", this.processingTime); NbtUtil.writeInventoryToNbt(nbt, this); } @Override - public int size() { + public int getContainerSize() { return 1; } @@ -229,51 +229,51 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory } @Override - public ItemStack getStack(int slot) { + public ItemStack getItem(int slot) { return inventory.get(slot); } @Override - public ItemStack removeStack(int slot, int amount) { - ItemStack itemStack = Inventories.splitStack(this.inventory, slot, amount); + public ItemStack removeItem(int slot, int amount) { + ItemStack itemStack = ContainerHelper.removeItem(this.inventory, slot, amount); if (!itemStack.isEmpty()) { - this.markDirty(); + this.setChanged(); } return itemStack; } @Override - public ItemStack removeStack(int slot) { - return Inventories.removeStack(this.inventory, slot); + public ItemStack removeItemNoUpdate(int slot) { + return ContainerHelper.takeItem(this.inventory, slot); } @Override - public void setStack(int slot, ItemStack stack) { + public void setItem(int slot, ItemStack stack) { this.inventory.set(slot, stack); - if (stack.getCount() > this.getMaxCountPerStack()) { - stack.setCount(this.getMaxCountPerStack()); + if (stack.getCount() > this.getMaxStackSize()) { + stack.setCount(this.getMaxStackSize()); } } @Override - public boolean canPlayerUse(PlayerEntity player) { + public boolean stillValid(Player player) { return false; } @Override - public void clear() { + public void clearContent() { inventory.clear(); } @Override - public int[] getAvailableSlots(Direction side) { + public int[] getSlotsForFace(Direction side) { return new int[] {0}; } @Override - public boolean canInsert(int slot, ItemStack stack, @Nullable Direction dir) { - return dir != MakeSure.notNull(world).getBlockState(this.pos).get(IncubatorBlock.FACING) + public boolean canPlaceItemThroughFace(int slot, ItemStack stack, @Nullable Direction dir) { + return dir != MakeSure.notNull(level).getBlockState(this.worldPosition).getValue(IncubatorBlock.FACING) && requireNonNull(Andromeda.get().getCurrentServer()) .dm$getReloader(EggProcessingData.RELOADER) .get(stack.getItem()) @@ -281,7 +281,7 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory } @Override - public boolean canExtract(int slot, ItemStack stack, Direction dir) { - return dir != Objects.requireNonNull(world).getBlockState(this.pos).get(IncubatorBlock.FACING); + public boolean canTakeItemThroughFace(int slot, ItemStack stack, Direction dir) { + return dir != Objects.requireNonNull(level).getBlockState(this.worldPosition).getValue(IncubatorBlock.FACING); } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockRenderer.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockRenderer.java index c315561b..499abdf9 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockRenderer.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockRenderer.java @@ -4,95 +4,95 @@ import me.melontini.dark_matter.api.base.util.MakeSure; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.block.entity.BlockEntityRenderer; -import net.minecraft.client.render.block.entity.BlockEntityRendererFactories; -import net.minecraft.client.render.block.entity.BlockEntityRendererFactory; -import net.minecraft.client.render.model.json.ModelTransformationMode; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.RotationAxis; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.item.ItemDisplayContext; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.world.level.Level; @Environment(EnvType.CLIENT) public class IncubatorBlockRenderer implements BlockEntityRenderer { - public IncubatorBlockRenderer(BlockEntityRendererFactory.Context context) {} + public IncubatorBlockRenderer(BlockEntityRendererProvider.Context context) {} @Override public void render( - IncubatorBlockEntity entity, - float tickDelta, - MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light, - int overlay) { + IncubatorBlockEntity entity, + float tickDelta, + PoseStack matrices, + MultiBufferSource vertexConsumers, + int light, + int overlay) { renderHay(matrices, vertexConsumers, light, overlay); renderItem(entity, matrices, vertexConsumers, light, overlay); } private void renderItem( - IncubatorBlockEntity entity, - MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light, - int overlay) { - matrices.push(); + IncubatorBlockEntity entity, + PoseStack matrices, + MultiBufferSource vertexConsumers, + int light, + int overlay) { + matrices.pushPose(); matrices.translate(0.5, 0.7, 0.5); - World world = MakeSure.notNull(entity.getWorld()); - BlockState state = world.getBlockState(entity.getPos()); + Level world = MakeSure.notNull(entity.getLevel()); + BlockState state = world.getBlockState(entity.getBlockPos()); if (state.getBlock() instanceof IncubatorBlock) { - switch (state.get(IncubatorBlock.FACING)) { - case NORTH -> matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180)); - case WEST -> matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(270)); - case EAST -> matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(90)); - case SOUTH -> matrices.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(0)); + switch (state.getValue(IncubatorBlock.FACING)) { + case NORTH -> matrices.mulPose(Axis.YP.rotationDegrees(180)); + case WEST -> matrices.mulPose(Axis.YP.rotationDegrees(270)); + case EAST -> matrices.mulPose(Axis.YP.rotationDegrees(90)); + case SOUTH -> matrices.mulPose(Axis.YP.rotationDegrees(0)); default -> throw new IllegalStateException( - String.valueOf(state.get(IncubatorBlock.FACING))); + String.valueOf(state.getValue(IncubatorBlock.FACING))); } - matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(-45)); + matrices.mulPose(Axis.XP.rotationDegrees(-45)); if (entity.processingTime > -1 && !entity.inventory.get(0).isEmpty()) { - MinecraftClient.getInstance() + Minecraft.getInstance() .getItemRenderer() - .renderItem( + .renderStatic( entity.inventory.get(0), - ModelTransformationMode.GROUND, + ItemDisplayContext.GROUND, light, overlay, matrices, vertexConsumers, - entity.getWorld(), + entity.getLevel(), 0); } } - matrices.pop(); + matrices.popPose(); } private void renderHay( - MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, int overlay) { - matrices.push(); + PoseStack matrices, MultiBufferSource vertexConsumers, int light, int overlay) { + matrices.pushPose(); matrices.scale(0.5F, 0.5F, 0.5F); matrices.translate(0.5, 1.4, 0.5); - MinecraftClient.getInstance() - .getBlockRenderManager() - .renderBlockAsEntity( - Blocks.HORN_CORAL_FAN.getDefaultState(/*very comfy*/ ), + Minecraft.getInstance() + .getBlockRenderer() + .renderSingleBlock( + Blocks.HORN_CORAL_FAN.defaultBlockState(/*very comfy*/ ), matrices, vertexConsumers, light, overlay); - matrices.pop(); + matrices.popPose(); } public static void onClient() { if (IncubatorBlock.INCUBATOR_BLOCK.isPresent()) { BlockRenderLayerMap.INSTANCE.putBlocks( - RenderLayer.getCutout(), IncubatorBlock.INCUBATOR_BLOCK.get()); + RenderType.cutout(), IncubatorBlock.INCUBATOR_BLOCK.get()); // This is registered alongside the block, so no check is necessary - BlockEntityRendererFactories.register( + BlockEntityRenderers.register( IncubatorBlock.INCUBATOR_BLOCK_ENTITY.get(), IncubatorBlockRenderer::new); } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/data/EggProcessingData.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/data/EggProcessingData.java index c71d4b65..2bdbb6d0 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/data/EggProcessingData.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/data/EggProcessingData.java @@ -16,33 +16,33 @@ import me.melontini.commander.api.expression.Arithmetica; import me.melontini.dark_matter.api.data.codecs.ExtraCodecs; import me.melontini.dark_matter.api.data.loading.ReloaderType; import me.melontini.dark_matter.api.data.loading.ServerReloadersEvent; -import net.minecraft.entity.EntityType; -import net.minecraft.item.Item; -import net.minecraft.item.SpawnEggItem; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.WeightedList; -import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.SpawnEggItem; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.behavior.ShufflingList; +import net.minecraft.util.profiling.ProfilerFiller; import org.jetbrains.annotations.Nullable; public record EggProcessingData( - boolean replace, Item item, WeightedList entity, Arithmetica time) { + boolean replace, Item item, ShufflingList entity, Arithmetica time) { public static final Codec CODEC = RecordCodecBuilder.create(data -> data.group( ExtraCodecs.optional("replace", Codec.BOOL, false).forGetter(EggProcessingData::replace), - Registries.ITEM.getCodec().fieldOf("identifier").forGetter(EggProcessingData::item), + BuiltInRegistries.ITEM.byNameCodec().fieldOf("identifier").forGetter(EggProcessingData::item), ExtraCodecs.weightedList(Entry.CODEC) .fieldOf("entries") .forGetter(EggProcessingData::entity), Arithmetica.CODEC.fieldOf("time").forGetter(EggProcessingData::time)) .apply(data, EggProcessingData::new)); - public record Entry(EntityType type, NbtCompound nbt, List commands) { + public record Entry(EntityType type, CompoundTag nbt, List commands) { public static final Codec CODEC = RecordCodecBuilder.create(data -> data.group( - Registries.ENTITY_TYPE.getCodec().fieldOf("entity").forGetter(Entry::type), - ExtraCodecs.optional("nbt", NbtCompound.CODEC, new NbtCompound()).forGetter(Entry::nbt), + BuiltInRegistries.ENTITY_TYPE.byNameCodec().fieldOf("entity").forGetter(Entry::type), + ExtraCodecs.optional("nbt", CompoundTag.CODEC, new CompoundTag()).forGetter(Entry::nbt), ExtraCodecs.optional( "commands", ExtraCodecs.list(Command.CODEC.codec()), Collections.emptyList()) .forGetter(Entry::commands)) @@ -70,16 +70,16 @@ public record EggProcessingData( @Override protected void apply( - Map data, ResourceManager manager, Profiler profiler) { + Map data, ResourceManager manager, ProfilerFiller profiler) { IdentityHashMap replace = new IdentityHashMap<>(); IdentityHashMap result = new IdentityHashMap<>(); - for (Item item : Registries.ITEM) { + for (Item item : BuiltInRegistries.ITEM) { if (item instanceof SpawnEggItem egg) { - WeightedList list = new WeightedList<>(); + ShufflingList list = new ShufflingList<>(); list.add( new Entry( - egg.getEntityType(new NbtCompound()), new NbtCompound(), Collections.emptyList()), + egg.getType(new CompoundTag()), new CompoundTag(), Collections.emptyList()), 1); result.put(egg, new EggProcessingData(false, egg, list, Arithmetica.constant(8000))); } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/mixin/EntityMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/mixin/EntityMixin.java index f7711139..70bc6298 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/mixin/EntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/mixin/EntityMixin.java @@ -3,18 +3,18 @@ package me.melontini.andromeda.modules.blocks.leaf_slowdown.mixin; import java.util.UUID; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.blocks.leaf_slowdown.LeafSlowdown; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.attribute.EntityAttribute; -import net.minecraft.entity.attribute.EntityAttributeInstance; -import net.minecraft.entity.attribute.EntityAttributeModifier; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; +import net.minecraft.tags.BlockTags; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,41 +26,41 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LivingEntity.class) abstract class EntityMixin extends Entity { - @Unique private static final EntityAttributeModifier LEAF_SLOWNESS = new EntityAttributeModifier( + @Unique private static final AttributeModifier LEAF_SLOWNESS = new AttributeModifier( UUID.fromString("f72625eb-d4c4-4e1d-8e5c-1736b9bab349"), "Leaf Slowness", -0.3, - EntityAttributeModifier.Operation.MULTIPLY_BASE); + AttributeModifier.Operation.MULTIPLY_BASE); - public EntityMixin(EntityType type, World world) { + public EntityMixin(EntityType type, Level world) { super(type, world); } @Shadow - public abstract @Nullable EntityAttributeInstance getAttributeInstance(EntityAttribute attribute); + public abstract @Nullable AttributeInstance getAttribute(Attribute attribute); @Inject(at = @At("HEAD"), method = "baseTick") public void andromeda$tick(CallbackInfo ci) { - if (!this.world.isClient - && this.world + if (!this.level.isClientSide + && this.level .am$get(LeafSlowdown.CONFIG) .available .asBoolean(LootContextBuilder.command( - world, builder -> builder.origin(this).thisEntity(this)))) { - EntityAttributeInstance attributeInstance = - this.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED); - if (this.world.getBlockState(getBlockPos().down()).isIn(BlockTags.LEAVES) - || (this.world.getBlockState(new BlockPos(getBlockPos().down(2))).isIn(BlockTags.LEAVES) - && this.world.getBlockState(new BlockPos(getBlockPos().down())).isOf(Blocks.AIR))) { - if (((LivingEntity) (Object) this) instanceof PlayerEntity player + level, builder -> builder.origin(this).thisEntity(this)))) { + AttributeInstance attributeInstance = + this.getAttribute(Attributes.MOVEMENT_SPEED); + if (this.level.getBlockState(blockPosition().below()).is(BlockTags.LEAVES) + || (this.level.getBlockState(new BlockPos(blockPosition().below(2))).is(BlockTags.LEAVES) + && this.level.getBlockState(new BlockPos(blockPosition().below())).is(Blocks.AIR))) { + if (((LivingEntity) (Object) this) instanceof Player player && (player.isCreative() || player.isSpectator())) return; if (attributeInstance != null) if (!attributeInstance.hasModifier(LEAF_SLOWNESS)) { - attributeInstance.addTemporaryModifier(LEAF_SLOWNESS); + attributeInstance.addTransientModifier(LEAF_SLOWNESS); } /*Does this even work?*/ - setVelocity( - getVelocity().getX(), getVelocity().getY() * 0.7, getVelocity().getZ()); + setDeltaMovement( + getDeltaMovement().x(), getDeltaMovement().y() * 0.7, getDeltaMovement().z()); } else { if (attributeInstance != null) if (attributeInstance.hasModifier(LEAF_SLOWNESS)) { diff --git a/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/mixin/AdvancementTabMixin.java b/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/mixin/AdvancementTabMixin.java index ca3a3641..446b17a8 100644 --- a/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/mixin/AdvancementTabMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/mixin/AdvancementTabMixin.java @@ -1,7 +1,7 @@ package me.melontini.andromeda.modules.bugfixes.advancement_shadow.mixin; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.advancement.AdvancementTab; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.advancements.AdvancementTab; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,33 +12,33 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; abstract class AdvancementTabMixin { @Shadow - private float alpha; + private float fade; @Shadow @Final - private MinecraftClient client; + private Minecraft minecraft; @ModifyArg( at = @At( value = "INVOKE", - target = "Lnet/minecraft/util/math/MathHelper;clamp(FFF)F", + target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 0), index = 0, - method = "drawWidgetTooltip") + method = "drawTooltips") private float andromeda$draw(float value) { - return this.alpha + (0.04F * client.getLastFrameDuration()); + return this.fade + (0.04F * minecraft.getDeltaFrameTime()); } @ModifyArg( at = @At( value = "INVOKE", - target = "Lnet/minecraft/util/math/MathHelper;clamp(FFF)F", + target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 1), index = 0, - method = "drawWidgetTooltip") + method = "drawTooltips") private float andromeda$draw1(float value) { - return this.alpha - (0.06F * client.getLastFrameDuration()); + return this.fade - (0.06F * minecraft.getDeltaFrameTime()); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java index ba817a7f..3c6bec52 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java @@ -5,13 +5,17 @@ import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.bee_flower_duplication.BeeFlowerDuplication; import me.melontini.andromeda.modules.misc.unknown.RoseOfTheValley; import me.melontini.andromeda.modules.misc.unknown.Unknown; -import net.minecraft.block.*; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.BeeEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Bee; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.AirBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.FlowerBlock; +import net.minecraft.world.level.block.TallFlowerBlock; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,18 +24,18 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(BeeEntity.class) -abstract class BeeEntityMixin extends AnimalEntity { +@Mixin(Bee.class) +abstract class BeeEntityMixin extends Animal { @Shadow - @Nullable BlockPos flowerPos; + @Nullable BlockPos savedFlowerPos; @Shadow - BeeEntity.PollinateGoal pollinateGoal; + Bee.BeePollinateGoal beePollinateGoal; @Unique private int andromeda$plantingCoolDown; - protected BeeEntityMixin(EntityType entityType, World world) { + protected BeeEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -39,57 +43,57 @@ abstract class BeeEntityMixin extends AnimalEntity { at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/passive/AnimalEntity;tick()V", + target = "Lnet/minecraft/world/entity/animal/Animal;tick()V", shift = At.Shift.AFTER), method = "tick") private void andromeda$tick(CallbackInfo ci) { if (this.andromeda$plantingCoolDown > 0) this.andromeda$plantingCoolDown--; - if (this.pollinateGoal != null) { - if (this.pollinateGoal.isRunning() - && this.pollinateGoal.completedPollination() + if (this.beePollinateGoal != null) { + if (this.beePollinateGoal.isPollinating() + && this.beePollinateGoal.hasPollinatedLongEnough() && this.andromeda$canPlant()) { this.andromeda$growFlower(); } } } - @Inject(at = @At("TAIL"), method = "writeCustomDataToNbt") - private void andromeda$writeNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "addAdditionalSaveData") + private void andromeda$writeNbt(CompoundTag nbt, CallbackInfo ci) { if (this.andromeda$plantingCoolDown != 0) nbt.putInt("AM-plantingCoolDown", this.andromeda$plantingCoolDown); } - @Inject(at = @At("TAIL"), method = "readCustomDataFromNbt") - private void andromeda$readNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "readAdditionalSaveData") + private void andromeda$readNbt(CompoundTag nbt, CallbackInfo ci) { if (nbt.contains("AM-plantingCoolDown")) this.andromeda$plantingCoolDown = nbt.getInt("AM-plantingCoolDown"); } @Unique private void andromeda$growFlower() { - if (this.flowerPos != null) { - BlockState flowerState = world.getBlockState(flowerPos); - var config = world.am$get(BeeFlowerDuplication.CONFIG); + if (this.savedFlowerPos != null) { + BlockState flowerState = level.getBlockState(savedFlowerPos); + var config = level.am$get(BeeFlowerDuplication.CONFIG); var supplier = - LootContextBuilder.block(world, builder -> builder.origin(getPos()).state(flowerState)); + LootContextBuilder.block(level, builder -> builder.origin(position()).state(flowerState)); if (!config.available.asBoolean(supplier)) return; if (flowerState.getBlock() instanceof FlowerBlock flowerBlock) { - andromeda$plantingCoolDown = world.random.nextBetween(3600, 6490); + andromeda$plantingCoolDown = level.random.nextIntBetweenInclusive(3600, 6490); for (int i = -2; i <= 2; i++) { for (int b = -2; b <= 2; b++) { for (int c = -2; c <= 2; c++) { BlockPos pos = - new BlockPos(flowerPos.getX() + i, flowerPos.getY() + b, flowerPos.getZ() + c); - if (world.getBlockState(pos).getBlock() instanceof AirBlock - && flowerBlock.canPlaceAt(flowerState, world, pos)) { - if (world.random.nextInt(12) == 0) { + new BlockPos(savedFlowerPos.getX() + i, savedFlowerPos.getY() + b, savedFlowerPos.getZ() + c); + if (level.getBlockState(pos).getBlock() instanceof AirBlock + && flowerBlock.canSurvive(flowerState, level, pos)) { + if (level.random.nextInt(12) == 0) { if (ModuleManager.get().get(Unknown.class).isPresent() - && world.random.nextInt(100) == 0) { - world.setBlockState( - pos, RoseOfTheValley.ROSE_OF_THE_VALLEY_BLOCK.orThrow().getDefaultState()); + && level.random.nextInt(100) == 0) { + level.setBlockAndUpdate( + pos, RoseOfTheValley.ROSE_OF_THE_VALLEY_BLOCK.orThrow().defaultBlockState()); } else { - world.setBlockState(pos, flowerState); + level.setBlockAndUpdate(pos, flowerState); } } } @@ -98,16 +102,16 @@ abstract class BeeEntityMixin extends AnimalEntity { } } else if (flowerState.getBlock() instanceof TallFlowerBlock flowerBlock && config.tallFlowers.asBoolean(supplier)) { - andromeda$plantingCoolDown = world.random.nextBetween(3600, 8000); + andromeda$plantingCoolDown = level.random.nextIntBetweenInclusive(3600, 8000); for (int i = -1; i <= 1; i++) { for (int b = -2; b <= 2; b++) { for (int c = -1; c <= 1; c++) { BlockPos pos = - new BlockPos(flowerPos.getX() + i, flowerPos.getY() + b, flowerPos.getZ() + c); - if (world.getBlockState(pos).getBlock() instanceof AirBlock - && flowerBlock.canPlaceAt(flowerState, world, pos)) { - if (world.random.nextInt(6) == 0) { - TallFlowerBlock.placeAt(world, flowerState, pos, Block.NOTIFY_LISTENERS); + new BlockPos(savedFlowerPos.getX() + i, savedFlowerPos.getY() + b, savedFlowerPos.getZ() + c); + if (level.getBlockState(pos).getBlock() instanceof AirBlock + && flowerBlock.canSurvive(flowerState, level, pos)) { + if (level.random.nextInt(6) == 0) { + TallFlowerBlock.placeAt(level, flowerState, pos, Block.UPDATE_CLIENTS); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BoneMealItemMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BoneMealItemMixin.java index 12bd139a..ed86e8e5 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BoneMealItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BoneMealItemMixin.java @@ -3,12 +3,12 @@ package me.melontini.andromeda.modules.entities.bee_flower_duplication.mixin; import me.melontini.andromeda.bootstrap.ModuleManager; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.bee_flower_duplication.BeeFlowerDuplication; -import net.minecraft.block.BlockState; -import net.minecraft.block.TallFlowerBlock; -import net.minecraft.item.BoneMealItem; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.TallFlowerBlock; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.BlockPos; +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; @@ -17,10 +17,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BoneMealItem.class) abstract class BoneMealItemMixin { - @Inject(at = @At("HEAD"), method = "useOnFertilizable", cancellable = true) + @Inject(at = @At("HEAD"), method = "growCrop", cancellable = true) private static void andromeda$useOnFertilizable( - ItemStack stack, World world, BlockPos pos, CallbackInfoReturnable cir) { - if (world.isClient()) return; + ItemStack stack, Level world, BlockPos pos, CallbackInfoReturnable cir) { + if (world.isClientSide()) return; BlockState blockState = world.getBlockState(pos); var config = world.am$get(BeeFlowerDuplication.CONFIG); @@ -30,14 +30,14 @@ abstract class BoneMealItemMixin { if (blockState.getBlock() instanceof TallFlowerBlock) { if (ModuleManager.get().get("misc.unknown").isPresent() && world.random.nextInt(100) == 0) { - world.createExplosion( + world.explode( null, pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5, 3.0F, false, - World.ExplosionSourceType.BLOCK); + Level.ExplosionInteraction.BLOCK); } cir.setReturnValue(false); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java index 2bfd22e3..47e813ed 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java @@ -11,12 +11,12 @@ import me.melontini.dark_matter.api.base.reflect.Reflect; import me.melontini.dark_matter.api.base.util.Support; import me.melontini.dark_matter.api.minecraft.util.ItemStackUtil; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.entity.vehicle.FurnaceMinecartEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.MinecartFurnace; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -24,20 +24,20 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(FurnaceMinecartEntity.class) -abstract class FurnaceMinecartIntakeMixin extends AbstractMinecartEntity { +@Mixin(MinecartFurnace.class) +abstract class FurnaceMinecartIntakeMixin extends AbstractMinecart { // stfu IDEA. @SuppressWarnings("OptionalUsedAsFieldOrParameterType") @Unique private static final Optional fb$pauseFuel = Support.fallback( "fabrication", - () -> Reflect.findField(FurnaceMinecartEntity.class, "fabrication$pauseFuel"), + () -> Reflect.findField(MinecartFurnace.class, "fabrication$pauseFuel"), Optional::empty); @Shadow public int fuel; - protected FurnaceMinecartIntakeMixin(EntityType entityType, World world) { + protected FurnaceMinecartIntakeMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -45,30 +45,30 @@ abstract class FurnaceMinecartIntakeMixin extends AbstractMinecartEntity { private void andromeda$tick(CallbackInfo ci) { if (!Andromeda.MAIN.get(BetterFurnaceMinecart.CONFIG).takeFuelWhenLow) return; - if (!this.world.isClient() && this.fuel < 100) { - if (world.getTime() % 20 == 0) { + if (!this.level.isClientSide() && this.fuel < 100) { + if (level.getGameTime() % 20 == 0) { if (fb$pauseFuel.map(f -> supply(() -> f.getInt(this)) > 0).orElse(false)) return; - AbstractMinecartEntity entity = this.world - .getEntitiesByClass( - AbstractMinecartEntity.class, - this.getBoundingBox().expand(1.5, 0, 1.5), - Inventory.class::isInstance) + AbstractMinecart entity = this.level + .getEntitiesOfClass( + AbstractMinecart.class, + this.getBoundingBox().inflate(1.5, 0, 1.5), + Container.class::isInstance) .stream() - .min(Comparator.comparingDouble(value -> value.squaredDistanceTo(this))) + .min(Comparator.comparingDouble(value -> value.distanceToSqr(this))) .orElse(null); - if (entity instanceof Inventory inventory) { - for (int i = 0; i < inventory.size(); ++i) { - ItemStack stack = inventory.getStack(i); + if (entity instanceof Container inventory) { + for (int i = 0; i < inventory.getContainerSize(); ++i) { + ItemStack stack = inventory.getItem(i); if (FuelRegistry.INSTANCE.get(stack.getItem()) != null) { int itemFuel = FuelRegistry.INSTANCE.get(stack.getItem()); if ((this.fuel + (itemFuel * 2.25)) <= Andromeda.MAIN.get(BetterFurnaceMinecart.CONFIG).maxFuel) { ItemStack reminder = stack.getRecipeRemainder(); if (!reminder.isEmpty()) - ItemStackUtil.spawn(entity.getPos(), stack.getRecipeRemainder(), world); - stack.decrement(1); + ItemStackUtil.spawn(entity.position(), stack.getRecipeRemainder(), level); + stack.shrink(1); this.fuel += (int) (itemFuel * 2.25); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartMixin.java index f283adda..1d0862d1 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartMixin.java @@ -3,13 +3,13 @@ package me.melontini.andromeda.modules.entities.better_furnace_minecart.mixin; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.modules.entities.better_furnace_minecart.BetterFurnaceMinecart; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.FurnaceMinecartEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.MinecartFurnace; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(FurnaceMinecartEntity.class) +@Mixin(MinecartFurnace.class) abstract class FurnaceMinecartMixin { @Shadow @@ -26,19 +26,19 @@ abstract class FurnaceMinecartMixin { @Inject(at = @At("HEAD"), method = "interact", cancellable = true) public void andromeda$interact( - PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - ItemStack stack = player.getStackInHand(hand); + Player player, InteractionHand hand, CallbackInfoReturnable cir) { + ItemStack stack = player.getItemInHand(hand); Item item = stack.getItem(); - FurnaceMinecartEntity furnaceMinecart = (FurnaceMinecartEntity) (Object) this; + MinecartFurnace furnaceMinecart = (MinecartFurnace) (Object) this; if (FuelRegistry.INSTANCE.get(item) != null) { int itemFuel = FuelRegistry.INSTANCE.get(item); if ((this.fuel + (itemFuel * 2.25)) <= Andromeda.MAIN.get(BetterFurnaceMinecart.CONFIG).maxFuel) { - if (!player.getAbilities().creativeMode) { + if (!player.getAbilities().instabuild) { ItemStack reminder = stack.getRecipeRemainder(); - if (!reminder.isEmpty()) player.getInventory().offerOrDrop(stack.getRecipeRemainder()); - stack.decrement(1); + if (!reminder.isEmpty()) player.getInventory().placeItemBackInInventory(stack.getRecipeRemainder()); + stack.shrink(1); } this.fuel += (int) (itemFuel * 2.25); @@ -46,25 +46,25 @@ abstract class FurnaceMinecartMixin { } if (this.fuel > 0) { - furnaceMinecart.pushX = furnaceMinecart.getX() - player.getX(); - furnaceMinecart.pushZ = furnaceMinecart.getZ() - player.getZ(); + furnaceMinecart.xPush = furnaceMinecart.getX() - player.getX(); + furnaceMinecart.zPush = furnaceMinecart.getZ() - player.getZ(); } - cir.setReturnValue(ActionResult.success(furnaceMinecart.world.isClient)); + cir.setReturnValue(InteractionResult.sidedSuccess(furnaceMinecart.level.isClientSide)); } @Redirect( at = @At( value = "INVOKE", - target = "Lnet/minecraft/nbt/NbtCompound;putShort(Ljava/lang/String;S)V"), - method = "writeCustomDataToNbt") - private void andromeda$fuelIntToNbt(NbtCompound nbt, String key, short value /* short */) { + target = "Lnet/minecraft/nbt/CompoundTag;putShort(Ljava/lang/String;S)V"), + method = "addAdditionalSaveData") + private void andromeda$fuelIntToNbt(CompoundTag nbt, String key, short value /* short */) { nbt.putInt(key, this.fuel); } - @Inject(at = @At("TAIL"), method = "readCustomDataFromNbt") - public void andromeda$fuelIntFromNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "readAdditionalSaveData") + public void andromeda$fuelIntFromNbt(CompoundTag nbt, CallbackInfo ci) { this.fuel = nbt.getInt("Fuel"); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatEntities.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatEntities.java index 50016a62..fd38bc9d 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatEntities.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatEntities.java @@ -12,12 +12,12 @@ import me.melontini.andromeda.modules.entities.boats.entities.TNTBoatEntity; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; public class BoatEntities { @@ -28,10 +28,10 @@ public class BoatEntities { public static final Keeper> BOAT_WITH_HOPPER = Keeper.create(); private static @Nullable EntityType boatType( - boolean register, Identifier id, EntityType.EntityFactory factory) { + boolean register, ResourceLocation id, EntityType.EntityFactory factory) { return RegistryUtil.register( - register, Registries.ENTITY_TYPE, id, () -> FabricEntityTypeBuilder.create( - SpawnGroup.MISC, factory) + register, BuiltInRegistries.ENTITY_TYPE, id, () -> FabricEntityTypeBuilder.create( + MobCategory.MISC, factory) .dimensions(new EntityDimensions(1.375F, 0.5625F, true)) .build()); } @@ -50,9 +50,9 @@ public class BoatEntities { // This sucks ServerPlayNetworking.registerGlobalReceiver( TNTBoatEntity.EXPLODE_BOAT_ON_SERVER, (server, player, handler, buf, responseSender) -> { - UUID id = buf.readUuid(); + UUID id = buf.readUUID(); server.execute(() -> { - Entity entity = player.world.getEntityLookup().get(id); + Entity entity = player.level.getEntities().get(id); if (entity instanceof TNTBoatEntity boat && boat.isAlive() && player == boat.getFirstPassenger()) boat.explode(); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatItems.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatItems.java index ff5283e4..d35bae17 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatItems.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/BoatItems.java @@ -11,11 +11,11 @@ import me.melontini.andromeda.common.util.AndromedaItemGroup; import me.melontini.andromeda.modules.entities.boats.items.AndromedaBoatItem; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroups; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; public class BoatItems { @@ -24,43 +24,43 @@ public class BoatItems { var config = Andromeda.MAIN.get(Boats.MAIN_CONFIG); List list = new ArrayList<>(); - for (BoatEntity.Type value : BoatEntity.Type.values()) { + for (Boat.Type value : Boat.Type.values()) { Optional.ofNullable(RegistryUtil.register( config.isFurnaceBoatOn, - Registries.ITEM, + BuiltInRegistries.ITEM, boatId(value, "furnace"), () -> new AndromedaBoatItem<>( - BoatEntities.BOAT_WITH_FURNACE, value, new FabricItemSettings().maxCount(1)))) + BoatEntities.BOAT_WITH_FURNACE, value, new FabricItemSettings().stacksTo(1)))) .ifPresent(list::add); Optional.ofNullable(RegistryUtil.register( config.isJukeboxBoatOn, - Registries.ITEM, + BuiltInRegistries.ITEM, boatId(value, "jukebox"), () -> new AndromedaBoatItem<>( - BoatEntities.BOAT_WITH_JUKEBOX, value, new FabricItemSettings().maxCount(1)))) + BoatEntities.BOAT_WITH_JUKEBOX, value, new FabricItemSettings().stacksTo(1)))) .ifPresent(list::add); Optional.ofNullable(RegistryUtil.register( config.isTNTBoatOn, - Registries.ITEM, + BuiltInRegistries.ITEM, boatId(value, "tnt"), () -> new AndromedaBoatItem<>( - BoatEntities.BOAT_WITH_TNT, value, new FabricItemSettings().maxCount(1)))) + BoatEntities.BOAT_WITH_TNT, value, new FabricItemSettings().stacksTo(1)))) .ifPresent(list::add); Optional.ofNullable(RegistryUtil.register( config.isHopperBoatOn, - Registries.ITEM, + BuiltInRegistries.ITEM, boatId(value, "hopper"), () -> new AndromedaBoatItem<>( - BoatEntities.BOAT_WITH_HOPPER, value, new FabricItemSettings().maxCount(1)))) + BoatEntities.BOAT_WITH_HOPPER, value, new FabricItemSettings().stacksTo(1)))) .ifPresent(list::add); } - AndromedaItemGroup.BUS.listen(acceptor -> acceptor.items(module, ItemGroups.TOOLS, list)); + AndromedaItemGroup.BUS.listen(acceptor -> acceptor.items(module, CreativeModeTabs.TOOLS_AND_UTILITIES, list)); } - public static Identifier boatId(BoatEntity.Type type, String boat) { + public static ResourceLocation boatId(Boat.Type type, String boat) { return id(type.getName().replace(":", "_") + "_boat_with_" + boat); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/client/BoatWithBlockRenderer.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/client/BoatWithBlockRenderer.java index 367cf813..1619a1ca 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/client/BoatWithBlockRenderer.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/client/BoatWithBlockRenderer.java @@ -1,76 +1,76 @@ package me.melontini.andromeda.modules.entities.boats.client; import com.mojang.datafixers.util.Pair; -import net.minecraft.block.BlockRenderType; -import net.minecraft.block.BlockState; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.BoatEntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.model.CompositeEntityModel; -import net.minecraft.client.render.entity.model.RaftEntityModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RotationAxis; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.BoatRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.model.ListModel; +import net.minecraft.client.model.RaftModel; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import com.mojang.math.Axis; import org.joml.Quaternionf; -public class BoatWithBlockRenderer extends BoatEntityRenderer { +public class BoatWithBlockRenderer extends BoatRenderer { private final BlockState blockState; - public BoatWithBlockRenderer(EntityRendererFactory.Context context, BlockState blockState) { + public BoatWithBlockRenderer(EntityRendererProvider.Context context, BlockState blockState) { super(context, false); this.blockState = blockState; } @Override public void render( - BoatEntity boatEntity, - float f, - float g, - MatrixStack matrixStack, - VertexConsumerProvider vertexConsumerProvider, - int i) { + Boat boatEntity, + float f, + float g, + PoseStack matrixStack, + MultiBufferSource vertexConsumerProvider, + int i) { super.render(boatEntity, f, g, matrixStack, vertexConsumerProvider, i); if (blockState != null) - if (blockState.getRenderType() != BlockRenderType.INVISIBLE) { - matrixStack.push(); - matrixStack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(180.0F - f)); - float h = (float) boatEntity.getDamageWobbleTicks() - g; - float j = boatEntity.getDamageWobbleStrength() - g; + if (blockState.getRenderShape() != RenderShape.INVISIBLE) { + matrixStack.pushPose(); + matrixStack.mulPose(Axis.YP.rotationDegrees(180.0F - f)); + float h = (float) boatEntity.getHurtTime() - g; + float j = boatEntity.getDamage() - g; if (h > 0.0F) { - matrixStack.multiply(RotationAxis.POSITIVE_X.rotationDegrees( - MathHelper.sin(h) * h * j / 10.0F * (float) boatEntity.getDamageWobbleSide())); + matrixStack.mulPose(Axis.XP.rotationDegrees( + Mth.sin(h) * h * j / 10.0F * (float) boatEntity.getHurtDir())); } - float k = boatEntity.interpolateBubbleWobble(g); - if (!MathHelper.approximatelyEquals(k, 0.0F)) { - matrixStack.multiply(new Quaternionf() + float k = boatEntity.getBubbleAngle(g); + if (!Mth.equal(k, 0.0F)) { + matrixStack.mulPose(new Quaternionf() .setAngleAxis( - boatEntity.interpolateBubbleWobble(g) * (float) (Math.PI / 180.0), + boatEntity.getBubbleAngle(g) * (float) (Math.PI / 180.0), 1.0F, 0.0F, 1.0F)); } - Pair> pair = - this.texturesAndModels.get(boatEntity.getVariant()); + Pair> pair = + this.boatResources.get(boatEntity.getVariant()); matrixStack.scale(0.8F, 0.8F, 0.8F); matrixStack.translate( 0.5, - pair.getSecond() instanceof RaftEntityModel ? 0.7 : 0.25, - pair.getSecond() instanceof RaftEntityModel ? 1.06 : 1); + pair.getSecond() instanceof RaftModel ? 0.7 : 0.25, + pair.getSecond() instanceof RaftModel ? 1.06 : 1); // :sob: - matrixStack.multiply(RotationAxis.POSITIVE_Y.rotationDegrees(-180)); - MinecraftClient.getInstance() - .getBlockRenderManager() - .renderBlockAsEntity( - blockState, matrixStack, vertexConsumerProvider, i, OverlayTexture.DEFAULT_UV); - matrixStack.pop(); + matrixStack.mulPose(Axis.YP.rotationDegrees(-180)); + Minecraft.getInstance() + .getBlockRenderer() + .renderSingleBlock( + blockState, matrixStack, vertexConsumerProvider, i, OverlayTexture.NO_OVERLAY); + matrixStack.popPose(); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/client/Client.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/client/Client.java index eec861d1..d28d9bd1 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/client/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/client/Client.java @@ -3,22 +3,22 @@ package me.melontini.andromeda.modules.entities.boats.client; import java.util.Map; import me.melontini.andromeda.modules.entities.boats.BoatEntities; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.minecraft.block.Blocks; -import net.minecraft.block.FurnaceBlock; -import net.minecraft.util.math.Direction; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FurnaceBlock; +import net.minecraft.core.Direction; public class Client { public static void init() { var map = Map.of( BoatEntities.BOAT_WITH_FURNACE, - Blocks.FURNACE.getDefaultState().with(FurnaceBlock.FACING, Direction.NORTH), + Blocks.FURNACE.defaultBlockState().setValue(FurnaceBlock.FACING, Direction.NORTH), BoatEntities.BOAT_WITH_JUKEBOX, - Blocks.JUKEBOX.getDefaultState(), + Blocks.JUKEBOX.defaultBlockState(), BoatEntities.BOAT_WITH_TNT, - Blocks.TNT.getDefaultState(), + Blocks.TNT.defaultBlockState(), BoatEntities.BOAT_WITH_HOPPER, - Blocks.HOPPER.getDefaultState()); + Blocks.HOPPER.defaultBlockState()); map.forEach((keeper, blockState) -> { if (keeper.isPresent()) { diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/client/ClientSoundHolder.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/client/ClientSoundHolder.java index 88ea92ea..d57ef433 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/client/ClientSoundHolder.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/client/ClientSoundHolder.java @@ -6,21 +6,21 @@ import java.util.UUID; import me.melontini.andromeda.common.Andromeda; import me.melontini.dark_matter.api.base.util.MakeSure; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.minecraft.client.sound.MovingSoundInstance; -import net.minecraft.client.sound.SoundInstance; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.random.Random; +import net.minecraft.client.resources.sounds.AbstractTickableSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.RecordItem; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; public class ClientSoundHolder { - public static final Identifier JUKEBOX_START_PLAYING = Andromeda.id("jukebox_start_playing"); - public static final Identifier JUKEBOX_STOP_PLAYING = Andromeda.id("jukebox_stop_playing"); + public static final ResourceLocation JUKEBOX_START_PLAYING = Andromeda.id("jukebox_start_playing"); + public static final ResourceLocation JUKEBOX_STOP_PLAYING = Andromeda.id("jukebox_stop_playing"); private static volatile boolean done = false; private static final Map soundInstanceMap = new HashMap<>(); @@ -30,16 +30,16 @@ public class ClientSoundHolder { ClientPlayNetworking.registerGlobalReceiver( JUKEBOX_START_PLAYING, (client, handler, buf, responseSender) -> { - UUID id = buf.readUuid(); - ItemStack stack = buf.readItemStack(); + UUID id = buf.readUUID(); + ItemStack stack = buf.readItem(); client.execute(() -> { Entity entity = - MakeSure.notNull(client.world, "client.world").getEntityLookup().get(id); - if (stack.getItem() instanceof MusicDiscItem disc) { - var discName = disc.getDescription(); + MakeSure.notNull(client.level, "client.world").getEntities().get(id); + if (stack.getItem() instanceof RecordItem disc) { + var discName = disc.getDisplayName(); soundInstanceMap.computeIfAbsent(id, k -> { var instance = new PersistentMovingSoundInstance( - disc.getSound(), SoundCategory.RECORDS, id, client.world, Random.create()); + disc.getSound(), SoundSource.RECORDS, id, client.level, RandomSource.create()); client.getSoundManager().play(instance); return instance; }); @@ -47,7 +47,7 @@ public class ClientSoundHolder { if (client.player != null && entity != null && entity.distanceTo(client.player) < 76) { - client.inGameHud.setRecordPlayingOverlay(discName); + client.gui.setNowPlaying(discName); } } } @@ -55,10 +55,10 @@ public class ClientSoundHolder { }); ClientPlayNetworking.registerGlobalReceiver( JUKEBOX_STOP_PLAYING, (client, handler, buf, responseSender) -> { - UUID id = buf.readUuid(); + UUID id = buf.readUUID(); client.execute(() -> { SoundInstance instance = soundInstanceMap.remove(id); - if (client.getSoundManager().isPlaying(instance)) + if (client.getSoundManager().isActive(instance)) client.getSoundManager().stop(instance); }); }); @@ -66,17 +66,17 @@ public class ClientSoundHolder { done = true; } - public static class PersistentMovingSoundInstance extends MovingSoundInstance { + public static class PersistentMovingSoundInstance extends AbstractTickableSoundInstance { - private final ClientWorld world; + private final ClientLevel world; private final UUID entityId; public PersistentMovingSoundInstance( - SoundEvent soundEvent, - SoundCategory soundCategory, - UUID entityId, - ClientWorld world, - Random random) { + SoundEvent soundEvent, + SoundSource soundCategory, + UUID entityId, + ClientLevel world, + RandomSource random) { super(soundEvent, soundCategory, random); this.volume = 3; this.pitch = 1; @@ -86,7 +86,7 @@ public class ClientSoundHolder { @Override public void tick() { - Entity entity = world.getEntityLookup().get(entityId); + Entity entity = world.getEntities().get(entityId); if (entity != null) { this.volume = 3; this.x = entity.getX(); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java index 1c217d35..4d4846e9 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java @@ -1,19 +1,19 @@ package me.melontini.andromeda.modules.entities.boats.entities; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.level.Level; -public abstract class BoatEntityWithBlock extends BoatEntity { +public abstract class BoatEntityWithBlock extends Boat { protected static final float PIby180 = (float) (Math.PI / 180.0); protected static final float PIby2 = (float) (Math.PI / 2); - public BoatEntityWithBlock(EntityType entityType, World world) { + public BoatEntityWithBlock(EntityType entityType, Level world) { super(entityType, world); } @Override - protected float getPassengerHorizontalOffset() { + protected float getSinglePassengerXOffset() { return 0.15f; } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java index d7da855d..df33d11c 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java @@ -6,42 +6,42 @@ import me.melontini.andromeda.modules.entities.better_furnace_minecart.BetterFur import me.melontini.andromeda.modules.entities.boats.BoatEntities; import me.melontini.andromeda.modules.entities.boats.BoatItems; import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.Registries; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; public class FurnaceBoatEntity extends BoatEntityWithBlock { - private static final TrackedData FUEL = - DataTracker.registerData(FurnaceBoatEntity.class, TrackedDataHandlerRegistry.INTEGER); + private static final EntityDataAccessor FUEL = + SynchedEntityData.defineId(FurnaceBoatEntity.class, EntityDataSerializers.INT); - public FurnaceBoatEntity(EntityType entityType, World world) { + public FurnaceBoatEntity(EntityType entityType, Level world) { super(entityType, world); } - public FurnaceBoatEntity(World world, double x, double y, double z) { + public FurnaceBoatEntity(Level world, double x, double y, double z) { this(BoatEntities.BOAT_WITH_FURNACE.orThrow(), world); - this.setPosition(x, y, z); - this.prevX = x; - this.prevY = y; - this.prevZ = z; + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; } @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(FUEL, 0); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(FUEL, 0); } @Override @@ -49,35 +49,35 @@ public class FurnaceBoatEntity extends BoatEntityWithBlock { super.tick(); if (this.getFuel() > 0) { this.setFuel(this.getFuel() - 1); - if (this.world.random.nextInt(4) == 0) { - Vec3d vec3d = new Vec3d(-0.8, 0.0, 0.0).rotateY(-this.getYaw() * PIby180 - PIby2); - this.world.addParticle( + if (this.level.random.nextInt(4) == 0) { + Vec3 vec3d = new Vec3(-0.8, 0.0, 0.0).yRot(-this.getYRot() * PIby180 - PIby2); + this.level.addParticle( ParticleTypes.CAMPFIRE_COSY_SMOKE, this.getX() + vec3d.x, this.getY() + 0.8, this.getZ() + vec3d.z, - -(this.getVelocity().x * 0.3), + -(this.getDeltaMovement().x * 0.3), 0.08, - -(this.getVelocity().z * 0.3)); + -(this.getDeltaMovement().z * 0.3)); } } } @Override - public void updateVelocity() { - super.updateVelocity(); - Vec3d vec3d = this.getVelocity(); + public void floatBoat() { + super.floatBoat(); + Vec3 vec3d = this.getDeltaMovement(); if (this.getFuel() > 0) { - Vec3d rotationVec = this.getRotationVec(1.0F); - if (this.location == Location.ON_LAND) - this.setVelocity(rotationVec.getX() * 0.1, vec3d.y, rotationVec.getZ() * 0.1); - else this.setVelocity(rotationVec.getX() * 0.4, vec3d.y, rotationVec.getZ() * 0.4); + Vec3 rotationVec = this.getViewVector(1.0F); + if (this.status == Status.ON_LAND) + this.setDeltaMovement(rotationVec.x() * 0.1, vec3d.y, rotationVec.z() * 0.1); + else this.setDeltaMovement(rotationVec.x() * 0.4, vec3d.y, rotationVec.z() * 0.4); } } @Override - public ActionResult interact(PlayerEntity player, Hand hand) { - ItemStack stack = player.getStackInHand(hand); + public InteractionResult interact(Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); if (FuelRegistry.INSTANCE.get(stack.getItem()) != null) { int itemFuel = FuelRegistry.INSTANCE.get(stack.getItem()); if ((this.getFuel() + (itemFuel * 2.25)) @@ -85,41 +85,41 @@ public class FurnaceBoatEntity extends BoatEntityWithBlock { .get(BetterFurnaceMinecart.class) .map(m -> Andromeda.MAIN.get(BetterFurnaceMinecart.CONFIG).maxFuel) .orElse(45000)) { - if (!player.getAbilities().creativeMode) { + if (!player.getAbilities().instabuild) { ItemStack reminder = stack.getRecipeRemainder(); - if (!reminder.isEmpty()) player.getInventory().offerOrDrop(stack.getRecipeRemainder()); - stack.decrement(1); + if (!reminder.isEmpty()) player.getInventory().placeItemBackInInventory(stack.getRecipeRemainder()); + stack.shrink(1); } this.setFuel((int) (this.getFuel() + (itemFuel * 2.25))); - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } return super.interact(player, hand); } @Override - public void writeCustomDataToNbt(NbtCompound nbt) { - super.writeCustomDataToNbt(nbt); + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); nbt.putInt("AM-Fuel", this.getFuel()); } @Override - public void readCustomDataFromNbt(NbtCompound nbt) { - super.readCustomDataFromNbt(nbt); + public void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); setFuel(nbt.getInt("AM-Fuel")); } @Override - public Item asItem() { - return Registries.ITEM.get(BoatItems.boatId(this.getVariant(), "furnace")); + public Item getDropItem() { + return BuiltInRegistries.ITEM.get(BoatItems.boatId(this.getVariant(), "furnace")); } public int getFuel() { - return this.dataTracker.get(FUEL); + return this.entityData.get(FUEL); } public void setFuel(int fuel) { - this.dataTracker.set(FUEL, fuel); + this.entityData.set(FUEL, fuel); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java index d22c156e..61d25929 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java @@ -6,74 +6,74 @@ import static me.melontini.andromeda.modules.entities.boats.entities.BoatEntityW import java.util.List; import me.melontini.andromeda.modules.entities.boats.BoatEntities; import me.melontini.andromeda.modules.entities.boats.BoatItems; -import net.minecraft.block.entity.Hopper; -import net.minecraft.block.entity.HopperBlockEntity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.entity.vehicle.ChestBoatEntity; -import net.minecraft.item.Item; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.registry.Registries; -import net.minecraft.screen.HopperScreenHandler; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.block.entity.Hopper; +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.entity.vehicle.ChestBoat; +import net.minecraft.world.item.Item; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.inventory.HopperMenu; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -public class HopperBoatEntity extends ChestBoatEntity implements Hopper { - private final BlockPos currentBlockPos = BlockPos.ORIGIN; +public class HopperBoatEntity extends ChestBoat implements Hopper { + private final BlockPos currentBlockPos = BlockPos.ZERO; public int transferCooldown = -1; - public HopperBoatEntity(EntityType entityType, World world) { + public HopperBoatEntity(EntityType entityType, Level world) { super(entityType, world); - this.resetInventory(); + this.clearItemStacks(); } - public HopperBoatEntity(World world, double x, double y, double z) { + public HopperBoatEntity(Level world, double x, double y, double z) { this(BoatEntities.BOAT_WITH_HOPPER.orThrow(), world); - this.setPosition(x, y, z); - this.prevX = x; - this.prevY = y; - this.prevZ = z; + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; } @Nullable @Override - public ScreenHandler createMenu( - int i, PlayerInventory playerInventory, PlayerEntity playerEntity) { - return new HopperScreenHandler(i, playerInventory, this); + public AbstractContainerMenu createMenu( + int i, Inventory playerInventory, Player playerEntity) { + return new HopperMenu(i, playerInventory, this); } @Override - public int size() { + public int getContainerSize() { return 5; } @Override - public double getHopperX() { - Vec3d vec3d = new Vec3d(-0.8, 0.0, 0.0).rotateY(-this.getYaw() * PIby180 - PIby2); + public double getLevelX() { + Vec3 vec3d = new Vec3(-0.8, 0.0, 0.0).yRot(-this.getYRot() * PIby180 - PIby2); return this.getX() + vec3d.x; } @Override - public double getHopperY() { + public double getLevelY() { return this.getY() + 0.5; } @Override - public double getHopperZ() { - Vec3d vec3d = new Vec3d(-0.8, 0.0, 0.0).rotateY(-this.getYaw() * PIby180 - PIby2); + public double getLevelZ() { + Vec3 vec3d = new Vec3(-0.8, 0.0, 0.0).yRot(-this.getYRot() * PIby180 - PIby2); return this.getZ() + vec3d.z; } @Override public void tick() { super.tick(); - if (!this.world.isClient && this.isAlive()) { - BlockPos blockPos = this.getBlockPos(); + if (!this.level.isClientSide && this.isAlive()) { + BlockPos blockPos = this.blockPosition(); if (blockPos.equals(this.currentBlockPos)) { --this.transferCooldown; } else { @@ -84,27 +84,27 @@ public class HopperBoatEntity extends ChestBoatEntity implements Hopper { this.setTransferCooldown(0); if (this.canOperate()) { this.setTransferCooldown(4); - this.markDirty(); + this.setChanged(); } } } } @Override - public Item asItem() { - return Registries.ITEM.get(BoatItems.boatId(this.getVariant(), "hopper")); + public Item getDropItem() { + return BuiltInRegistries.ITEM.get(BoatItems.boatId(this.getVariant(), "hopper")); } public boolean canOperate() { - if (HopperBlockEntity.extract(this.world, this)) { + if (HopperBlockEntity.suckInItems(this.level, this)) { return true; } else { - List list = this.world.getEntitiesByClass( + List list = this.level.getEntitiesOfClass( ItemEntity.class, - this.getBoundingBox().expand(0.25, 0.0, 0.25), - EntityPredicates.VALID_ENTITY); + this.getBoundingBox().inflate(0.25, 0.0, 0.25), + EntitySelector.ENTITY_STILL_ALIVE); if (!list.isEmpty()) { - HopperBlockEntity.extract(this, list.get(0)); + HopperBlockEntity.addItem(this, list.get(0)); } return false; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java index 9c06ae1d..197db5a7 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java @@ -6,58 +6,58 @@ import me.melontini.andromeda.modules.entities.boats.client.ClientSoundHolder; import me.melontini.dark_matter.api.minecraft.util.ItemStackUtil; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.stat.Stats; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Clearable; -import net.minecraft.util.Hand; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.RecordItem; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.Clearable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; public class JukeboxBoatEntity extends BoatEntityWithBlock implements Clearable { public ItemStack record = ItemStack.EMPTY; - public JukeboxBoatEntity(EntityType entityType, World world) { + public JukeboxBoatEntity(EntityType entityType, Level world) { super(entityType, world); } - public JukeboxBoatEntity(World world, double x, double y, double z) { + public JukeboxBoatEntity(Level world, double x, double y, double z) { this(BoatEntities.BOAT_WITH_JUKEBOX.orThrow(), world); - this.setPosition(x, y, z); - this.prevX = x; - this.prevY = y; - this.prevZ = z; + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; } @Override - public boolean damage(DamageSource source, float amount) { + public boolean hurt(DamageSource source, float amount) { if (this.isInvulnerableTo(source)) { return false; - } else if (!this.world.isClient && !this.isRemoved()) { - this.setDamageWobbleSide(-this.getDamageWobbleSide()); - this.setDamageWobbleTicks(10); - this.setDamageWobbleStrength(this.getDamageWobbleStrength() + amount * 10.0F); - this.scheduleVelocityUpdate(); - this.emitGameEvent(GameEvent.ENTITY_DAMAGE, source.getAttacker()); + } else if (!this.level.isClientSide && !this.isRemoved()) { + this.setHurtDir(-this.getHurtDir()); + this.setHurtTime(10); + this.setDamage(this.getDamage() + amount * 10.0F); + this.markHurt(); + this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity()); boolean bl = - source.getAttacker() instanceof PlayerEntity player && player.getAbilities().creativeMode; - if (bl || this.getDamageWobbleStrength() > 40.0F) { + source.getEntity() instanceof Player player && player.getAbilities().instabuild; + if (bl || this.getDamage() > 40.0F) { this.stopPlaying(); - if (!bl && this.world.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS)) { - this.dropItem(this.asItem()); + if (!bl && this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + this.spawnAtLocation(this.getDropItem()); } this.discard(); @@ -76,14 +76,14 @@ public class JukeboxBoatEntity extends BoatEntityWithBlock implements Clearable } @Override - public ActionResult interact(PlayerEntity player, Hand hand) { - ItemStack stackInHand = player.getStackInHand(hand); - if (!world.isClient()) - if (!this.record.isEmpty() && player.isSneaking()) { + public InteractionResult interact(Player player, InteractionHand hand) { + ItemStack stackInHand = player.getItemInHand(hand); + if (!level.isClientSide()) + if (!this.record.isEmpty() && player.isShiftKeyDown()) { ItemStackUtil.spawnVelocity( - new Vec3d(this.getX(), this.getY() + 0.5, this.getZ()), + new Vec3(this.getX(), this.getY() + 0.5, this.getZ()), this.record, - this.world, + this.level, -0.2, 0.2, 0.1, @@ -91,58 +91,58 @@ public class JukeboxBoatEntity extends BoatEntityWithBlock implements Clearable -0.2, 0.2); this.stopPlaying(); - this.clear(); - return ActionResult.SUCCESS; - } else if (stackInHand.getItem() instanceof MusicDiscItem && record.isEmpty()) { + this.clearContent(); + return InteractionResult.SUCCESS; + } else if (stackInHand.getItem() instanceof RecordItem && record.isEmpty()) { this.record = stackInHand.copy(); this.startPlaying(); - stackInHand.decrement(1); - player.incrementStat(Stats.PLAY_RECORD); - return ActionResult.SUCCESS; + stackInHand.shrink(1); + player.awardStat(Stats.PLAY_RECORD); + return InteractionResult.SUCCESS; } super.interact(player, hand); - return ActionResult.success(this.world.isClient); + return InteractionResult.sidedSuccess(this.level.isClientSide); } public void stopPlaying() { - PacketByteBuf buf = PacketByteBufs.create().writeUuid(this.getUuid()); + FriendlyByteBuf buf = PacketByteBufs.create().writeUUID(this.getUUID()); - for (PlayerEntity player1 : world.getPlayers()) { + for (Player player1 : level.players()) { ServerPlayNetworking.send( - (ServerPlayerEntity) player1, ClientSoundHolder.JUKEBOX_STOP_PLAYING, buf); + (ServerPlayer) player1, ClientSoundHolder.JUKEBOX_STOP_PLAYING, buf); } } public void startPlaying() { - PacketByteBuf buf = PacketByteBufs.create().writeUuid(this.uuid).writeItemStack(this.record); + FriendlyByteBuf buf = PacketByteBufs.create().writeUUID(this.uuid).writeItem(this.record); - for (PlayerEntity player1 : world.getPlayers()) { + for (Player player1 : level.players()) { ServerPlayNetworking.send( - (ServerPlayerEntity) player1, ClientSoundHolder.JUKEBOX_START_PLAYING, buf); + (ServerPlayer) player1, ClientSoundHolder.JUKEBOX_START_PLAYING, buf); } } @Override - public Item asItem() { - return Registries.ITEM.get(BoatItems.boatId(this.getVariant(), "jukebox")); + public Item getDropItem() { + return BuiltInRegistries.ITEM.get(BoatItems.boatId(this.getVariant(), "jukebox")); } @Override - public void readCustomDataFromNbt(NbtCompound nbt) { - super.readCustomDataFromNbt(nbt); + public void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); if (nbt.contains("Items", 10)) { - this.record = ItemStack.fromNbt(nbt.getCompound("Items")); + this.record = ItemStack.of(nbt.getCompound("Items")); } } @Override - public void writeCustomDataToNbt(NbtCompound nbt) { - super.writeCustomDataToNbt(nbt); - if (!this.record.isEmpty()) nbt.put("Items", this.record.writeNbt(new NbtCompound())); + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); + if (!this.record.isEmpty()) nbt.put("Items", this.record.save(new CompoundTag())); } @Override - public void clear() { + public void clearContent() { this.record = ItemStack.EMPTY; } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java index b09bc01e..ad7690d2 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java @@ -7,49 +7,49 @@ import me.melontini.dark_matter.api.base.util.Support; import net.fabricmc.api.EnvType; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.Registries; -import net.minecraft.registry.tag.DamageTypeTags; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.DamageTypeTags; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; public class TNTBoatEntity extends BoatEntityWithBlock { - public static final Identifier EXPLODE_BOAT_ON_SERVER = Andromeda.id("explode_boat_on_server"); + public static final ResourceLocation EXPLODE_BOAT_ON_SERVER = Andromeda.id("explode_boat_on_server"); public int fuseTicks = -1; - public TNTBoatEntity(EntityType entityType, World world) { + public TNTBoatEntity(EntityType entityType, Level world) { super(entityType, world); } - public TNTBoatEntity(World world, double x, double y, double z) { + public TNTBoatEntity(Level world, double x, double y, double z) { this(BoatEntities.BOAT_WITH_TNT.orThrow(), world); - this.setPosition(x, y, z); - this.prevX = x; - this.prevY = y; - this.prevZ = z; + this.setPos(x, y, z); + this.xo = x; + this.yo = y; + this.zo = z; } private final Runnable explode = Support.support( EnvType.CLIENT, () -> () -> { - PacketByteBuf buf = PacketByteBufs.create().writeUuid(this.getUuid()); + FriendlyByteBuf buf = PacketByteBufs.create().writeUUID(this.getUUID()); ClientPlayNetworking.send(EXPLODE_BOAT_ON_SERVER, buf); }, () -> this::explode); @@ -58,21 +58,21 @@ public class TNTBoatEntity extends BoatEntityWithBlock { public void tick() { if (this.fuseTicks > 0) { --this.fuseTicks; - Vec3d vec3d = new Vec3d(-0.55, 0.0, 0.0).rotateY(-this.getYaw() * PIby180 - PIby2); - world.addParticle( + Vec3 vec3d = new Vec3(-0.55, 0.0, 0.0).yRot(-this.getYRot() * PIby180 - PIby2); + level.addParticle( ParticleTypes.SMOKE, this.getX() + vec3d.x, this.getY() + 0.8, this.getZ() + vec3d.z, - -(this.getVelocity().x * 0.3), + -(this.getDeltaMovement().x * 0.3), 0.08, - -(this.getVelocity().z * 0.3)); + -(this.getDeltaMovement().z * 0.3)); } else if (this.fuseTicks == 0) { this.explode(); } if (this.horizontalCollision) { - if ((this.getFirstPassenger() instanceof PlayerEntity)) { + if ((this.getFirstPassenger() instanceof Player)) { this.explode.run(); } else { this.explode(); @@ -82,39 +82,39 @@ public class TNTBoatEntity extends BoatEntityWithBlock { } @Override - public boolean damage(DamageSource source, float amount) { - Entity entity = source.getSource(); + public boolean hurt(DamageSource source, float amount) { + Entity entity = source.getDirectEntity(); - if (entity instanceof PersistentProjectileEntity persistentProjectileEntity + if (entity instanceof AbstractArrow persistentProjectileEntity && persistentProjectileEntity.isOnFire()) { this.setFuse(); return false; } - if (source.isIn(DamageTypeTags.IS_FIRE)) { + if (source.is(DamageTypeTags.IS_FIRE)) { this.setFuse(); return false; } - if (source.isIn(DamageTypeTags.IS_EXPLOSION)) { + if (source.is(DamageTypeTags.IS_EXPLOSION)) { this.setFuse(); return false; } if (this.isInvulnerableTo(source)) { return false; - } else if (!this.world.isClient && !this.isRemoved()) { - this.setDamageWobbleSide(-this.getDamageWobbleSide()); - this.setDamageWobbleTicks(10); - this.setDamageWobbleStrength(this.getDamageWobbleStrength() + amount * 10.0F); - this.scheduleVelocityUpdate(); - this.emitGameEvent(GameEvent.ENTITY_DAMAGE, source.getAttacker()); + } else if (!this.level.isClientSide && !this.isRemoved()) { + this.setHurtDir(-this.getHurtDir()); + this.setHurtTime(10); + this.setDamage(this.getDamage() + amount * 10.0F); + this.markHurt(); + this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity()); boolean bl = - source.getAttacker() instanceof PlayerEntity player && player.getAbilities().creativeMode; + source.getEntity() instanceof Player player && player.getAbilities().instabuild; if (bl) { this.discard(); return false; } - if (this.getDamageWobbleStrength() > 40.0F) { + if (this.getDamage() > 40.0F) { this.explode(); } } @@ -122,57 +122,57 @@ public class TNTBoatEntity extends BoatEntityWithBlock { } @Override - public ActionResult interact(PlayerEntity player, Hand hand) { - ItemStack stack = player.getStackInHand(hand); - if (hand == Hand.MAIN_HAND - && (stack.isOf(Items.FLINT_AND_STEEL) || stack.isOf(Items.FIRE_CHARGE))) { + public InteractionResult interact(Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + if (hand == InteractionHand.MAIN_HAND + && (stack.is(Items.FLINT_AND_STEEL) || stack.is(Items.FIRE_CHARGE))) { this.setFuse(); if (!player.isCreative()) { - if (stack.isOf(Items.FLINT_AND_STEEL)) { - stack.damage(1, player, playerx -> playerx.sendToolBreakStatus(hand)); + if (stack.is(Items.FLINT_AND_STEEL)) { + stack.hurtAndBreak(1, player, playerx -> playerx.broadcastBreakEvent(hand)); } else { - stack.decrement(1); + stack.shrink(1); } } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } return super.interact(player, hand); } @Override - public Item asItem() { - return Registries.ITEM.get(BoatItems.boatId(this.getVariant(), "tnt")); + public Item getDropItem() { + return BuiltInRegistries.ITEM.get(BoatItems.boatId(this.getVariant(), "tnt")); } @Override - protected void readCustomDataFromNbt(NbtCompound nbt) { - super.readCustomDataFromNbt(nbt); + protected void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); if (nbt.contains("AM-TNTFuse", 99)) { this.fuseTicks = nbt.getInt("AM-TNTFuse"); } } @Override - protected void writeCustomDataToNbt(NbtCompound nbt) { - super.writeCustomDataToNbt(nbt); + protected void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); nbt.putInt("AM-TNTFuse", this.fuseTicks); } public void setFuse() { if (this.fuseTicks == -1) { - this.fuseTicks = 50 + world.getRandom().nextInt(20); - if (!world.isClient) { - world.playSoundFromEntity( - null, this, SoundEvents.ENTITY_TNT_PRIMED, SoundCategory.HOSTILE, 1F, 1F); + this.fuseTicks = 50 + level.getRandom().nextInt(20); + if (!level.isClientSide) { + level.playSound( + null, this, SoundEvents.TNT_PRIMED, SoundSource.HOSTILE, 1F, 1F); } } } public void explode() { - if (!this.world.isClient) { + if (!this.level.isClientSide) { this.discard(); - this.world.createExplosion( - this, this.getX(), this.getY(), this.getZ(), 4.0F, World.ExplosionSourceType.TNT); + this.level.explode( + this, this.getX(), this.getY(), this.getZ(), 4.0F, Level.ExplosionInteraction.TNT); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/items/AndromedaBoatItem.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/items/AndromedaBoatItem.java index 76f159c7..0ce51a14 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/items/AndromedaBoatItem.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/items/AndromedaBoatItem.java @@ -5,33 +5,37 @@ import java.util.function.Predicate; import me.melontini.andromeda.common.util.Keeper; import me.melontini.andromeda.common.util.MiscUtil; import me.melontini.dark_matter.api.base.util.MakeSure; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.BoatEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.registry.tag.FluidTags; -import net.minecraft.stat.Stats; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.*; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; - -public class AndromedaBoatItem extends Item { +import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockSource; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.Boat; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.tags.FluidTags; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.phys.Vec3; + +public class AndromedaBoatItem extends Item { private static final Predicate RIDERS = - EntityPredicates.EXCEPT_SPECTATOR.and(Entity::canHit); - private final BoatEntity.Type type; + EntitySelector.NO_SPECTATORS.and(Entity::isPickable); + private final Boat.Type type; private final Keeper> keeper; - public AndromedaBoatItem(Keeper> keeper, BoatEntity.Type type, Settings settings) { + public AndromedaBoatItem(Keeper> keeper, Boat.Type type, Properties settings) { super(settings); this.keeper = keeper; this.type = type; @@ -39,89 +43,89 @@ public class AndromedaBoatItem extends Item { } @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { - ItemStack itemStack = user.getStackInHand(hand); - HitResult hitResult = raycast(world, user, RaycastContext.FluidHandling.ANY); + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + ItemStack itemStack = user.getItemInHand(hand); + HitResult hitResult = getPlayerPOVHitResult(world, user, ClipContext.Fluid.ANY); if (hitResult.getType() == HitResult.Type.MISS) { - return TypedActionResult.pass(itemStack); + return InteractionResultHolder.pass(itemStack); } else { - Vec3d vec3d = user.getRotationVec(1.0F); - List list = world.getOtherEntities( - user, user.getBoundingBox().stretch(vec3d.multiply(5.0)).expand(1.0), RIDERS); + Vec3 vec3d = user.getViewVector(1.0F); + List list = world.getEntities( + user, user.getBoundingBox().expandTowards(vec3d.scale(5.0)).inflate(1.0), RIDERS); if (!list.isEmpty()) { - Vec3d vec3d2 = user.getEyePos(); + Vec3 vec3d2 = user.getEyePosition(); for (Entity entity : list) { - Box box = entity.getBoundingBox().expand(entity.getTargetingMargin()); + AABB box = entity.getBoundingBox().inflate(entity.getPickRadius()); if (box.contains(vec3d2)) { - return TypedActionResult.pass(itemStack); + return InteractionResultHolder.pass(itemStack); } } } if (hitResult.getType() == HitResult.Type.BLOCK) { T furnace = MakeSure.notNull(this.keeper.orThrow().create(world)); - furnace.setPosition(hitResult.getPos().x, hitResult.getPos().y, hitResult.getPos().z); + furnace.setPos(hitResult.getLocation().x, hitResult.getLocation().y, hitResult.getLocation().z); furnace.setVariant(this.type); - furnace.setYaw(user.getYaw()); - if (!world.isSpaceEmpty(furnace, furnace.getBoundingBox())) { - return TypedActionResult.fail(itemStack); + furnace.setYRot(user.getYRot()); + if (!world.noCollision(furnace, furnace.getBoundingBox())) { + return InteractionResultHolder.fail(itemStack); } else { - if (!world.isClient) { - world.spawnEntity(furnace); - world.emitGameEvent( - user, GameEvent.ENTITY_PLACE, MiscUtil.vec3dAsBlockPos(hitResult.getPos())); - if (!user.getAbilities().creativeMode) { - itemStack.decrement(1); + if (!world.isClientSide) { + world.addFreshEntity(furnace); + world.gameEvent( + user, GameEvent.ENTITY_PLACE, MiscUtil.vec3dAsBlockPos(hitResult.getLocation())); + if (!user.getAbilities().instabuild) { + itemStack.shrink(1); } } - user.incrementStat(Stats.USED.getOrCreateStat(this)); - return TypedActionResult.success(itemStack, world.isClient()); + user.awardStat(Stats.ITEM_USED.get(this)); + return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide()); } } else { - return TypedActionResult.pass(itemStack); + return InteractionResultHolder.pass(itemStack); } } } - private class BoatDispenseBehavior extends ItemDispenserBehavior { + private class BoatDispenseBehavior extends DefaultDispenseItemBehavior { - private final ItemDispenserBehavior itemDispenser; + private final DefaultDispenseItemBehavior itemDispenser; public BoatDispenseBehavior() { - this.itemDispenser = new ItemDispenserBehavior(); + this.itemDispenser = new DefaultDispenseItemBehavior(); } @Override - protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); - World world = pointer.getWorld(); + protected ItemStack execute(BlockSource pointer, ItemStack stack) { + Direction direction = pointer.getBlockState().getValue(DispenserBlock.FACING); + Level world = pointer.getLevel(); double d = 0.5625 + EntityType.BOAT.getWidth() / 2.0; - double e = pointer.getX() + direction.getOffsetX() * d; - double f = pointer.getY() + direction.getOffsetY() * 1.125F; - double g = pointer.getZ() + direction.getOffsetZ() * d; - BlockPos blockPos = pointer.getPos().offset(direction); + double e = pointer.x() + direction.getStepX() * d; + double f = pointer.y() + direction.getStepY() * 1.125F; + double g = pointer.z() + direction.getStepZ() * d; + BlockPos blockPos = pointer.getPos().relative(direction); double h; - if (world.getFluidState(blockPos).isIn(FluidTags.WATER)) { + if (world.getFluidState(blockPos).is(FluidTags.WATER)) { h = 1.0; } else { if (!world.getBlockState(blockPos).isAir() - || !world.getFluidState(blockPos.down()).isIn(FluidTags.WATER)) { + || !world.getFluidState(blockPos.below()).is(FluidTags.WATER)) { return this.itemDispenser.dispense(pointer, stack); } h = 0.0; } T boatEntity = MakeSure.notNull(AndromedaBoatItem.this.keeper.orThrow().create(world)); - boatEntity.setPosition(e, f + h, g); + boatEntity.setPos(e, f + h, g); boatEntity.setVariant(AndromedaBoatItem.this.type); - boatEntity.setYaw(direction.asRotation()); + boatEntity.setYRot(direction.toYRot()); - world.spawnEntity(boatEntity); - stack.decrement(1); + world.addFreshEntity(boatEntity); + stack.shrink(1); return stack; } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/Main.java b/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/Main.java index 0c94ee0b..933da480 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/Main.java @@ -2,26 +2,26 @@ package me.melontini.andromeda.modules.entities.ghast_tweaks; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; -import net.minecraft.entity.mob.GhastEntity; -import net.minecraft.world.World; +import net.minecraft.world.entity.monster.Ghast; +import net.minecraft.world.level.Level; public final class Main { static void init() { ServerLivingEntityEvents.AFTER_DEATH.register((entity, damageSource) -> { - if (entity instanceof GhastEntity) { - var c = entity.world.am$get(GhastTweaks.CONFIG); + if (entity instanceof Ghast) { + var c = entity.level.am$get(GhastTweaks.CONFIG); var supplier = ConstantLootContextAccessor.get(entity); if (!c.available.asBoolean(supplier)) return; if (c.explodeOnDeath.asBoolean(supplier)) - entity.world.createExplosion( + entity.level.explode( entity, entity.getX(), entity.getY(), entity.getZ(), c.explosionPower.asFloat(supplier), - World.ExplosionSourceType.MOB); + Level.ExplosionInteraction.MOB); } }); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/ExplosionMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/ExplosionMixin.java index 5460a042..5fb87844 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/ExplosionMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/ExplosionMixin.java @@ -3,11 +3,11 @@ package me.melontini.andromeda.modules.entities.ghast_tweaks.mixin; import com.llamalad7.mixinextras.sugar.Local; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import me.melontini.andromeda.modules.entities.ghast_tweaks.GhastExplosionDuck; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.explosion.Explosion; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.Explosion; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,7 +21,7 @@ abstract class ExplosionMixin implements GhastExplosionDuck { @Shadow @Final - private World world; + private Level level; @Unique private final ObjectArrayList affectedObsidian = new ObjectArrayList<>(); @@ -32,23 +32,23 @@ abstract class ExplosionMixin implements GhastExplosionDuck { @At( value = "INVOKE", target = - "Lnet/minecraft/world/explosion/ExplosionBehavior;getBlastResistance(Lnet/minecraft/world/explosion/Explosion;Lnet/minecraft/world/BlockView;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/fluid/FluidState;)Ljava/util/Optional;"), - method = "collectBlocksAndDamageEntities") + "Lnet/minecraft/world/level/ExplosionDamageCalculator;getBlockExplosionResistance(Lnet/minecraft/world/level/Explosion;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/material/FluidState;)Ljava/util/Optional;"), + method = "explode") private void collectAffectedObsidian( CallbackInfo ci, @Local(index = 14) float h, @Local(index = 22) BlockPos pos, @Local(index = 23) BlockState state) { if (!affectObsidian || state.getBlock() != Blocks.OBSIDIAN) return; - if (h - 0.64 > 0 && world.random.nextFloat() >= 0.2f) affectedObsidian.add(pos); + if (h - 0.64 > 0 && level.random.nextFloat() >= 0.2f) affectedObsidian.add(pos); } @Inject( - at = @At(value = "FIELD", target = "Lnet/minecraft/world/explosion/Explosion;createFire:Z"), - method = "affectWorld") + at = @At(value = "FIELD", target = "Lnet/minecraft/world/level/Explosion;fire:Z"), + method = "finalizeExplosion") private void affectObsidian(boolean particles, CallbackInfo ci) { for (BlockPos blockPos : affectedObsidian) { - world.setBlockState(blockPos, Blocks.CRYING_OBSIDIAN.getDefaultState()); + level.setBlockAndUpdate(blockPos, Blocks.CRYING_OBSIDIAN.defaultBlockState()); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/FireballEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/FireballEntityMixin.java index c426f59b..8bfaacfd 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/FireballEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/ghast_tweaks/mixin/FireballEntityMixin.java @@ -4,55 +4,55 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import me.melontini.andromeda.modules.entities.ghast_tweaks.GhastExplosionDuck; import me.melontini.andromeda.modules.entities.ghast_tweaks.GhastTweaks; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.mob.GhastEntity; -import net.minecraft.entity.projectile.AbstractFireballEntity; -import net.minecraft.entity.projectile.FireballEntity; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; -import net.minecraft.world.explosion.Explosion; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Ghast; +import net.minecraft.world.entity.projectile.Fireball; +import net.minecraft.world.entity.projectile.LargeFireball; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.Explosion; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(FireballEntity.class) -abstract class FireballEntityMixin extends AbstractFireballEntity { +@Mixin(LargeFireball.class) +abstract class FireballEntityMixin extends Fireball { - public FireballEntityMixin(EntityType entityType, World world) { + public FireballEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @WrapOperation( - method = "onCollision", + method = "onHit", at = @At( value = "INVOKE", target = - "Lnet/minecraft/world/World;createExplosion(Lnet/minecraft/entity/Entity;DDDFZLnet/minecraft/world/World$ExplosionSourceType;)Lnet/minecraft/world/explosion/Explosion;")) + "Lnet/minecraft/world/level/Level;explode(Lnet/minecraft/world/entity/Entity;DDDFZLnet/minecraft/world/level/Level$ExplosionInteraction;)Lnet/minecraft/world/level/Explosion;")) private Explosion redirectExplosionType( - World instance, - Entity entity, - double x, - double y, - double z, - float power, - boolean createFire, - World.ExplosionSourceType explosionSourceType, - Operation original) { - if (this.getOwner() instanceof GhastEntity + Level instance, + Entity entity, + double x, + double y, + double z, + float power, + boolean createFire, + Level.ExplosionInteraction explosionSourceType, + Operation original) { + if (this.getOwner() instanceof Ghast && instance.am$get(GhastTweaks.CONFIG).fireBallsConvertObsidian) { - Explosion.DestructionType destructionType = - instance.getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING) - ? instance.getGameRules().getBoolean(GameRules.MOB_EXPLOSION_DROP_DECAY) - ? Explosion.DestructionType.DESTROY_WITH_DECAY - : Explosion.DestructionType.DESTROY - : Explosion.DestructionType.KEEP; + Explosion.BlockInteraction destructionType = + instance.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) + ? instance.getGameRules().getBoolean(GameRules.RULE_MOB_EXPLOSION_DROP_DECAY) + ? Explosion.BlockInteraction.DESTROY_WITH_DECAY + : Explosion.BlockInteraction.DESTROY + : Explosion.BlockInteraction.KEEP; Explosion explosion = new Explosion(instance, entity, null, null, x, y, z, power, createFire, destructionType); ((GhastExplosionDuck) explosion).andromeda$convertObsidian(true); - explosion.collectBlocksAndDamageEntities(); - explosion.affectWorld(true); + explosion.explode(); + explosion.finalizeExplosion(true); return explosion; } else { return original.call(instance, entity, x, y, z, power, createFire, explosionSourceType); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/AbstractMinecartEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/AbstractMinecartEntityMixin.java index 4a7d9861..56a2d6f6 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/AbstractMinecartEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/AbstractMinecartEntityMixin.java @@ -3,24 +3,24 @@ package me.melontini.andromeda.modules.entities.minecart_speed_control.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.modules.entities.minecart_speed_control.MinecartSpeedControl; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(AbstractMinecartEntity.class) +@Mixin(AbstractMinecart.class) abstract class AbstractMinecartEntityMixin extends Entity { - public AbstractMinecartEntityMixin(EntityType type, World world) { + public AbstractMinecartEntityMixin(EntityType type, Level world) { super(type, world); } @ModifyReturnValue(method = "getMaxSpeed", at = @At("RETURN")) private double andromeda$getMaxSpeed(double original) { - if (!this.getWorld().isClient()) { - var c = this.getWorld().am$get(MinecartSpeedControl.CONFIG); + if (!this.level().isClientSide()) { + var c = this.level().am$get(MinecartSpeedControl.CONFIG); var supplier = ConstantLootContextAccessor.get(this); return c.available.asBoolean(supplier) ? original * c.modifier.asDouble(supplier) : original; } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/FurnaceMinecartEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/FurnaceMinecartEntityMixin.java index 31e3b798..c6af85dc 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/FurnaceMinecartEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecart_speed_control/mixin/FurnaceMinecartEntityMixin.java @@ -3,31 +3,31 @@ package me.melontini.andromeda.modules.entities.minecart_speed_control.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.modules.entities.minecart_speed_control.MinecartSpeedControl; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.entity.vehicle.FurnaceMinecartEntity; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.MinecartFurnace; +import net.minecraft.world.level.Level; 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; -@Mixin(FurnaceMinecartEntity.class) -abstract class FurnaceMinecartEntityMixin extends AbstractMinecartEntity { +@Mixin(MinecartFurnace.class) +abstract class FurnaceMinecartEntityMixin extends AbstractMinecart { @Shadow public int fuel; - protected FurnaceMinecartEntityMixin(EntityType entityType, World world) { + protected FurnaceMinecartEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @Inject(at = @At("HEAD"), method = "tick") private void andromeda$subtract(CallbackInfo ci) { - if (!this.getWorld().isClient()) { + if (!this.level().isClientSide()) { if (fuel > 0) { - var c = this.getWorld().am$get(MinecartSpeedControl.CONFIG); + var c = this.level().am$get(MinecartSpeedControl.CONFIG); var supplier = ConstantLootContextAccessor.get(this); if (c.available.asBoolean(supplier)) fuel = Math.max(fuel - c.additionalFurnaceFuel.asInt(supplier), 0); @@ -37,8 +37,8 @@ abstract class FurnaceMinecartEntityMixin extends AbstractMinecartEntity { @ModifyReturnValue(method = "getMaxSpeed", at = @At("RETURN")) private double andromeda$getMaxSpeed(double original) { - if (!this.getWorld().isClient()) { - var c = this.getWorld().am$get(MinecartSpeedControl.CONFIG); + if (!this.level().isClientSide()) { + var c = this.level().am$get(MinecartSpeedControl.CONFIG); var supplier = ConstantLootContextAccessor.get(this); return c.available.asBoolean(supplier) ? original * c.furnaceModifier.asDouble(supplier) diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartEntities.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartEntities.java index 4b21ef05..cbb20437 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartEntities.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartEntities.java @@ -9,10 +9,10 @@ import me.melontini.andromeda.modules.entities.minecarts.entities.JukeboxMinecar import me.melontini.andromeda.modules.entities.minecarts.entities.NoteBlockMinecartEntity; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.registry.Registries; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.core.registries.BuiltInRegistries; public class MinecartEntities { @@ -28,28 +28,28 @@ public class MinecartEntities { ANVIL_MINECART_ENTITY.init(RegistryUtil.register( config.isAnvilMinecartOn, - Registries.ENTITY_TYPE, + BuiltInRegistries.ENTITY_TYPE, id("anvil_minecart"), () -> FabricEntityTypeBuilder.create( - SpawnGroup.MISC, AnvilMinecartEntity::new) + MobCategory.MISC, AnvilMinecartEntity::new) .dimensions(new EntityDimensions(0.98F, 0.7F, true)) .build())); NOTEBLOCK_MINECART_ENTITY.init(RegistryUtil.register( config.isNoteBlockMinecartOn, - Registries.ENTITY_TYPE, + BuiltInRegistries.ENTITY_TYPE, id("note_block_minecart"), () -> FabricEntityTypeBuilder.create( - SpawnGroup.MISC, NoteBlockMinecartEntity::new) + MobCategory.MISC, NoteBlockMinecartEntity::new) .dimensions(new EntityDimensions(0.98F, 0.7F, true)) .build())); JUKEBOX_MINECART_ENTITY.init(RegistryUtil.register( config.isJukeboxMinecartOn, - Registries.ENTITY_TYPE, + BuiltInRegistries.ENTITY_TYPE, id("jukebox_minecart"), () -> FabricEntityTypeBuilder.create( - SpawnGroup.MISC, JukeboxMinecartEntity::new) + MobCategory.MISC, JukeboxMinecartEntity::new) .dimensions(new EntityDimensions(0.98F, 0.7F, true)) .build())); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartItems.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartItems.java index e3cbdd56..e75c7c8b 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartItems.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/MinecartItems.java @@ -19,19 +19,19 @@ import me.melontini.dark_matter.api.base.util.MakeSure; import me.melontini.dark_matter.api.data.nbt.NbtBuilder; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.block.Blocks; -import net.minecraft.block.NoteBlock; -import net.minecraft.block.entity.JukeboxBlockEntity; -import net.minecraft.block.entity.MobSpawnerBlockEntity; -import net.minecraft.item.ItemGroups; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.state.property.Properties; -import net.minecraft.util.Identifier; -import net.minecraft.util.InvalidIdentifierException; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldEvents; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.NoteBlock; +import net.minecraft.world.level.block.entity.JukeboxBlockEntity; +import net.minecraft.world.level.block.entity.SpawnerBlockEntity; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.ResourceLocationException; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.LevelEvent; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Unique; @@ -50,38 +50,38 @@ public class MinecartItems { SPAWNER_MINECART.init(RegistryUtil.register( config.isSpawnerMinecartOn, - Registries.ITEM, + BuiltInRegistries.ITEM, id("spawner_minecart"), - () -> new SpawnerMinecartItem(new FabricItemSettings().maxCount(1)))); + () -> new SpawnerMinecartItem(new FabricItemSettings().stacksTo(1)))); ANVIL_MINECART.init(RegistryUtil.register( config.isAnvilMinecartOn, - Registries.ITEM, + BuiltInRegistries.ITEM, id("anvil_minecart"), () -> new AndromedaMinecartItem<>( - MinecartEntities.ANVIL_MINECART_ENTITY, new FabricItemSettings().maxCount(1)))); + MinecartEntities.ANVIL_MINECART_ENTITY, new FabricItemSettings().stacksTo(1)))); NOTE_BLOCK_MINECART.init(RegistryUtil.register( config.isNoteBlockMinecartOn, - Registries.ITEM, + BuiltInRegistries.ITEM, id("note_block_minecart"), - () -> new NoteBlockMinecartItem(new FabricItemSettings().maxCount(1)))); + () -> new NoteBlockMinecartItem(new FabricItemSettings().stacksTo(1)))); JUKEBOX_MINECART.init(RegistryUtil.register( config.isJukeboxMinecartOn, - Registries.ITEM, + BuiltInRegistries.ITEM, id("jukebox_minecart"), - () -> new JukeboxMinecartItem(new FabricItemSettings().maxCount(1)))); + () -> new JukeboxMinecartItem(new FabricItemSettings().stacksTo(1)))); var l = List.of(SPAWNER_MINECART, ANVIL_MINECART, NOTE_BLOCK_MINECART, JUKEBOX_MINECART); AndromedaItemGroup.BUS.listen( - acceptor -> acceptor.keepers(module, ItemGroups.TOOLS, List.copyOf(l))); + acceptor -> acceptor.keepers(module, CreativeModeTabs.TOOLS_AND_UTILITIES, List.copyOf(l))); if (ModuleManager.get().get(MinecartBlockPicking.class).isPresent()) { if (SPAWNER_MINECART.isPresent()) { PickUpBehaviorHandler.registerPickUpBehavior(Blocks.SPAWNER, (state, world, pos) -> { if (world.am$get(MinecartBlockPicking.CONFIG).spawnerPicking) { - MobSpawnerBlockEntity mobSpawnerBlockEntity = (MobSpawnerBlockEntity) MakeSure.notNull( + SpawnerBlockEntity mobSpawnerBlockEntity = (SpawnerBlockEntity) MakeSure.notNull( world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); ItemStack spawnerMinecart = new ItemStack(SPAWNER_MINECART.orThrow(), 1); - spawnerMinecart.setNbt(NbtBuilder.create() + spawnerMinecart.setTag(NbtBuilder.create() .putString("Entity", String.valueOf(andromeda$getEntityId(mobSpawnerBlockEntity))) .build()); return spawnerMinecart; @@ -98,10 +98,10 @@ public class MinecartItems { if (NOTE_BLOCK_MINECART.isPresent()) { PickUpBehaviorHandler.registerPickUpBehavior(Blocks.NOTE_BLOCK, (state, world, pos) -> { NoteBlock noteBlock = (NoteBlock) state.getBlock(); - int noteProp = noteBlock.getStateWithProperties(state).get(Properties.NOTE); + int noteProp = noteBlock.withPropertiesOf(state).getValue(BlockStateProperties.NOTE); ItemStack noteBlockMinecart = new ItemStack(NOTE_BLOCK_MINECART.orThrow()); - noteBlockMinecart.setNbt(NbtBuilder.create().putInt("Note", noteProp).build()); + noteBlockMinecart.setTag(NbtBuilder.create().putInt("Note", noteProp).build()); return noteBlockMinecart; }); } @@ -111,33 +111,33 @@ public class MinecartItems { JukeboxBlockEntity jukeboxBlockEntity = (JukeboxBlockEntity) MakeSure.notNull( world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); - ItemStack record = jukeboxBlockEntity.getStack(0); + ItemStack record = jukeboxBlockEntity.getItem(0); ItemStack jukeboxMinecart = new ItemStack(JUKEBOX_MINECART.orThrow()); if (!record.isEmpty()) { - world.syncWorldEvent(WorldEvents.JUKEBOX_STARTS_PLAYING, pos, 0); - jukeboxMinecart.setNbt(NbtBuilder.create() - .put("Items", record.writeNbt(new NbtCompound())) + world.levelEvent(LevelEvent.SOUND_PLAY_JUKEBOX_SONG, pos, 0); + jukeboxMinecart.setTag(NbtBuilder.create() + .put("Items", record.save(new CompoundTag())) .build()); } - jukeboxBlockEntity.clear(); + jukeboxBlockEntity.clearContent(); return jukeboxMinecart; }); } } } - @Nullable @Unique private static Identifier andromeda$getEntityId(MobSpawnerBlockEntity mobSpawnerBlockEntity) { - var entry = mobSpawnerBlockEntity.getLogic().spawnEntry; - if (entry == null) return Registries.ENTITY_TYPE.getDefaultId(); - String identifier = entry.entity().getString("id"); + @Nullable @Unique private static ResourceLocation andromeda$getEntityId(SpawnerBlockEntity mobSpawnerBlockEntity) { + var entry = mobSpawnerBlockEntity.getSpawner().nextSpawnData; + if (entry == null) return BuiltInRegistries.ENTITY_TYPE.getDefaultKey(); + String identifier = entry.entityToSpawn().getString("id"); try { return StringUtils.isEmpty(identifier) - ? Registries.ENTITY_TYPE.getDefaultId() - : new Identifier(identifier); - } catch (InvalidIdentifierException e) { - BlockPos blockPos = mobSpawnerBlockEntity.getPos(); + ? BuiltInRegistries.ENTITY_TYPE.getDefaultKey() + : new ResourceLocation(identifier); + } catch (ResourceLocationException e) { + BlockPos blockPos = mobSpawnerBlockEntity.getBlockPos(); ModuleManager.get() .get(Minecarts.class) .orElseThrow() @@ -145,13 +145,13 @@ public class MinecartItems { .error( "Invalid entity id '{}' at spawner {}:[{},{},{}]", identifier, - Objects.requireNonNull(mobSpawnerBlockEntity.getWorld()) - .getRegistryKey() - .getValue(), + Objects.requireNonNull(mobSpawnerBlockEntity.getLevel()) + .dimension() + .location(), blockPos.getX(), blockPos.getY(), blockPos.getZ()); - return Registries.ENTITY_TYPE.getDefaultId(); + return BuiltInRegistries.ENTITY_TYPE.getDefaultKey(); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/client/Client.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/client/Client.java index 330b08b6..5d1d69c6 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/client/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/client/Client.java @@ -4,8 +4,8 @@ import static me.melontini.andromeda.modules.entities.minecarts.MinecartEntities import me.melontini.andromeda.modules.entities.boats.client.ClientSoundHolder; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.minecraft.client.render.entity.MinecartEntityRenderer; -import net.minecraft.client.render.entity.model.EntityModelLayers; +import net.minecraft.client.renderer.entity.MinecartRenderer; +import net.minecraft.client.model.geom.ModelLayers; public class Client { @@ -13,19 +13,19 @@ public class Client { if (ANVIL_MINECART_ENTITY.isPresent()) { EntityRendererRegistry.register( ANVIL_MINECART_ENTITY.get(), - ctx -> new MinecartEntityRenderer<>(ctx, EntityModelLayers.MINECART)); + ctx -> new MinecartRenderer<>(ctx, ModelLayers.MINECART)); } if (NOTEBLOCK_MINECART_ENTITY.isPresent()) { EntityRendererRegistry.register( NOTEBLOCK_MINECART_ENTITY.get(), - ctx -> new MinecartEntityRenderer<>(ctx, EntityModelLayers.MINECART)); + ctx -> new MinecartRenderer<>(ctx, ModelLayers.MINECART)); } if (JUKEBOX_MINECART_ENTITY.isPresent()) { EntityRendererRegistry.register( JUKEBOX_MINECART_ENTITY.get(), - ctx -> new MinecartEntityRenderer<>(ctx, EntityModelLayers.MINECART)); + ctx -> new MinecartRenderer<>(ctx, ModelLayers.MINECART)); } if (JUKEBOX_MINECART_ENTITY.isPresent()) ClientSoundHolder.init(); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java index 0fd1a04a..d5a91f38 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java @@ -7,29 +7,29 @@ import me.melontini.andromeda.modules.entities.minecart_speed_control.MinecartSp import me.melontini.andromeda.modules.entities.minecarts.MinecartEntities; import me.melontini.andromeda.modules.entities.minecarts.MinecartItems; import me.melontini.dark_matter.api.base.util.MathUtil; -import net.minecraft.block.AnvilBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.predicate.entity.EntityPredicates; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.MathHelper; -import net.minecraft.world.World; +import net.minecraft.world.level.block.AnvilBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.entity.EntitySelector; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; -public class AnvilMinecartEntity extends AbstractMinecartEntity { - public AnvilMinecartEntity(EntityType entityType, World world) { +public class AnvilMinecartEntity extends AbstractMinecart { + public AnvilMinecartEntity(EntityType entityType, Level world) { super(entityType, world); } - public AnvilMinecartEntity(World world, double x, double y, double z) { + public AnvilMinecartEntity(Level world, double x, double y, double z) { super(MinecartEntities.ANVIL_MINECART_ENTITY.orThrow(), world, x, y, z); } @@ -39,20 +39,20 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { } @Override - public ActionResult interact(PlayerEntity player, Hand hand) { - return ActionResult.success(world.isClient); + public InteractionResult interact(Player player, InteractionHand hand) { + return InteractionResult.sidedSuccess(level.isClientSide); } @Override - public boolean handleFallDamage( - float fallDistance, float damageMultiplier, DamageSource damageSource) { - int i = MathHelper.ceil(fallDistance - 1.0F); + public boolean causeFallDamage( + float fallDistance, float damageMultiplier, DamageSource damageSource) { + int i = Mth.ceil(fallDistance - 1.0F); if (i >= 0) { float f = (float) Math.min(MathUtil.fastFloor(i * 2), 40); - for (Entity entity : world.getEntitiesByClass( - Entity.class, this.getBoundingBox().expand(0.1), EntityPredicates.EXCEPT_SPECTATOR)) { - if (!(entity instanceof AbstractMinecartEntity)) { - entity.damage(world.getDamageSources().fallingAnvil(this), f); + for (Entity entity : level.getEntitiesOfClass( + Entity.class, this.getBoundingBox().inflate(0.1), EntitySelector.NO_SPECTATORS)) { + if (!(entity instanceof AbstractMinecart)) { + entity.hurt(level.damageSources().anvil(this), f); } } } @@ -60,7 +60,7 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { } @Override - public Item getItem() { + public Item getDropItem() { return MinecartItems.ANVIL_MINECART.orThrow(); } @@ -70,10 +70,10 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { @Override public double getMaxSpeed() { - double d = (this.isTouchingWater() ? 0.08 : 0.1) / 20.0; + double d = (this.isInWater() ? 0.08 : 0.1) / 20.0; return optional .map(ms -> { - var c = world.am$get(MinecartSpeedControl.CONFIG); + var c = level.am$get(MinecartSpeedControl.CONFIG); var supplier = ConstantLootContextAccessor.get(this); return c.available.asBoolean(supplier) ? d * c.modifier.asDouble(supplier) : d; }) @@ -81,12 +81,12 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { } @Override - public BlockState getDefaultContainedBlock() { - return Blocks.ANVIL.getDefaultState().with(AnvilBlock.FACING, Direction.NORTH); + public BlockState getDefaultDisplayBlockState() { + return Blocks.ANVIL.defaultBlockState().setValue(AnvilBlock.FACING, Direction.NORTH); } @Override - public ItemStack getPickBlockStack() { + public ItemStack getPickResult() { return new ItemStack(MinecartItems.ANVIL_MINECART.orThrow()); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java index c95c4f95..e5befd00 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java @@ -6,37 +6,37 @@ import me.melontini.andromeda.modules.entities.minecarts.MinecartItems; import me.melontini.dark_matter.api.minecraft.util.ItemStackUtil; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.MusicDiscItem; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.stat.Stats; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Clearable; -import net.minecraft.util.Hand; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; - -public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Clearable { +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.RecordItem; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.Clearable; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.GameRules; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; + +public class JukeboxMinecartEntity extends AbstractMinecart implements Clearable { public ItemStack record = ItemStack.EMPTY; public JukeboxMinecartEntity( - EntityType entityType, World world) { + EntityType entityType, Level world) { super(entityType, world); } - public JukeboxMinecartEntity(World world, double x, double y, double z) { + public JukeboxMinecartEntity(Level world, double x, double y, double z) { super(MinecartEntities.JUKEBOX_MINECART_ENTITY.orThrow(), world, x, y, z); } @@ -46,44 +46,44 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle } @Override - public void onActivatorRail(int x, int y, int z, boolean powered) { + public void activateMinecart(int x, int y, int z, boolean powered) { if (powered && !this.record.isEmpty()) { ItemStackUtil.spawnVelocity( - new Vec3d(this.getX(), this.getY() + 0.5, this.getZ()), + new Vec3(this.getX(), this.getY() + 0.5, this.getZ()), this.record, - this.world, + this.level, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2); - this.clear(); + this.clearContent(); this.stopPlaying(); } } @Override - public boolean damage(DamageSource source, float amount) { - if (this.world.isClient || this.isRemoved()) { + public boolean hurt(DamageSource source, float amount) { + if (this.level.isClientSide || this.isRemoved()) { return true; } else if (this.isInvulnerableTo(source)) { return false; } else { - this.setDamageWobbleSide(-this.getDamageWobbleSide()); - this.setDamageWobbleTicks(10); - this.scheduleVelocityUpdate(); - this.setDamageWobbleStrength(this.getDamageWobbleStrength() + amount * 10.0F); - this.emitGameEvent(GameEvent.ENTITY_DAMAGE, source.getAttacker()); + this.setHurtDir(-this.getHurtDir()); + this.setHurtTime(10); + this.markHurt(); + this.setDamage(this.getDamage() + amount * 10.0F); + this.gameEvent(GameEvent.ENTITY_DAMAGE, source.getEntity()); boolean isCreativePlayer = - source.getAttacker() instanceof PlayerEntity player && player.getAbilities().creativeMode; - if (isCreativePlayer || this.getDamageWobbleStrength() > 40.0F) { - this.removeAllPassengers(); + source.getEntity() instanceof Player player && player.getAbilities().instabuild; + if (isCreativePlayer || this.getDamage() > 40.0F) { + this.ejectPassengers(); this.stopPlaying(); if (isCreativePlayer && !this.hasCustomName()) { this.discard(); } else { - this.dropItems(source); + this.destroy(source); } } @@ -92,10 +92,10 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle } @Override - public void dropItems(DamageSource damageSource) { - super.dropItems(damageSource); - if (this.world.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS)) { - this.dropItem(record.getItem()); + public void destroy(DamageSource damageSource) { + super.destroy(damageSource); + if (this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + this.spawnAtLocation(record.getItem()); } } @@ -106,14 +106,14 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle } @Override - public ActionResult interact(PlayerEntity player, Hand hand) { - ItemStack stackInHand = player.getStackInHand(hand); - if (!world.isClient()) + public InteractionResult interact(Player player, InteractionHand hand) { + ItemStack stackInHand = player.getItemInHand(hand); + if (!level.isClientSide()) if (!this.record.isEmpty()) { ItemStackUtil.spawnVelocity( - new Vec3d(this.getX(), this.getY() + 0.5, this.getZ()), + new Vec3(this.getX(), this.getY() + 0.5, this.getZ()), this.record, - this.world, + this.level, -0.2, 0.2, 0.1, @@ -121,65 +121,65 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle -0.2, 0.2); this.stopPlaying(); - this.clear(); - } else if (stackInHand.getItem() instanceof MusicDiscItem) { + this.clearContent(); + } else if (stackInHand.getItem() instanceof RecordItem) { this.record = stackInHand.copy(); this.startPlaying(); - stackInHand.decrement(1); - player.incrementStat(Stats.PLAY_RECORD); + stackInHand.shrink(1); + player.awardStat(Stats.PLAY_RECORD); } - return ActionResult.success(this.world.isClient); + return InteractionResult.sidedSuccess(this.level.isClientSide); } public void stopPlaying() { - PacketByteBuf buf = PacketByteBufs.create().writeUuid(this.getUuid()); + FriendlyByteBuf buf = PacketByteBufs.create().writeUUID(this.getUUID()); - for (PlayerEntity player1 : world.getPlayers()) { + for (Player player1 : level.players()) { ServerPlayNetworking.send( - (ServerPlayerEntity) player1, ClientSoundHolder.JUKEBOX_STOP_PLAYING, buf); + (ServerPlayer) player1, ClientSoundHolder.JUKEBOX_STOP_PLAYING, buf); } } public void startPlaying() { - PacketByteBuf buf = PacketByteBufs.create().writeUuid(this.uuid).writeItemStack(this.record); + FriendlyByteBuf buf = PacketByteBufs.create().writeUUID(this.uuid).writeItem(this.record); - for (PlayerEntity player1 : world.getPlayers()) { + for (Player player1 : level.players()) { ServerPlayNetworking.send( - (ServerPlayerEntity) player1, ClientSoundHolder.JUKEBOX_START_PLAYING, buf); + (ServerPlayer) player1, ClientSoundHolder.JUKEBOX_START_PLAYING, buf); } } @Override - public void readCustomDataFromNbt(NbtCompound nbt) { - super.readCustomDataFromNbt(nbt); + public void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); if (nbt.contains("Items", 10)) { - this.record = ItemStack.fromNbt(nbt.getCompound("Items")); + this.record = ItemStack.of(nbt.getCompound("Items")); } } @Override - public void writeCustomDataToNbt(NbtCompound nbt) { - super.writeCustomDataToNbt(nbt); - if (!this.record.isEmpty()) nbt.put("Items", this.record.writeNbt(new NbtCompound())); + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); + if (!this.record.isEmpty()) nbt.put("Items", this.record.save(new CompoundTag())); } @Override - public Item getItem() { + public Item getDropItem() { return MinecartItems.JUKEBOX_MINECART.orThrow(); } @Override - public BlockState getDefaultContainedBlock() { - return Blocks.JUKEBOX.getDefaultState(); + public BlockState getDefaultDisplayBlockState() { + return Blocks.JUKEBOX.defaultBlockState(); } @Override - public ItemStack getPickBlockStack() { + public ItemStack getPickResult() { return new ItemStack(MinecartItems.JUKEBOX_MINECART.orThrow()); } @Override - public void clear() { + public void clearContent() { this.record = ItemStack.EMPTY; } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java index 4798cd98..d539ff6f 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java @@ -2,80 +2,80 @@ package me.melontini.andromeda.modules.entities.minecarts.entities; import me.melontini.andromeda.modules.entities.minecarts.MinecartEntities; import me.melontini.andromeda.modules.entities.minecarts.MinecartItems; -import net.minecraft.block.AbstractRailBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.PoweredRailBlock; -import net.minecraft.block.enums.Instrument; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.sound.SoundCategory; -import net.minecraft.stat.Stats; -import net.minecraft.state.property.Properties; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; - -public class NoteBlockMinecartEntity extends AbstractMinecartEntity { +import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.PoweredRailBlock; +import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.tags.BlockTags; +import net.minecraft.sounds.SoundSource; +import net.minecraft.stats.Stats; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.core.BlockPos; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; + +public class NoteBlockMinecartEntity extends AbstractMinecart { public int note = 0; public boolean isPowered = false; public NoteBlockMinecartEntity( - EntityType entityType, World world) { + EntityType entityType, Level world) { super(entityType, world); } - public NoteBlockMinecartEntity(World world, double x, double y, double z) { + public NoteBlockMinecartEntity(Level world, double x, double y, double z) { super(MinecartEntities.NOTEBLOCK_MINECART_ENTITY.orThrow(), world, x, y, z); } @Override - public boolean damage(DamageSource source, float amount) { - this.playNote(world, new Vec3d(getX(), getY() - 1, getZ())); - super.damage(source, amount); + public boolean hurt(DamageSource source, float amount) { + this.playNote(level, new Vec3(getX(), getY() - 1, getZ())); + super.hurt(source, amount); return true; } @Override - public ActionResult interact(PlayerEntity player, Hand hand) { + public InteractionResult interact(Player player, InteractionHand hand) { this.cycleNote(); - this.playNote(world, new Vec3d(getX(), getY() - 1, getZ())); - player.incrementStat(Stats.TUNE_NOTEBLOCK); - return ActionResult.success(world.isClient); + this.playNote(level, new Vec3(getX(), getY() - 1, getZ())); + player.awardStat(Stats.TUNE_NOTEBLOCK); + return InteractionResult.sidedSuccess(level.isClientSide); } @Override - public void onActivatorRail(int x, int y, int z, boolean powered) { + public void activateMinecart(int x, int y, int z, boolean powered) { if (powered && !this.isPowered) { - playNote(this.world, new Vec3d(getX(), getY() - 1, getZ())); + playNote(this.level, new Vec3(getX(), getY() - 1, getZ())); } } @Override public void tick() { - int i = MathHelper.floor(this.getX()); - int j = MathHelper.floor(this.getY()); - int k = MathHelper.floor(this.getZ()); - if (this.world.getBlockState(new BlockPos(i, j - 1, k)).isIn(BlockTags.RAILS)) { + int i = Mth.floor(this.getX()); + int j = Mth.floor(this.getY()); + int k = Mth.floor(this.getZ()); + if (this.level.getBlockState(new BlockPos(i, j - 1, k)).is(BlockTags.RAILS)) { --j; } BlockPos blockPos = new BlockPos(i, j, k); - BlockState blockState = this.world.getBlockState(blockPos); - if (AbstractRailBlock.isRail(blockState)) { - if (blockState.isOf(Blocks.ACTIVATOR_RAIL)) { - if (blockState.get(PoweredRailBlock.POWERED)) { - this.onActivatorRail(i, j, k, true); + BlockState blockState = this.level.getBlockState(blockPos); + if (BaseRailBlock.isRail(blockState)) { + if (blockState.is(Blocks.ACTIVATOR_RAIL)) { + if (blockState.getValue(PoweredRailBlock.POWERED)) { + this.activateMinecart(i, j, k, true); this.isPowered = true; } else { this.isPowered = false; @@ -93,67 +93,67 @@ public class NoteBlockMinecartEntity extends AbstractMinecartEntity { } @Override - public void readCustomDataFromNbt(NbtCompound nbt) { - super.readCustomDataFromNbt(nbt); + public void readAdditionalSaveData(CompoundTag nbt) { + super.readAdditionalSaveData(nbt); this.note = nbt.getInt("Note"); this.isPowered = nbt.getBoolean("Powered"); } @Override - public void writeCustomDataToNbt(NbtCompound nbt) { - super.writeCustomDataToNbt(nbt); + public void addAdditionalSaveData(CompoundTag nbt) { + super.addAdditionalSaveData(nbt); nbt.putInt("Note", this.note); nbt.putBoolean("Powered", this.isPowered); } @Override - public Item getItem() { + public Item getDropItem() { return MinecartItems.NOTE_BLOCK_MINECART.orThrow(); } @Override - public BlockState getDefaultContainedBlock() { - return Blocks.NOTE_BLOCK.getDefaultState(); + public BlockState getDefaultDisplayBlockState() { + return Blocks.NOTE_BLOCK.defaultBlockState(); } @Override - public ItemStack getPickBlockStack() { + public ItemStack getPickResult() { return new ItemStack(MinecartItems.NOTE_BLOCK_MINECART.orThrow()); } public void cycleNote() { int nextNote = this.note + 1; - if (nextNote < Properties.NOTE.stream().toList().size()) { + if (nextNote < BlockStateProperties.NOTE.getAllValues().toList().size()) { this.note = nextNote; } else { this.note = 0; } } - public void playNote(World world, Vec3d pos) { + public void playNote(Level world, Vec3 pos) { BlockPos blockPos = new BlockPos( - MathHelper.floor(pos.getX()), MathHelper.floor(pos.getY()), MathHelper.floor(pos.getZ())); + Mth.floor(pos.x()), Mth.floor(pos.y()), Mth.floor(pos.z())); // BlockState state = world.getBlockState(blockPos); - Instrument instrument = world.getBlockState(blockPos.up()).getInstrument(); - if (!instrument.isNotBaseBlock()) { - Instrument instrument2 = world.getBlockState(blockPos.down()).getInstrument(); - instrument = instrument2.isNotBaseBlock() ? Instrument.HARP : instrument2; + NoteBlockInstrument instrument = world.getBlockState(blockPos.above()).instrument(); + if (!instrument.worksAboveNoteBlock()) { + NoteBlockInstrument instrument2 = world.getBlockState(blockPos.below()).instrument(); + instrument = instrument2.worksAboveNoteBlock() ? NoteBlockInstrument.HARP : instrument2; } int i = this.note; float f = (float) Math.pow(2.0, (i - 12) / 12.0); - this.world.playSound( + this.level.playSound( null, new BlockPos( - MathHelper.floor(pos.getX()), - MathHelper.floor(pos.getY()), - MathHelper.floor(pos.getZ())), - instrument.getSound().value(), - SoundCategory.RECORDS, + Mth.floor(pos.x()), + Mth.floor(pos.y()), + Mth.floor(pos.z())), + instrument.getSoundEvent().value(), + SoundSource.RECORDS, 3.0F, f); - this.world.addParticle( - ParticleTypes.NOTE, pos.getX(), pos.getY() + 1.2, pos.getZ(), i / 24.0, 0.0, 0.0); + this.level.addParticle( + ParticleTypes.NOTE, pos.x(), pos.y() + 1.2, pos.z(), i / 24.0, 0.0, 0.0); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/AndromedaMinecartItem.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/AndromedaMinecartItem.java index 61e0d22f..c1362653 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/AndromedaMinecartItem.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/AndromedaMinecartItem.java @@ -2,30 +2,30 @@ package me.melontini.andromeda.modules.entities.minecarts.items; import me.melontini.andromeda.common.util.Keeper; import me.melontini.dark_matter.api.base.util.MakeSure; -import net.minecraft.block.AbstractRailBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.ItemDispenserBehavior; -import net.minecraft.block.enums.RailShape; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.util.ActionResult; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.WorldEvents; -import net.minecraft.world.event.GameEvent; - -public class AndromedaMinecartItem extends Item { +import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; +import net.minecraft.world.level.block.state.properties.RailShape; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionResult; +import net.minecraft.core.BlockSource; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.LevelEvent; +import net.minecraft.world.level.gameevent.GameEvent; + +public class AndromedaMinecartItem extends Item { private final Keeper> keeper; - public AndromedaMinecartItem(Keeper> keeper, Settings settings) { + public AndromedaMinecartItem(Keeper> keeper, Properties settings) { super(settings); this.keeper = keeper; DispenserBlock.registerBehavior(this, new MinecartDispenseBehavior()); @@ -34,17 +34,17 @@ public class AndromedaMinecartItem extends Ite protected void onCreate(ItemStack stack, T entity) {} @Override - public ActionResult useOnBlock(ItemUsageContext context) { - World world = context.getWorld(); - BlockPos blockPos = context.getBlockPos(); + public InteractionResult useOn(UseOnContext context) { + Level world = context.getLevel(); + BlockPos blockPos = context.getClickedPos(); BlockState blockState = world.getBlockState(blockPos); - if (!blockState.isIn(BlockTags.RAILS)) { - return ActionResult.FAIL; + if (!blockState.is(BlockTags.RAILS)) { + return InteractionResult.FAIL; } else { - ItemStack itemStack = context.getStack(); - if (!world.isClient) { - RailShape railShape = blockState.getBlock() instanceof AbstractRailBlock - ? blockState.get(((AbstractRailBlock) blockState.getBlock()).getShapeProperty()) + ItemStack itemStack = context.getItemInHand(); + if (!world.isClientSide) { + RailShape railShape = blockState.getBlock() instanceof BaseRailBlock + ? blockState.getValue(((BaseRailBlock) blockState.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH; double d = 0.0; if (railShape.isAscending()) { @@ -52,75 +52,75 @@ public class AndromedaMinecartItem extends Ite } T minecart = MakeSure.notNull(this.keeper.orThrow().create(world)); - minecart.setPosition( + minecart.setPos( (double) blockPos.getX() + 0.5, (double) blockPos.getY() + 0.0625 + d, (double) blockPos.getZ() + 0.5); onCreate(itemStack, minecart); - if (itemStack.hasCustomName()) { - minecart.setCustomName(itemStack.getName()); + if (itemStack.hasCustomHoverName()) { + minecart.setCustomName(itemStack.getHoverName()); } - world.spawnEntity(minecart); - world.emitGameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockPos); + world.addFreshEntity(minecart); + world.gameEvent(context.getPlayer(), GameEvent.ENTITY_PLACE, blockPos); } - itemStack.decrement(1); - return ActionResult.success(world.isClient); + itemStack.shrink(1); + return InteractionResult.sidedSuccess(world.isClientSide); } } - private class MinecartDispenseBehavior extends ItemDispenserBehavior { - private final ItemDispenserBehavior defaultBehavior = new ItemDispenserBehavior(); + private class MinecartDispenseBehavior extends DefaultDispenseItemBehavior { + private final DefaultDispenseItemBehavior defaultBehavior = new DefaultDispenseItemBehavior(); @Override - public ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { - Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); - World world = pointer.getWorld(); + public ItemStack execute(BlockSource pointer, ItemStack stack) { + Direction direction = pointer.getBlockState().getValue(DispenserBlock.FACING); + Level world = pointer.getLevel(); - BlockPos blockPos = pointer.getPos().offset(direction); + BlockPos blockPos = pointer.getPos().relative(direction); BlockState blockState = world.getBlockState(blockPos); - RailShape railShape = blockState.getBlock() instanceof AbstractRailBlock - ? blockState.get(((AbstractRailBlock) blockState.getBlock()).getShapeProperty()) + RailShape railShape = blockState.getBlock() instanceof BaseRailBlock + ? blockState.getValue(((BaseRailBlock) blockState.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH; double g; - if (blockState.isIn(BlockTags.RAILS)) { + if (blockState.is(BlockTags.RAILS)) { g = railShape.isAscending() ? 0.6 : 0.1; } else { - if (!blockState.isAir() || !world.getBlockState(blockPos.down()).isIn(BlockTags.RAILS)) { + if (!blockState.isAir() || !world.getBlockState(blockPos.below()).is(BlockTags.RAILS)) { return this.defaultBehavior.dispense(pointer, stack); } - BlockState blockState2 = world.getBlockState(blockPos.down()); - RailShape railShape2 = blockState2.getBlock() instanceof AbstractRailBlock - ? blockState2.get(((AbstractRailBlock) blockState2.getBlock()).getShapeProperty()) + BlockState blockState2 = world.getBlockState(blockPos.below()); + RailShape railShape2 = blockState2.getBlock() instanceof BaseRailBlock + ? blockState2.getValue(((BaseRailBlock) blockState2.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH; g = direction != Direction.DOWN && railShape2.isAscending() ? -0.4 : -0.9; } - double d = pointer.getX() + direction.getOffsetX() * 1.125; - double e = Math.floor(pointer.getY()) + direction.getOffsetY(); - double f = pointer.getZ() + direction.getOffsetZ() * 1.125; + double d = pointer.x() + direction.getStepX() * 1.125; + double e = Math.floor(pointer.y()) + direction.getStepY(); + double f = pointer.z() + direction.getStepZ() * 1.125; T minecart = MakeSure.notNull(AndromedaMinecartItem.this.keeper.orThrow().create(world)); - minecart.setPosition(d, e + g, f); + minecart.setPos(d, e + g, f); onCreate(stack, minecart); - if (stack.hasCustomName()) { - minecart.setCustomName(stack.getName()); + if (stack.hasCustomHoverName()) { + minecart.setCustomName(stack.getHoverName()); } - world.spawnEntity(minecart); - stack.decrement(1); + world.addFreshEntity(minecart); + stack.shrink(1); return stack; } @Override - protected void playSound(BlockPointer pointer) { - pointer.getWorld().syncWorldEvent(WorldEvents.DISPENSER_DISPENSES, pointer.getPos(), 0); + protected void playSound(BlockSource pointer) { + pointer.getLevel().levelEvent(LevelEvent.SOUND_DISPENSER_DISPENSE, pointer.getPos(), 0); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/JukeboxMinecartItem.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/JukeboxMinecartItem.java index 8a91be26..f4c5d9db 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/JukeboxMinecartItem.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/JukeboxMinecartItem.java @@ -2,21 +2,21 @@ package me.melontini.andromeda.modules.entities.minecarts.items; import me.melontini.andromeda.modules.entities.minecarts.MinecartEntities; import me.melontini.andromeda.modules.entities.minecarts.entities.JukeboxMinecartEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; public class JukeboxMinecartItem extends AndromedaMinecartItem { - public JukeboxMinecartItem(Settings settings) { + public JukeboxMinecartItem(Properties settings) { super(MinecartEntities.JUKEBOX_MINECART_ENTITY, settings); } @Override protected void onCreate(ItemStack stack, JukeboxMinecartEntity entity) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); if (nbt != null) if (nbt.getCompound("Items") != null) { - entity.record = ItemStack.fromNbt(nbt.getCompound("Items")); + entity.record = ItemStack.of(nbt.getCompound("Items")); if (!entity.record.isEmpty()) entity.startPlaying(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/NoteBlockMinecartItem.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/NoteBlockMinecartItem.java index 6e897b51..b3afa2d9 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/NoteBlockMinecartItem.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/NoteBlockMinecartItem.java @@ -2,18 +2,18 @@ package me.melontini.andromeda.modules.entities.minecarts.items; import me.melontini.andromeda.modules.entities.minecarts.MinecartEntities; import me.melontini.andromeda.modules.entities.minecarts.entities.NoteBlockMinecartEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; public class NoteBlockMinecartItem extends AndromedaMinecartItem { - public NoteBlockMinecartItem(Settings settings) { + public NoteBlockMinecartItem(Properties settings) { super(MinecartEntities.NOTEBLOCK_MINECART_ENTITY, settings); } @Override protected void onCreate(ItemStack stack, NoteBlockMinecartEntity entity) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); if (nbt != null) if (nbt.getInt("Note") >= 0) { entity.note = nbt.getInt("Note"); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/SpawnerMinecartItem.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/SpawnerMinecartItem.java index c0445f72..ad3b2391 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/SpawnerMinecartItem.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/items/SpawnerMinecartItem.java @@ -3,51 +3,51 @@ package me.melontini.andromeda.modules.entities.minecarts.items; import java.util.List; import me.melontini.andromeda.common.util.Keeper; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.vehicle.SpawnerMinecartEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.vehicle.MinecartSpawner; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; -public class SpawnerMinecartItem extends AndromedaMinecartItem { +public class SpawnerMinecartItem extends AndromedaMinecartItem { - public SpawnerMinecartItem(Settings settings) { + public SpawnerMinecartItem(Properties settings) { super(Keeper.now(EntityType.SPAWNER_MINECART), settings); } @Override - public void appendTooltip( - ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { - NbtCompound nbt = stack.getNbt(); + public void appendHoverText( + ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { + CompoundTag nbt = stack.getTag(); if (nbt != null) if (nbt.getString("Entity") != null) { tooltip.add(TextUtil.translatable( "tooltip.andromeda.spawner_minecart.filled", - Registries.ENTITY_TYPE - .get(new Identifier(nbt.getString("Entity"))) - .getName()) - .formatted(Formatting.GRAY)); + BuiltInRegistries.ENTITY_TYPE + .get(new ResourceLocation(nbt.getString("Entity"))) + .getDescription()) + .withStyle(ChatFormatting.GRAY)); } } @Override - protected void onCreate(ItemStack stack, SpawnerMinecartEntity entity) { - NbtCompound nbt = stack.getNbt(); + protected void onCreate(ItemStack stack, MinecartSpawner entity) { + CompoundTag nbt = stack.getTag(); if (nbt != null) if (nbt.getString("Entity") != null) { entity - .getLogic() + .getSpawner() .setEntityId( - Registries.ENTITY_TYPE.get(new Identifier(nbt.getString("Entity"))), - entity.world, - entity.world.random, - entity.getBlockPos()); + BuiltInRegistries.ENTITY_TYPE.get(new ResourceLocation(nbt.getString("Entity"))), + entity.level, + entity.level.random, + entity.blockPosition()); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/flee/MobEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/flee/MobEntityMixin.java index 0f76bc0e..6aa2c902 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/flee/MobEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/flee/MobEntityMixin.java @@ -4,41 +4,41 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.slimes.Slimes; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -@Mixin(MobEntity.class) +@Mixin(Mob.class) abstract class MobEntityMixin extends Entity { @Shadow @Nullable private LivingEntity target; - public MobEntityMixin(EntityType type, World world) { + public MobEntityMixin(EntityType type, Level world) { super(type, world); } @ModifyExpressionValue( at = @At(value = "CONSTANT", args = "floatValue=90"), - method = "lookAtEntity") + method = "lookAt") private float andromeda$rotateSlime( - float original, Entity target, float maxYawChange, float maxPitchChange) { - if ((MobEntity) (Object) this instanceof SlimeEntity slime - && !(target instanceof SlimeEntity)) { - var config = world.am$get(Slimes.CONFIG); + float original, Entity target, float maxYawChange, float maxPitchChange) { + if ((Mob) (Object) this instanceof Slime slime + && !(target instanceof Slime)) { + var config = level.am$get(Slimes.CONFIG); - if (!slime.isSmall()) return original; + if (!slime.isTiny()) return original; if (!config.available.asBoolean(ConstantLootContextAccessor.get(this))) return original; if (config.flee.asBoolean(LootContextBuilder.entity( - world, builder -> builder.origin(target).thisEntity(target).genericSource()))) return 270; + level, builder -> builder.origin(target).thisEntity(target).genericSource()))) return 270; } return original; } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java index 01ae2137..bf26d0a0 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java @@ -5,13 +5,13 @@ import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.slimes.Slimes; import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.data.nbt.NbtUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ai.goal.ActiveTargetGoal; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -19,8 +19,8 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(SlimeEntity.class) -abstract class SlimeEntityMixin extends MobEntity { +@Mixin(Slime.class) +abstract class SlimeEntityMixin extends Mob { @Shadow public abstract int getSize(); @@ -30,20 +30,20 @@ abstract class SlimeEntityMixin extends MobEntity { @Unique private int andromeda$mergeCD = MathUtil.nextInt(700, 2000); - protected SlimeEntityMixin(EntityType entityType, World world) { + protected SlimeEntityMixin(EntityType entityType, Level world) { super(entityType, world); } - @Inject(at = @At("TAIL"), method = "initGoals") + @Inject(at = @At("TAIL"), method = "registerGoals") private void andromeda$newGoal(CallbackInfo ci) { - var config = this.world.am$get(Slimes.CONFIG); + var config = this.level.am$get(Slimes.CONFIG); var supplier = ConstantLootContextAccessor.get(this); - this.targetSelector.add( + this.targetSelector.addGoal( 2, - new ActiveTargetGoal<>( - (SlimeEntity) (Object) this, SlimeEntity.class, 5, true, false, livingEntity -> { + new NearestAttackableTargetGoal<>( + (Slime) (Object) this, Slime.class, 5, true, false, livingEntity -> { if (!config.available.asBoolean(supplier)) return false; - var supplier1 = LootContextBuilder.entity(world, builder -> builder + var supplier1 = LootContextBuilder.entity(level, builder -> builder .origin(livingEntity) .thisEntity(livingEntity) .killer(this) @@ -53,21 +53,21 @@ abstract class SlimeEntityMixin extends MobEntity { float d = livingEntity.distanceTo(this); return d <= 6 && (getSize() <= config.maxMerge.asInt(supplier1) - && ((SlimeEntity) livingEntity).getSize() < getSize()); + && ((Slime) livingEntity).getSize() < getSize()); })); } - @Inject(at = @At("TAIL"), method = "pushAwayFrom") + @Inject(at = @At("TAIL"), method = "push") private void andromeda$push(Entity entity, CallbackInfo ci) { - var config = this.world.am$get(Slimes.CONFIG); + var config = this.level.am$get(Slimes.CONFIG); var supplier = ConstantLootContextAccessor.get(this); if (!config.available.asBoolean(supplier)) return; if (!config.merge.asBoolean(LootContextBuilder.entity( - world, + level, builder -> builder.origin(entity).thisEntity(entity).genericSource().killer(this)))) return; - if (getTarget() instanceof SlimeEntity slime + if (getTarget() instanceof Slime slime && slime == entity && this.andromeda$mergeCD == 0) { int size = (int) Math.round(slime.getSize() * 0.75 + getSize() * 0.75); @@ -83,13 +83,13 @@ abstract class SlimeEntityMixin extends MobEntity { if (this.andromeda$mergeCD > 0) --this.andromeda$mergeCD; } - @Inject(at = @At("TAIL"), method = "writeCustomDataToNbt") - private void andromeda$writeNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "addAdditionalSaveData") + private void andromeda$writeNbt(CompoundTag nbt, CallbackInfo ci) { nbt.putInt("AM-MergeCD", Math.max(this.andromeda$mergeCD, 0)); } - @Inject(at = @At("TAIL"), method = "readCustomDataFromNbt") - private void andromeda$readNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "readAdditionalSaveData") + private void andromeda$readNbt(CompoundTag nbt, CallbackInfo ci) { this.andromeda$mergeCD = NbtUtil.getInt(nbt, "AM-MergeCD", MathUtil.nextInt(700, 2000)); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/slowness/SlimeEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/slowness/SlimeEntityMixin.java index 4dc96edf..36c5e424 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/slowness/SlimeEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/slimes/mixin/slowness/SlimeEntityMixin.java @@ -3,31 +3,31 @@ package me.melontini.andromeda.modules.entities.slimes.mixin.slowness; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.slimes.Slimes; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.entity.mob.SlimeEntity; -import net.minecraft.particle.ParticleEffect; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.monster.Slime; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; 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; -@Mixin(SlimeEntity.class) -abstract class SlimeEntityMixin extends MobEntity { +@Mixin(Slime.class) +abstract class SlimeEntityMixin extends Mob { @Shadow public abstract int getSize(); @Shadow - protected abstract ParticleEffect getParticles(); + protected abstract ParticleOptions getParticleType(); - protected SlimeEntityMixin(EntityType entityType, World world) { + protected SlimeEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -35,22 +35,22 @@ abstract class SlimeEntityMixin extends MobEntity { at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/mob/SlimeEntity;getSize()I", + target = "Lnet/minecraft/world/entity/monster/Slime;getSize()I", shift = At.Shift.BEFORE), - method = "damage") + method = "dealDamage") private void andromeda$onPlayerCollision(LivingEntity target, CallbackInfo ci) { - var config = this.world.am$get(Slimes.CONFIG); + var config = this.level.am$get(Slimes.CONFIG); if (!config.available.asBoolean(ConstantLootContextAccessor.get(this))) return; if (!config.slowness.asBoolean(LootContextBuilder.entity( - world, + level, builder -> builder.origin(target).thisEntity(target).genericSource().killer(this)))) return; - StatusEffectInstance effectInstance = new StatusEffectInstance( - StatusEffects.SLOWNESS, 20 * this.getSize(), 1, true, false, false); - target.addStatusEffect(effectInstance); - if (world.getTime() % 3 == 0) - ((ServerWorld) world) - .spawnParticles( - getParticles(), target.getX(), target.getY(), target.getZ(), 5, 0.2, 0.7, 0.2, 0); + MobEffectInstance effectInstance = new MobEffectInstance( + MobEffects.MOVEMENT_SLOWDOWN, 20 * this.getSize(), 1, true, false, false); + target.addEffect(effectInstance); + if (level.getGameTime() % 3 == 0) + ((ServerLevel) level) + .sendParticles( + getParticleType(), target.getX(), target.getY(), target.getZ(), 5, 0.2, 0.7, 0.2, 0); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/cooldown/SnowballItemMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/cooldown/SnowballItemMixin.java index 3ed43f9a..bf5a8724 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/cooldown/SnowballItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/cooldown/SnowballItemMixin.java @@ -4,12 +4,12 @@ import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.snowball_tweaks.Snowballs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.SnowballItem; -import net.minecraft.util.Hand; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.SnowballItem; +import net.minecraft.world.InteractionHand; +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.ModifyArg; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(SnowballItem.class) abstract class SnowballItemMixin extends Item { - public SnowballItemMixin(Settings settings) { + public SnowballItemMixin(Properties settings) { super(settings); } @@ -25,14 +25,14 @@ abstract class SnowballItemMixin extends Item { at = @At( value = "INVOKE", - target = "Lnet/minecraft/world/World;spawnEntity(Lnet/minecraft/entity/Entity;)Z"), + target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z"), method = "use") private Entity andromeda$useCooldown( - Entity par1, - @Local(argsOnly = true) World world, - @Local(argsOnly = true) PlayerEntity user, - @Local(argsOnly = true) Hand hand) { - if (world.isClient()) return null; + Entity par1, + @Local(argsOnly = true) Level world, + @Local(argsOnly = true) Player user, + @Local(argsOnly = true) InteractionHand hand) { + if (world.isClientSide()) return null; var config = world.am$get(Snowballs.CONFIG); if (!config.available.asBoolean(ConstantLootContextAccessor.get(par1))) return par1; @@ -41,7 +41,7 @@ abstract class SnowballItemMixin extends Item { world, builder -> builder.origin(user).tool(user, hand).thisEntity(user)); if (!config.enableCooldown.asBoolean(supplier)) return par1; - user.getItemCooldownManager().set(this, config.cooldown.asInt(supplier)); + user.getCooldowns().addCooldown(this, config.cooldown.asInt(supplier)); return par1; } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/freeze/SnowballEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/freeze/SnowballEntityMixin.java index 28ef2cb6..1847d406 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/freeze/SnowballEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/freeze/SnowballEntityMixin.java @@ -3,32 +3,32 @@ package me.melontini.andromeda.modules.entities.snowball_tweaks.mixin.freeze; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.snowball_tweaks.Snowballs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.projectile.thrown.SnowballEntity; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.projectile.Snowball; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.phys.EntityHitResult; +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.CallbackInfo; -@Mixin(SnowballEntity.class) -abstract class SnowballEntityMixin extends ThrownItemEntity { +@Mixin(Snowball.class) +abstract class SnowballEntityMixin extends ThrowableItemProjectile { - public SnowballEntityMixin(EntityType entityType, World world) { + public SnowballEntityMixin(EntityType entityType, Level world) { super(entityType, world); } - @Inject(at = @At("TAIL"), method = "onEntityHit") + @Inject(at = @At("TAIL"), method = "onHitEntity") private void andromeda$applyFreezing(EntityHitResult result, CallbackInfo ci) { - if (result.getEntity().world.isClient()) return; + if (result.getEntity().level.isClientSide()) return; - var config = result.getEntity().world.am$get(Snowballs.CONFIG); + var config = result.getEntity().level.am$get(Snowballs.CONFIG); if (!config.available.asBoolean(ConstantLootContextAccessor.get(this))) return; - if (!config.freeze.asBoolean(LootContextBuilder.entity(world, builder -> builder + if (!config.freeze.asBoolean(LootContextBuilder.entity(level, builder -> builder .origin(result.getEntity()) .thisEntity(result.getEntity()) .genericSource() @@ -36,7 +36,7 @@ abstract class SnowballEntityMixin extends ThrownItemEntity { Entity entity = result.getEntity(); if (entity instanceof LivingEntity livingEntity) { - livingEntity.setFrozenTicks(livingEntity.getMinFreezeDamageTicks() + 40); + livingEntity.setTicksFrozen(livingEntity.getTicksRequiredToFreeze() + 40); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/layers/SnowballEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/layers/SnowballEntityMixin.java index 1ca0f628..c2780300 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/layers/SnowballEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/layers/SnowballEntityMixin.java @@ -3,94 +3,95 @@ package me.melontini.andromeda.modules.entities.snowball_tweaks.mixin.layers; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.modules.entities.snowball_tweaks.Snowballs; import me.melontini.dark_matter.api.mixin.annotations.ConstructDummy; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.SnowBlock; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.projectile.thrown.SnowballEntity; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.fluid.FluidState; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.Snowball; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; 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(SnowballEntity.class) -abstract class SnowballEntityMixin extends ThrownItemEntity { +@Mixin(Snowball.class) +abstract class SnowballEntityMixin extends ThrowableItemProjectile { - public SnowballEntityMixin(EntityType entityType, World world) { + public SnowballEntityMixin(EntityType entityType, Level world) { super(entityType, world); } + // TODO(Ravel): target method tick with the signature not found @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"}) @ConstructDummy(owner = "net.minecraft.class_1297", name = "method_5773", desc = "()V") @Inject(at = @At("TAIL"), method = "tick()V") public void andromeda$onBlockHit(CallbackInfo ci) { - if (world.isClient()) return; + if (level.isClientSide()) return; - var config = world.am$get(Snowballs.CONFIG); + var config = level.am$get(Snowballs.CONFIG); var supplier = ConstantLootContextAccessor.get(this); if (!config.available.asBoolean(supplier) || !config.layers.asBoolean(supplier)) return; - Vec3d pos = this.getPos(); - Vec3d vec3d = pos.add(this.getVelocity()); + Vec3 pos = this.position(); + Vec3 vec3d = pos.add(this.getDeltaMovement()); // We need to recast, since vanilla ignores fluids. - BlockHitResult hitResult = this.world.raycast(new RaycastContext( - pos, vec3d, RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.WATER, this)); + BlockHitResult hitResult = this.level.clip(new ClipContext( + pos, vec3d, ClipContext.Block.COLLIDER, ClipContext.Fluid.WATER, this)); if (hitResult.getType() == HitResult.Type.BLOCK) { BlockPos blockPos = hitResult.getBlockPos(); - FluidState fluidState = this.world.getFluidState(blockPos); + FluidState fluidState = this.level.getFluidState(blockPos); if (fluidState.isEmpty()) { - BlockState blockState = this.world.getBlockState(blockPos); + BlockState blockState = this.level.getBlockState(blockPos); if (!blockState.isAir()) { - if (blockState.isOf(Blocks.SNOW)) { - int i = blockState.get(SnowBlock.LAYERS); + if (blockState.is(Blocks.SNOW)) { + int i = blockState.getValue(SnowLayerBlock.LAYERS); BlockState placedState = i < 7 - ? blockState.with(SnowBlock.LAYERS, Math.min(8, i + 1)) - : Blocks.SNOW_BLOCK.getDefaultState(); + ? blockState.setValue(SnowLayerBlock.LAYERS, Math.min(8, i + 1)) + : Blocks.SNOW_BLOCK.defaultBlockState(); this.andromeda$setStateAndDiscard(blockPos, placedState); return; } - BlockPos newPos = blockPos.offset(hitResult.getSide()); - BlockState newBlockState = this.world.getBlockState(newPos); - if (newBlockState.isOf(Blocks.SNOW)) { - int i = newBlockState.get(SnowBlock.LAYERS); + BlockPos newPos = blockPos.relative(hitResult.getDirection()); + BlockState newBlockState = this.level.getBlockState(newPos); + if (newBlockState.is(Blocks.SNOW)) { + int i = newBlockState.getValue(SnowLayerBlock.LAYERS); BlockState placedState = i < 7 - ? newBlockState.with(SnowBlock.LAYERS, Math.min(8, i + 1)) - : Blocks.SNOW_BLOCK.getDefaultState(); + ? newBlockState.setValue(SnowLayerBlock.LAYERS, Math.min(8, i + 1)) + : Blocks.SNOW_BLOCK.defaultBlockState(); this.andromeda$setStateAndDiscard(newPos, placedState); return; } if (newBlockState.isAir()) { - BlockState below = this.world.getBlockState(newPos.down()); - if (!below.isAir() && Blocks.SNOW.getDefaultState().canPlaceAt(this.world, newPos)) { + BlockState below = this.level.getBlockState(newPos.below()); + if (!below.isAir() && Blocks.SNOW.defaultBlockState().canSurvive(this.level, newPos)) { this.andromeda$setStateAndDiscard( - newPos, Blocks.SNOW.getDefaultState().with(SnowBlock.LAYERS, 1)); + newPos, Blocks.SNOW.defaultBlockState().setValue(SnowLayerBlock.LAYERS, 1)); return; } } - this.world.sendEntityStatus(this, (byte) 3); + this.level.broadcastEntityEvent(this, (byte) 3); this.discard(); } } else { - this.andromeda$setStateAndDiscard(blockPos, Blocks.ICE.getDefaultState()); + this.andromeda$setStateAndDiscard(blockPos, Blocks.ICE.defaultBlockState()); } } } @Unique private void andromeda$setStateAndDiscard(BlockPos blockPos, BlockState state) { - this.world.setBlockState(blockPos, state, Block.NOTIFY_ALL); - this.world.sendEntityStatus(this, (byte) 3); + this.level.setBlock(blockPos, state, Block.UPDATE_ALL); + this.level.broadcastEntityEvent(this, (byte) 3); this.discard(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/melt/SnowballEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/melt/SnowballEntityMixin.java index 232afc94..1f6b407b 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/melt/SnowballEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/melt/SnowballEntityMixin.java @@ -3,36 +3,37 @@ package me.melontini.andromeda.modules.entities.snowball_tweaks.mixin.melt; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.modules.entities.snowball_tweaks.Snowballs; import me.melontini.dark_matter.api.mixin.annotations.ConstructDummy; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.projectile.thrown.SnowballEntity; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.Snowball; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +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.CallbackInfo; -@Mixin(SnowballEntity.class) -abstract class SnowballEntityMixin extends ThrownItemEntity { +@Mixin(Snowball.class) +abstract class SnowballEntityMixin extends ThrowableItemProjectile { - public SnowballEntityMixin(EntityType entityType, World world) { + public SnowballEntityMixin(EntityType entityType, Level world) { super(entityType, world); } + // TODO(Ravel): target method tick with the signature not found @SuppressWarnings({"MixinAnnotationTarget", "UnresolvedMixinReference"}) @ConstructDummy(owner = "net.minecraft.class_1297", name = "method_5773", desc = "()V") @Inject(at = @At("HEAD"), method = "tick()V") public void andromeda$melt(CallbackInfo ci) { - if (world.isClient() || !this.isOnFire()) return; + if (level.isClientSide() || !this.isOnFire()) return; - var config = world.am$get(Snowballs.CONFIG); + var config = level.am$get(Snowballs.CONFIG); var supplier = ConstantLootContextAccessor.get(this); if (!config.available.asBoolean(supplier) || !config.melt.asBoolean(supplier)) return; - ((ServerWorld) world) - .spawnParticles( + ((ServerLevel) level) + .sendParticles( ParticleTypes.FALLING_WATER, this.getX(), this.getY(), diff --git a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/put_out_fire/SnowballEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/put_out_fire/SnowballEntityMixin.java index 4a9f47e9..83750308 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/put_out_fire/SnowballEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/mixin/put_out_fire/SnowballEntityMixin.java @@ -4,40 +4,40 @@ import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.entities.snowball_tweaks.Snowballs; import me.melontini.dark_matter.api.base.util.MathUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.projectile.thrown.SnowballEntity; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.Snowball; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.phys.EntityHitResult; +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.CallbackInfo; -@Mixin(SnowballEntity.class) -abstract class SnowballEntityMixin extends ThrownItemEntity { +@Mixin(Snowball.class) +abstract class SnowballEntityMixin extends ThrowableItemProjectile { - public SnowballEntityMixin(EntityType entityType, World world) { + public SnowballEntityMixin(EntityType entityType, Level world) { super(entityType, world); } - @Inject(at = @At("TAIL"), method = "onEntityHit") + @Inject(at = @At("TAIL"), method = "onHitEntity") private void andromeda$extinguish(EntityHitResult result, CallbackInfo ci) { - if (result.getEntity().world.isClient()) return; + if (result.getEntity().level.isClientSide()) return; - var config = result.getEntity().world.am$get(Snowballs.CONFIG); + var config = result.getEntity().level.am$get(Snowballs.CONFIG); if (!config.available.asBoolean(ConstantLootContextAccessor.get(this))) return; Entity entity = result.getEntity(); if (!config.extinguish.asBoolean(LootContextBuilder.entity( - world, + level, builder -> builder.origin(entity).thisEntity(entity).genericSource().killer(this)))) return; if (entity.isOnFire()) { - entity.extinguish(); + entity.clearFire(); entity.playSound( - SoundEvents.ENTITY_GENERIC_EXTINGUISH_FIRE, + SoundEvents.GENERIC_EXTINGUISH_FIRE, 0.7F, 1.6F + (MathUtil.threadRandom().nextFloat() - MathUtil.threadRandom().nextFloat()) * 0.4F); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/vehicle_unentrapment/Main.java b/src/main/java/me/melontini/andromeda/modules/entities/vehicle_unentrapment/Main.java index 53f79a99..3647f2dc 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/vehicle_unentrapment/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/vehicle_unentrapment/Main.java @@ -5,37 +5,37 @@ import static me.melontini.andromeda.common.Andromeda.id; import java.util.Objects; import me.melontini.andromeda.common.util.LootContextBuilder; import net.fabricmc.fabric.api.entity.event.v1.ServerLivingEntityEvents; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.core.registries.Registries; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.Level; public final class Main { public static final TagKey> ESCAPE_VEHICLES_ON_HIT = - TagKey.of(RegistryKeys.ENTITY_TYPE, id("escape_vehicles_on_hit")); + TagKey.create(Registries.ENTITY_TYPE, id("escape_vehicles_on_hit")); public static final TagKey> ESCAPABLE_VEHICLES = - TagKey.of(RegistryKeys.ENTITY_TYPE, id("escapable_vehicles")); + TagKey.create(Registries.ENTITY_TYPE, id("escapable_vehicles")); static void init() { ServerLivingEntityEvents.ALLOW_DAMAGE.register((entity, source, amount) -> { - World world = entity.getWorld(); + Level world = entity.level(); if (world .am$get(VehicleUnentrapment.CONFIG) .available .asBoolean(LootContextBuilder.entity(world, builder -> builder - .origin(Objects.requireNonNullElse(source.getPosition(), entity.getPos())) + .origin(Objects.requireNonNullElse(source.getSourcePosition(), entity.position())) .thisEntity(entity) .sourceOrGeneric(source) - .killer(source.getAttacker()) - .directKiller(source.getSource())))) { - if (source.getAttacker() == null || entity instanceof PlayerEntity) return true; - if (!entity.getType().isIn(ESCAPE_VEHICLES_ON_HIT)) return true; + .killer(source.getEntity()) + .directKiller(source.getDirectEntity())))) { + if (source.getEntity() == null || entity instanceof Player) return true; + if (!entity.getType().is(ESCAPE_VEHICLES_ON_HIT)) return true; Entity vehicle = entity.getVehicle(); - if (vehicle == null || !vehicle.getType().isIn(ESCAPABLE_VEHICLES)) return true; + if (vehicle == null || !vehicle.getType().is(ESCAPABLE_VEHICLES)) return true; entity.stopRiding(); } return true; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagerTemptGoal.java b/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagerTemptGoal.java index 25af9ebd..ce3a4e89 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagerTemptGoal.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagerTemptGoal.java @@ -3,44 +3,44 @@ package me.melontini.andromeda.modules.entities.villagers_follow_emeralds; import static me.melontini.andromeda.common.Andromeda.id; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; -import net.minecraft.entity.ai.brain.Activity; -import net.minecraft.entity.ai.goal.TemptGoal; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.item.Item; -import net.minecraft.recipe.Ingredient; -import net.minecraft.registry.Registries; -import net.minecraft.registry.tag.TagKey; +import net.minecraft.world.entity.schedule.Activity; +import net.minecraft.world.entity.ai.goal.TemptGoal; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.TagKey; public class VillagerTemptGoal extends TemptGoal { public static final TagKey TEMPTING = - TagKey.of(Registries.ITEM.getKey(), id("tempting_for_villagers")); + TagKey.create(BuiltInRegistries.ITEM.key(), id("tempting_for_villagers")); public VillagerTemptGoal( - VillagerEntity entity, double speed, Ingredient food, boolean canBeScared) { + Villager entity, double speed, Ingredient food, boolean canBeScared) { super(entity, speed, food, canBeScared); } @Override - public boolean canStart() { - if (this.mob.world.isClient()) return false; + public boolean canUse() { + if (this.mob.level.isClientSide()) return false; if (!this.mob - .world + .level .am$get(VillagersFollowEmeralds.CONFIG) .available .asBoolean(ConstantLootContextAccessor.get(mob))) return false; - if (this.cooldown > 0) { - --this.cooldown; + if (this.calmDown > 0) { + --this.calmDown; return false; } else { - if (mob.getBrain().hasActivity(Activity.PANIC) - || mob.getBrain().hasActivity(Activity.REST) - || mob.getBrain().hasActivity(Activity.HIDE)) { + if (mob.getBrain().isActive(Activity.PANIC) + || mob.getBrain().isActive(Activity.REST) + || mob.getBrain().isActive(Activity.HIDE)) { return false; } else { - this.closestPlayer = this.mob.getWorld().getClosestPlayer(this.predicate, this.mob); - return closestPlayer != null; + this.player = this.mob.level().getNearestPlayer(this.targetingConditions, this.mob); + return player != null; } } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/mixin/VillagerEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/mixin/VillagerEntityMixin.java index 8840d46c..b3a1e41c 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/mixin/VillagerEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/mixin/VillagerEntityMixin.java @@ -1,21 +1,21 @@ package me.melontini.andromeda.modules.entities.villagers_follow_emeralds.mixin; import me.melontini.andromeda.modules.entities.villagers_follow_emeralds.VillagerTemptGoal; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.MerchantEntity; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.recipe.Ingredient; -import net.minecraft.village.VillagerType; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.entity.npc.VillagerType; +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.CallbackInfo; -@Mixin(VillagerEntity.class) -abstract class VillagerEntityMixin extends MerchantEntity { +@Mixin(Villager.class) +abstract class VillagerEntityMixin extends AbstractVillager { - public VillagerEntityMixin(EntityType entityType, World world) { + public VillagerEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -24,21 +24,21 @@ abstract class VillagerEntityMixin extends MerchantEntity { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/passive/VillagerEntity;setVillagerData(Lnet/minecraft/village/VillagerData;)V", + "Lnet/minecraft/world/entity/npc/Villager;setVillagerData(Lnet/minecraft/world/entity/npc/VillagerData;)V", shift = At.Shift.AFTER), method = - "(Lnet/minecraft/entity/EntityType;Lnet/minecraft/world/World;Lnet/minecraft/village/VillagerType;)V") + "(Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/npc/VillagerType;)V") private void andromeda$init( - EntityType entityType, - World world, - VillagerType type, - CallbackInfo ci) { - this.goalSelector.add( + EntityType entityType, + Level world, + VillagerType type, + CallbackInfo ci) { + this.goalSelector.addGoal( 6, new VillagerTemptGoal( - (VillagerEntity) (Object) this, + (Villager) (Object) this, 0.5, - Ingredient.fromTag(VillagerTemptGoal.TEMPTING), + Ingredient.of(VillagerTemptGoal.TEMPTING), false)); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/mixin/ZombieEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/mixin/ZombieEntityMixin.java index c516ee3e..4726767a 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/mixin/ZombieEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/mixin/ZombieEntityMixin.java @@ -2,24 +2,24 @@ package me.melontini.andromeda.modules.entities.zombie.all_pick_up.mixin; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.modules.entities.zombie.all_pick_up.Pickup; -import net.minecraft.entity.EntityData; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.mob.ZombieEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.world.LocalDifficulty; -import net.minecraft.world.ServerWorldAccess; -import net.minecraft.world.World; +import net.minecraft.world.entity.SpawnGroupData; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.DifficultyInstance; +import net.minecraft.world.level.ServerLevelAccessor; +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; -@Mixin(ZombieEntity.class) -abstract class ZombieEntityMixin extends HostileEntity { +@Mixin(Zombie.class) +abstract class ZombieEntityMixin extends Monster { - protected ZombieEntityMixin(EntityType entityType, World world) { + protected ZombieEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -27,20 +27,20 @@ abstract class ZombieEntityMixin extends HostileEntity { at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/mob/ZombieEntity;setCanPickUpLoot(Z)V", + target = "Lnet/minecraft/world/entity/monster/Zombie;setCanPickUpLoot(Z)V", shift = At.Shift.AFTER), - method = "initialize") + method = "finalizeSpawn") private void andromeda$initialize( - ServerWorldAccess world, - LocalDifficulty difficulty, - SpawnReason spawnReason, - EntityData entityData, - NbtCompound entityNbt, - CallbackInfoReturnable cir) { - if (world.isClient()) return; + ServerLevelAccessor world, + DifficultyInstance difficulty, + MobSpawnType spawnReason, + SpawnGroupData entityData, + CompoundTag entityNbt, + CallbackInfoReturnable cir) { + if (world.isClientSide()) return; if (world - .toServerWorld() + .getLevel() .am$get(Pickup.CONFIG) .available .asBoolean(ConstantLootContextAccessor.get(this))) this.setCanPickUpLoot(true); diff --git a/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/PickupTag.java b/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/PickupTag.java index 668fc779..ed9d2135 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/PickupTag.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/PickupTag.java @@ -2,12 +2,12 @@ package me.melontini.andromeda.modules.entities.zombie.clean_pickup; import static me.melontini.andromeda.common.Andromeda.id; -import net.minecraft.item.Item; -import net.minecraft.registry.Registries; -import net.minecraft.registry.tag.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.TagKey; public class PickupTag { public static final TagKey ZOMBIES_PICKUP = - TagKey.of(Registries.ITEM.getKey(), id("zombies_pick_up")); + TagKey.create(BuiltInRegistries.ITEM.key(), id("zombies_pick_up")); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/mixin/ZombieEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/mixin/ZombieEntityMixin.java index 71bd53ad..4ed1b4a4 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/mixin/ZombieEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/mixin/ZombieEntityMixin.java @@ -9,19 +9,19 @@ import me.melontini.andromeda.common.util.ConstantLootContextAccessor; import me.melontini.andromeda.modules.entities.zombie.clean_pickup.Pickup; import me.melontini.andromeda.modules.entities.zombie.clean_pickup.PickupTag; import me.melontini.andromeda.modules.mechanics.throwable_items.ThrowableItems; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.mob.ZombieEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@Mixin(ZombieEntity.class) -abstract class ZombieEntityMixin extends HostileEntity { +@Mixin(Zombie.class) +abstract class ZombieEntityMixin extends Monster { - protected ZombieEntityMixin(EntityType entityType, World world) { + protected ZombieEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -30,21 +30,21 @@ abstract class ZombieEntityMixin extends HostileEntity { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/mob/HostileEntity;canPickupItem(Lnet/minecraft/item/ItemStack;)Z"), - method = "canPickupItem") + "Lnet/minecraft/world/entity/monster/Monster;canHoldItem(Lnet/minecraft/world/item/ItemStack;)Z"), + method = "canHoldItem") public boolean andromeda$canPickupItem(boolean original, ItemStack stack) { - if (world.am$get(Pickup.CONFIG).available.asBoolean(ConstantLootContextAccessor.get(this))) { + if (level.am$get(Pickup.CONFIG).available.asBoolean(ConstantLootContextAccessor.get(this))) { return original - && (stack.isIn(PickupTag.ZOMBIES_PICKUP) + && (stack.is(PickupTag.ZOMBIES_PICKUP) || ModuleManager.get() .get(ThrowableItems.class) - .map(m -> handleThrowableItems(m, world, stack)) + .map(m -> handleThrowableItems(m, level, stack)) .orElse(false)); } return original; } - @Unique private boolean handleThrowableItems(ThrowableItems m, World world, ItemStack stack) { + @Unique private boolean handleThrowableItems(ThrowableItems m, Level world, ItemStack stack) { return world.am$get(ThrowableItems.CONFIG).canZombiesThrowItems && requireNonNull(world.getServer()).dm$getReloader(RELOADER).hasBehaviors(stack); } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/Client.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/Client.java index a2e5187e..f41dfb34 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/Client.java @@ -4,8 +4,8 @@ import me.melontini.andromeda.common.AndromedaClient; import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import net.minecraft.client.gui.screen.ingame.AbstractFurnaceScreen; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.client.gui.screens.inventory.AbstractFurnaceScreen; +import net.minecraft.core.particles.ParticleTypes; public class Client { @@ -17,13 +17,13 @@ public class Client { && config.furnaceScreenParticles) { ScreenEvents.afterTick(abstractFurnaceScreen).register(screen -> { AbstractFurnaceScreen furnaceScreen = (AbstractFurnaceScreen) screen; - if (furnaceScreen.getScreenHandler().isBurning() + if (furnaceScreen.getMenu().isLit() && MathUtil.threadRandom().nextInt(10) == 0) { ScreenParticleHelper.addScreenParticle( screen, ParticleTypes.FLAME, - MathUtil.nextDouble(furnaceScreen.x + 56, furnaceScreen.x + 56 + 14), - furnaceScreen.y + 36 + 13, + MathUtil.nextDouble(furnaceScreen.leftPos + 56, furnaceScreen.leftPos + 56 + 14), + furnaceScreen.topPos + 36 + 13, MathUtil.nextDouble(-0.01, 0.01), 0.05); } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/CustomItemStackParticle.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/CustomItemStackParticle.java index 321dc01e..cd1377d5 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/CustomItemStackParticle.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/CustomItemStackParticle.java @@ -1,11 +1,11 @@ package me.melontini.andromeda.modules.gui.gui_particles; import me.melontini.dark_matter.api.glitter.particles.ItemStackParticle; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RotationAxis; +import net.minecraft.client.gui.GuiGraphics; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.item.ItemStack; +import net.minecraft.util.Mth; +import com.mojang.math.Axis; public class CustomItemStackParticle extends ItemStackParticle { public CustomItemStackParticle(double x, double y, double velX, double velY, ItemStack stack) { @@ -13,16 +13,16 @@ public class CustomItemStackParticle extends ItemStackParticle { } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - double x = MathHelper.lerp(delta, prevX, this.x); - double y = MathHelper.lerp(delta, prevY, this.y); - MatrixStack matrixStack = context.getMatrices(); - matrixStack.push(); + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + double x = Mth.lerp(delta, prevX, this.x); + double y = Mth.lerp(delta, prevY, this.y); + PoseStack matrixStack = context.pose(); + matrixStack.pushPose(); matrixStack.translate(x, y, 500); double angle = Math.toDegrees(Math.atan2(velY, velX) * 0.5); - matrixStack.multiply(RotationAxis.POSITIVE_Z.rotationDegrees((float) angle)); - context.drawItem(this.stack, -8, -8); - context.drawItemInSlot(client.textRenderer, this.stack, -8, -8); - matrixStack.pop(); + matrixStack.mulPose(Axis.ZP.rotationDegrees((float) angle)); + context.renderItem(this.stack, -8, -8); + context.renderItemDecorations(client.font, this.stack, -8, -8); + matrixStack.popPose(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java index c8d13fcf..31b27198 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java @@ -3,34 +3,34 @@ package me.melontini.andromeda.modules.gui.gui_particles.mixin; import me.melontini.andromeda.common.AndromedaClient; import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.AnvilScreen; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.particle.BlockStateParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.ForgingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AnvilScreen; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.inventory.ItemCombinerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.MenuType; import org.jetbrains.annotations.Nullable; 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; -@Mixin(AnvilScreenHandler.class) -abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { +@Mixin(AnvilMenu.class) +abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu { public AnvilScreenHandlerMixin( - @Nullable ScreenHandlerType type, - int syncId, - PlayerInventory playerInventory, - ScreenHandlerContext context) { + @Nullable MenuType type, + int syncId, + Inventory playerInventory, + ContainerLevelAccess context) { super(type, syncId, playerInventory, context); } @@ -39,23 +39,23 @@ abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @At( value = "INVOKE", target = - "Lnet/minecraft/inventory/Inventory;setStack(ILnet/minecraft/item/ItemStack;)V", + "Lnet/minecraft/world/Container;setItem(ILnet/minecraft/world/item/ItemStack;)V", ordinal = 0), - method = "onTakeOutput") - private void andromeda$particles(PlayerEntity player, ItemStack stack, CallbackInfo ci) { + method = "onTake") + private void andromeda$particles(Player player, ItemStack stack, CallbackInfo ci) { if (!AndromedaClient.CLIENT.get(GuiParticles.CONFIG).anvilScreenParticles) return; - if (MinecraftClient.getInstance().isOnThread() - && MinecraftClient.getInstance().currentScreen instanceof AnvilScreen anvilScreen) { - BlockState state = Blocks.ANVIL.getDefaultState(); + if (Minecraft.getInstance().isSameThread() + && Minecraft.getInstance().screen instanceof AnvilScreen anvilScreen) { + BlockState state = Blocks.ANVIL.defaultBlockState(); var slot = this.slots.get(2); - boolean enchant = this.slots.get(1).getStack().isOf(Items.ENCHANTED_BOOK); + boolean enchant = this.slots.get(1).getItem().is(Items.ENCHANTED_BOOK); ScreenParticleHelper.addScreenParticles( !enchant - ? new BlockStateParticleEffect(ParticleTypes.BLOCK, state) + ? new BlockParticleOption(ParticleTypes.BLOCK, state) : ParticleTypes.END_ROD, - anvilScreen.x + slot.x + 8, - anvilScreen.y + slot.y + 8, + anvilScreen.leftPos + slot.x + 8, + anvilScreen.topPos + slot.y + 8, 0.5, 0.5, !enchant ? 0.5 : 0.07, diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java index d8a01c1f..a9f926df 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java @@ -3,11 +3,11 @@ package me.melontini.andromeda.modules.gui.gui_particles.mixin; import me.melontini.andromeda.common.AndromedaClient; import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; -import net.minecraft.client.MinecraftClient; -import net.minecraft.item.BundleItem; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ItemStackParticleEffect; -import net.minecraft.particle.ParticleTypes; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.BundleItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,21 +16,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BundleItem.class) abstract class BundleItemMixin { - @Inject(at = @At("RETURN"), method = "addToBundle") + @Inject(at = @At("RETURN"), method = "add") private static void andromeda$spawnParticles( - ItemStack bundle, ItemStack stack, CallbackInfoReturnable cir) { + ItemStack bundle, ItemStack stack, CallbackInfoReturnable cir) { if (cir.getReturnValueI() > 0 && AndromedaClient.CLIENT.get(GuiParticles.CONFIG).bundleInputParticles) { - var client = MinecraftClient.getInstance(); - if (client.isOnThread() && client.currentScreen != null) { - int x = (int) (client.mouse.getX() - * (double) client.getWindow().getScaledWidth() - / (double) client.getWindow().getWidth()); - int y = (int) (client.mouse.getY() - * (double) client.getWindow().getScaledHeight() - / (double) client.getWindow().getHeight()); + var client = Minecraft.getInstance(); + if (client.isSameThread() && client.screen != null) { + int x = (int) (client.mouseHandler.xpos() + * (double) client.getWindow().getGuiScaledWidth() + / (double) client.getWindow().getScreenWidth()); + int y = (int) (client.mouseHandler.ypos() + * (double) client.getWindow().getGuiScaledHeight() + / (double) client.getWindow().getScreenHeight()); ScreenParticleHelper.addScreenParticles( - new ItemStackParticleEffect(ParticleTypes.ITEM, stack), x, y, 0.5, 0.5, 0.1, 7); + new ItemParticleOption(ParticleTypes.ITEM, stack), x, y, 0.5, 0.5, 0.1, 7); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/CreativeInventoryScreenMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/CreativeInventoryScreenMixin.java index e86ff808..91d2515a 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/CreativeInventoryScreenMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/CreativeInventoryScreenMixin.java @@ -6,24 +6,24 @@ import me.melontini.andromeda.modules.gui.gui_particles.CustomItemStackParticle; import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; -import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; -import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.screen.slot.Slot; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.inventory.EffectRenderingInventoryScreen; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.network.chat.Component; 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; -@Mixin(CreativeInventoryScreen.class) +@Mixin(CreativeModeInventoryScreen.class) abstract class CreativeInventoryScreenMixin - extends AbstractInventoryScreen { + extends EffectRenderingInventoryScreen { public CreativeInventoryScreenMixin( - CreativeInventoryScreen.CreativeScreenHandler screenHandler, - PlayerInventory playerInventory, - Text text) { + CreativeModeInventoryScreen.ItemPickerMenu screenHandler, + Inventory playerInventory, + Component text) { super(screenHandler, playerInventory, text); } @@ -32,28 +32,28 @@ abstract class CreativeInventoryScreenMixin @At( value = "INVOKE", target = - "Lnet/minecraft/client/network/ClientPlayerInteractionManager;clickCreativeStack(Lnet/minecraft/item/ItemStack;I)V", + "Lnet/minecraft/client/multiplayer/MultiPlayerGameMode;handleCreativeModeItemAdd(Lnet/minecraft/world/item/ItemStack;I)V", ordinal = 0, shift = At.Shift.BEFORE), - method = "onMouseClick") + method = "slotClicked") private void andromeda$clickDeleteParticles( - Slot slot, - int slotId, - int button, - SlotActionType actionType, - CallbackInfo ci, - @Local(ordinal = 2) int index) { + Slot slot, + int slotId, + int button, + ClickType actionType, + CallbackInfo ci, + @Local(ordinal = 2) int index) { var config = AndromedaClient.CLIENT.get(GuiParticles.CONFIG); if (!config.creativeScreenParticles) return; - if (index >= this.handler.slots.size()) return; - Slot slot1 = this.handler.slots.get(index); + if (index >= this.menu.slots.size()) return; + Slot slot1 = this.menu.slots.get(index); ScreenParticleHelper.addScreenParticle(new CustomItemStackParticle( - this.x + slot1.x + 8, - this.y + slot1.y + 8, + this.leftPos + slot1.x + 8, + this.topPos + slot1.y + 8, MathUtil.nextDouble( -config.creativeScreenParticlesVelX, config.creativeScreenParticlesVelX), 0.6, - slot1.getStack())); + slot1.getItem())); } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/EnchantmentScreenMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/EnchantmentScreenMixin.java index 566356ba..c3a4a526 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/EnchantmentScreenMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/EnchantmentScreenMixin.java @@ -3,22 +3,22 @@ package me.melontini.andromeda.modules.gui.gui_particles.mixin; import me.melontini.andromeda.common.AndromedaClient; import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; -import net.minecraft.client.gui.screen.ingame.EnchantmentScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.screen.EnchantmentScreenHandler; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.inventory.EnchantmentScreen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.inventory.EnchantmentMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.network.chat.Component; 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(EnchantmentScreen.class) -abstract class EnchantmentScreenMixin extends HandledScreen { +abstract class EnchantmentScreenMixin extends AbstractContainerScreen { public EnchantmentScreenMixin( - EnchantmentScreenHandler handler, PlayerInventory inventory, Text title) { + EnchantmentMenu handler, Inventory inventory, Component title) { super(handler, inventory, title); } @@ -27,15 +27,15 @@ abstract class EnchantmentScreenMixin extends HandledScreen cir) { if (!AndromedaClient.CLIENT.get(GuiParticles.CONFIG).enchantmentScreenParticles) return; - Slot slot = this.handler.slots.get(0); + Slot slot = this.menu.slots.get(0); ScreenParticleHelper.addScreenParticles( - ParticleTypes.END_ROD, this.x + slot.x + 8, this.y + slot.y + 8, 0.5, 0.5, 0.07, 10); + ParticleTypes.END_ROD, this.leftPos + slot.x + 8, this.topPos + slot.y + 8, 0.5, 0.5, 0.07, 10); } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java index 14631521..b4a3e51a 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java @@ -9,15 +9,15 @@ import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; import me.melontini.dark_matter.api.glitter.particles.ItemStackParticle; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.GameModeSelectionScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.math.random.Random; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.debug.GameModeSwitcherScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.util.RandomSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -25,48 +25,48 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(GameModeSelectionScreen.class) +@Mixin(GameModeSwitcherScreen.class) abstract class GameModeSelectionScreenMixin extends Screen { @Shadow protected abstract void init(); @Unique private static final List ANDROMEDA$ADVENTURE = Lists.newArrayList( - Items.COMPASS.getDefaultStack(), - Items.MAP.getDefaultStack(), - Items.FILLED_MAP.getDefaultStack()); + Items.COMPASS.getDefaultInstance(), + Items.MAP.getDefaultInstance(), + Items.FILLED_MAP.getDefaultInstance()); @Unique private static final List ANDROMEDA$SURVIVAL = Lists.newArrayList( - Items.IRON_SWORD.getDefaultStack(), - Items.APPLE.getDefaultStack(), - Items.DIAMOND.getDefaultStack(), - Items.LEATHER_BOOTS.getDefaultStack(), - Items.ROTTEN_FLESH.getDefaultStack(), - Items.ENDER_PEARL.getDefaultStack()); + Items.IRON_SWORD.getDefaultInstance(), + Items.APPLE.getDefaultInstance(), + Items.DIAMOND.getDefaultInstance(), + Items.LEATHER_BOOTS.getDefaultInstance(), + Items.ROTTEN_FLESH.getDefaultInstance(), + Items.ENDER_PEARL.getDefaultInstance()); @Unique private static final List ANDROMEDA$SPECTATOR = - Lists.newArrayList(Items.ENDER_EYE.getDefaultStack()); + Lists.newArrayList(Items.ENDER_EYE.getDefaultInstance()); - @Unique private static final Map> + @Unique private static final Map> ANDROMEDA$GAME_MODE_STACKS = - Utilities.supply(new EnumMap<>(GameModeSelectionScreen.GameModeSelection.class), map -> { - map.put(GameModeSelectionScreen.GameModeSelection.CREATIVE, () -> Registries.ITEM - .getRandom(Random.create()) + Utilities.supply(new EnumMap<>(GameModeSwitcherScreen.GameModeIcon.class), map -> { + map.put(GameModeSwitcherScreen.GameModeIcon.CREATIVE, () -> BuiltInRegistries.ITEM + .getRandom(RandomSource.create()) .orElseThrow() .value() - .getDefaultStack()); + .getDefaultInstance()); map.put( - GameModeSelectionScreen.GameModeSelection.ADVENTURE, + GameModeSwitcherScreen.GameModeIcon.ADVENTURE, () -> Utilities.pickAtRandom(ANDROMEDA$ADVENTURE)); map.put( - GameModeSelectionScreen.GameModeSelection.SURVIVAL, + GameModeSwitcherScreen.GameModeIcon.SURVIVAL, () -> Utilities.pickAtRandom(ANDROMEDA$SURVIVAL)); map.put( - GameModeSelectionScreen.GameModeSelection.SPECTATOR, + GameModeSwitcherScreen.GameModeIcon.SPECTATOR, () -> Utilities.pickAtRandom(ANDROMEDA$SPECTATOR)); }); - protected GameModeSelectionScreenMixin(Text title) { + protected GameModeSelectionScreenMixin(Component title) { super(title); } @@ -75,23 +75,23 @@ abstract class GameModeSelectionScreenMixin extends Screen { @At( value = "INVOKE", target = - "Lnet/minecraft/client/network/ClientPlayNetworkHandler;sendCommand(Ljava/lang/String;)Z", + "Lnet/minecraft/client/multiplayer/ClientPacketListener;sendUnsignedCommand(Ljava/lang/String;)Z", shift = At.Shift.BEFORE), method = - "apply(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection;)V") + "switchToHoveredGameMode(Lnet/minecraft/client/Minecraft;Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon;)V") private static void andromeda$gmSwitchParticles( - MinecraftClient client, GameModeSelectionScreen.GameModeSelection gameMode, CallbackInfo ci) { + Minecraft client, GameModeSwitcherScreen.GameModeIcon gameMode, CallbackInfo ci) { if (!AndromedaClient.CLIENT.get(GuiParticles.CONFIG).gameModeSwitcherParticles) return; - if (client.currentScreen instanceof GameModeSelectionScreen gameModeSelectionScreen) { - List buttonWidgets = - new ArrayList<>(gameModeSelectionScreen.gameModeButtons); - buttonWidgets.removeIf(buttonWidget -> buttonWidget.gameMode != gameMode); - Optional optional = + if (client.screen instanceof GameModeSwitcherScreen gameModeSelectionScreen) { + List buttonWidgets = + new ArrayList<>(gameModeSelectionScreen.slots); + buttonWidgets.removeIf(buttonWidget -> buttonWidget.icon != gameMode); + Optional optional = buttonWidgets.stream().findFirst(); if (optional.isPresent()) { - GameModeSelectionScreen.ButtonWidget widget = optional.get(); + GameModeSwitcherScreen.GameModeSlot widget = optional.get(); double x = widget.getX() + widget.getWidth() / 2d; double y = widget.getY() + widget.getHeight() / 2d; diff --git a/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/Client.java b/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/Client.java index d3b8e8ab..7e27313e 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/Client.java @@ -14,21 +14,21 @@ import me.melontini.dark_matter.api.base.util.Utilities; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback; import net.fabricmc.fabric.api.client.rendering.v1.TooltipComponentCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.decoration.ItemFrameEntity; -import net.minecraft.text.Text; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.decoration.ItemFrame; +import net.minecraft.network.chat.Component; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.util.Mth; import org.joml.Vector2i; public class Client { - private Supplier> action; + private Supplier> action; private float tooltipFlow; private float oldTooltipFlow; @@ -36,26 +36,26 @@ public class Client { inGameTooltips(); ClientTickEvents.START_CLIENT_TICK.register(client -> { - var cast = client.crosshairTarget; + var cast = client.hitResult; getCast(cast); oldTooltipFlow = tooltipFlow; tooltipFlow = action != null - ? MathHelper.lerp(0.25f, tooltipFlow, 1) - : MathHelper.lerp(0.1f, tooltipFlow, 0); + ? Mth.lerp(0.25f, tooltipFlow, 1) + : Mth.lerp(0.1f, tooltipFlow, 0); if (Math.abs(tooltipFlow) < 1.0E-5F) tooltipFlow = 0; }); } public static void registerEntityTooltip( Predicate predicate, - Function> function) { + Function> function) { ENTITY_LOOKUP.put(predicate, function); } private void inGameTooltips() { HudRenderCallback.EVENT.register((context, delta) -> { - if (MinecraftClient.getInstance().currentScreen == null) { - var client = MinecraftClient.getInstance(); + if (Minecraft.getInstance().screen == null) { + var client = Minecraft.getInstance(); if (action != null) { renderFromComponents(client, context, action.get()); @@ -64,24 +64,24 @@ public class Client { }); registerEntityTooltip( - entityHitResult -> entityHitResult.getEntity() instanceof ItemFrameEntity ife - && !ife.getHeldItemStack().isEmpty(), + entityHitResult -> entityHitResult.getEntity() instanceof ItemFrame ife + && !ife.getItem().isEmpty(), entityHitResult -> { - var frameStack = ((ItemFrameEntity) entityHitResult.getEntity()).getHeldItemStack(); + var frameStack = ((ItemFrame) entityHitResult.getEntity()).getItem(); if (frameStack.isEmpty()) return Collections.emptyList(); - var list = Screen.getTooltipFromItem(MinecraftClient.getInstance(), frameStack); - List components = list.stream() - .map(Text::asOrderedText) - .map(TooltipComponent::of) + var list = Screen.getTooltipFromItem(Minecraft.getInstance(), frameStack); + List components = list.stream() + .map(Component::getVisualOrderText) + .map(ClientTooltipComponent::create) .collect(Collectors.toCollection(ArrayList::new)); frameStack - .getTooltipData() + .getTooltipImage() .ifPresent(datax -> components.add(1, Utilities.supply(() -> { - TooltipComponent component = + ClientTooltipComponent component = TooltipComponentCallback.EVENT.invoker().getComponent(datax); - if (component == null) component = TooltipComponent.of(datax); + if (component == null) component = ClientTooltipComponent.create(datax); return component; }))); return components; @@ -89,7 +89,7 @@ public class Client { } private static final Map< - Predicate, Function>> + Predicate, Function>> ENTITY_LOOKUP = new Reference2ObjectOpenHashMap<>(); private void getCast(HitResult cast) { @@ -108,32 +108,32 @@ public class Client { } private void renderFromComponents( - MinecraftClient client, DrawContext context, List components) { + Minecraft client, GuiGraphics context, List components) { if (components.isEmpty()) return; - float flow = MathHelper.lerp(client.getTickDelta(), oldTooltipFlow, tooltipFlow); - MatrixStack matrices = context.getMatrices(); + float flow = Mth.lerp(client.getFrameTime(), oldTooltipFlow, tooltipFlow); + PoseStack matrices = context.pose(); - matrices.push(); + matrices.pushPose(); matrices.translate(0, 0, -450); matrices.scale(1, 1, 1); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShaderColor(1, 1, 1, Math.min(flow, 0.8f)); - context.drawTooltip( - client.textRenderer, + context.renderTooltipInternal( + client.font, components, 0, 0, (screenWidth, screenHeight, sameX, sameY, width, height) -> { float smoothX = ((screenWidth / 2f) - (flow * 15)) + 27; - float smoothY = ((client.getWindow().getScaledHeight() - height) / 2f); + float smoothY = ((client.getWindow().getGuiScaledHeight() - height) / 2f); matrices.translate(smoothX - (int) smoothX, smoothY - (int) smoothY, 1); return new Vector2i((int) smoothX, (int) smoothY); }); RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.disableBlend(); - matrices.pop(); + matrices.popPose(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/mixin/InGameHudMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/mixin/InGameHudMixin.java index 360a9e97..2561be69 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/mixin/InGameHudMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/mixin/InGameHudMixin.java @@ -7,14 +7,14 @@ import java.util.stream.Collectors; import me.melontini.dark_matter.api.base.util.MakeSure; import me.melontini.dark_matter.api.base.util.Utilities; import net.fabricmc.fabric.api.client.rendering.v1.TooltipComponentCallback; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.Component; import org.joml.Vector2i; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -23,65 +23,65 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(InGameHud.class) +@Mixin(Gui.class) abstract class InGameHudMixin { @Shadow @Final - private MinecraftClient client; + private Minecraft minecraft; @Shadow - private int heldItemTooltipFade; + private int toolHighlightTimer; @Shadow - private ItemStack currentStack; + private ItemStack lastToolHighlight; @Shadow - private int scaledHeight; + private int screenHeight; - @Inject(at = @At("HEAD"), method = "renderHeldItemTooltip", cancellable = true) - private void andromeda$renderTooltip(DrawContext context, CallbackInfo ci) { - this.client.getProfiler().push("selectedItemName"); + @Inject(at = @At("HEAD"), method = "renderSelectedItemName", cancellable = true) + private void andromeda$renderTooltip(GuiGraphics context, CallbackInfo ci) { + this.minecraft.getProfiler().push("selectedItemName"); - if (this.heldItemTooltipFade > 0 - && !this.currentStack.isEmpty() - && MinecraftClient.getInstance().currentScreen == null) { - int l = (int) ((float) this.heldItemTooltipFade * 256.0F / 10.0F); + if (this.toolHighlightTimer > 0 + && !this.lastToolHighlight.isEmpty() + && Minecraft.getInstance().screen == null) { + int l = (int) ((float) this.toolHighlightTimer * 256.0F / 10.0F); if (l > 255) { l = 255; } if (l > 0) { - int k = this.scaledHeight - 59; - if (!MakeSure.notNull(this.client.interactionManager).hasStatusBars()) { + int k = this.screenHeight - 59; + if (!MakeSure.notNull(this.minecraft.gameMode).canHurtPlayer()) { k += 14; } - MatrixStack matrices = context.getMatrices(); - matrices.push(); + PoseStack matrices = context.pose(); + matrices.pushPose(); matrices.translate(0, 0, -450); matrices.scale(1, 1, 1); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShaderColor(1, 1, 1, Math.min(l / 255f, 0.8f)); - var list = Screen.getTooltipFromItem(MinecraftClient.getInstance(), this.currentStack); - List list1 = list.stream() - .map(Text::asOrderedText) - .map(TooltipComponent::of) + var list = Screen.getTooltipFromItem(Minecraft.getInstance(), this.lastToolHighlight); + List list1 = list.stream() + .map(Component::getVisualOrderText) + .map(ClientTooltipComponent::create) .collect(Collectors.toCollection(ArrayList::new)); - this.currentStack - .getTooltipData() + this.lastToolHighlight + .getTooltipImage() .ifPresent(datax -> list1.add(1, Utilities.supply(() -> { - TooltipComponent component = + ClientTooltipComponent component = TooltipComponentCallback.EVENT.invoker().getComponent(datax); - if (component == null) component = TooltipComponent.of(datax); + if (component == null) component = ClientTooltipComponent.create(datax); return component; }))); int finalK = k; int finalL = l; - context.drawTooltip( - client.textRenderer, list1, 0, 0, (screenWidth, screenHeight, x, y, width, height) -> { + context.renderTooltipInternal( + minecraft.font, list1, 0, 0, (screenWidth, screenHeight, x, y, width, height) -> { float smoothX = ((screenWidth - width) / 2f); float smoothY = (finalK - height + (finalL / 255f * 2)) + 6; matrices.translate(smoothX - (int) smoothX, smoothY - (int) smoothY, 1); @@ -89,11 +89,11 @@ abstract class InGameHudMixin { }); RenderSystem.setShaderColor(1, 1, 1, 1); RenderSystem.disableBlend(); - matrices.pop(); + matrices.popPose(); } } - this.client.getProfiler().pop(); + this.minecraft.getProfiler().pop(); ci.cancel(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionMixin.java index f8c6c89c..1c20f1c9 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionMixin.java @@ -1,21 +1,21 @@ package me.melontini.andromeda.modules.gui.no_more_adventure.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.client.gui.screen.GameModeSelectionScreen; +import net.minecraft.client.gui.screens.debug.GameModeSwitcherScreen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(GameModeSelectionScreen.GameModeSelection.class) +@Mixin(GameModeSwitcherScreen.GameModeIcon.class) abstract class GameModeSelectionMixin { @ModifyExpressionValue( - method = "next", + method = "getNext", at = @At( value = "FIELD", target = - "Lnet/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection;ADVENTURE:Lnet/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection;")) - private GameModeSelectionScreen.GameModeSelection andromeda$next( - GameModeSelectionScreen.GameModeSelection original) { - return GameModeSelectionScreen.GameModeSelection.SPECTATOR; + "Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon;ADVENTURE:Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon;")) + private GameModeSwitcherScreen.GameModeIcon andromeda$next( + GameModeSwitcherScreen.GameModeIcon original) { + return GameModeSwitcherScreen.GameModeIcon.SPECTATOR; } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionScreenMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionScreenMixin.java index bc7bbea4..1b204994 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionScreenMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/mixin/GameModeSelectionScreenMixin.java @@ -1,24 +1,24 @@ package me.melontini.andromeda.modules.gui.no_more_adventure.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.client.gui.screen.GameModeSelectionScreen; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.debug.GameModeSwitcherScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; import org.apache.commons.lang3.ArrayUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@Mixin(GameModeSelectionScreen.class) +@Mixin(GameModeSwitcherScreen.class) abstract class GameModeSelectionScreenMixin extends Screen { - protected GameModeSelectionScreenMixin(Text title) { + protected GameModeSelectionScreenMixin(Component title) { super(title); } - @Unique private final GameModeSelectionScreen.GameModeSelection[] andromeda$gameModeSelections = + @Unique private final GameModeSwitcherScreen.GameModeIcon[] andromeda$gameModeSelections = ArrayUtils.removeElement( - GameModeSelectionScreen.GameModeSelection.values(), - GameModeSelectionScreen.GameModeSelection.ADVENTURE); + GameModeSwitcherScreen.GameModeIcon.values(), + GameModeSwitcherScreen.GameModeIcon.ADVENTURE); @ModifyExpressionValue( method = "init", @@ -26,9 +26,9 @@ abstract class GameModeSelectionScreenMixin extends Screen { @At( value = "FIELD", target = - "Lnet/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection;VALUES:[Lnet/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection;")) - private GameModeSelectionScreen.GameModeSelection[] andromeda$modValues( - GameModeSelectionScreen.GameModeSelection[] original) { + "Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon;VALUES:[Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon;")) + private GameModeSwitcherScreen.GameModeIcon[] andromeda$modValues( + GameModeSwitcherScreen.GameModeIcon[] original) { return andromeda$gameModeSelections; } @@ -37,7 +37,7 @@ abstract class GameModeSelectionScreenMixin extends Screen { at = @At( value = "FIELD", - target = "Lnet/minecraft/client/gui/screen/GameModeSelectionScreen;UI_WIDTH:I")) + target = "Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen;ALL_SLOTS_WIDTH:I")) private int andromeda$modValues(int original) { return andromeda$gameModeSelections.length * 31 - 5; } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/smooth_tooltips/mixin/DrawContextMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/smooth_tooltips/mixin/DrawContextMixin.java index e60182d5..93299e1e 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/smooth_tooltips/mixin/DrawContextMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/smooth_tooltips/mixin/DrawContextMixin.java @@ -7,13 +7,13 @@ import com.llamalad7.mixinextras.sugar.ref.LocalBooleanRef; import java.util.List; import me.melontini.andromeda.common.AndromedaClient; import me.melontini.andromeda.modules.gui.smooth_tooltips.SmoothTooltips; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.tooltip.TooltipComponent; -import net.minecraft.client.gui.tooltip.TooltipPositioner; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.util.Mth; import org.joml.Vector2d; import org.joml.Vector2i; import org.joml.Vector2ic; @@ -25,16 +25,16 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(DrawContext.class) +@Mixin(GuiGraphics.class) abstract class DrawContextMixin { @Shadow @Final - private MinecraftClient client; + private Minecraft minecraft; @Shadow @Final - private MatrixStack matrices; + private PoseStack pose; @Unique private static Vector2d smoothPos; @@ -43,9 +43,9 @@ abstract class DrawContextMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/client/gui/tooltip/TooltipPositioner;getPosition(IIIIII)Lorg/joml/Vector2ic;"), + "Lnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;positionTooltip(IIIIII)Lorg/joml/Vector2ic;"), method = - "drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;IILnet/minecraft/client/gui/tooltip/TooltipPositioner;)V") + "renderTooltipInternal(Lnet/minecraft/client/gui/Font;Ljava/util/List;IILnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;)V") private Vector2ic andromeda$smoothTooltip( Vector2ic vic, @Local(argsOnly = true, ordinal = 0) int x, @@ -54,46 +54,46 @@ abstract class DrawContextMixin { if (andromeda$makeSmooth(x, y)) { var c = AndromedaClient.CLIENT.get(SmoothTooltips.CONFIG); if (smoothPos == null) smoothPos = new Vector2d(x, y); - smoothPos.x = MathHelper.clamp( - MathHelper.lerp(c.deltaX * client.getLastFrameDuration(), smoothPos.x, vic.x()), + smoothPos.x = Mth.clamp( + Mth.lerp(c.deltaX * minecraft.getDeltaFrameTime(), smoothPos.x, vic.x()), vic.x() - c.clampX, vic.x() + c.clampX); - smoothPos.y = MathHelper.clamp( - MathHelper.lerp(c.deltaY * client.getLastFrameDuration(), smoothPos.y, vic.y()), + smoothPos.y = Mth.clamp( + Mth.lerp(c.deltaY * minecraft.getDeltaFrameTime(), smoothPos.y, vic.y()), vic.y() - c.clampY, vic.y() + c.clampY); popMatrix.set(true); - this.matrices.push(); - this.matrices.translate(smoothPos.x - (int) smoothPos.x, smoothPos.y - (int) smoothPos.y, 1); + this.pose.pushPose(); + this.pose.translate(smoothPos.x - (int) smoothPos.x, smoothPos.y - (int) smoothPos.y, 1); return new Vector2i((int) smoothPos.x, (int) smoothPos.y); } return vic; } @Unique private boolean andromeda$makeSmooth(int x, int y) { - double mX = (this.client.mouse.getX() - * this.client.getWindow().getScaledWidth() - / this.client.getWindow().getWidth()); + double mX = (this.minecraft.mouseHandler.xpos() + * this.minecraft.getWindow().getGuiScaledWidth() + / this.minecraft.getWindow().getScreenWidth()); if ((int) mX != x) return false; - double mY = (this.client.mouse.getY() - * this.client.getWindow().getScaledHeight() - / this.client.getWindow().getHeight()); + double mY = (this.minecraft.mouseHandler.ypos() + * this.minecraft.getWindow().getGuiScaledHeight() + / this.minecraft.getWindow().getScreenHeight()); return (int) mY == y; } @Inject( at = @At(value = "TAIL"), method = - "drawTooltip(Lnet/minecraft/client/font/TextRenderer;Ljava/util/List;IILnet/minecraft/client/gui/tooltip/TooltipPositioner;)V") + "renderTooltipInternal(Lnet/minecraft/client/gui/Font;Ljava/util/List;IILnet/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipPositioner;)V") private void andromeda$popMatrix( - TextRenderer textRenderer, - List components, - int x, - int y, - TooltipPositioner positioner, - CallbackInfo ci, - @Share("popMatrix") LocalBooleanRef popMatrix) { - if (popMatrix.get()) this.matrices.pop(); + Font textRenderer, + List components, + int x, + int y, + ClientTooltipPositioner positioner, + CallbackInfo ci, + @Share("popMatrix") LocalBooleanRef popMatrix) { + if (popMatrix.get()) this.pose.popPose(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenHandlerMixin.java b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenHandlerMixin.java index 26e1fd5e..83b37abc 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenHandlerMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenHandlerMixin.java @@ -1,34 +1,34 @@ package me.melontini.andromeda.modules.items.balanced_mending.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.Items; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.ForgingScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; -import net.minecraft.screen.ScreenHandlerType; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.Items; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.world.inventory.ItemCombinerMenu; +import net.minecraft.world.inventory.ContainerLevelAccess; +import net.minecraft.world.inventory.MenuType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(AnvilScreenHandler.class) -abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { +@Mixin(AnvilMenu.class) +abstract class AnvilScreenHandlerMixin extends ItemCombinerMenu { public AnvilScreenHandlerMixin( - @org.jetbrains.annotations.Nullable ScreenHandlerType type, - int syncId, - PlayerInventory playerInventory, - ScreenHandlerContext context) { + @org.jetbrains.annotations.Nullable MenuType type, + int syncId, + Inventory playerInventory, + ContainerLevelAccess context) { super(type, syncId, playerInventory, context); } @ModifyExpressionValue( - method = "updateResult", + method = "createResult", at = @At(value = "CONSTANT", args = "intValue=40")) private int andromeda$setRepairLimit(int constant) { - if (!this.getSlot(1).getStack().isOf(Items.ENCHANTED_BOOK)) - if (EnchantmentHelper.get(this.getSlot(0).getStack()).containsKey(Enchantments.MENDING)) { + if (!this.getSlot(1).getItem().is(Items.ENCHANTED_BOOK)) + if (EnchantmentHelper.getEnchantments(this.getSlot(0).getItem()).containsKey(Enchantments.MENDING)) { return Integer.MAX_VALUE; } return constant; diff --git a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenMixin.java b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenMixin.java index fbfc7789..f43e1823 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/AnvilScreenMixin.java @@ -3,31 +3,31 @@ package me.melontini.andromeda.modules.items.balanced_mending.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import me.melontini.andromeda.bootstrap.util.mixin.MixinEnvironment; import net.fabricmc.api.EnvType; -import net.minecraft.client.gui.screen.ingame.AnvilScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.Items; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.text.Text; +import net.minecraft.client.gui.screens.inventory.AnvilScreen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.item.Items; +import net.minecraft.world.inventory.AnvilMenu; +import net.minecraft.network.chat.Component; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @MixinEnvironment(EnvType.CLIENT) @Mixin(AnvilScreen.class) -abstract class AnvilScreenMixin extends HandledScreen { +abstract class AnvilScreenMixin extends AbstractContainerScreen { - public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory inventory, Text title) { + public AnvilScreenMixin(AnvilMenu handler, Inventory inventory, Component title) { super(handler, inventory, title); } @ModifyExpressionValue( - method = "drawForeground", + method = "renderLabels", at = @At(value = "CONSTANT", args = "intValue=40")) private int andromeda$setRepairLimit(int constant) { - if (!this.handler.getSlot(1).getStack().isOf(Items.ENCHANTED_BOOK)) - if (EnchantmentHelper.get(this.handler.getSlot(0).getStack()) + if (!this.menu.getSlot(1).getItem().is(Items.ENCHANTED_BOOK)) + if (EnchantmentHelper.getEnchantments(this.menu.getSlot(0).getItem()) .containsKey(Enchantments.MENDING)) { return Integer.MAX_VALUE; } diff --git a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ExperienceOrbMixin.java b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ExperienceOrbMixin.java index d9311846..245b240c 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ExperienceOrbMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ExperienceOrbMixin.java @@ -1,18 +1,18 @@ package me.melontini.andromeda.modules.items.balanced_mending.mixin; -import net.minecraft.entity.ExperienceOrbEntity; -import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.world.entity.ExperienceOrb; +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(ExperienceOrbEntity.class) +@Mixin(ExperienceOrb.class) abstract class ExperienceOrbMixin { - @Inject(at = @At("HEAD"), method = "repairPlayerGears", cancellable = true) + @Inject(at = @At("HEAD"), method = "repairPlayerItems", cancellable = true) private void andromeda$repair( - PlayerEntity player, int amount, CallbackInfoReturnable cir) { + Player player, int amount, CallbackInfoReturnable cir) { cir.setReturnValue(amount); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ItemStackMixin.java b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ItemStackMixin.java index b42afd03..13310253 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ItemStackMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/mixin/ItemStackMixin.java @@ -1,19 +1,19 @@ package me.melontini.andromeda.modules.items.balanced_mending.mixin; import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(ItemStack.class) abstract class ItemStackMixin { - @ModifyReturnValue(method = "getRepairCost", at = @At("RETURN")) + @ModifyReturnValue(method = "getBaseRepairCost", at = @At("RETURN")) private int andromeda$getRepairCost(int original) { if (original >= 52 - && EnchantmentHelper.get((ItemStack) (Object) this).containsKey(Enchantments.MENDING)) { + && EnchantmentHelper.getEnchantments((ItemStack) (Object) this).containsKey(Enchantments.MENDING)) { return 52; } return original; diff --git a/src/main/java/me/melontini/andromeda/modules/items/better_names/mixin/ItemStackMixin.java b/src/main/java/me/melontini/andromeda/modules/items/better_names/mixin/ItemStackMixin.java index 00338fdb..4c4f9ca4 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/better_names/mixin/ItemStackMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/better_names/mixin/ItemStackMixin.java @@ -3,13 +3,13 @@ package me.melontini.andromeda.modules.items.better_names.mixin; import com.llamalad7.mixinextras.sugar.Local; import java.util.List; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Rarity; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -30,7 +30,7 @@ abstract class ItemStackMixin { public abstract int getCount(); @Shadow - public abstract int getDamage(); + public abstract int getDamageValue(); @Shadow public abstract Rarity getRarity(); @@ -42,21 +42,21 @@ abstract class ItemStackMixin { target = "Ljava/util/List;add(Ljava/lang/Object;)Z", ordinal = 0, shift = At.Shift.BEFORE), - method = "getTooltip") + method = "getTooltipLines") private void andromeda$getTooltip( - @Nullable PlayerEntity player, - TooltipContext context, - CallbackInfoReturnable> cir, - @Local MutableText mutableText) { - if (!this.getItem().isDamageable()) { + @Nullable Player player, + TooltipFlag context, + CallbackInfoReturnable> cir, + @Local MutableComponent mutableText) { + if (!this.getItem().canBeDepleted()) { if (this.getCount() > 1) mutableText.append( - TextUtil.literal(" x" + this.getCount()).formatted(getRarity().formatting)); + TextUtil.literal(" x" + this.getCount()).withStyle(getRarity().color)); } else { - if (this.getDamage() > 0) + if (this.getDamageValue() > 0) mutableText.append(TextUtil.literal( - " " + ((this.getMaxDamage() - this.getDamage()) * 100 / this.getMaxDamage()) + "%") - .formatted(getRarity().formatting)); + " " + ((this.getMaxDamage() - this.getDamageValue()) * 100 / this.getMaxDamage()) + "%") + .withStyle(getRarity().color)); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/BeaconUtil.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/BeaconUtil.java index 04c8deb7..0f30d1fa 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/BeaconUtil.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/BeaconUtil.java @@ -1,20 +1,20 @@ package me.melontini.andromeda.modules.items.infinite_totem; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; public class BeaconUtil { - public static boolean matchesPattern(World world, BlockPos pos) { + public static boolean matchesPattern(Level world, BlockPos pos) { int x = pos.getX(); int y = pos.getY(); int z = pos.getZ(); for (int j = 1; j <= 4; j++) { int k = y - j; - if (k < world.getBottomY()) break; + if (k < world.getMinBuildHeight()) break; Block current = j % 2 == 0 ? Blocks.DIAMOND_BLOCK : Blocks.NETHERITE_BLOCK; diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/Main.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/Main.java index 26520e79..9cebee82 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/Main.java @@ -9,33 +9,33 @@ import me.melontini.andromeda.common.util.Keeper; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroups; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.registry.Registries; -import net.minecraft.util.Identifier; -import net.minecraft.util.Rarity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Rarity; public final class Main { public static final Keeper INFINITE_TOTEM = Keeper.create(); - public static final Keeper KNOCKOFF_TOTEM_PARTICLE = Keeper.create(); + public static final Keeper KNOCKOFF_TOTEM_PARTICLE = Keeper.create(); - public static final Identifier USED_CUSTOM_TOTEM = Andromeda.id("used_custom_totem"); - public static final Identifier NOTIFY_CLIENT = Andromeda.id("notify_client_about_stuff_please"); + public static final ResourceLocation USED_CUSTOM_TOTEM = Andromeda.id("used_custom_totem"); + public static final ResourceLocation NOTIFY_CLIENT = Andromeda.id("notify_client_about_stuff_please"); static void init() { var module = ModuleManager.get().get(InfiniteTotem.class).orElseThrow(); INFINITE_TOTEM.init(RegistryUtil.register( - Registries.ITEM, + BuiltInRegistries.ITEM, id("infinite_totem"), - () -> new Item(new FabricItemSettings().maxCount(1).rarity(Rarity.EPIC)))); + () -> new Item(new FabricItemSettings().stacksTo(1).rarity(Rarity.EPIC)))); KNOCKOFF_TOTEM_PARTICLE.init(RegistryUtil.register( - Registries.PARTICLE_TYPE, id("knockoff_totem_particles"), FabricParticleTypes::simple)); + BuiltInRegistries.PARTICLE_TYPE, id("knockoff_totem_particles"), FabricParticleTypes::simple)); AndromedaItemGroup.BUS.listen( - acceptor -> acceptor.keeper(module, ItemGroups.COMBAT, INFINITE_TOTEM)); + acceptor -> acceptor.keeper(module, CreativeModeTabs.COMBAT, INFINITE_TOTEM)); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/Client.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/Client.java index 4975123f..865b5468 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/Client.java @@ -5,50 +5,50 @@ import me.melontini.andromeda.modules.items.infinite_totem.Main; import me.melontini.dark_matter.api.base.util.MakeSure; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.DefaultParticleType; -import net.minecraft.registry.Registries; -import net.minecraft.sound.SoundEvents; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.sounds.SoundEvents; public class Client { public static void init() { ClientPlayNetworking.registerGlobalReceiver( Main.USED_CUSTOM_TOTEM, (client, handler, buf, responseSender) -> { - UUID id = buf.readUuid(); - ItemStack stack = buf.readItemStack(); - DefaultParticleType particle = - (DefaultParticleType) buf.readRegistryValue(Registries.PARTICLE_TYPE); + UUID id = buf.readUUID(); + ItemStack stack = buf.readItem(); + SimpleParticleType particle = + (SimpleParticleType) buf.readById(BuiltInRegistries.PARTICLE_TYPE); client.execute(() -> { Entity entity = - MakeSure.notNull(client.world, "client.world").getEntityLookup().get(id); - client.particleManager.addEmitter( + MakeSure.notNull(client.level, "client.world").getEntities().get(id); + client.particleEngine.createTrackingEmitter( MakeSure.notNull(entity, "(Andromeda) Client received invalid entity ID"), particle, 30); - client.world.playSound( + client.level.playLocalSound( entity.getX(), entity.getY(), entity.getZ(), - SoundEvents.ITEM_TOTEM_USE, - entity.getSoundCategory(), + SoundEvents.TOTEM_USE, + entity.getSoundSource(), 1.0F, 1.0F, false); - if (entity == client.player) client.gameRenderer.showFloatingItem(stack); + if (entity == client.player) client.gameRenderer.displayItemActivation(stack); }); }); ClientPlayNetworking.registerGlobalReceiver( Main.NOTIFY_CLIENT, (client, handler, packetByteBuf, responseSender) -> { int uuid = packetByteBuf.readVarInt(); - ItemStack stack = packetByteBuf.readItemStack(); + ItemStack stack = packetByteBuf.readItem(); client.execute(() -> { ItemEntity entity = (ItemEntity) - MakeSure.notNull(client.world, "client.world").getEntityLookup().get(uuid); - if (entity != null) entity.getDataTracker().set(ItemEntity.STACK, stack); + MakeSure.notNull(client.level, "client.world").getEntities().get(uuid); + if (entity != null) entity.getEntityData().set(ItemEntity.DATA_ITEM, stack); }); }); diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/KnockoffTotemParticle.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/KnockoffTotemParticle.java index 4984919c..f0e0c248 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/KnockoffTotemParticle.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/client/KnockoffTotemParticle.java @@ -2,32 +2,32 @@ package me.melontini.andromeda.modules.items.infinite_totem.client; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.particle.AnimatedParticle; +import net.minecraft.client.particle.SimpleAnimatedParticle; import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleFactory; -import net.minecraft.client.particle.SpriteProvider; -import net.minecraft.client.world.ClientWorld; -import net.minecraft.particle.DefaultParticleType; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.core.particles.SimpleParticleType; -public class KnockoffTotemParticle extends AnimatedParticle { +public class KnockoffTotemParticle extends SimpleAnimatedParticle { KnockoffTotemParticle( - ClientWorld world, - double x, - double y, - double z, - double velocityX, - double velocityY, - double velocityZ, - SpriteProvider spriteProvider) { + ClientLevel world, + double x, + double y, + double z, + double velocityX, + double velocityY, + double velocityZ, + SpriteSet spriteProvider) { super(world, x, y, z, spriteProvider, 1.25F); - this.velocityMultiplier = 0.6F; - this.velocityX = velocityX; - this.velocityY = velocityY; - this.velocityZ = velocityZ; - this.scale *= 0.75F; - this.maxAge = 60 + random.nextInt(12); - this.setSpriteForAge(spriteProvider); + this.friction = 0.6F; + this.xd = velocityX; + this.yd = velocityY; + this.zd = velocityZ; + this.quadSize *= 0.75F; + this.lifetime = 60 + random.nextInt(12); + this.setSpriteFromAge(spriteProvider); if (random.nextInt(2) == 0) { this.setColor(-1121831); @@ -37,19 +37,19 @@ public class KnockoffTotemParticle extends AnimatedParticle { } @Environment(EnvType.CLIENT) - public record Factory(SpriteProvider spriteProvider) - implements ParticleFactory { + public record Factory(SpriteSet spriteProvider) + implements ParticleProvider { @Override public Particle createParticle( - DefaultParticleType defaultParticleType, - ClientWorld clientWorld, - double d, - double e, - double f, - double g, - double h, - double i) { + SimpleParticleType defaultParticleType, + ClientLevel clientWorld, + double d, + double e, + double f, + double g, + double h, + double i) { return new KnockoffTotemParticle(clientWorld, d, e, f, g, h, i, this.spriteProvider); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java index f0a6c0a3..1668c568 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java @@ -10,21 +10,21 @@ import me.melontini.dark_matter.api.base.util.tuple.Tuple; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PlayerLookup; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.block.entity.BeaconBlockEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.Heightmap; -import net.minecraft.world.World; +import net.minecraft.world.level.block.entity.BeaconBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -36,13 +36,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; abstract class ItemEntityMixin extends Entity { @Shadow - public abstract void setPickupDelayInfinite(); + public abstract void setNeverPickUp(); @Shadow - public abstract void setToDefaultPickupDelay(); + public abstract void setDefaultPickUpDelay(); @Shadow - public abstract ItemStack getStack(); + public abstract ItemStack getItem(); @Unique private static final Tuple ANDROMEDA$NULL_BEACON = Tuple.of(null, false); @@ -53,7 +53,7 @@ abstract class ItemEntityMixin extends Entity { @Unique private Tuple andromeda$beacon = ANDROMEDA$NULL_BEACON; - public ItemEntityMixin(EntityType type, World world) { + public ItemEntityMixin(EntityType type, Level world) { super(type, world); } @@ -61,21 +61,21 @@ abstract class ItemEntityMixin extends Entity { at = @At( value = "INVOKE", - target = "Lnet/minecraft/entity/Entity;tick()V", + target = "Lnet/minecraft/world/entity/Entity;tick()V", shift = At.Shift.BEFORE), method = "tick") private void andromeda$tick(CallbackInfo ci) { - if (this.world.isClient()) return; - if (!this.getStack().isOf(Items.TOTEM_OF_UNDYING)) return; - var c = world.am$get(InfiniteTotem.CONFIG); + if (this.level.isClientSide()) return; + if (!this.getItem().is(Items.TOTEM_OF_UNDYING)) return; + var c = level.am$get(InfiniteTotem.CONFIG); var supplier = - LootContextBuilder.fishing(world, builder -> builder.origin(getPos()).tool(getStack())); + LootContextBuilder.fishing(level, builder -> builder.origin(position()).tool(getItem())); if (!c.available.asBoolean(supplier) || !c.enableAscension.asBoolean(supplier)) return; - if (age % 35 == 0 && andromeda$ascensionTicks == 0) { + if (tickCount % 35 == 0 && andromeda$ascensionTicks == 0) { if (!andromeda$beaconCheck()) { - this.setToDefaultPickupDelay(); - if (andromeda$itemEntity != null) andromeda$itemEntity.setToDefaultPickupDelay(); + this.setDefaultPickUpDelay(); + if (andromeda$itemEntity != null) andromeda$itemEntity.setDefaultPickUpDelay(); } } @@ -83,12 +83,12 @@ abstract class ItemEntityMixin extends Entity { if (andromeda$itemEntity == null) { if (andromeda$ascensionTicks > 0) --andromeda$ascensionTicks; - if (age % 10 == 0) { - Optional optional = world - .getEntitiesByClass( + if (tickCount % 10 == 0) { + Optional optional = level + .getEntitiesOfClass( ItemEntity.class, - getBoundingBox().expand(0.5), - itemEntity -> itemEntity.getStack().isOf(Items.NETHER_STAR) + getBoundingBox().inflate(0.5), + itemEntity -> itemEntity.getItem().is(Items.NETHER_STAR) && toMixin(itemEntity).andromeda$itemEntity == null) .stream() .findAny(); @@ -97,33 +97,33 @@ abstract class ItemEntityMixin extends Entity { andromeda$itemEntity = optional.get(); toMixin(andromeda$itemEntity).andromeda$itemEntity = (ItemEntity) (Object) this; - ItemStack targetStack = andromeda$itemEntity.getStack(); + ItemStack targetStack = andromeda$itemEntity.getItem(); int count = targetStack.getCount() - 1; if (count > 0) { ItemStack newStack = targetStack.copy(); newStack.setCount(count); targetStack.setCount(1); - andromeda$itemEntity.setStack(targetStack); + andromeda$itemEntity.setItem(targetStack); ItemEntity entity = new ItemEntity( - world, + level, andromeda$itemEntity.getX(), andromeda$itemEntity.getY(), andromeda$itemEntity.getZ(), newStack); - world.spawnEntity(entity); + level.addFreshEntity(entity); - PacketByteBuf buf = PacketByteBufs.create() + FriendlyByteBuf buf = PacketByteBufs.create() .writeVarInt(andromeda$itemEntity.getId()) - .writeItemStack(targetStack); - for (ServerPlayerEntity serverPlayerEntity : PlayerLookup.tracking(this)) { + .writeItem(targetStack); + for (ServerPlayer serverPlayerEntity : PlayerLookup.tracking(this)) { ServerPlayNetworking.send(serverPlayerEntity, Main.NOTIFY_CLIENT, buf); } } - andromeda$itemEntity.setPickupDelayInfinite(); - this.setPickupDelayInfinite(); + andromeda$itemEntity.setNeverPickUp(); + this.setNeverPickUp(); } } } else { @@ -136,23 +136,23 @@ abstract class ItemEntityMixin extends Entity { if (andromeda$ascensionTicks == 180) { andromeda$ascensionTicks = 0; - ((ServerWorld) world) - .spawnParticles( + ((ServerLevel) level) + .sendParticles( ParticleTypes.END_ROD, this.getX(), this.getY(), this.getZ(), 15, 0, 0, 0, 0.4); ItemEntity entity = new ItemEntity( - world, + level, this.getX(), this.getY(), this.getZ(), new ItemStack(Main.INFINITE_TOTEM.orThrow())); this.discard(); andromeda$itemEntity.discard(); - world.spawnEntity(entity); + level.addFreshEntity(entity); } } else { - this.setToDefaultPickupDelay(); - andromeda$itemEntity.setToDefaultPickupDelay(); + this.setDefaultPickUpDelay(); + andromeda$itemEntity.setDefaultPickUpDelay(); toMixin(andromeda$itemEntity).andromeda$itemEntity = null; andromeda$itemEntity = null; @@ -166,17 +166,17 @@ abstract class ItemEntityMixin extends Entity { } @Unique private boolean andromeda$beaconCheck() { - BlockEntity entity = world.getBlockEntity(new BlockPos( + BlockEntity entity = level.getBlockEntity(new BlockPos( (int) getX(), - world.getTopY( - Heightmap.Type.WORLD_SURFACE, - getBlockPos().getX(), - getBlockPos().getZ()) + level.getHeight( + Heightmap.Types.WORLD_SURFACE, + blockPosition().getX(), + blockPosition().getZ()) - 1, (int) getZ())); if (entity instanceof BeaconBlockEntity beaconBlock) { this.andromeda$beacon = - Tuple.of(beaconBlock, BeaconUtil.matchesPattern(world, beaconBlock.getPos())); + Tuple.of(beaconBlock, BeaconUtil.matchesPattern(level, beaconBlock.getBlockPos())); return true; } else { this.andromeda$beacon = ANDROMEDA$NULL_BEACON; @@ -184,13 +184,13 @@ abstract class ItemEntityMixin extends Entity { } } - @Inject(at = @At("TAIL"), method = "readCustomDataFromNbt") - private void andromeda$readNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "readAdditionalSaveData") + private void andromeda$readNbt(CompoundTag nbt, CallbackInfo ci) { this.andromeda$ascensionTicks = nbt.getInt("AM-Ascension"); } - @Inject(at = @At("TAIL"), method = "writeCustomDataToNbt") - private void andromeda$writeNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "addAdditionalSaveData") + private void andromeda$writeNbt(CompoundTag nbt, CallbackInfo ci) { nbt.putInt("AM-Ascension", this.andromeda$ascensionTicks); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java index d518c3ca..c1974131 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java @@ -9,17 +9,17 @@ import me.melontini.andromeda.modules.items.infinite_totem.Main; import me.melontini.dark_matter.api.minecraft.util.PlayerUtil; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Hand; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -30,34 +30,34 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; abstract class LivingEntityMixin extends Entity { @Shadow - public abstract ItemStack getStackInHand(Hand hand); + public abstract ItemStack getItemInHand(InteractionHand hand); - public LivingEntityMixin(EntityType type, World world) { + public LivingEntityMixin(EntityType type, Level world) { super(type, world); } @ModifyExpressionValue( - method = "tryUseTotem", + method = "checkTotemDeathProtection", at = @At( value = "INVOKE", - target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z")) + target = "Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z")) private boolean andromeda$infiniteFallback( - boolean original, DamageSource source, @Local(index = 3) ItemStack itemStack) { + boolean original, DamageSource source, @Local(index = 3) ItemStack itemStack) { return original - || (world + || (level .am$get(InfiniteTotem.CONFIG) .available .asBoolean(LootContextBuilder.fishing( - world, builder -> builder.origin(getPos()).tool(itemStack))) - && itemStack.isOf(Main.INFINITE_TOTEM.orThrow())); + level, builder -> builder.origin(position()).tool(itemStack))) + && itemStack.is(Main.INFINITE_TOTEM.orThrow())); } @WrapWithCondition( - method = "tryUseTotem", - at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;decrement(I)V")) + method = "checkTotemDeathProtection", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V")) private boolean andromeda$infiniteFallback(ItemStack instance, int i) { - return !instance.isOf(Main.INFINITE_TOTEM.orThrow()); + return !instance.is(Main.INFINITE_TOTEM.orThrow()); } @Inject( @@ -65,23 +65,23 @@ abstract class LivingEntityMixin extends Entity { @At( value = "INVOKE", target = - "Lnet/minecraft/world/World;sendEntityStatus(Lnet/minecraft/entity/Entity;B)V", + "Lnet/minecraft/world/level/Level;broadcastEntityEvent(Lnet/minecraft/world/entity/Entity;B)V", shift = At.Shift.BEFORE), - method = "tryUseTotem", + method = "checkTotemDeathProtection", cancellable = true) private void andromeda$useInfiniteTotem( - DamageSource source, - CallbackInfoReturnable cir, - @Local(ordinal = 0) ItemStack itemStack) { - if (itemStack.isOf(Main.INFINITE_TOTEM.orThrow())) { - if (!world.isClient()) { - PacketByteBuf buf = PacketByteBufs.create() - .writeUuid(this.getUuid()) - .writeItemStack(new ItemStack(Main.INFINITE_TOTEM.orThrow())); - buf.writeRegistryValue(Registries.PARTICLE_TYPE, Main.KNOCKOFF_TOTEM_PARTICLE.orThrow()); + DamageSource source, + CallbackInfoReturnable cir, + @Local(ordinal = 0) ItemStack itemStack) { + if (itemStack.is(Main.INFINITE_TOTEM.orThrow())) { + if (!level.isClientSide()) { + FriendlyByteBuf buf = PacketByteBufs.create() + .writeUUID(this.getUUID()) + .writeItem(new ItemStack(Main.INFINITE_TOTEM.orThrow())); + buf.writeId(BuiltInRegistries.PARTICLE_TYPE, Main.KNOCKOFF_TOTEM_PARTICLE.orThrow()); - for (PlayerEntity player : PlayerUtil.findPlayersInRange(world, getBlockPos(), 120)) { - ServerPlayNetworking.send((ServerPlayerEntity) player, Main.USED_CUSTOM_TOTEM, buf); + for (Player player : PlayerUtil.findPlayersInRange(level, blockPosition(), 120)) { + ServerPlayNetworking.send((ServerPlayer) player, Main.USED_CUSTOM_TOTEM, buf); } } cir.setReturnValue(true); diff --git a/src/main/java/me/melontini/andromeda/modules/items/lava_disintegrator/mixin/ItemMixin.java b/src/main/java/me/melontini/andromeda/modules/items/lava_disintegrator/mixin/ItemMixin.java index e184d848..b9212347 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lava_disintegrator/mixin/ItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lava_disintegrator/mixin/ItemMixin.java @@ -5,19 +5,19 @@ import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.MinecraftClient; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.StackReference; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.screen.slot.Slot; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.ClickType; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.world.inventory.Slot; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.inventory.ClickAction; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -27,21 +27,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Item.class) abstract class ItemMixin { - @Inject(at = @At("HEAD"), method = "onClicked", cancellable = true) + @Inject(at = @At("HEAD"), method = "overrideOtherStackedOnMe", cancellable = true) private void andromeda$onLavaClick( - ItemStack stack, - ItemStack otherStack, - Slot slot, - ClickType clickType, - PlayerEntity player, - StackReference cursorStackReference, - CallbackInfoReturnable cir) { - if (clickType == ClickType.RIGHT && stack.isOf(Items.LAVA_BUCKET)) { - if (otherStack.getItem().isFireproof() - || EnchantmentHelper.getLevel(Enchantments.FIRE_PROTECTION, otherStack) > 0) return; + ItemStack stack, + ItemStack otherStack, + Slot slot, + ClickAction clickType, + Player player, + SlotAccess cursorStackReference, + CallbackInfoReturnable cir) { + if (clickType == ClickAction.SECONDARY && stack.is(Items.LAVA_BUCKET)) { + if (otherStack.getItem().isFireResistant() + || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.FIRE_PROTECTION, otherStack) > 0) return; cursorStackReference.set(ItemStack.EMPTY); - if (player.world.isClient) + if (player.level.isClientSide) spawnLavaParticles((int) Math.max(2, Math.sqrt(otherStack.getCount()))); cir.setReturnValue(true); } @@ -49,20 +49,20 @@ abstract class ItemMixin { @Unique @Environment(EnvType.CLIENT) private static void spawnLavaParticles(int count) { - var client = MinecraftClient.getInstance(); - int x = (int) (client.mouse.getX() - * (double) client.getWindow().getScaledWidth() - / (double) client.getWindow().getWidth()); - int y = (int) (client.mouse.getY() - * (double) client.getWindow().getScaledHeight() - / (double) client.getWindow().getHeight()); + var client = Minecraft.getInstance(); + int x = (int) (client.mouseHandler.xpos() + * (double) client.getWindow().getGuiScaledWidth() + / (double) client.getWindow().getScreenWidth()); + int y = (int) (client.mouseHandler.ypos() + * (double) client.getWindow().getGuiScaledHeight() + / (double) client.getWindow().getScreenHeight()); for (int i = 0; i < count; i++) { ScreenParticleHelper.addParticle(ParticleTypes.LAVA, x, y, 0.0, 0.0); } Objects.requireNonNull(client.player) - .playSound( - SoundEvents.BLOCK_LAVA_EXTINGUISH, - SoundCategory.AMBIENT, + .playNotifySound( + SoundEvents.LAVA_EXTINGUISH, + SoundSource.AMBIENT, 0.8f, 0.8F + MathUtil.threadRandom().nextFloat() * 0.4F); } diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java index c6ad05cd..67c3bc39 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java @@ -13,38 +13,38 @@ import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.minecraft.util.RegistryUtil; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.passive.MerchantEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroups; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.screen.SimpleNamedScreenHandlerFactory; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.SimpleMenuProvider; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; public class LockpickItem extends Item { public static final Keeper INSTANCE = Keeper.create(); - public LockpickItem(Settings settings) { + public LockpickItem(Properties settings) { super(settings); } - public boolean tryUse(ItemStack stack, LivingEntity user, Hand hand) { - var c = user.world.am$get(Lockpick.CONFIG); + public boolean tryUse(ItemStack stack, LivingEntity user, InteractionHand hand) { + var c = user.level.am$get(Lockpick.CONFIG); var supplier = LootContextBuilder.fishing( - user.world, builder -> builder.origin(user).tool(user, hand).thisEntity(user)); - if (c.available.asBoolean(supplier) && hand == Hand.MAIN_HAND) { + user.level, builder -> builder.origin(user).tool(user, hand).thisEntity(user)); + if (c.available.asBoolean(supplier) && hand == InteractionHand.MAIN_HAND) { int chance = c.chance.asInt(supplier); - if (!(user instanceof PlayerEntity p && p.getAbilities().creativeMode)) { + if (!(user instanceof Player p && p.getAbilities().instabuild)) { if (c.breakAfterUse.asBoolean(supplier)) { - if (!user.world.isClient()) user.sendEquipmentBreakStatus(EquipmentSlot.MAINHAND); + if (!user.level.isClientSide()) user.broadcastBreakEvent(EquipmentSlot.MAINHAND); - stack.decrement(1); + stack.shrink(1); } } @@ -54,21 +54,21 @@ public class LockpickItem extends Item { } @Override - public ActionResult useOnEntity( - ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) { - if (user.world.isClient()) return ActionResult.SUCCESS; + public InteractionResult interactLivingEntity( + ItemStack stack, Player user, LivingEntity entity, InteractionHand hand) { + if (user.level.isClientSide()) return InteractionResult.SUCCESS; - if (entity instanceof MerchantEntity merchant + if (entity instanceof AbstractVillager merchant && Andromeda.MAIN.get(Lockpick.MAIN_CONFIG).villagerInventory) { if (tryUse(stack, user, hand)) { - user.openHandledScreen(new SimpleNamedScreenHandlerFactory( + user.openMenu(new SimpleMenuProvider( (syncId, inv, player) -> new MerchantInventoryScreenHandler(syncId, inv, merchant.getInventory()), TextUtil.translatable("gui.andromeda.merchant"))); - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } - return ActionResult.CONSUME; + return InteractionResult.CONSUME; } static void init() { @@ -76,27 +76,27 @@ public class LockpickItem extends Item { var config = Andromeda.MAIN.get(Lockpick.MAIN_CONFIG); LockpickItem.INSTANCE.init(RegistryUtil.register( - Registries.ITEM, + BuiltInRegistries.ITEM, id("lockpick"), - () -> new LockpickItem(new FabricItemSettings().maxCount(16)))); + () -> new LockpickItem(new FabricItemSettings().stacksTo(16)))); MerchantInventoryScreenHandler.INSTANCE.init(RegistryUtil.register( config.villagerInventory, - Registries.SCREEN_HANDLER, + BuiltInRegistries.MENU, id("merchant_inventory"), RegistryUtil.screenHandlerType(MerchantInventoryScreenHandler::new))); AndromedaItemGroup.BUS.listen( - acceptor -> acceptor.keeper(module, ItemGroups.TOOLS, LockpickItem.INSTANCE)); + acceptor -> acceptor.keeper(module, CreativeModeTabs.TOOLS_AND_UTILITIES, LockpickItem.INSTANCE)); ModuleManager.get() .whenAvailable( ModuleDeclarations.LOOT_UNLOCKER, function -> function.apply((be, player) -> { - if (player.world.am$get(GuardedLoot.CONFIG).allowLockPicking) { - if (player.getMainHandStack().isOf(LockpickItem.INSTANCE.orThrow())) { + if (player.level.am$get(GuardedLoot.CONFIG).allowLockPicking) { + if (player.getMainHandItem().is(LockpickItem.INSTANCE.orThrow())) { return LockpickItem.INSTANCE .orThrow() - .tryUse(player.getMainHandStack(), player, Hand.MAIN_HAND); + .tryUse(player.getMainHandItem(), player, InteractionHand.MAIN_HAND); } } return false; diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreen.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreen.java index 0a4531ea..04004f47 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreen.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreen.java @@ -3,45 +3,45 @@ package me.melontini.andromeda.modules.items.lockpick; import me.melontini.andromeda.common.Andromeda; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreens; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.MenuScreens; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; @Environment(EnvType.CLIENT) -public class MerchantInventoryScreen extends HandledScreen { +public class MerchantInventoryScreen extends AbstractContainerScreen { - private static final Identifier TEXTURE = Andromeda.id("textures/gui/merchant_inventory.png"); + private static final ResourceLocation TEXTURE = Andromeda.id("textures/gui/merchant_inventory.png"); public MerchantInventoryScreen( - MerchantInventoryScreenHandler handler, PlayerInventory inventory, Text title) { + MerchantInventoryScreenHandler handler, Inventory inventory, Component title) { super(handler, inventory, title); } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { this.renderBackground(context); super.render(context, mouseX, mouseY, delta); - this.drawMouseoverTooltip(context, mouseX, mouseY); + this.renderTooltip(context, mouseX, mouseY); } @Override - protected void drawForeground(DrawContext context, int mouseX, int mouseY) { - context.drawText(this.textRenderer, this.title, this.titleX, this.titleY, 42107532, false); + protected void renderLabels(GuiGraphics context, int mouseX, int mouseY) { + context.drawString(this.font, this.title, this.titleLabelX, this.titleLabelY, 42107532, false); } @Override - protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) { - int i = (this.width - this.backgroundWidth) / 2; - int j = (this.height - this.backgroundHeight) / 2; - context.drawTexture(TEXTURE, i, j, 0, 0, this.backgroundWidth, this.backgroundHeight); + protected void renderBg(GuiGraphics context, float delta, int mouseX, int mouseY) { + int i = (this.width - this.imageWidth) / 2; + int j = (this.height - this.imageHeight) / 2; + context.blit(TEXTURE, i, j, 0, 0, this.imageWidth, this.imageHeight); } public static void onClient() { if (MerchantInventoryScreenHandler.INSTANCE.isPresent()) { - HandledScreens.register( + MenuScreens.register( MerchantInventoryScreenHandler.INSTANCE.orThrow(), MerchantInventoryScreen::new); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java index 8d896856..273c882a 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java @@ -1,30 +1,30 @@ package me.melontini.andromeda.modules.items.lockpick; import me.melontini.andromeda.common.util.Keeper; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.Inventory; -import net.minecraft.inventory.SimpleInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import net.minecraft.screen.slot.Slot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.Container; +import net.minecraft.world.SimpleContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; -public class MerchantInventoryScreenHandler extends ScreenHandler { +public class MerchantInventoryScreenHandler extends AbstractContainerMenu { - public static final Keeper> INSTANCE = + public static final Keeper> INSTANCE = Keeper.create(); - private final Inventory inventory; + private final Container inventory; - public MerchantInventoryScreenHandler(int syncId, PlayerInventory playerInventory) { - this(syncId, playerInventory, new SimpleInventory(8)); + public MerchantInventoryScreenHandler(int syncId, Inventory playerInventory) { + this(syncId, playerInventory, new SimpleContainer(8)); } public MerchantInventoryScreenHandler( - int syncId, PlayerInventory playerInventory, Inventory inventory) { + int syncId, Inventory playerInventory, Container inventory) { super(INSTANCE.orThrow(), syncId); this.inventory = inventory; - inventory.onOpen(playerInventory.player); + inventory.startOpen(playerInventory.player); int i = -3 * 18; @@ -44,24 +44,24 @@ public class MerchantInventoryScreenHandler extends ScreenHandler { } @Override - public ItemStack quickMove(PlayerEntity player, int index) { + public ItemStack quickMoveStack(Player player, int index) { ItemStack itemStack = ItemStack.EMPTY; Slot slot = this.slots.get(index); - if (slot.hasStack()) { - ItemStack itemStack2 = slot.getStack(); + if (slot.hasItem()) { + ItemStack itemStack2 = slot.getItem(); itemStack = itemStack2.copy(); if (index < 8) { - if (!this.insertItem(itemStack2, 8, this.slots.size(), true)) { + if (!this.moveItemStackTo(itemStack2, 8, this.slots.size(), true)) { return ItemStack.EMPTY; } - } else if (!this.insertItem(itemStack2, 0, 8, false)) { + } else if (!this.moveItemStackTo(itemStack2, 0, 8, false)) { return ItemStack.EMPTY; } if (itemStack2.isEmpty()) { - slot.setStack(ItemStack.EMPTY); + slot.setByPlayer(ItemStack.EMPTY); } else { - slot.markDirty(); + slot.setChanged(); } } @@ -69,17 +69,17 @@ public class MerchantInventoryScreenHandler extends ScreenHandler { } @Override - public boolean canUse(PlayerEntity player) { - return this.inventory.canPlayerUse(player); + public boolean stillValid(Player player) { + return this.inventory.stillValid(player); } @Override - public void onClosed(PlayerEntity player) { - super.onClosed(player); - this.inventory.onClose(player); + public void removed(Player player) { + super.removed(player); + this.inventory.stopOpen(player); } - public Inventory getInventory() { + public Container getInventory() { return this.inventory; } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/mixin/PlayerEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/mixin/PlayerEntityMixin.java index 43dc9c5a..5f3f71e3 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/mixin/PlayerEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/mixin/PlayerEntityMixin.java @@ -3,20 +3,20 @@ package me.melontini.andromeda.modules.items.lockpick.mixin; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import me.melontini.andromeda.modules.items.lockpick.LockpickItem; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(PlayerEntity.class) +@Mixin(Player.class) abstract class PlayerEntityMixin extends LivingEntity { - protected PlayerEntityMixin(EntityType entityType, World world) { + protected PlayerEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -25,13 +25,13 @@ abstract class PlayerEntityMixin extends LivingEntity { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/Entity;interact(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;"), - method = "interact") - private ActionResult andromeda$stopInteract( - Entity entity, PlayerEntity player, Hand hand, Operation original) { - if (getStackInHand(Hand.MAIN_HAND).getItem() instanceof LockpickItem - || getStackInHand(Hand.OFF_HAND).getItem() instanceof LockpickItem) { - return ActionResult.PASS; + "Lnet/minecraft/world/entity/Entity;interact(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/InteractionHand;)Lnet/minecraft/world/InteractionResult;"), + method = "interactOn") + private InteractionResult andromeda$stopInteract( + Entity entity, Player player, InteractionHand hand, Operation original) { + if (getItemInHand(InteractionHand.MAIN_HAND).getItem() instanceof LockpickItem + || getItemInHand(InteractionHand.OFF_HAND).getItem() instanceof LockpickItem) { + return InteractionResult.PASS; } return original.call(entity, player, hand); } diff --git a/src/main/java/me/melontini/andromeda/modules/items/magnet/MagnetItem.java b/src/main/java/me/melontini/andromeda/modules/items/magnet/MagnetItem.java index a9792892..5a415a43 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/magnet/MagnetItem.java +++ b/src/main/java/me/melontini/andromeda/modules/items/magnet/MagnetItem.java @@ -21,58 +21,58 @@ import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.BundleTooltipData; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.client.item.TooltipData; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.StackReference; -import net.minecraft.item.Item; -import net.minecraft.item.ItemGroups; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtElement; -import net.minecraft.nbt.NbtList; -import net.minecraft.nbt.NbtString; -import net.minecraft.particle.ItemStackParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.Registries; -import net.minecraft.screen.slot.Slot; -import net.minecraft.sound.SoundEvents; -import net.minecraft.text.Text; -import net.minecraft.util.ClickType; -import net.minecraft.util.Formatting; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.util.math.Box; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.world.inventory.tooltip.BundleTooltip; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.inventory.tooltip.TooltipComponent; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.inventory.Slot; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.ChatFormatting; +import net.minecraft.world.InteractionHand; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.NonNullList; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public class MagnetItem extends Item { public static final Keeper MAGNET = Keeper.create(); - private static final BiConsumer ITEM_PARTICLES = + private static final BiConsumer ITEM_PARTICLES = Support.support(EnvType.CLIENT, () -> MagnetItem::itemParticles, () -> (stack, player) -> {}); - private static final Consumer UPGRADE_PARTICLES = + private static final Consumer UPGRADE_PARTICLES = Support.support(EnvType.CLIENT, () -> MagnetItem::upgradeParticles, () -> stack -> {}); - public MagnetItem(Settings settings) { + public MagnetItem(Properties settings) { super(settings); } public static final String LEVEL_KEY = "PowerLevel"; @Override - public boolean onStackClicked( - ItemStack stack, Slot slot, ClickType clickType, PlayerEntity player) { - if (clickType == ClickType.RIGHT) { - ItemStack itemStack = slot.getStack(); + public boolean overrideStackedOnOther( + ItemStack stack, Slot slot, ClickAction clickType, Player player) { + if (clickType == ClickAction.SECONDARY) { + ItemStack itemStack = slot.getItem(); if (itemStack.isEmpty()) { removeFirst(stack); this.playRemoveOneSound(player); @@ -87,14 +87,14 @@ public class MagnetItem extends Item { } @Override - public boolean onClicked( - ItemStack stack, - ItemStack otherStack, - Slot slot, - ClickType clickType, - PlayerEntity player, - StackReference cursorStackReference) { - if (clickType == ClickType.RIGHT) { + public boolean overrideOtherStackedOnMe( + ItemStack stack, + ItemStack otherStack, + Slot slot, + ClickAction clickType, + Player player, + SlotAccess cursorStackReference) { + if (clickType == ClickAction.SECONDARY) { if (otherStack.isEmpty()) { removeFirst(stack); this.playRemoveOneSound(player); @@ -105,10 +105,10 @@ public class MagnetItem extends Item { } return true; } - if (clickType == ClickType.LEFT) { - if (otherStack.isOf(Items.HEART_OF_THE_SEA)) { + if (clickType == ClickAction.PRIMARY) { + if (otherStack.is(Items.HEART_OF_THE_SEA)) { if (incrementLevel(stack)) { - otherStack.decrement(1); + otherStack.shrink(1); UPGRADE_PARTICLES.accept(player); playUpgradeSound(player); } @@ -119,50 +119,50 @@ public class MagnetItem extends Item { } @Environment(EnvType.CLIENT) - private static void upgradeParticles(PlayerEntity player) { - if (player.world.isClient()) { - var client = MinecraftClient.getInstance(); - int x = (int) (client.mouse.getX() - * (double) client.getWindow().getScaledWidth() - / (double) client.getWindow().getWidth()); - int y = (int) (client.mouse.getY() - * (double) client.getWindow().getScaledHeight() - / (double) client.getWindow().getHeight()); + private static void upgradeParticles(Player player) { + if (player.level.isClientSide()) { + var client = Minecraft.getInstance(); + int x = (int) (client.mouseHandler.xpos() + * (double) client.getWindow().getGuiScaledWidth() + / (double) client.getWindow().getScreenWidth()); + int y = (int) (client.mouseHandler.ypos() + * (double) client.getWindow().getGuiScaledHeight() + / (double) client.getWindow().getScreenHeight()); ScreenParticleHelper.addScreenParticles(ParticleTypes.END_ROD, x, y, 0.5, 0.5, 0.07, 7); } } @Environment(EnvType.CLIENT) - private static void itemParticles(ItemStack stack, PlayerEntity player) { - if (player.world.isClient()) { - var client = MinecraftClient.getInstance(); - int x = (int) (client.mouse.getX() - * (double) client.getWindow().getScaledWidth() - / (double) client.getWindow().getWidth()); - int y = (int) (client.mouse.getY() - * (double) client.getWindow().getScaledHeight() - / (double) client.getWindow().getHeight()); + private static void itemParticles(ItemStack stack, Player player) { + if (player.level.isClientSide()) { + var client = Minecraft.getInstance(); + int x = (int) (client.mouseHandler.xpos() + * (double) client.getWindow().getGuiScaledWidth() + / (double) client.getWindow().getScreenWidth()); + int y = (int) (client.mouseHandler.ypos() + * (double) client.getWindow().getGuiScaledHeight() + / (double) client.getWindow().getScreenHeight()); ScreenParticleHelper.addScreenParticles( - new ItemStackParticleEffect(ParticleTypes.ITEM, stack), x, y, 0.5, 0.5, 0.1, 7); + new ItemParticleOption(ParticleTypes.ITEM, stack), x, y, 0.5, 0.5, 0.1, 7); } } @Override public void inventoryTick( - ItemStack stack, World world, Entity entity, int slot, boolean selected) { - if (!world.isClient()) { + ItemStack stack, Level world, Entity entity, int slot, boolean selected) { + if (!world.isClientSide()) { if (entity instanceof LivingEntity pe) { // selected doesn't account for offhand - if (!ItemStack.areItemsEqual(stack, pe.getStackInHand(Hand.MAIN_HAND)) - && !ItemStack.areItemsEqual(stack, pe.getStackInHand(Hand.OFF_HAND))) return; + if (!ItemStack.isSameItem(stack, pe.getItemInHand(InteractionHand.MAIN_HAND)) + && !ItemStack.isSameItem(stack, pe.getItemInHand(InteractionHand.OFF_HAND))) return; } else if (!selected) return; Set magnetables = magnetable(stack); int level = getLevel(stack); world - .getEntitiesByClass( + .getEntitiesOfClass( ItemEntity.class, - new Box(entity.getBlockPos()) - .expand(level + new AABB(entity.blockPosition()) + .inflate(level * world .am$get(Magnet.CONFIG) .rangeMultiplier @@ -170,30 +170,30 @@ public class MagnetItem extends Item { world, builder -> builder.origin(entity).tool(stack).thisEntity(entity)))), ie -> - magnetables.contains(ie.getDataTracker().get(ItemEntity.STACK).getItem())) + magnetables.contains(ie.getEntityData().get(ItemEntity.DATA_ITEM).getItem())) .forEach(ie -> { - Vec3d vel = ie.getPos().relativize(entity.getPos()).normalize().multiply(0.05f * level); - ie.addVelocity(vel.x, vel.y, vel.z); + Vec3 vel = ie.position().vectorTo(entity.position()).normalize().scale(0.05f * level); + ie.push(vel.x, vel.y, vel.z); }); } } @Override - public Optional getTooltipData(ItemStack stack) { - DefaultedList defaultedList = DefaultedList.of(); - magnetable(stack).forEach(item -> defaultedList.add(item.getDefaultStack())); - return Optional.of(new BundleTooltipData(defaultedList, Integer.MAX_VALUE)); + public Optional getTooltipImage(ItemStack stack) { + NonNullList defaultedList = NonNullList.create(); + magnetable(stack).forEach(item -> defaultedList.add(item.getDefaultInstance())); + return Optional.of(new BundleTooltip(defaultedList, Integer.MAX_VALUE)); } @Override - public void appendTooltip( - ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + public void appendHoverText( + ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { tooltip.add(TextUtil.translatable("tooltip.andromeda.magnet.level", getLevel(stack)) - .formatted(Formatting.GRAY)); + .withStyle(ChatFormatting.GRAY)); } private static boolean incrementLevel(ItemStack stack) { - NbtCompound nbt = stack.getOrCreateNbt(); + CompoundTag nbt = stack.getOrCreateTag(); if (!nbt.contains(LEVEL_KEY)) nbt.putInt(LEVEL_KEY, 1); int level = nbt.getInt(LEVEL_KEY); if (level >= 5) return false; @@ -202,7 +202,7 @@ public class MagnetItem extends Item { } private static int getLevel(ItemStack stack) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); if (nbt != null) { if (nbt.contains(LEVEL_KEY)) return MathUtil.clamp(nbt.getInt(LEVEL_KEY), 0, 5); } @@ -210,69 +210,69 @@ public class MagnetItem extends Item { } public static void addFirst(ItemStack bundle, ItemStack other) { - NbtCompound nbt = bundle.getOrCreateNbt(); + CompoundTag nbt = bundle.getOrCreateTag(); if (!nbt.contains("Items")) { - nbt.put("Items", new NbtList()); + nbt.put("Items", new ListTag()); } - NbtList list = nbt.getList("Items", NbtElement.STRING_TYPE); - NbtString id = NbtString.of(Registries.ITEM.getId(other.getItem()).toString()); + ListTag list = nbt.getList("Items", Tag.TAG_STRING); + StringTag id = StringTag.valueOf(BuiltInRegistries.ITEM.getKey(other.getItem()).toString()); if (list.contains(id)) return; list.add(0, id); } private static void removeFirst(ItemStack stack) { - NbtCompound nbt = stack.getOrCreateNbt(); + CompoundTag nbt = stack.getOrCreateTag(); if (nbt.contains("Items")) { - NbtList list = nbt.getList("Items", NbtElement.STRING_TYPE); + ListTag list = nbt.getList("Items", Tag.TAG_STRING); if (!list.isEmpty()) { list.remove(0); - if (list.isEmpty()) stack.removeSubNbt("Items"); + if (list.isEmpty()) stack.removeTagKey("Items"); } } } private static Set magnetable(ItemStack stack) { - NbtCompound nbt = stack.getNbt(); + CompoundTag nbt = stack.getTag(); if (nbt == null) { return Collections.emptySet(); } else { - NbtList nbtList = nbt.getList("Items", NbtElement.STRING_TYPE); + ListTag nbtList = nbt.getList("Items", Tag.TAG_STRING); return nbtList.stream() - .map(NbtString.class::cast) - .map(s -> Registries.ITEM.get(new Identifier(s.asString()))) + .map(StringTag.class::cast) + .map(s -> BuiltInRegistries.ITEM.get(new ResourceLocation(s.getAsString()))) .collect(ImmutableSet.toImmutableSet()); } } private void playUpgradeSound(Entity entity) { entity.playSound( - SoundEvents.BLOCK_ENCHANTMENT_TABLE_USE, + SoundEvents.ENCHANTMENT_TABLE_USE, 0.8F, - 0.8F + entity.getWorld().getRandom().nextFloat() * 0.4F); + 0.8F + entity.level().getRandom().nextFloat() * 0.4F); } private void playRemoveOneSound(Entity entity) { entity.playSound( - SoundEvents.ITEM_BUNDLE_REMOVE_ONE, + SoundEvents.BUNDLE_REMOVE_ONE, 0.8F, - 0.8F + entity.getWorld().getRandom().nextFloat() * 0.4F); + 0.8F + entity.level().getRandom().nextFloat() * 0.4F); } private void playInsertSound(Entity entity) { entity.playSound( - SoundEvents.ITEM_BUNDLE_INSERT, + SoundEvents.BUNDLE_INSERT, 0.8F, - 0.8F + entity.getWorld().getRandom().nextFloat() * 0.4F); + 0.8F + entity.level().getRandom().nextFloat() * 0.4F); } static void init() { var module = ModuleManager.get().get(Magnet.class).orElseThrow(); MagnetItem.MAGNET.init(RegistryUtil.register( - Registries.ITEM, id("magnet"), () -> new MagnetItem(new FabricItemSettings().maxCount(1)))); + BuiltInRegistries.ITEM, id("magnet"), () -> new MagnetItem(new FabricItemSettings().stacksTo(1)))); AndromedaItemGroup.BUS.listen( - acceptor -> acceptor.keeper(module, ItemGroups.TOOLS, MagnetItem.MAGNET)); + acceptor -> acceptor.keeper(module, CreativeModeTabs.TOOLS_AND_UTILITIES, MagnetItem.MAGNET)); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PickUpBehaviorHandler.java b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PickUpBehaviorHandler.java index d9e56fdd..10670b74 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PickUpBehaviorHandler.java +++ b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PickUpBehaviorHandler.java @@ -5,17 +5,17 @@ import java.util.Optional; import me.melontini.dark_matter.api.base.util.MakeSure; import me.melontini.dark_matter.api.data.nbt.NbtBuilder; import me.melontini.dark_matter.api.data.nbt.NbtUtil; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.AbstractFurnaceBlockEntity; -import net.minecraft.block.entity.ChestBlockEntity; -import net.minecraft.block.entity.HopperBlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import net.minecraft.world.level.block.entity.HopperBlockEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public class PickUpBehaviorHandler { @@ -37,8 +37,8 @@ public class PickUpBehaviorHandler { world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); ItemStack chestMinecart = new ItemStack(Items.CHEST_MINECART, 1); - chestMinecart.setNbt(NbtUtil.writeInventoryToNbt(new NbtCompound(), chestBlockEntity)); - chestBlockEntity.clear(); + chestMinecart.setTag(NbtUtil.writeInventoryToNbt(new CompoundTag(), chestBlockEntity)); + chestBlockEntity.clearContent(); return chestMinecart; }); @@ -49,8 +49,8 @@ public class PickUpBehaviorHandler { world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); ItemStack furnaceMinecart = new ItemStack(Items.FURNACE_MINECART, 1); // 2.25 - furnaceMinecart.setNbt(NbtBuilder.create() - .putInt("Fuel", (int) (furnaceBlock.burnTime * 2.25)) + furnaceMinecart.setTag(NbtBuilder.create() + .putInt("Fuel", (int) (furnaceBlock.litTime * 2.25)) .build()); return furnaceMinecart; }); @@ -60,13 +60,13 @@ public class PickUpBehaviorHandler { world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); ItemStack hopperMinecart = new ItemStack(Items.HOPPER_MINECART, 1); - hopperMinecart.setNbt(NbtUtil.writeInventoryToNbt(new NbtCompound(), hopperBlockEntity)); - hopperBlockEntity.clear(); + hopperMinecart.setTag(NbtUtil.writeInventoryToNbt(new CompoundTag(), hopperBlockEntity)); + hopperBlockEntity.clearContent(); return hopperMinecart; }); } public interface PickUpBehavior { - @Nullable ItemStack pickUp(BlockState state, World world, BlockPos pos); + @Nullable ItemStack pickUp(BlockState state, Level world, BlockPos pos); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PlaceBehaviorHandler.java b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PlaceBehaviorHandler.java index 4d18c00d..caf2b10a 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PlaceBehaviorHandler.java +++ b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/PlaceBehaviorHandler.java @@ -6,15 +6,15 @@ import me.melontini.andromeda.bootstrap.ModuleManager; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.modules.entities.better_furnace_minecart.BetterFurnaceMinecart; import me.melontini.dark_matter.api.data.nbt.NbtUtil; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.entity.vehicle.ChestMinecartEntity; -import net.minecraft.entity.vehicle.FurnaceMinecartEntity; -import net.minecraft.entity.vehicle.HopperMinecartEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.MinecartChest; +import net.minecraft.world.entity.vehicle.MinecartFurnace; +import net.minecraft.world.entity.vehicle.MinecartHopper; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; public class PlaceBehaviorHandler { @@ -31,29 +31,29 @@ public class PlaceBehaviorHandler { public static void init() { registerPlaceBehavior(Items.CHEST_MINECART, (stack, world, d, e, f, g, pos) -> { - ChestMinecartEntity chestMinecart = (ChestMinecartEntity) - AbstractMinecartEntity.create(world, d, e + g, f, AbstractMinecartEntity.Type.CHEST); + MinecartChest chestMinecart = (MinecartChest) + AbstractMinecart.createMinecart(world, d, e + g, f, AbstractMinecart.Type.CHEST); - NbtUtil.readInventoryFromNbt(stack.getNbt(), chestMinecart); - if (stack.hasCustomName()) chestMinecart.setCustomName(stack.getName()); + NbtUtil.readInventoryFromNbt(stack.getTag(), chestMinecart); + if (stack.hasCustomHoverName()) chestMinecart.setCustomName(stack.getHoverName()); return chestMinecart; }); registerPlaceBehavior(Items.HOPPER_MINECART, (stack, world, d, e, f, g, pos) -> { - HopperMinecartEntity hopperMinecart = (HopperMinecartEntity) - AbstractMinecartEntity.create(world, d, e + g, f, AbstractMinecartEntity.Type.HOPPER); + MinecartHopper hopperMinecart = (MinecartHopper) + AbstractMinecart.createMinecart(world, d, e + g, f, AbstractMinecart.Type.HOPPER); - NbtUtil.readInventoryFromNbt(stack.getNbt(), hopperMinecart); - if (stack.hasCustomName()) hopperMinecart.setCustomName(stack.getName()); + NbtUtil.readInventoryFromNbt(stack.getTag(), hopperMinecart); + if (stack.hasCustomHoverName()) hopperMinecart.setCustomName(stack.getHoverName()); return hopperMinecart; }); registerPlaceBehavior(Items.FURNACE_MINECART, (stack, world, d, e, f, g, pos) -> { - FurnaceMinecartEntity furnaceMinecart = (FurnaceMinecartEntity) - AbstractMinecartEntity.create(world, d, e + g, f, AbstractMinecartEntity.Type.FURNACE); + MinecartFurnace furnaceMinecart = (MinecartFurnace) + AbstractMinecart.createMinecart(world, d, e + g, f, AbstractMinecart.Type.FURNACE); furnaceMinecart.fuel = NbtUtil.getInt( - stack.getNbt(), + stack.getTag(), "Fuel", 0, ModuleManager.get() @@ -61,17 +61,17 @@ public class PlaceBehaviorHandler { .map(m -> Andromeda.MAIN.get(BetterFurnaceMinecart.CONFIG).maxFuel) .orElse(32000)); if (furnaceMinecart.fuel > 0) { - furnaceMinecart.pushX = furnaceMinecart.getX() - pos.getX(); - furnaceMinecart.pushZ = furnaceMinecart.getZ() - pos.getZ(); + furnaceMinecart.xPush = furnaceMinecart.getX() - pos.getX(); + furnaceMinecart.zPush = furnaceMinecart.getZ() - pos.getZ(); } - if (stack.hasCustomName()) furnaceMinecart.setCustomName(stack.getName()); + if (stack.hasCustomHoverName()) furnaceMinecart.setCustomName(stack.getHoverName()); return furnaceMinecart; }); } public interface PlaceBehavior { - AbstractMinecartEntity dispense( - ItemStack stack, World world, double d, double e, double f, double g, BlockPos pos); + AbstractMinecart dispense( + ItemStack stack, Level world, double d, double e, double f, double g, BlockPos pos); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/ItemDispenserBehaviorMixin.java b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/ItemDispenserBehaviorMixin.java index 4895cdf3..d5fe3bda 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/ItemDispenserBehaviorMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/ItemDispenserBehaviorMixin.java @@ -2,16 +2,16 @@ package me.melontini.andromeda.modules.items.minecart_block_picking.mixin; import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.modules.items.minecart_block_picking.PlaceBehaviorHandler; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPointer; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.BlockSource; +import net.minecraft.core.BlockPos; 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(targets = "net/minecraft/item/MinecartItem$1") +@Mixin(targets = "net.minecraft.world.item.MinecartItem$1") abstract class ItemDispenserBehaviorMixin { @Inject( @@ -19,26 +19,26 @@ abstract class ItemDispenserBehaviorMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/vehicle/AbstractMinecartEntity;create(Lnet/minecraft/world/World;DDDLnet/minecraft/entity/vehicle/AbstractMinecartEntity$Type;)Lnet/minecraft/entity/vehicle/AbstractMinecartEntity;", + "Lnet/minecraft/world/entity/vehicle/AbstractMinecart;createMinecart(Lnet/minecraft/world/level/Level;DDDLnet/minecraft/world/entity/vehicle/AbstractMinecart$Type;)Lnet/minecraft/world/entity/vehicle/AbstractMinecart;", shift = At.Shift.BEFORE), - method = "dispenseSilently", + method = "execute", cancellable = true) public void andromeda$dispenseSilently( - BlockPointer pointer, - ItemStack stack, - CallbackInfoReturnable cir, - @Local(index = 5) double d, - @Local(index = 7) double e, - @Local(index = 9) double f, - @Local(index = 14) double g, - @Local BlockPos blockPos) { + BlockSource pointer, + ItemStack stack, + CallbackInfoReturnable cir, + @Local(index = 5) double d, + @Local(index = 7) double e, + @Local(index = 9) double f, + @Local(index = 14) double g, + @Local BlockPos blockPos) { PlaceBehaviorHandler.getPlaceBehavior(stack.getItem()).ifPresent(b -> { - if (!pointer.getWorld().isClient()) { - AbstractMinecartEntity entity = b.dispense(stack, pointer.getWorld(), d, e, f, g, blockPos); + if (!pointer.getLevel().isClientSide()) { + AbstractMinecart entity = b.dispense(stack, pointer.getLevel(), d, e, f, g, blockPos); if (entity == null) return; - pointer.getWorld().spawnEntity(entity); - stack.decrement(1); + pointer.getLevel().addFreshEntity(entity); + stack.shrink(1); } cir.setReturnValue(stack); }); diff --git a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java index 2cd06b99..be22ef43 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java @@ -4,16 +4,20 @@ import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.items.minecart_block_picking.MinecartBlockPicking; import me.melontini.andromeda.modules.items.minecart_block_picking.PickUpBehaviorHandler; import me.melontini.andromeda.modules.items.minecart_block_picking.PlaceBehaviorHandler; -import net.minecraft.block.AbstractRailBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.enums.RailShape; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.vehicle.AbstractMinecartEntity; -import net.minecraft.item.*; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.util.ActionResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.MinecartItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.RailShape; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionResult; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -23,60 +27,60 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(MinecartItem.class) abstract class MinecartItemMixin extends Item { - public MinecartItemMixin(Settings settings) { - super(settings); - } + public MinecartItemMixin(Properties properties) { + super(properties); + } - @Inject(at = @At("HEAD"), method = "useOnBlock", cancellable = true) + @Inject(at = @At("HEAD"), method = "useOn", cancellable = true) public void andromeda$useOnStuff( - @NotNull ItemUsageContext context, CallbackInfoReturnable cir) { - World world = context.getWorld(); - BlockPos pos = context.getBlockPos(); + UseOnContext context, CallbackInfoReturnable cir) { + Level world = context.getLevel(); + BlockPos pos = context.getClickedPos(); BlockState state = world.getBlockState(pos); - ItemStack stack = context.getStack(); - PlayerEntity player = context.getPlayer(); + ItemStack stack = context.getItemInHand(); + Player player = context.getPlayer(); if (player == null) return; - if (state.isIn(BlockTags.RAILS)) { - RailShape railShape = state.getBlock() instanceof AbstractRailBlock - ? state.get(((AbstractRailBlock) state.getBlock()).getShapeProperty()) + if (state.is(BlockTags.RAILS)) { + RailShape railShape = state.getBlock() instanceof BaseRailBlock + ? state.getValue(((BaseRailBlock) state.getBlock()).getShapeProperty()) : RailShape.NORTH_SOUTH; double d = railShape.isAscending() ? 0.5 : 0.0; PlaceBehaviorHandler.getPlaceBehavior(stack.getItem()).ifPresent(b -> { - if (!world.isClient()) { - AbstractMinecartEntity entity = b.dispense( + if (!world.isClientSide()) { + AbstractMinecart entity = b.dispense( stack, world, pos.getX() + 0.5, pos.getY() + 0.0625, pos.getZ() + 0.5, d, pos); if (entity == null) return; - world.spawnEntity(entity); - if (!player.isCreative()) stack.decrement(1); + world.addFreshEntity(entity); + if (!player.isCreative()) stack.shrink(1); } - cir.setReturnValue(ActionResult.success(world.isClient())); + cir.setReturnValue(InteractionResult.sidedSuccess(world.isClientSide())); }); return; } - if (player.isSneaking()) { + if (player.isShiftKeyDown()) { if (stack.getItem() != Items.MINECART) return; PickUpBehaviorHandler.getPickUpBehavior(state.getBlock()).ifPresent(b -> { - if (!world.isClient()) { + if (!world.isClientSide()) { if (!world .am$get(MinecartBlockPicking.CONFIG) .available .asBoolean(LootContextBuilder.fishing( world, - builder -> builder.origin(context.getHitPos()).tool(stack).thisEntity(player)))) + builder -> builder.origin(context.getClickLocation()).tool(stack).thisEntity(player)))) return; ItemStack stack1 = b.pickUp(state, world, pos); if (stack1 == null || stack1.isEmpty()) return; - if (!player.isCreative()) stack.decrement(1); - player.getInventory().offerOrDrop(stack1); - world.breakBlock(pos, false); + if (!player.isCreative()) stack.shrink(1); + player.getInventory().placeItemBackInInventory(stack1); + world.destroyBlock(pos, false); } - cir.setReturnValue(ActionResult.success(world.isClient())); + cir.setReturnValue(InteractionResult.sidedSuccess(world.isClientSide())); }); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/pouches/Main.java b/src/main/java/me/melontini/andromeda/modules/items/pouches/Main.java index d5bd7552..9dfafdea 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/pouches/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/items/pouches/Main.java @@ -20,22 +20,22 @@ import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; import net.fabricmc.fabric.api.transfer.v1.storage.Storage; import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil; import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.ProjectileDispenserBehavior; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.block.entity.ViewerCountManager; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.item.ItemGroups; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.Registries; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Position; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.entity.ContainerOpenersCounter; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Position; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public final class Main { @@ -53,15 +53,15 @@ public final class Main { public static int getViewCount(BlockEntity be) { Field f = Main.VIEWABLE_VIEW.get(be.getType()); if (f != null) { - ViewerCountManager vcm = (ViewerCountManager) Exceptions.supply(() -> f.get(be)); - return vcm.getViewerCount(); + ContainerOpenersCounter vcm = (ContainerOpenersCounter) Exceptions.supply(() -> f.get(be)); + return vcm.getOpenerCount(); } return -1; } @SuppressWarnings("UnstableApiUsage") public static void tryInsertItem( - World world, Vec3d pos, ItemStack stack, Storage storage) { + Level world, Vec3 pos, ItemStack stack, Storage storage) { if (stack.isEmpty()) return; ItemStack itemStack = stack.copy(); try (Transaction transaction = Transaction.openOuter()) { @@ -81,31 +81,31 @@ public final class Main { var config = Andromeda.MAIN.get(Pouches.MAIN_CONFIG); SEED_POUCH.init(RegistryUtil.register( config.seedPouch, - Registries.ITEM, + BuiltInRegistries.ITEM, id("seed_pouch"), - () -> new PouchItem(PouchEntity.Type.SEED, new FabricItemSettings().maxCount(16)))); + () -> new PouchItem(PouchEntity.Type.SEED, new FabricItemSettings().stacksTo(16)))); FLOWER_POUCH.init(RegistryUtil.register( config.flowerPouch, - Registries.ITEM, + BuiltInRegistries.ITEM, id("flower_pouch"), - () -> new PouchItem(PouchEntity.Type.FLOWER, new FabricItemSettings().maxCount(16)))); + () -> new PouchItem(PouchEntity.Type.FLOWER, new FabricItemSettings().stacksTo(16)))); SAPLING_POUCH.init(RegistryUtil.register( config.saplingPouch, - Registries.ITEM, + BuiltInRegistries.ITEM, id("sapling_pouch"), - () -> new PouchItem(PouchEntity.Type.SAPLING, new FabricItemSettings().maxCount(16)))); + () -> new PouchItem(PouchEntity.Type.SAPLING, new FabricItemSettings().stacksTo(16)))); SPECIAL_POUCH.init(RegistryUtil.register( config.specialPouch, - Registries.ITEM, + BuiltInRegistries.ITEM, id("special_pouch"), - () -> new PouchItem(PouchEntity.Type.CUSTOM, new FabricItemSettings().maxCount(16)))); + () -> new PouchItem(PouchEntity.Type.CUSTOM, new FabricItemSettings().stacksTo(16)))); POUCH.init(RegistryUtil.register( - Registries.ENTITY_TYPE, id("pouch"), () -> FabricEntityTypeBuilder.create( - SpawnGroup.MISC, PouchEntity::new) + BuiltInRegistries.ENTITY_TYPE, id("pouch"), () -> FabricEntityTypeBuilder.create( + MobCategory.MISC, PouchEntity::new) .dimensions(new EntityDimensions(0.25F, 0.25F, true)) .trackRangeChunks(4) .trackedUpdateRate(10) @@ -115,12 +115,12 @@ public final class Main { List> l = List.of(SEED_POUCH, FLOWER_POUCH, SAPLING_POUCH, SPECIAL_POUCH); AndromedaItemGroup.BUS.listen( - acceptor -> acceptor.keepers(module, ItemGroups.TOOLS, new ArrayList<>(l))); + acceptor -> acceptor.keepers(module, CreativeModeTabs.TOOLS_AND_UTILITIES, new ArrayList<>(l))); - var behavior = new ProjectileDispenserBehavior() { + var behavior = new AbstractProjectileDispenseBehavior() { @Override - protected ProjectileEntity createProjectile(World world, Position position, ItemStack stack) { - var pouch = new PouchEntity(position.getX(), position.getY(), position.getZ(), world); + protected Projectile getProjectile(Level world, Position position, ItemStack stack) { + var pouch = new PouchEntity(position.x(), position.y(), position.z(), world); pouch.setPouchType(((PouchItem) stack.getItem()).getType()); return pouch; } @@ -148,7 +148,7 @@ public final class Main { private static @Nullable Field traverse(Class cls) { for (Field f : cls.getDeclaredFields()) { - if (f.getType() == ViewerCountManager.class) { + if (f.getType() == ContainerOpenersCounter.class) { return f; } } @@ -158,22 +158,22 @@ public final class Main { static void testBlocks() { var module = ModuleManager.get().get(Pouches.class).orElseThrow(); - for (BlockEntityType type : Registries.BLOCK_ENTITY_TYPE) { - var o = type.blocks.stream().findAny(); + for (BlockEntityType type : BuiltInRegistries.BLOCK_ENTITY_TYPE) { + var o = type.validBlocks.stream().findAny(); if (o.isPresent()) { try { - test(type.instantiate(BlockPos.ORIGIN, o.orElseThrow().getDefaultState()), module); + test(type.create(BlockPos.ZERO, o.orElseThrow().defaultBlockState()), module); } catch (Exception e) { module .logger() .error( "{} failed the ViewerCountManager test. {}: {}", - Registries.BLOCK_ENTITY_TYPE.getId(type), + BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(type), e.getClass().getSimpleName(), e.getLocalizedMessage()); } } else { - module.logger().warn("{} has no blocks?", Registries.BLOCK_ENTITY_TYPE.getId(type)); + module.logger().warn("{} has no blocks?", BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(type)); } } @@ -182,7 +182,7 @@ public final class Main { b.append("Viewable block entities:"); Main.VIEWABLE_VIEW.forEach((blockEntityType, field) -> { b.append('\n') - .append(Registries.BLOCK_ENTITY_TYPE.getId(blockEntityType)) + .append(BuiltInRegistries.BLOCK_ENTITY_TYPE.getKey(blockEntityType)) .append(": ") .append(field.getName()); }); diff --git a/src/main/java/me/melontini/andromeda/modules/items/pouches/Trades.java b/src/main/java/me/melontini/andromeda/modules/items/pouches/Trades.java index e8516316..e319c5bc 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/pouches/Trades.java +++ b/src/main/java/me/melontini/andromeda/modules/items/pouches/Trades.java @@ -1,10 +1,10 @@ package me.melontini.andromeda.modules.items.pouches; import net.fabricmc.fabric.api.object.builder.v1.trade.TradeOfferHelper; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.village.TradeOffer; -import net.minecraft.village.VillagerProfession; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraft.world.entity.npc.VillagerProfession; public class Trades { @@ -13,7 +13,7 @@ public class Trades { TradeOfferHelper.registerVillagerOffers( VillagerProfession.FARMER, 2, - factories -> factories.add((entity, random) -> new TradeOffer( + factories -> factories.add((entity, random) -> new MerchantOffer( new ItemStack(Items.EMERALD, 5), new ItemStack(Main.SAPLING_POUCH.orThrow(), 1), 12, @@ -25,7 +25,7 @@ public class Trades { TradeOfferHelper.registerVillagerOffers( VillagerProfession.FARMER, 2, - factories -> factories.add((entity, random) -> new TradeOffer( + factories -> factories.add((entity, random) -> new MerchantOffer( new ItemStack(Items.EMERALD, 4), new ItemStack(Main.FLOWER_POUCH.orThrow(), 1), 12, @@ -37,7 +37,7 @@ public class Trades { TradeOfferHelper.registerVillagerOffers( VillagerProfession.FARMER, 2, - factories -> factories.add((entity, random) -> new TradeOffer( + factories -> factories.add((entity, random) -> new MerchantOffer( new ItemStack(Items.EMERALD, 3), new ItemStack(Main.SEED_POUCH.orThrow(), 1), 12, diff --git a/src/main/java/me/melontini/andromeda/modules/items/pouches/client/Client.java b/src/main/java/me/melontini/andromeda/modules/items/pouches/client/Client.java index 340a68e4..81fd7215 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/pouches/client/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/items/pouches/client/Client.java @@ -2,11 +2,11 @@ package me.melontini.andromeda.modules.items.pouches.client; import me.melontini.andromeda.modules.items.pouches.Main; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.minecraft.client.render.entity.FlyingItemEntityRenderer; +import net.minecraft.client.renderer.entity.ThrownItemRenderer; public class Client { public static void init() { - EntityRendererRegistry.register(Main.POUCH.orThrow(), FlyingItemEntityRenderer::new); + EntityRendererRegistry.register(Main.POUCH.orThrow(), ThrownItemRenderer::new); } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/pouches/entities/PouchEntity.java b/src/main/java/me/melontini/andromeda/modules/items/pouches/entities/PouchEntity.java index 7c405ce6..ed6633e8 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/pouches/entities/PouchEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/items/pouches/entities/PouchEntity.java @@ -12,57 +12,57 @@ import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.minecraft.util.ItemStackUtil; import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.fabricmc.fabric.api.transfer.v1.item.ItemStorage; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.InventoryOwner; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.data.DataTracker; -import net.minecraft.entity.data.TrackedData; -import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.particle.ItemStackParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.world.World; -import net.minecraft.world.event.GameEvent; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.npc.InventoryCarrier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.EntityDataSerializers; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.gameevent.GameEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PouchEntity extends ThrownItemEntity { +public class PouchEntity extends ThrowableItemProjectile { - private static final TrackedData POUCH_TYPE = - DataTracker.registerData(PouchEntity.class, TrackedDataHandlerRegistry.INTEGER); + private static final EntityDataAccessor POUCH_TYPE = + SynchedEntityData.defineId(PouchEntity.class, EntityDataSerializers.INT); - public PouchEntity(EntityType entityType, World world) { + public PouchEntity(EntityType entityType, Level world) { super(entityType, world); } - public PouchEntity(double d, double e, double f, World world) { + public PouchEntity(double d, double e, double f, Level world) { super(Main.POUCH.orThrow(), d, e, f, world); } - public PouchEntity(LivingEntity livingEntity, World world) { + public PouchEntity(LivingEntity livingEntity, Level world) { super(Main.POUCH.orThrow(), livingEntity, world); } @Override - protected void onCollision(HitResult hitResult) { + protected void onHit(HitResult hitResult) { HitResult.Type type = hitResult.getType(); - ItemStack stack = getStack(); + ItemStack stack = getItem(); if (type == HitResult.Type.ENTITY) { - this.onEntityHit((EntityHitResult) hitResult); - if (world instanceof ServerWorld sw) { - sw.spawnParticles( - new ItemStackParticleEffect(ParticleTypes.ITEM, stack), + this.onHitEntity((EntityHitResult) hitResult); + if (level instanceof ServerLevel sw) { + sw.sendParticles( + new ItemParticleOption(ParticleTypes.ITEM, stack), getX(), getY(), getZ(), @@ -74,10 +74,10 @@ public class PouchEntity extends ThrownItemEntity { } this.discard(); } else if (type == HitResult.Type.BLOCK) { - this.onBlockHit((BlockHitResult) hitResult); - if (world instanceof ServerWorld sw) { - sw.spawnParticles( - new ItemStackParticleEffect(ParticleTypes.ITEM, stack), + this.onHitBlock((BlockHitResult) hitResult); + if (level instanceof ServerLevel sw) { + sw.sendParticles( + new ItemParticleOption(ParticleTypes.ITEM, stack), getX(), getY(), getZ(), @@ -91,60 +91,60 @@ public class PouchEntity extends ThrownItemEntity { } if (type != HitResult.Type.MISS) { - this.emitGameEvent(GameEvent.PROJECTILE_LAND, this.getOwner()); + this.gameEvent(GameEvent.PROJECTILE_LAND, this.getOwner()); } } @Override - protected void onEntityHit(EntityHitResult entityHitResult) { - if (!world.isClient()) { - var stacks = LootContextBuilder.prepareLoot(world, this.getPouchType().getLootId(getStack())); + protected void onHitEntity(EntityHitResult entityHitResult) { + if (!level.isClientSide()) { + var stacks = LootContextBuilder.prepareLoot(level, this.getPouchType().getLootId(getItem())); Entity entity = entityHitResult.getEntity(); - if (entity instanceof PlayerEntity pe) { - stacks.forEach(stack -> pe.getInventory().offerOrDrop(stack)); + if (entity instanceof Player pe) { + stacks.forEach(stack -> pe.getInventory().placeItemBackInInventory(stack)); return; - } else if (entity instanceof InventoryOwner io) { + } else if (entity instanceof InventoryCarrier io) { var storage = InventoryStorage.of(io.getInventory(), null); - stacks.forEach(stack -> Main.tryInsertItem(world, this.getPos(), stack, storage)); + stacks.forEach(stack -> Main.tryInsertItem(level, this.position(), stack, storage)); return; - } else if (entity instanceof Inventory inv) { + } else if (entity instanceof Container inv) { var storage = InventoryStorage.of(inv, null); - stacks.forEach(stack -> Main.tryInsertItem(world, this.getPos(), stack, storage)); + stacks.forEach(stack -> Main.tryInsertItem(level, this.position(), stack, storage)); return; } stacks.forEach(stack -> - ItemStackUtil.spawnVelocity(this.getPos(), stack, world, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2)); + ItemStackUtil.spawnVelocity(this.position(), stack, level, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2)); } } @Override - protected void onBlockHit(BlockHitResult blockHitResult) { - if (!world.isClient()) { - var stacks = LootContextBuilder.prepareLoot(world, this.getPouchType().getLootId(getStack())); + protected void onHitBlock(BlockHitResult blockHitResult) { + if (!level.isClientSide()) { + var stacks = LootContextBuilder.prepareLoot(level, this.getPouchType().getLootId(getItem())); - var be = world.getBlockEntity(blockHitResult.getBlockPos()); + var be = level.getBlockEntity(blockHitResult.getBlockPos()); if ((be != null && Main.getViewCount(be) > 0)) { var storage = ItemStorage.SIDED.find( - world, + level, blockHitResult.getBlockPos(), - world.getBlockState(blockHitResult.getBlockPos()), + level.getBlockState(blockHitResult.getBlockPos()), be, - blockHitResult.getSide()); + blockHitResult.getDirection()); if (storage != null) { - stacks.forEach(stack -> Main.tryInsertItem(world, this.getPos(), stack, storage)); + stacks.forEach(stack -> Main.tryInsertItem(level, this.position(), stack, storage)); return; } } stacks.forEach(stack -> - ItemStackUtil.spawnVelocity(this.getPos(), stack, world, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2)); + ItemStackUtil.spawnVelocity(this.position(), stack, level, -0.2, 0.2, 0.1, 0.2, -0.2, 0.2)); } } @Override - protected void initDataTracker() { - super.initDataTracker(); - this.dataTracker.startTracking(POUCH_TYPE, Type.SEED.syncId); + protected void defineSynchedData() { + super.defineSynchedData(); + this.entityData.define(POUCH_TYPE, Type.SEED.syncId); } @Override @@ -153,20 +153,20 @@ public class PouchEntity extends ThrownItemEntity { } public Type getPouchType() { - return Type.getType(this.dataTracker.get(POUCH_TYPE)); + return Type.getType(this.entityData.get(POUCH_TYPE)); } public void setPouchType(Type type) { - this.dataTracker.set(POUCH_TYPE, type.syncId); + this.entityData.set(POUCH_TYPE, type.syncId); } @Override - public void writeCustomDataToNbt(NbtCompound nbt) { + public void addAdditionalSaveData(CompoundTag nbt) { nbt.putString("Type", getPouchType().name()); } @Override - public void readCustomDataFromNbt(NbtCompound nbt) { + public void readAdditionalSaveData(CompoundTag nbt) { if (nbt.contains("Type")) { setPouchType(Type.valueOf(nbt.getString("Type"))); } @@ -178,10 +178,10 @@ public class PouchEntity extends ThrownItemEntity { FLOWER(2, Andromeda.id("pouches/flowers"), Main.FLOWER_POUCH), CUSTOM(3, null, Main.SPECIAL_POUCH) { @Override - public @NotNull Identifier getLootId(ItemStack stack) { - NbtCompound nbt = stack.getNbt(); + public @NotNull ResourceLocation getLootId(ItemStack stack) { + CompoundTag nbt = stack.getTag(); if (nbt != null && nbt.contains("CustomLootId")) { - return new Identifier(nbt.getString("CustomLootId")); + return new ResourceLocation(nbt.getString("CustomLootId")); } return SEED.getLootId(stack); } @@ -197,17 +197,17 @@ public class PouchEntity extends ThrownItemEntity { private final int syncId; - @Nullable private final Identifier lootId; + @Nullable private final ResourceLocation lootId; private final Keeper defaultItem; - Type(int syncId, @Nullable Identifier lootId, Keeper defaultItem) { + Type(int syncId, @Nullable ResourceLocation lootId, Keeper defaultItem) { this.syncId = syncId; this.lootId = lootId; this.defaultItem = defaultItem; } - public @NotNull Identifier getLootId(ItemStack stack) { + public @NotNull ResourceLocation getLootId(ItemStack stack) { return Objects.requireNonNull(lootId); } diff --git a/src/main/java/me/melontini/andromeda/modules/items/pouches/items/PouchItem.java b/src/main/java/me/melontini/andromeda/modules/items/pouches/items/PouchItem.java index aa6ac698..27bf00e1 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/pouches/items/PouchItem.java +++ b/src/main/java/me/melontini/andromeda/modules/items/pouches/items/PouchItem.java @@ -9,24 +9,24 @@ import me.melontini.andromeda.util.Util; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.fabric.api.transfer.v1.item.InventoryStorage; import net.fabricmc.fabric.api.transfer.v1.item.PlayerInventoryStorage; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.entity.InventoryOwner; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ItemStackParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.stat.Stats; -import net.minecraft.text.Text; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Formatting; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.entity.npc.InventoryCarrier; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.ChatFormatting; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; @Getter @@ -34,72 +34,72 @@ public class PouchItem extends Item { private final PouchEntity.Type type; - public PouchItem(PouchEntity.Type type, Settings settings) { + public PouchItem(PouchEntity.Type type, Properties settings) { super(settings); this.type = type; } @Override - public void appendTooltip( - ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + public void appendHoverText( + ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { if (context.isAdvanced() && Util.isDev()) { tooltip.add( - TextUtil.literal("Loot: " + this.getType().getLootId(stack)).formatted(Formatting.GRAY)); + TextUtil.literal("Loot: " + this.getType().getLootId(stack)).withStyle(ChatFormatting.GRAY)); } } @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { - ItemStack itemStack = user.getStackInHand(hand); + public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { + ItemStack itemStack = user.getItemInHand(hand); world.playSound( null, user.getX(), user.getY(), user.getZ(), - SoundEvents.ENTITY_SNOWBALL_THROW, - SoundCategory.NEUTRAL, + SoundEvents.SNOWBALL_THROW, + SoundSource.NEUTRAL, 0.5F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); - if (!world.isClient) { + if (!world.isClientSide) { var entity = new PouchEntity(user, world); entity.setPouchType(this.type); - entity.setPos(user.getX(), user.getEyeY() - 0.1F, user.getZ()); - entity.setVelocity(user, user.getPitch(), user.getYaw(), 0.0F, 1.5F, 1.0F); + entity.setPosRaw(user.getX(), user.getEyeY() - 0.1F, user.getZ()); + entity.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); entity.setItem(itemStack); - world.spawnEntity(entity); + world.addFreshEntity(entity); } - user.incrementStat(Stats.USED.getOrCreateStat(this)); - if (!user.getAbilities().creativeMode) { - itemStack.decrement(1); + user.awardStat(Stats.ITEM_USED.get(this)); + if (!user.getAbilities().instabuild) { + itemStack.shrink(1); } - return TypedActionResult.success(itemStack, world.isClient()); + return InteractionResultHolder.sidedSuccess(itemStack, world.isClientSide()); } @Override - public ActionResult useOnEntity( - ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) { - if (!user.getWorld().isClient()) { - var stacks = LootContextBuilder.prepareLoot(user.getWorld(), type.getLootId(stack)); + public InteractionResult interactLivingEntity( + ItemStack stack, Player user, LivingEntity entity, InteractionHand hand) { + if (!user.level().isClientSide()) { + var stacks = LootContextBuilder.prepareLoot(user.level(), type.getLootId(stack)); boolean success = false; - if (entity instanceof PlayerEntity player) { + if (entity instanceof Player player) { var storage = PlayerInventoryStorage.of(player); stacks.forEach( - itemStack -> Main.tryInsertItem(user.getWorld(), player.getPos(), itemStack, storage)); + itemStack -> Main.tryInsertItem(user.level(), player.position(), itemStack, storage)); success = true; - } else if (entity instanceof InventoryOwner io) { + } else if (entity instanceof InventoryCarrier io) { var storage = InventoryStorage.of(io.getInventory(), null); stacks.forEach(itemStack -> - Main.tryInsertItem(entity.getWorld(), entity.getPos(), itemStack, storage)); + Main.tryInsertItem(entity.level(), entity.position(), itemStack, storage)); success = true; } if (success) { - if (user.getWorld() instanceof ServerWorld sw) { - sw.spawnParticles( - new ItemStackParticleEffect(ParticleTypes.ITEM, stack), + if (user.level() instanceof ServerLevel sw) { + sw.sendParticles( + new ItemParticleOption(ParticleTypes.ITEM, stack), entity.getX(), entity.getY(), entity.getZ(), @@ -110,12 +110,12 @@ public class PouchItem extends Item { 0.25); } - if (!user.getAbilities().creativeMode) { - stack.decrement(1); + if (!user.getAbilities().instabuild) { + stack.shrink(1); } - return ActionResult.SUCCESS; + return InteractionResult.SUCCESS; } } - return ActionResult.PASS; + return InteractionResult.PASS; } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/clock/ItemMixin.java b/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/clock/ItemMixin.java index 25f81ad8..4cc6657a 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/clock/ItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/clock/ItemMixin.java @@ -5,13 +5,13 @@ import me.melontini.andromeda.common.AndromedaClient; import me.melontini.andromeda.modules.items.tooltips.Tooltips; import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.world.World; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -21,24 +21,24 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Item.class) abstract class ItemMixin { - @Inject(at = @At("HEAD"), method = "appendTooltip") + @Inject(at = @At("HEAD"), method = "appendHoverText") public void andromeda$tooltip( - ItemStack stack, - @Nullable World world, - List tooltip, - TooltipContext context, - CallbackInfo ci) { + ItemStack stack, + @Nullable Level world, + List tooltip, + TooltipFlag context, + CallbackInfo ci) { if (!AndromedaClient.CLIENT.get(Tooltips.CONFIG).clock) return; - if (world != null && world.isClient) { + if (world != null && world.isClientSide) { if (stack.getItem() == Items.CLOCK) { // totally not stolen from here // https://bukkit.org/threads/how-can-i-convert-minecraft-long-time-to-real-hours-and-minutes.122912/ - int i = MathUtil.fastFloor((world.getTimeOfDay() / 1000d + 8) % 24); - int j = MathUtil.fastFloor(60 * (world.getTimeOfDay() % 1000d) / 1000); + int i = MathUtil.fastFloor((world.getDayTime() / 1000d + 8) % 24); + int j = MathUtil.fastFloor(60 * (world.getDayTime() % 1000d) / 1000); tooltip.add( TextUtil.translatable("tooltip.andromeda.clock", String.format("%02d:%02d", i, j)) - .formatted(Formatting.GRAY)); + .withStyle(ChatFormatting.GRAY)); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/compass/ItemMixin.java b/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/compass/ItemMixin.java index b11892fb..3df90c49 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/compass/ItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/compass/ItemMixin.java @@ -6,17 +6,17 @@ import me.melontini.andromeda.common.util.MiscUtil; import me.melontini.andromeda.modules.items.tooltips.Tooltips; import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.CompassItem; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.GlobalPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.CompassItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -26,38 +26,38 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Item.class) abstract class ItemMixin { - @Inject(at = @At("HEAD"), method = "appendTooltip") + @Inject(at = @At("HEAD"), method = "appendHoverText") public void andromeda$tooltip( - ItemStack stack, - @Nullable World world, - List tooltip, - TooltipContext context, - CallbackInfo ci) { + ItemStack stack, + @Nullable Level world, + List tooltip, + TooltipFlag context, + CallbackInfo ci) { if (!AndromedaClient.CLIENT.get(Tooltips.CONFIG).compass) return; if (world != null) - if (world.isClient) { - var player = MinecraftClient.getInstance().player; + if (world.isClientSide) { + var player = Minecraft.getInstance().player; if (stack.getItem() == Items.COMPASS && player != null) { - boolean lodestone = stack.hasNbt() && CompassItem.hasLodestone(stack); + boolean lodestone = stack.hasTag() && CompassItem.isLodestoneCompass(stack); GlobalPos globalPos = lodestone - ? CompassItem.createLodestonePos(stack.getNbt()) - : CompassItem.createSpawnPos(world); + ? CompassItem.getLodestonePosition(stack.getTag()) + : CompassItem.getSpawnPosition(world); double dist; - if (globalPos != null && world.getRegistryKey() == globalPos.getDimension()) { - Vec3d compassPos = new Vec3d( - globalPos.getPos().getX() + 0.5, - globalPos.getPos().getY() + 0.5, - globalPos.getPos().getZ() + 0.5); - dist = MiscUtil.horizontalDistanceTo(player.getPos(), compassPos); + if (globalPos != null && world.dimension() == globalPos.dimension()) { + Vec3 compassPos = new Vec3( + globalPos.pos().getX() + 0.5, + globalPos.pos().getY() + 0.5, + globalPos.pos().getZ() + 0.5); + dist = MiscUtil.horizontalDistanceTo(player.position(), compassPos); } else { dist = MathUtil.threadRandom().nextGaussian() * 0.1; } tooltip.add(TextUtil.translatable( lodestone ? "tooltip.andromeda.compass.lodestone" : "tooltip.andromeda.compass", String.format("%.1f", dist)) - .formatted(Formatting.GRAY)); + .withStyle(ChatFormatting.GRAY)); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/recovery_compass/ItemMixin.java b/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/recovery_compass/ItemMixin.java index 8440740b..95f7f30e 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/recovery_compass/ItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/tooltips/mixin/recovery_compass/ItemMixin.java @@ -6,16 +6,16 @@ import me.melontini.andromeda.common.util.MiscUtil; import me.melontini.andromeda.modules.items.tooltips.Tooltips; import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.math.GlobalPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -25,36 +25,36 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Item.class) abstract class ItemMixin { - @Inject(at = @At("HEAD"), method = "appendTooltip") + @Inject(at = @At("HEAD"), method = "appendHoverText") public void andromeda$tooltip( - ItemStack stack, - @Nullable World world, - List tooltip, - TooltipContext context, - CallbackInfo ci) { + ItemStack stack, + @Nullable Level world, + List tooltip, + TooltipFlag context, + CallbackInfo ci) { if (!AndromedaClient.CLIENT.get(Tooltips.CONFIG).recoveryCompass) return; if (world != null) - if (world.isClient) { - var player = MinecraftClient.getInstance().player; + if (world.isClientSide) { + var player = Minecraft.getInstance().player; if (stack.getItem() == Items.RECOVERY_COMPASS && player != null) { - var optional = player.getLastDeathPos(); + var optional = player.getLastDeathLocation(); if (optional.isPresent()) { GlobalPos globalPos = optional.get(); double dist; - if (world.getRegistryKey() == globalPos.getDimension()) { - Vec3d compassPos = new Vec3d( - globalPos.getPos().getX() + 0.5, - globalPos.getPos().getY() + 0.5, - globalPos.getPos().getZ() + 0.5); - dist = MiscUtil.horizontalDistanceTo(player.getPos(), compassPos); + if (world.dimension() == globalPos.dimension()) { + Vec3 compassPos = new Vec3( + globalPos.pos().getX() + 0.5, + globalPos.pos().getY() + 0.5, + globalPos.pos().getZ() + 0.5); + dist = MiscUtil.horizontalDistanceTo(player.position(), compassPos); } else { dist = MathUtil.threadRandom().nextGaussian() * 0.1; } tooltip.add(TextUtil.translatable( "tooltip.andromeda.compass.recovery", String.format("%.1f", dist)) - .formatted(Formatting.GRAY)); + .withStyle(ChatFormatting.GRAY)); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/EnderDragonManager.java b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/EnderDragonManager.java index 9f3d555b..dff79f3f 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/EnderDragonManager.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/EnderDragonManager.java @@ -13,18 +13,18 @@ import net.fabricmc.fabric.api.attachment.v1.AttachmentRegistry; import net.fabricmc.fabric.api.attachment.v1.AttachmentType; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LightningEntity; -import net.minecraft.entity.attribute.EntityAttributeInstance; -import net.minecraft.entity.attribute.EntityAttributes; -import net.minecraft.entity.boss.dragon.EnderDragonEntity; -import net.minecraft.entity.decoration.EndCrystalEntity; -import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.Level; import org.apache.commons.lang3.mutable.MutableInt; @SuppressWarnings("UnstableApiUsage") @@ -47,25 +47,25 @@ public class EnderDragonManager { this.maxPlayers = Math.max(maxPlayers, 1); } - public void tick(ServerWorld world) { - List dragons = world.getAliveEnderDragons(); + public void tick(ServerLevel world) { + List dragons = world.getDragons(); if (dragons.isEmpty()) { maxPlayers = 1; return; } - int i = Math.max(world.getPlayers().size(), 1); + int i = Math.max(world.players().size(), 1); if (i > maxPlayers) maxPlayers = i; Set removal = new HashSet<>(); for (Crystal pair : crystals) { if (pair.timer().decrementAndGet() > 0) continue; - LightningEntity lightning = new LightningEntity(EntityType.LIGHTNING_BOLT, world); - lightning.setCosmetic(true); - lightning.setPos(pair.pos().x, pair.pos().y, pair.pos().z); - world.spawnEntity(lightning); + LightningBolt lightning = new LightningBolt(EntityType.LIGHTNING_BOLT, world); + lightning.setVisualOnly(true); + lightning.setPosRaw(pair.pos().x, pair.pos().y, pair.pos().z); + world.addFreshEntity(lightning); - ParticleS2CPacket particleS2CPacket = new ParticleS2CPacket( + ClientboundLevelParticlesPacket particleS2CPacket = new ClientboundLevelParticlesPacket( ParticleTypes.END_ROD, true, pair.pos().x, @@ -76,40 +76,40 @@ public class EnderDragonManager { 0.5f, 0.5f, 100); - for (int j = 0; j < world.getPlayers().size(); ++j) { - ServerPlayerEntity serverPlayerEntity = world.getPlayers().get(j); - world.sendToPlayerIfNearby( + for (int j = 0; j < world.players().size(); ++j) { + ServerPlayer serverPlayerEntity = world.players().get(j); + world.sendParticles( serverPlayerEntity, true, pair.pos().x, pair.pos().y, pair.pos().z, particleS2CPacket); } - EndCrystalEntity endCrystalEntity = - new EndCrystalEntity(world, pair.pos().x, pair.pos().y, pair.pos().z); - world.spawnEntity(endCrystalEntity); + EndCrystal endCrystalEntity = + new EndCrystal(world, pair.pos().x, pair.pos().y, pair.pos().z); + world.addFreshEntity(endCrystalEntity); removal.add(pair); } crystals.removeAll(removal); if (!Andromeda.MAIN.get(DragonFight.CONFIG).scaleHealthByMaxPlayers) return; - for (EnderDragonEntity dragon : dragons) { - EntityAttributeInstance inst = - dragon.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH); + for (EnderDragon dragon : dragons) { + AttributeInstance inst = + dragon.getAttribute(Attributes.MAX_HEALTH); MakeSure.notNull(inst, "Ender Dragon has no attributes?") .setBaseValue(Math.floor(Math.sqrt(500 * maxPlayers) * 10)); } } - public void queueRespawn(MutableInt mutableInt, Vec3d vec3d) { + public void queueRespawn(MutableInt mutableInt, Vec3 vec3d) { var crystal = new Crystal(mutableInt, vec3d); if (!crystals.contains(crystal)) crystals.add(crystal); } - public record Crystal(MutableInt timer, Vec3d pos) { + public record Crystal(MutableInt timer, Vec3 pos) { public static final Codec CODEC = RecordCodecBuilder.create(data -> data.group( Codec.INT .fieldOf("timer") .xmap(MutableInt::new, MutableInt::getValue) .forGetter(Crystal::timer), - Vec3d.CODEC.fieldOf("pos").forGetter(Crystal::pos)) + Vec3.CODEC.fieldOf("pos").forGetter(Crystal::pos)) .apply(data, Crystal::new)); } @@ -120,12 +120,12 @@ public class EnderDragonManager { .buildAndRegister(id("ender_dragon_data"))); ServerWorldEvents.LOAD.register((server, world) -> { - if (world.getRegistryKey() == World.END) + if (world.dimension() == Level.END) world.getAttachedOrCreate(EnderDragonManager.ATTACHMENT.get()); }); ServerTickEvents.END_WORLD_TICK.register(world -> { - if (world.getRegistryKey() == World.END) + if (world.dimension() == Level.END) world.getAttachedOrCreate(EnderDragonManager.ATTACHMENT.get()).tick(world); }); } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EndCrystalMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EndCrystalMixin.java index 465f0c08..0032f0ca 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EndCrystalMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EndCrystalMixin.java @@ -4,12 +4,12 @@ import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.modules.mechanics.dragon_fight.DragonFight; import me.melontini.andromeda.modules.mechanics.dragon_fight.EnderDragonManager; import me.melontini.dark_matter.api.base.util.MathUtil; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.decoration.EndCrystalEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.world.World; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import org.apache.commons.lang3.mutable.MutableInt; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,13 +17,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(EndCrystalEntity.class) +@Mixin(EndCrystal.class) abstract class EndCrystalMixin extends Entity { @Shadow - public abstract boolean shouldShowBottom(); + public abstract boolean showsBottom(); - public EndCrystalMixin(EntityType type, World world) { + public EndCrystalMixin(EntityType type, Level world) { super(type, world); } @@ -32,20 +32,20 @@ abstract class EndCrystalMixin extends Entity { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/decoration/EndCrystalEntity;remove(Lnet/minecraft/entity/Entity$RemovalReason;)V", + "Lnet/minecraft/world/entity/boss/enderdragon/EndCrystal;remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V", shift = At.Shift.BEFORE), - method = "damage") + method = "hurt") private void andromeda$damage( - DamageSource source, float amount, CallbackInfoReturnable cir) { + DamageSource source, float amount, CallbackInfoReturnable cir) { if (!Andromeda.MAIN.get(DragonFight.CONFIG).respawnCrystals) return; - if (world.getRegistryKey() == World.END - && !((ServerWorld) world).getAliveEnderDragons().isEmpty() - && shouldShowBottom()) { - if (this.getPos().getY() <= 71) return; - ((ServerWorld) world) + if (level.dimension() == Level.END + && !((ServerLevel) level).getDragons().isEmpty() + && showsBottom()) { + if (this.position().y() <= 71) return; + ((ServerLevel) level) .getAttachedOrCreate(EnderDragonManager.ATTACHMENT.get()) - .queueRespawn(new MutableInt(MathUtil.nextInt(1900, 3500)), this.getPos()); + .queueRespawn(new MutableInt(MathUtil.nextInt(1900, 3500)), this.position()); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EnderDragonMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EnderDragonMixin.java index 61b2bbef..18f006c6 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EnderDragonMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/EnderDragonMixin.java @@ -3,16 +3,16 @@ package me.melontini.andromeda.modules.mechanics.dragon_fight.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.modules.mechanics.dragon_fight.DragonFight; -import net.minecraft.entity.boss.dragon.EnderDragonEntity; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(EnderDragonEntity.class) +@Mixin(EnderDragon.class) abstract class EnderDragonMixin { @ModifyExpressionValue( at = @At(value = "CONSTANT", args = "doubleValue=32"), - method = "tickWithEndCrystals") + method = "checkCrystals") private double andromeda$modConstant(double constant) { if (Andromeda.MAIN.get(DragonFight.CONFIG).shorterCrystalTrackRange) return 24.0; return constant; diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/SpikeCacheMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/SpikeCacheMixin.java index b4938cac..423ef738 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/SpikeCacheMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/mixin/SpikeCacheMixin.java @@ -6,7 +6,7 @@ import me.melontini.andromeda.modules.mechanics.dragon_fight.DragonFight; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(targets = "net/minecraft/world/gen/feature/EndSpikeFeature$SpikeCache") +@Mixin(targets = "net.minecraft.world.level.levelgen.feature.SpikeFeature$SpikeCacheLoader") abstract class SpikeCacheMixin { @ModifyExpressionValue( diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java index 46b6e186..28cf4adb 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java @@ -3,41 +3,41 @@ package me.melontini.andromeda.modules.mechanics.throwable_items; import static java.util.Objects.requireNonNull; import me.melontini.andromeda.modules.mechanics.throwable_items.data.ItemBehaviorManager; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.projectile.thrown.ThrownItemEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.hit.HitResult; -import net.minecraft.world.World; - -public class FlyingItemEntity extends ThrownItemEntity { - - public FlyingItemEntity(EntityType entityType, World world) { +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.ThrowableItemProjectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.level.Level; + +public class FlyingItemEntity extends ThrowableItemProjectile { + + public FlyingItemEntity(EntityType entityType, Level world) { super(entityType, world); this.setItem(ItemStack.EMPTY); } - public FlyingItemEntity(ItemStack stack, double d, double e, double f, World world) { + public FlyingItemEntity(ItemStack stack, double d, double e, double f, Level world) { super(Main.FLYING_ITEM.orThrow(), d, e, f, world); this.setItem(stack); } - public FlyingItemEntity(ItemStack stack, Entity entity, World world) { + public FlyingItemEntity(ItemStack stack, Entity entity, Level world) { super(Main.FLYING_ITEM.orThrow(), world); this.setOwner(entity); this.setItem(stack); } @Override - protected void onCollision(HitResult hitResult) { - if (!this.world.isClient()) { - for (ItemBehavior behavior : requireNonNull(this.world.getServer()) + protected void onHit(HitResult hitResult) { + if (!this.level.isClientSide()) { + for (ItemBehavior behavior : requireNonNull(this.level.getServer()) .dm$getReloader(ItemBehaviorManager.RELOADER) - .getBehaviors(getItem().getItem())) { + .getBehaviors(getItemRaw().getItem())) { if (!this.isRemoved()) - behavior.onCollision(getItem(), this, (ServerWorld) world, getOwner(), hitResult); + behavior.onCollision(getItemRaw(), this, (ServerLevel) level, getOwner(), hitResult); } } this.discard(); @@ -45,6 +45,6 @@ public class FlyingItemEntity extends ThrownItemEntity { @Override protected Item getDefaultItem() { - return getItem().getItem(); + return getItemRaw().getItem(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemBehavior.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemBehavior.java index 889fa205..31d4306e 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemBehavior.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemBehavior.java @@ -2,38 +2,38 @@ package me.melontini.andromeda.modules.mechanics.throwable_items; import static me.melontini.andromeda.modules.mechanics.throwable_items.data.ItemBehaviorManager.RELOADER; -import net.minecraft.entity.Entity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameterSet; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.hit.HitResult; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.HitResult; import org.jetbrains.annotations.Nullable; @FunctionalInterface public interface ItemBehavior { void onCollision( - ItemStack stack, - FlyingItemEntity fie, - ServerWorld world, - @Nullable Entity user, - HitResult hitResult); + ItemStack stack, + FlyingItemEntity fie, + ServerLevel world, + @Nullable Entity user, + HitResult hitResult); static int getCooldown( - ServerWorld world, @Nullable Entity user, FlyingItemEntity fie, ItemStack stack) { + ServerLevel world, @Nullable Entity user, FlyingItemEntity fie, ItemStack stack) { var cd = world.getServer().dm$getReloader(RELOADER).getCooldown(stack.getItem()); if (cd.toSource().left().isPresent()) return cd.asInt(null); // constant, can pass null. - LootContextParameterSet.Builder builder = new LootContextParameterSet.Builder(world); - builder.add(LootContextParameters.DIRECT_KILLER_ENTITY, fie); - builder.addOptional(LootContextParameters.KILLER_ENTITY, user); - builder.add(LootContextParameters.TOOL, stack); - builder.add(LootContextParameters.ORIGIN, fie.getPos()); + LootParams.Builder builder = new LootParams.Builder(world); + builder.withParameter(LootContextParams.DIRECT_KILLER_ENTITY, fie); + builder.withOptionalParameter(LootContextParams.KILLER_ENTITY, user); + builder.withParameter(LootContextParams.TOOL, stack); + builder.withParameter(LootContextParams.ORIGIN, fie.position()); LootContext lootContext = - new LootContext.Builder(builder.build(Main.CONTEXT_TYPE.orThrow())).build(null); + new LootContext.Builder(builder.create(Main.CONTEXT_TYPE.orThrow())).create(null); return cd.asInt(lootContext); } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemThrowerMob.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemThrowerMob.java index f84999e9..f5d2e461 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemThrowerMob.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ItemThrowerMob.java @@ -1,6 +1,6 @@ package me.melontini.andromeda.modules.mechanics.throwable_items; -import net.minecraft.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity; public interface ItemThrowerMob { diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/Main.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/Main.java index 061716ae..d3e7fbb9 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/Main.java @@ -18,70 +18,70 @@ import net.fabricmc.fabric.api.networking.v1.PlayerLookup; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.fabricmc.fabric.api.object.builder.v1.entity.FabricEntityTypeBuilder; -import net.minecraft.block.dispenser.ProjectileDispenserBehavior; -import net.minecraft.entity.EntityDimensions; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnGroup; -import net.minecraft.entity.damage.DamageType; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.loot.context.LootContextType; -import net.minecraft.loot.context.LootContextTypes; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.registry.Registries; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.Position; -import net.minecraft.world.World; +import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; +import net.minecraft.world.entity.EntityDimensions; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSet; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.core.registries.Registries; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.Position; +import net.minecraft.world.level.Level; public final class Main { public static final Keeper> FLYING_ITEM = Keeper.create(); - public static final RegistryKey BRICKED = - Andromeda.key(RegistryKeys.DAMAGE_TYPE, "bricked"); + public static final ResourceKey BRICKED = + Andromeda.key(Registries.DAMAGE_TYPE, "bricked"); - public static final Identifier FLYING_STACK_LANDED = Andromeda.id("flying_stack_landed"); - public static final Identifier ITEMS_WITH_BEHAVIORS = Andromeda.id("items_with_behaviors"); - public static final Identifier COLORED_FLYING_STACK_LANDED = + public static final ResourceLocation FLYING_STACK_LANDED = Andromeda.id("flying_stack_landed"); + public static final ResourceLocation ITEMS_WITH_BEHAVIORS = Andromeda.id("items_with_behaviors"); + public static final ResourceLocation COLORED_FLYING_STACK_LANDED = Andromeda.id("colored_flying_stack_landed"); - public static final ProjectileDispenserBehavior BEHAVIOR = new ProjectileDispenserBehavior() { + public static final AbstractProjectileDispenseBehavior BEHAVIOR = new AbstractProjectileDispenseBehavior() { @Override - protected ProjectileEntity createProjectile(World world, Position position, ItemStack stack) { + protected Projectile getProjectile(Level world, Position position, ItemStack stack) { ItemStack stack1 = stack.copy(); stack1.setCount(1); - return new FlyingItemEntity(stack1, position.getX(), position.getY(), position.getZ(), world); + return new FlyingItemEntity(stack1, position.x(), position.y(), position.z(), world); } }; - public static final Keeper CONTEXT_TYPE = Keeper.create(); + public static final Keeper CONTEXT_TYPE = Keeper.create(); public static final Keeper PARTICLE_COMMAND = Keeper.create(); public static final Keeper ITEM_PLOP_COMMAND = Keeper.create(); static void init() { FLYING_ITEM.init(RegistryUtil.register( - Registries.ENTITY_TYPE, + BuiltInRegistries.ENTITY_TYPE, id("flying_item"), () -> FabricEntityTypeBuilder.create( - SpawnGroup.MISC, FlyingItemEntity::new) + MobCategory.MISC, FlyingItemEntity::new) .dimensions(new EntityDimensions(0.25F, 0.25F, true)) .trackRangeChunks(4) .trackedUpdateRate(10) .build())); - CONTEXT_TYPE.init(LootContextTypes.register("andromeda:throwable_items", builder -> builder - .require(LootContextParameters.ORIGIN) - .require(LootContextParameters.DIRECT_KILLER_ENTITY) - .require(LootContextParameters.TOOL) - .allow(LootContextParameters.KILLER_ENTITY) - .allow(LootContextParameters.THIS_ENTITY) - .allow(LootContextParameters.BLOCK_STATE) - .allow(LootContextParameters.BLOCK_ENTITY))); + CONTEXT_TYPE.init(LootContextParamSets.register("andromeda:throwable_items", builder -> builder + .required(LootContextParams.ORIGIN) + .required(LootContextParams.DIRECT_KILLER_ENTITY) + .required(LootContextParams.TOOL) + .optional(LootContextParams.KILLER_ENTITY) + .optional(LootContextParams.THIS_ENTITY) + .optional(LootContextParams.BLOCK_STATE) + .optional(LootContextParams.BLOCK_ENTITY))); PARTICLE_COMMAND.init(CommandType.register(id("particles"), ParticleCommand.CODEC)); ITEM_PLOP_COMMAND.init(CommandType.register(id("item_plop"), ItemPlopEffect.CODEC)); @@ -91,7 +91,7 @@ public final class Main { }); ServerLifecycleEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, success) -> { var packet = sendItemsS2CPacket(server.dm$getReloader(RELOADER)); - for (ServerPlayerEntity player : PlayerLookup.all(server)) { + for (ServerPlayer player : PlayerLookup.all(server)) { ServerPlayNetworking.send(player, ITEMS_WITH_BEHAVIORS, packet); } }); @@ -101,11 +101,11 @@ public final class Main { DefaultBehaviors.init(); } - private static PacketByteBuf sendItemsS2CPacket(ItemBehaviorManager manger) { + private static FriendlyByteBuf sendItemsS2CPacket(ItemBehaviorManager manger) { var items = manger.itemsWithBehaviors(); var packet = PacketByteBufs.create().writeVarInt(items.size()); for (Item item : items) { - packet.writeIdentifier(Registries.ITEM.getId(item)); + packet.writeResourceLocation(BuiltInRegistries.ITEM.getKey(item)); } return packet; } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItemAttackGoal.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItemAttackGoal.java index b0cd8540..99d9cc6a 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItemAttackGoal.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItemAttackGoal.java @@ -5,18 +5,18 @@ import static me.melontini.andromeda.modules.mechanics.throwable_items.data.Item import java.util.EnumSet; import me.melontini.andromeda.common.util.ConstantLootContextAccessor; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.ai.goal.Goal; -import net.minecraft.entity.ai.pathing.Path; -import net.minecraft.entity.mob.MobEntity; -import net.minecraft.util.Hand; -import net.minecraft.util.math.MathHelper; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.goal.Goal; +import net.minecraft.world.level.pathfinder.Path; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.InteractionHand; +import net.minecraft.util.Mth; import org.jetbrains.annotations.Nullable; -public class ThrowableItemAttackGoal extends Goal { +public class ThrowableItemAttackGoal extends Goal { private final ItemThrowerMob owner; - private final MobEntity mob; + private final Mob mob; @Nullable private LivingEntity target; @@ -34,23 +34,23 @@ public class ThrowableItemAttackGoal extends Goal { public ThrowableItemAttackGoal( ItemThrowerMob mob, double mobSpeed, float minRange, float range) { this.owner = mob; - this.mob = (MobEntity) mob; + this.mob = (Mob) mob; this.mobSpeed = mobSpeed; this.minRange = minRange; this.range = range; - this.setControls(EnumSet.of(Control.MOVE, Control.LOOK)); + this.setFlags(EnumSet.of(Flag.MOVE, Flag.LOOK)); } @Override - public boolean canStart() { - if (requireNonNull(mob.world.getServer()) + public boolean canUse() { + if (requireNonNull(mob.level.getServer()) .dm$getReloader(RELOADER) - .hasBehaviors(this.mob.getMainHandStack())) { + .hasBehaviors(this.mob.getMainHandItem())) { LivingEntity livingEntity = this.mob.getTarget(); if (livingEntity != null && livingEntity.isAlive() && this.owner.am$cooldown() <= 0) { double d = this.mob.distanceTo(livingEntity); - Path path = this.mob.getNavigation().getCurrentPath(); - if ((d <= this.range && d >= this.minRange) || (path != null && !path.reachesTarget())) { + Path path = this.mob.getNavigation().getPath(); + if ((d <= this.range && d >= this.minRange) || (path != null && !path.canReach())) { this.target = livingEntity; return true; } @@ -60,16 +60,16 @@ public class ThrowableItemAttackGoal extends Goal { } @Override - public boolean shouldContinue() { - return this.canStart() - || (requireNonNull(this.target).isAlive() && !this.mob.getNavigation().isIdle()); + public boolean canContinueToUse() { + return this.canUse() + || (requireNonNull(this.target).isAlive() && !this.mob.getNavigation().isDone()); } @Override public void start() { super.start(); - this.mob.setCurrentHand(Hand.MAIN_HAND); - this.mob.setAttacking(true); + this.mob.startUsingItem(InteractionHand.MAIN_HAND); + this.mob.setAggressive(true); } @Override @@ -77,19 +77,19 @@ public class ThrowableItemAttackGoal extends Goal { this.target = null; this.seenTargetTicks = 0; this.updateCountdownTicks = -1; - this.mob.clearActiveItem(); - this.mob.setAttacking(false); + this.mob.stopUsingItem(); + this.mob.setAggressive(false); } @Override - public boolean shouldRunEveryTick() { + public boolean requiresUpdateEveryTick() { return true; } @Override public void tick() { double d = this.mob.distanceTo(this.target); - boolean bl = this.mob.getVisibilityCache().canSee(this.target); + boolean bl = this.mob.getSensing().hasLineOfSight(this.target); if (bl) { ++this.seenTargetTicks; } else { @@ -97,25 +97,25 @@ public class ThrowableItemAttackGoal extends Goal { } if (!(d > this.range) && this.seenTargetTicks >= 5) this.mob.getNavigation().stop(); - else this.mob.getNavigation().startMovingTo(this.target, this.mobSpeed); + else this.mob.getNavigation().moveTo(this.target, this.mobSpeed); - this.mob.getLookControl().lookAt(this.target, 30.0F, 30.0F); + this.mob.getLookControl().setLookAt(this.target, 30.0F, 30.0F); if (--this.updateCountdownTicks == 0) { if (!bl) { return; } float f = (float) Math.sqrt(d) / this.range; - float g = MathHelper.clamp(f, 0.1F, 1.0F); + float g = Mth.clamp(f, 0.1F, 1.0F); this.owner.am$throwItem(requireNonNull(this.target), g); - this.updateCountdownTicks = MathHelper.floor(f * getInterval()); + this.updateCountdownTicks = Mth.floor(f * getInterval()); } else if (this.updateCountdownTicks < 0) { - this.updateCountdownTicks = MathHelper.floor(getInterval()); + this.updateCountdownTicks = Mth.floor(getInterval()); } } public double getInterval() { - return mob.world + return mob.level .am$get(ThrowableItems.CONFIG) .zombieThrowInterval .asDouble(ConstantLootContextAccessor.get(mob)); diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/Client.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/Client.java index 7f7aa35d..eaa63c60 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/Client.java @@ -15,16 +15,16 @@ import net.fabricmc.fabric.api.client.item.v1.ItemTooltipCallback; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.client.rendering.v1.EntityRendererRegistry; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.ParticlesMode; +import net.minecraft.client.Minecraft; +import net.minecraft.client.ParticleStatus; import net.minecraft.client.particle.Particle; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ItemStackParticleEffect; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.Registries; -import net.minecraft.util.Formatting; -import net.minecraft.util.Identifier; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.ItemParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.ChatFormatting; +import net.minecraft.resources.ResourceLocation; public final class Client { @@ -38,12 +38,12 @@ public final class Client { ClientPlayConnectionEvents.DISCONNECT.register((handler, client) -> showTooltip.clear()); ClientPlayNetworking.registerGlobalReceiver( Main.ITEMS_WITH_BEHAVIORS, (client, handler, buf, responseSender) -> { - Set ids = new HashSet<>(); + Set ids = new HashSet<>(); int length = buf.readVarInt(); - for (int i = 0; i < length; i++) ids.add(buf.readIdentifier()); + for (int i = 0; i < length; i++) ids.add(buf.readResourceLocation()); client.execute(() -> { showTooltip.clear(); - for (Identifier id : ids) showTooltip.add(Registries.ITEM.get(id)); + for (ResourceLocation id : ids) showTooltip.add(BuiltInRegistries.ITEM.get(id)); }); }); @@ -51,7 +51,7 @@ public final class Client { ItemTooltipCallback.EVENT.register((stack, context, lines) -> { if (config.tooltip && showTooltip.contains(stack.getItem())) { lines.add( - TextUtil.translatable("tooltip.andromeda.throwable_item").formatted(Formatting.GRAY)); + TextUtil.translatable("tooltip.andromeda.throwable_item").withStyle(ChatFormatting.GRAY)); } }); @@ -59,7 +59,7 @@ public final class Client { Main.FLYING_STACK_LANDED, (client, handler, buf, responseSender) -> { double x = buf.readDouble(), y = buf.readDouble(), z = buf.readDouble(); boolean spawnItem = buf.readBoolean(); - ItemStack stack = buf.readItemStack(); + ItemStack stack = buf.readItem(); boolean spawnColor = buf.readBoolean(); int color = 0; @@ -69,16 +69,16 @@ public final class Client { g = ColorUtil.getGreenF(color), b = ColorUtil.getBlueF(color); client.execute(() -> { - ParticlesMode particlesMode = - MinecraftClient.getInstance().options.getParticles().getValue(); - if (particlesMode == ParticlesMode.MINIMAL) return; + ParticleStatus particlesMode = + Minecraft.getInstance().options.particles().get(); + if (particlesMode == ParticleStatus.MINIMAL) return; if (spawnItem) - for (int i = 0; i < (particlesMode != ParticlesMode.DECREASED ? 8 : 4); ++i) { - MinecraftClient.getInstance() - .particleManager - .addParticle( - new ItemStackParticleEffect(ParticleTypes.ITEM, stack), + for (int i = 0; i < (particlesMode != ParticleStatus.DECREASED ? 8 : 4); ++i) { + Minecraft.getInstance() + .particleEngine + .createParticle( + new ItemParticleOption(ParticleTypes.ITEM, stack), x, y, z, @@ -88,10 +88,10 @@ public final class Client { } if (spawnColor) - for (int i = 0; i < (particlesMode != ParticlesMode.DECREASED ? 15 : 7); i++) { - Particle particle = MinecraftClient.getInstance() - .particleManager - .addParticle( + for (int i = 0; i < (particlesMode != ParticleStatus.DECREASED ? 15 : 7); i++) { + Particle particle = Minecraft.getInstance() + .particleEngine + .createParticle( ParticleTypes.EFFECT, x, y, @@ -106,12 +106,12 @@ public final class Client { ClientPlayNetworking.registerGlobalReceiver( Main.COLORED_FLYING_STACK_LANDED, (client, handler, buf, responseSender) -> { - ItemStack dye = buf.readItemStack(); + ItemStack dye = buf.readItem(); client.execute(() -> { - int a = client.getWindow().getScaledWidth(); + int a = client.getWindow().getGuiScaledWidth(); ScreenParticleHelper.addParticle(new DyeParticle( MathUtil.nextDouble(a / 2d - (a / 3d), a / 2d + a / 3d), - client.getWindow().getScaledHeight() / 2d, + client.getWindow().getGuiScaledHeight() / 2d, 0, 0, dye)); diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/DyeParticle.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/DyeParticle.java index b0368988..29f88e52 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/DyeParticle.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/DyeParticle.java @@ -2,11 +2,11 @@ package me.melontini.andromeda.modules.mechanics.throwable_items.client; import me.melontini.dark_matter.api.glitter.particles.AbstractScreenParticle; import me.melontini.dark_matter.api.minecraft.client.util.DrawUtil; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.render.model.BakedModel; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.model.BakedModel; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.item.ItemStack; +import net.minecraft.util.Mth; public class DyeParticle extends AbstractScreenParticle { @@ -22,24 +22,24 @@ public class DyeParticle extends AbstractScreenParticle { } @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - MatrixStack matrices = context.getMatrices(); - float scale = MathHelper.lerp(delta, oldScale, this.scale); - float offset = MathHelper.lerp(delta, oldOffset, this.offset); - matrices.push(); + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + PoseStack matrices = context.pose(); + float scale = Mth.lerp(delta, oldScale, this.scale); + float offset = Mth.lerp(delta, oldOffset, this.offset); + matrices.pushPose(); matrices.translate(x, y + offset, 500); matrices.scale(scale, scale, 1); BakedModel model = client.getItemRenderer().getModel(stack, null, null, 0); DrawUtil.renderGuiItemModelCustomMatrix(matrices, stack, -8, -8, model); - matrices.pop(); + matrices.popPose(); } @Override protected void tick() { int window = - Math.max(client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight()); + Math.max(client.getWindow().getGuiScaledWidth(), client.getWindow().getGuiScaledHeight()); oldScale = scale; - scale = MathHelper.lerp(0.15f, scale, window / 25f); + scale = Mth.lerp(0.15f, scale, window / 25f); if (scale > (window / 25f) * 0.99f) { oldOffset = offset; offset += 1 * (offset * 0.07f); diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/FlyingItemEntityRenderer.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/FlyingItemEntityRenderer.java index 0c0dd992..69a4b38b 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/FlyingItemEntityRenderer.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/client/FlyingItemEntityRenderer.java @@ -1,17 +1,17 @@ package me.melontini.andromeda.modules.mechanics.throwable_items.client; import me.melontini.andromeda.modules.mechanics.throwable_items.FlyingItemEntity; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.render.model.json.ModelTransformationMode; -import net.minecraft.client.texture.SpriteAtlasTexture; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.RotationAxis; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.client.renderer.texture.TextureAtlas; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import com.mojang.math.Axis; import org.joml.Quaternionf; public class FlyingItemEntityRenderer extends EntityRenderer { @@ -21,50 +21,50 @@ public class FlyingItemEntityRenderer extends EntityRenderer { private final float scale; private final boolean lit; - public FlyingItemEntityRenderer(EntityRendererFactory.Context ctx, float scale, boolean lit) { + public FlyingItemEntityRenderer(EntityRendererProvider.Context ctx, float scale, boolean lit) { super(ctx); this.itemRenderer = ctx.getItemRenderer(); this.scale = scale; this.lit = lit; } - public FlyingItemEntityRenderer(EntityRendererFactory.Context context) { + public FlyingItemEntityRenderer(EntityRendererProvider.Context context) { this(context, 1.0F, false); } @Override - protected int getBlockLight(FlyingItemEntity entity, BlockPos pos) { - return this.lit ? 15 : super.getBlockLight(entity, pos); + protected int getBlockLightLevel(FlyingItemEntity entity, BlockPos pos) { + return this.lit ? 15 : super.getBlockLightLevel(entity, pos); } @Override public void render( - FlyingItemEntity entity, - float yaw, - float tickDelta, - MatrixStack matrices, - VertexConsumerProvider vertexConsumers, - int light) { - if (entity.age >= 2 - || !(this.dispatcher.camera.getFocusedEntity().squaredDistanceTo(entity) < MIN_DISTANCE)) { - matrices.push(); + FlyingItemEntity entity, + float yaw, + float tickDelta, + PoseStack matrices, + MultiBufferSource vertexConsumers, + int light) { + if (entity.tickCount >= 2 + || !(this.entityRenderDispatcher.camera.getEntity().distanceToSqr(entity) < MIN_DISTANCE)) { + matrices.pushPose(); matrices.scale(this.scale, this.scale, this.scale); var quaternion = new Quaternionf(0, 0, 0, 1); quaternion = hamiltonProduct( - quaternion, RotationAxis.POSITIVE_Y.rotationDegrees(entity.getYaw(tickDelta))); + quaternion, Axis.YP.rotationDegrees(entity.getViewYRot(tickDelta))); quaternion = hamiltonProduct( - quaternion, RotationAxis.POSITIVE_X.rotationDegrees(entity.getPitch(tickDelta))); - matrices.multiply(quaternion); - this.itemRenderer.renderItem( - entity.getStack(), - ModelTransformationMode.GROUND, + quaternion, Axis.XP.rotationDegrees(entity.getViewXRot(tickDelta))); + matrices.mulPose(quaternion); + this.itemRenderer.renderStatic( + entity.getItem(), + ItemDisplayContext.GROUND, light, - OverlayTexture.DEFAULT_UV, + OverlayTexture.NO_OVERLAY, matrices, vertexConsumers, - entity.getWorld(), + entity.level(), entity.getId()); - matrices.pop(); + matrices.popPose(); super.render(entity, yaw, tickDelta, matrices, vertexConsumers, light); } } @@ -86,7 +86,7 @@ public class FlyingItemEntityRenderer extends EntityRenderer { } @Override - public Identifier getTexture(FlyingItemEntity entity) { - return SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE; + public ResourceLocation getTextureLocation(FlyingItemEntity entity) { + return TextureAtlas.LOCATION_BLOCKS; } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/DefaultBehaviors.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/DefaultBehaviors.java index f172257d..793f3dba 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/DefaultBehaviors.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/DefaultBehaviors.java @@ -2,27 +2,27 @@ package me.melontini.andromeda.modules.mechanics.throwable_items.data; import static me.melontini.andromeda.modules.mechanics.throwable_items.Main.BRICKED; -import net.minecraft.block.AbstractFireBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.TntBlock; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.mob.Angerable; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.Hand; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.event.GameEvent; +import net.minecraft.world.level.block.BaseFireBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.TntBlock; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.NeutralMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.item.Items; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.gameevent.GameEvent; public class DefaultBehaviors { @@ -32,10 +32,10 @@ public class DefaultBehaviors { if (hitResult.getType() == HitResult.Type.BLOCK) { BlockHitResult result = (BlockHitResult) hitResult; - Items.BONE_MEAL.useOnBlock(new ItemUsageContext( + Items.BONE_MEAL.useOn(new UseOnContext( world, - user instanceof PlayerEntity player ? player : null, - Hand.MAIN_HAND, + user instanceof Player player ? player : null, + InteractionHand.MAIN_HAND, stack, result)); } @@ -46,26 +46,26 @@ public class DefaultBehaviors { (stack, fie, world, user, hitResult) -> { if (hitResult.getType() == HitResult.Type.ENTITY) { Entity entity = ((EntityHitResult) hitResult).getEntity(); - entity.damage(world.getDamageSources().create(BRICKED, user), 2); + entity.hurt(world.damageSources().source(BRICKED, user), 2); if (entity instanceof LivingEntity livingEntity) { - livingEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 100, 0)); + livingEntity.addEffect(new MobEffectInstance(MobEffects.CONFUSION, 100, 0)); } - if (entity instanceof Angerable angerable + if (entity instanceof NeutralMob angerable && user instanceof LivingEntity livingEntity) { angerable.setTarget(livingEntity); } } - world.playSound( + world.playSeededSound( null, fie.getX(), fie.getY(), fie.getZ(), - SoundEvents.BLOCK_STONE_FALL, - SoundCategory.AMBIENT, - (float) (fie.getVelocity().normalize().length() * 1.5), + SoundEvents.STONE_FALL, + SoundSource.AMBIENT, + (float) (fie.getDeltaMovement().normalize().length() * 1.5), 1, world.getRandom().nextLong()); - world.spawnEntity(new ItemEntity(world, fie.getX(), fie.getY(), fie.getZ(), stack)); + world.addFreshEntity(new ItemEntity(world, fie.getX(), fie.getY(), fie.getZ(), stack)); }, Items.BRICK, Items.NETHER_BRICK); @@ -78,39 +78,39 @@ public class DefaultBehaviors { BlockState blockState = world.getBlockState(blockPos); if (blockState.getBlock() instanceof TntBlock) { - TntBlock.primeTnt(world, blockPos); + TntBlock.explode(world, blockPos); world.removeBlock(blockPos, false); - world.emitGameEvent(user, GameEvent.BLOCK_ACTIVATE, blockPos); + world.gameEvent(user, GameEvent.BLOCK_ACTIVATE, blockPos); } else { if (world - .getBlockState(blockPos = blockPos.offset(result.getSide())) + .getBlockState(blockPos = blockPos.relative(result.getDirection())) .isAir()) { - world.setBlockState(blockPos, AbstractFireBlock.getState(world, blockPos)); - world.emitGameEvent(user, GameEvent.BLOCK_PLACE, blockPos); + world.setBlockAndUpdate(blockPos, BaseFireBlock.getState(world, blockPos)); + world.gameEvent(user, GameEvent.BLOCK_PLACE, blockPos); } } - Random random = world.getRandom(); + RandomSource random = world.getRandom(); world.playSound( null, - fie.getBlockPos(), - SoundEvents.ITEM_FIRECHARGE_USE, - SoundCategory.BLOCKS, + fie.blockPosition(), + SoundEvents.FIRECHARGE_USE, + SoundSource.BLOCKS, 1.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F); } else if (hitResult.getType() == HitResult.Type.ENTITY) { EntityHitResult result = (EntityHitResult) hitResult; Entity entity = result.getEntity(); if (entity instanceof LivingEntity livingEntity) - livingEntity.takeKnockback( - 0.4, -fie.getVelocity().getX(), -fie.getVelocity().getZ()); - entity.setOnFireFor(8); - Random random = world.getRandom(); + livingEntity.knockback( + 0.4, -fie.getDeltaMovement().x(), -fie.getDeltaMovement().z()); + entity.setSecondsOnFire(8); + RandomSource random = world.getRandom(); world.playSound( null, - fie.getBlockPos(), - SoundEvents.ITEM_FIRECHARGE_USE, - SoundCategory.BLOCKS, + fie.blockPosition(), + SoundEvents.FIRECHARGE_USE, + SoundSource.BLOCKS, 1.0F, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F); } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorData.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorData.java index e2181144..d2a4416e 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorData.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorData.java @@ -16,18 +16,18 @@ import me.melontini.commander.api.event.EventKey; import me.melontini.commander.api.event.EventType; import me.melontini.commander.api.expression.Arithmetica; import me.melontini.dark_matter.api.data.codecs.ExtraCodecs; -import net.minecraft.entity.Entity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContext; -import net.minecraft.loot.context.LootContextParameterSet; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.registry.Registries; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Nullable; public record ItemBehaviorData(Parameters parameters, List subscriptions) @@ -35,11 +35,11 @@ public record ItemBehaviorData(Parameters parameters, List subscri @Override public void onCollision( - ItemStack stack, - FlyingItemEntity fie, - ServerWorld world, - @Nullable Entity user, - HitResult hitResult) { + ItemStack stack, + FlyingItemEntity fie, + ServerLevel world, + @Nullable Entity user, + HitResult hitResult) { Stream stream = null; switch (hitResult.getType()) { case BLOCK -> stream = subscriptions.stream().filter(s -> s.event == Main.Event.BLOCK); @@ -50,28 +50,28 @@ public record ItemBehaviorData(Parameters parameters, List subscri .toList(); if (list.isEmpty()) return; - LootContextParameterSet.Builder builder = new LootContextParameterSet.Builder(world); - builder.add(LootContextParameters.DIRECT_KILLER_ENTITY, fie); - builder.addOptional(LootContextParameters.KILLER_ENTITY, user); - builder.add(LootContextParameters.TOOL, stack); + LootParams.Builder builder = new LootParams.Builder(world); + builder.withParameter(LootContextParams.DIRECT_KILLER_ENTITY, fie); + builder.withOptionalParameter(LootContextParams.KILLER_ENTITY, user); + builder.withParameter(LootContextParams.TOOL, stack); switch (hitResult.getType()) { case BLOCK -> { BlockHitResult result = (BlockHitResult) hitResult; - builder.add(LootContextParameters.ORIGIN, Vec3d.ofCenter(result.getBlockPos())); - builder.add(LootContextParameters.BLOCK_STATE, world.getBlockState(result.getBlockPos())); - builder.addOptional( - LootContextParameters.BLOCK_ENTITY, world.getBlockEntity(result.getBlockPos())); + builder.withParameter(LootContextParams.ORIGIN, Vec3.atCenterOf(result.getBlockPos())); + builder.withParameter(LootContextParams.BLOCK_STATE, world.getBlockState(result.getBlockPos())); + builder.withOptionalParameter( + LootContextParams.BLOCK_ENTITY, world.getBlockEntity(result.getBlockPos())); } case ENTITY -> { EntityHitResult result = (EntityHitResult) hitResult; - builder.add(LootContextParameters.ORIGIN, result.getPos()); - builder.addOptional(LootContextParameters.THIS_ENTITY, result.getEntity()); + builder.withParameter(LootContextParams.ORIGIN, result.getLocation()); + builder.withOptionalParameter(LootContextParams.THIS_ENTITY, result.getEntity()); } - case MISS -> builder.add(LootContextParameters.ORIGIN, hitResult.getPos()); + case MISS -> builder.withParameter(LootContextParams.ORIGIN, hitResult.getLocation()); } LootContext lootContext = - new LootContext.Builder(builder.build(Main.CONTEXT_TYPE.orThrow())).build(null); + new LootContext.Builder(builder.create(Main.CONTEXT_TYPE.orThrow())).create(null); EventContext context = EventContext.builder(EventType.NULL) .addParameter(EventKey.LOOT_CONTEXT, lootContext) .build(); @@ -95,7 +95,7 @@ public record ItemBehaviorData(Parameters parameters, List subscri boolean complement, Arithmetica cooldown) { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(data -> data.group( - ExtraCodecs.list(Registries.ITEM.getCodec()) + ExtraCodecs.list(BuiltInRegistries.ITEM.byNameCodec()) .fieldOf("items") .forGetter(Parameters::items), ExtraCodecs.optional("disabled", Codec.BOOL, false).forGetter(Parameters::disabled), diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorManager.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorManager.java index a214ff1e..358693ad 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorManager.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemBehaviorManager.java @@ -15,12 +15,12 @@ import me.melontini.andromeda.modules.mechanics.throwable_items.ThrowableItems; import me.melontini.commander.api.expression.Arithmetica; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.data.loading.ReloaderType; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.profiling.ProfilerFiller; public class ItemBehaviorManager extends IdentifiedJsonDataLoader { @@ -123,7 +123,7 @@ public class ItemBehaviorManager extends IdentifiedJsonDataLoader { @Override protected void apply( - Map data, ResourceManager manager, Profiler profiler) { + Map data, ResourceManager manager, ProfilerFiller profiler) { this.clear(); itemBehaviors.putAll(STATIC); this.disable(Items.AIR); diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemPlopEffect.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemPlopEffect.java index 446b4fdc..48677b6f 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemPlopEffect.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ItemPlopEffect.java @@ -8,13 +8,13 @@ import me.melontini.commander.api.command.Selector; import me.melontini.commander.api.event.EventContext; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; public record ItemPlopEffect(Selector.Conditioned selector) implements Command { @@ -26,13 +26,13 @@ public record ItemPlopEffect(Selector.Conditioned selector) implements Command { var opt = selector.select(context); if (opt.isEmpty()) return false; Entity entity = opt.get().getEntity(); - if (entity instanceof ServerPlayerEntity player) { - PacketByteBuf buf = PacketByteBufs.create(); - buf.writeItemStack(context.lootContext().get(LootContextParameters.TOOL)); + if (entity instanceof ServerPlayer player) { + FriendlyByteBuf buf = PacketByteBufs.create(); + buf.writeItem(context.lootContext().getParamOrNull(LootContextParams.TOOL)); ServerPlayNetworking.send(player, Main.COLORED_FLYING_STACK_LANDED, buf); } else if (entity instanceof LivingEntity living) { - living.addStatusEffect( - new StatusEffectInstance(StatusEffects.BLINDNESS, 100, 0, false, false, true)); + living.addEffect( + new MobEffectInstance(MobEffects.BLINDNESS, 100, 0, false, false, true)); } return true; } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ParticleCommand.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ParticleCommand.java index 78ca5bd4..51028848 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ParticleCommand.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/data/ParticleCommand.java @@ -13,13 +13,13 @@ import me.melontini.dark_matter.api.data.codecs.ExtraCodecs; import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.fabricmc.fabric.api.networking.v1.PlayerLookup; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContextParameters; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; public record ParticleCommand(Selector.Conditioned selector, boolean item, Optional colors) implements Command { @@ -37,9 +37,9 @@ public record ParticleCommand(Selector.Conditioned selector, boolean item, Optio if (opt.isEmpty()) return false; sendParticlePacket( - opt.get().getWorld(), + opt.get().getLevel(), opt.get().getPosition(), - context.lootContext().get(LootContextParameters.TOOL)); + context.lootContext().getParamOrNull(LootContextParams.TOOL)); return true; } @@ -48,15 +48,15 @@ public record ParticleCommand(Selector.Conditioned selector, boolean item, Optio return Main.PARTICLE_COMMAND.orThrow(); } - public void sendParticlePacket(ServerWorld world, Vec3d pos, ItemStack stack) { - PacketByteBuf byteBuf = PacketByteBufs.create(); - byteBuf.writeDouble(pos.getX()).writeDouble(pos.getY()).writeDouble(pos.getZ()); + public void sendParticlePacket(ServerLevel world, Vec3 pos, ItemStack stack) { + FriendlyByteBuf byteBuf = PacketByteBufs.create(); + byteBuf.writeDouble(pos.x()).writeDouble(pos.y()).writeDouble(pos.z()); byteBuf.writeBoolean(item); - byteBuf.writeItemStack(stack); + byteBuf.writeItem(stack); byteBuf.writeBoolean(colors.isPresent()); byteBuf.writeVarInt(colors.orElse(-1)); - for (ServerPlayerEntity serverPlayerEntity : - PlayerLookup.tracking(world, BlockPos.ofFloored(pos))) { + for (ServerPlayer serverPlayerEntity : + PlayerLookup.tracking(world, BlockPos.containing(pos))) { ServerPlayNetworking.send(serverPlayerEntity, Main.FLYING_STACK_LANDED, byteBuf); } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/DispenserBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/DispenserBlockMixin.java index 6dcac3b1..165ade53 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/DispenserBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/DispenserBlockMixin.java @@ -5,10 +5,10 @@ import static me.melontini.andromeda.modules.mechanics.throwable_items.data.Item import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.modules.mechanics.throwable_items.Main; -import net.minecraft.block.DispenserBlock; -import net.minecraft.block.dispenser.DispenserBehavior; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.core.dispenser.DispenseItemBehavior; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -20,17 +20,17 @@ abstract class DispenserBlockMixin { @Inject(at = @At("TAIL"), method = "method_10008") private static void andromeda$throwItem( - Object2ObjectOpenHashMap map, CallbackInfo ci) { + Object2ObjectOpenHashMap map, CallbackInfo ci) { var b = map.defaultReturnValue(); map.defaultReturnValue((pointer, stack) -> - pointer.getWorld().getServer().dm$getReloader(RELOADER).hasBehaviors(stack) + pointer.getLevel().getServer().dm$getReloader(RELOADER).hasBehaviors(stack) ? Main.BEHAVIOR.dispense(pointer, stack) : b.dispense(pointer, stack)); } - @Inject(at = @At("HEAD"), method = "getBehaviorForItem", cancellable = true) + @Inject(at = @At("HEAD"), method = "getDispenseMethod", cancellable = true) private void andromeda$overrideBehavior( - ItemStack stack, CallbackInfoReturnable cir) { + ItemStack stack, CallbackInfoReturnable cir) { var server = Andromeda.get().getCurrentServer(); if (server == null) return; diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ItemStackMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ItemStackMixin.java index 4f4ea1c0..26bd389d 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ItemStackMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ItemStackMixin.java @@ -6,17 +6,17 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import me.melontini.andromeda.modules.mechanics.throwable_items.FlyingItemEntity; import me.melontini.andromeda.modules.mechanics.throwable_items.ItemBehavior; import me.melontini.andromeda.modules.mechanics.throwable_items.data.ItemBehaviorManager; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.stat.Stats; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.World; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.stats.Stats; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -31,66 +31,66 @@ abstract class ItemStackMixin { public abstract Item getItem(); @Shadow - public abstract void decrement(int amount); + public abstract void shrink(int amount); @Inject(at = @At("HEAD"), method = "use", cancellable = true) private void andromeda$throwableBehavior( - World world, - PlayerEntity user, - Hand hand, - CallbackInfoReturnable> cir) { - if (world.isClient()) return; + Level world, + Player user, + InteractionHand hand, + CallbackInfoReturnable> cir) { + if (world.isClientSide()) return; ItemStack stack = (ItemStack) (Object) this; var manager = world.getServer().dm$getReloader(RELOADER); if (manager.hasBehaviors(stack) && manager.overridesVanilla(getItem())) { if (andromeda$runBehaviors(world, manager, user)) { - cir.setReturnValue(TypedActionResult.success(stack)); + cir.setReturnValue(InteractionResultHolder.success(stack)); } } } @ModifyReturnValue(at = @At("RETURN"), method = "use") - private TypedActionResult andromeda$throwableBehavior( - TypedActionResult original, World world, PlayerEntity user, Hand hand) { - if (world.isClient()) return original; + private InteractionResultHolder andromeda$throwableBehavior( + InteractionResultHolder original, Level world, Player user, InteractionHand hand) { + if (world.isClientSide()) return original; ItemStack stack = (ItemStack) (Object) this; var manager = world.getServer().dm$getReloader(RELOADER); - if (original.getResult() == ActionResult.PASS + if (original.getResult() == InteractionResult.PASS && manager.hasBehaviors(stack) && !manager.overridesVanilla(getItem())) { if (andromeda$runBehaviors(world, manager, user)) { - return TypedActionResult.success(stack); + return InteractionResultHolder.success(stack); } } return original; } @Unique private boolean andromeda$runBehaviors( - World world, ItemBehaviorManager manager, PlayerEntity user) { + Level world, ItemBehaviorManager manager, Player user) { world.playSound( null, user.getX(), user.getY(), user.getZ(), - SoundEvents.ENTITY_SNOWBALL_THROW, - SoundCategory.NEUTRAL, + SoundEvents.SNOWBALL_THROW, + SoundSource.NEUTRAL, 0.5F, 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); var entity = new FlyingItemEntity((ItemStack) (Object) this, user, world); - entity.setPos(user.getX(), user.getEyeY() - 0.1F, user.getZ()); - entity.setVelocity(user, user.getPitch(), user.getYaw(), 0.0F, 1.5F, 1.0F); - world.spawnEntity(entity); + entity.setPosRaw(user.getX(), user.getEyeY() - 0.1F, user.getZ()); + entity.shootFromRotation(user, user.getXRot(), user.getYRot(), 0.0F, 1.5F, 1.0F); + world.addFreshEntity(entity); - user.getItemCooldownManager() - .set(getItem(), ItemBehavior.getCooldown((ServerWorld) world, user, entity, (ItemStack) + user.getCooldowns() + .addCooldown(getItem(), ItemBehavior.getCooldown((ServerLevel) world, user, entity, (ItemStack) (Object) this)); - user.incrementStat(Stats.USED.getOrCreateStat(getItem())); + user.awardStat(Stats.ITEM_USED.get(getItem())); - if (!user.getAbilities().creativeMode) { - this.decrement(1); + if (!user.getAbilities().instabuild) { + this.shrink(1); } return true; } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ZombieEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ZombieEntityMixin.java index 9d360bd8..6d3bd148 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ZombieEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/mixin/ZombieEntityMixin.java @@ -2,15 +2,15 @@ package me.melontini.andromeda.modules.mechanics.throwable_items.mixin; import me.melontini.andromeda.modules.mechanics.throwable_items.*; import me.melontini.dark_matter.api.base.util.MathUtil; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.mob.ZombieEntity; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvents; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.monster.Zombie; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -18,19 +18,19 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ZombieEntity.class) -abstract class ZombieEntityMixin extends HostileEntity implements ItemThrowerMob { +@Mixin(Zombie.class) +abstract class ZombieEntityMixin extends Monster implements ItemThrowerMob { @Unique private int andromeda$cooldown = 0; - protected ZombieEntityMixin(EntityType entityType, World world) { + protected ZombieEntityMixin(EntityType entityType, Level world) { super(entityType, world); } - @Inject(at = @At("HEAD"), method = "initCustomGoals") + @Inject(at = @At("HEAD"), method = "addBehaviourGoals") private void andromeda$initCustomGoals(CallbackInfo ci) { - if (world.am$get(ThrowableItems.CONFIG).canZombiesThrowItems) - this.goalSelector.add(1, new ThrowableItemAttackGoal<>(this, 1.0f, 4, 16)); + if (level.am$get(ThrowableItems.CONFIG).canZombiesThrowItems) + this.goalSelector.addGoal(1, new ThrowableItemAttackGoal<>(this, 1.0f, 4, 16)); } @Inject(at = @At("HEAD"), method = "tick") @@ -40,36 +40,36 @@ abstract class ZombieEntityMixin extends HostileEntity implements ItemThrowerMob @Override public void am$throwItem(LivingEntity target, float pullProgress) { - if (!world.am$get(ThrowableItems.CONFIG).canZombiesThrowItems) return; + if (!level.am$get(ThrowableItems.CONFIG).canZombiesThrowItems) return; - world.playSound( + level.playSound( null, this.getX(), this.getY(), this.getZ(), - SoundEvents.ENTITY_SNOWBALL_THROW, - SoundCategory.NEUTRAL, + SoundEvents.SNOWBALL_THROW, + SoundSource.NEUTRAL, 0.5F, - 0.4F / (world.random.nextFloat() * 0.4F + 0.8F)); + 0.4F / (level.random.nextFloat() * 0.4F + 0.8F)); var entity = andromeda$getFlyingItemEntity(target); - world.spawnEntity(entity); + level.addFreshEntity(entity); if (MathUtil.threadRandom().nextBoolean()) this.andromeda$cooldown += Math.max( MathUtil.nextInt( (int) (this.distanceTo(target) * 28) / 2, (int) (this.distanceTo(target) * 28)), - ItemBehavior.getCooldown((ServerWorld) world, this, entity, this.getMainHandStack())); - this.getMainHandStack().decrement(1); + ItemBehavior.getCooldown((ServerLevel) level, this, entity, this.getMainHandItem())); + this.getMainHandItem().shrink(1); } @Unique @NotNull private FlyingItemEntity andromeda$getFlyingItemEntity(LivingEntity target) { - var entity = new FlyingItemEntity(this.getMainHandStack(), this, world); - entity.setPos(this.getX(), this.getEyeY() - 0.1F, this.getZ()); + var entity = new FlyingItemEntity(this.getMainHandItem(), this, level); + entity.setPosRaw(this.getX(), this.getEyeY() - 0.1F, this.getZ()); double d = target.getX() - this.getX(); - double e = target.getBodyY(0.3333333333333333) - entity.getY(); + double e = target.getY(0.3333333333333333) - entity.getY(); double f = target.getZ() - this.getZ(); double g = Math.sqrt(d * d + f * f); - entity.setVelocity(d, e + g * 0.2F, f, 0.9F, 9.0F); + entity.shoot(d, e + g * 0.2F, f, 0.9F, 9.0F); return entity; } @@ -78,13 +78,13 @@ abstract class ZombieEntityMixin extends HostileEntity implements ItemThrowerMob return this.andromeda$cooldown; } - @Inject(at = @At("HEAD"), method = "writeCustomDataToNbt") - private void andromeda$writeCustomDataToNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("HEAD"), method = "addAdditionalSaveData") + private void andromeda$writeCustomDataToNbt(CompoundTag nbt, CallbackInfo ci) { if (this.andromeda$cooldown > 0) nbt.putInt("AM-Throw-Cooldown", this.andromeda$cooldown); } - @Inject(at = @At("HEAD"), method = "readCustomDataFromNbt") - private void andromeda$readCustomDataFromNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("HEAD"), method = "readAdditionalSaveData") + private void andromeda$readCustomDataFromNbt(CompoundTag nbt, CallbackInfo ci) { if (nbt.contains("AM-Throw-Cooldown")) this.andromeda$cooldown = nbt.getInt("AM-Throw-Cooldown"); } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/CustomTraderManager.java b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/CustomTraderManager.java index 8bca4eed..975a8ccf 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/CustomTraderManager.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/CustomTraderManager.java @@ -14,22 +14,27 @@ import net.fabricmc.fabric.api.attachment.v1.AttachmentRegistry; import net.fabricmc.fabric.api.attachment.v1.AttachmentType; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.SpawnReason; -import net.minecraft.entity.SpawnRestriction; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.passive.TraderLlamaEntity; -import net.minecraft.entity.passive.WanderingTraderEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.tag.BiomeTags; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.MobSpawnType; +import net.minecraft.world.entity.SpawnPlacements; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.animal.horse.TraderLlama; +import net.minecraft.world.entity.npc.WanderingTrader; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.tags.BiomeTags; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; import net.minecraft.world.*; -import net.minecraft.world.level.ServerWorldProperties; -import net.minecraft.world.poi.PointOfInterestStorage; -import net.minecraft.world.poi.PointOfInterestTypes; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.NaturalSpawner; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.storage.ServerLevelData; +import net.minecraft.world.entity.ai.village.poi.PoiManager; +import net.minecraft.world.entity.ai.village.poi.PoiTypes; import org.jetbrains.annotations.Nullable; @SuppressWarnings("UnstableApiUsage") @@ -44,7 +49,7 @@ public class CustomTraderManager { @Getter public int cooldown; - private WanderingTraderEntity trader; + private WanderingTrader trader; public CustomTraderManager(int cooldown) { this.cooldown = cooldown; @@ -56,37 +61,37 @@ public class CustomTraderManager { } public void trySpawn( - ServerWorld world, - ServerWorldProperties properties, - ItemStack stackInHand, - PlayerEntity player, - boolean highlight) { + ServerLevel world, + ServerLevelData properties, + ItemStack stackInHand, + Player player, + boolean highlight) { if (player == null) return; if (cooldown > 0) { if (!highlight || this.trader == null || this.trader.isRemoved()) return; - this.trader.addStatusEffect( - new StatusEffectInstance(StatusEffects.GLOWING, 20 * 5, 0, true, false)); + this.trader.addEffect( + new MobEffectInstance(MobEffects.GLOWING, 20 * 5, 0, true, false)); return; } - BlockPos blockPos = player.getBlockPos(); + BlockPos blockPos = player.blockPosition(); - PointOfInterestStorage pointOfInterestStorage = world.getPointOfInterestStorage(); - Optional optional = pointOfInterestStorage.getPosition( - registryEntry -> registryEntry.matchesKey(PointOfInterestTypes.MEETING), + PoiManager pointOfInterestStorage = world.getPoiManager(); + Optional optional = pointOfInterestStorage.find( + registryEntry -> registryEntry.is(PoiTypes.MEETING), pos -> true, blockPos, 48, - PointOfInterestStorage.OccupationStatus.ANY); + PoiManager.Occupancy.ANY); BlockPos blockPos2 = optional.orElse(blockPos); BlockPos blockPos3 = getNearbySpawnPos(world, blockPos2, 48); if (blockPos3 == null || !doesNotSuffocateAt(world, blockPos3)) return; - if (world.getBiome(blockPos3).isIn(BiomeTags.WITHOUT_WANDERING_TRADER_SPAWNS)) return; + if (world.getBiome(blockPos3).is(BiomeTags.WITHOUT_WANDERING_TRADER_SPAWNS)) return; - WanderingTraderEntity wanderingTraderEntity = - EntityType.WANDERING_TRADER.spawn(world, blockPos3, SpawnReason.EVENT); + WanderingTrader wanderingTraderEntity = + EntityType.WANDERING_TRADER.spawn(world, blockPos3, MobSpawnType.EVENT); if (wanderingTraderEntity == null) return; this.trader = wanderingTraderEntity; @@ -101,36 +106,36 @@ public class CustomTraderManager { spawnLlama(world, this.trader); } - properties.setWanderingTraderId(this.trader.getUuid()); + properties.setWanderingTraderId(this.trader.getUUID()); this.trader.setDespawnDelay(tCooldown); this.trader.setWanderTarget(blockPos2); - this.trader.setPositionTarget(blockPos2, 16); - this.trader.addStatusEffect( - new StatusEffectInstance(StatusEffects.GLOWING, 20 * 8, 0, true, false)); + this.trader.restrictTo(blockPos2, 16); + this.trader.addEffect( + new MobEffectInstance(MobEffects.GLOWING, 20 * 8, 0, true, false)); } private void spawnLlama( - @NonNull ServerWorld world, @NonNull WanderingTraderEntity wanderingTrader) { - BlockPos blockPos = this.getNearbySpawnPos(world, wanderingTrader.getBlockPos(), 4); + @NonNull ServerLevel world, @NonNull WanderingTrader wanderingTrader) { + BlockPos blockPos = this.getNearbySpawnPos(world, wanderingTrader.blockPosition(), 4); if (blockPos == null) return; - TraderLlamaEntity traderLlamaEntity = - EntityType.TRADER_LLAMA.spawn(world, blockPos, SpawnReason.EVENT); + TraderLlama traderLlamaEntity = + EntityType.TRADER_LLAMA.spawn(world, blockPos, MobSpawnType.EVENT); if (traderLlamaEntity == null) return; - traderLlamaEntity.attachLeash(wanderingTrader, true); + traderLlamaEntity.setLeashedTo(wanderingTrader, true); } - @Nullable private BlockPos getNearbySpawnPos(WorldView world, BlockPos pos, int range) { + @Nullable private BlockPos getNearbySpawnPos(LevelReader world, BlockPos pos, int range) { BlockPos blockPos = null; for (int i = 0; i < 10; ++i) { int x = pos.getX() + MathUtil.threadRandom().nextInt(range * 2) - range; int z = pos.getZ() + MathUtil.threadRandom().nextInt(range * 2) - range; - int y = world.getTopY(Heightmap.Type.WORLD_SURFACE, x, z); + int y = world.getHeight(Heightmap.Types.WORLD_SURFACE, x, z); BlockPos blockPos2 = new BlockPos(x, y, z); - if (SpawnHelper.canSpawn( - SpawnRestriction.Location.ON_GROUND, world, blockPos2, EntityType.WANDERING_TRADER)) { + if (NaturalSpawner.isSpawnPositionOk( + SpawnPlacements.Type.ON_GROUND, world, blockPos2, EntityType.WANDERING_TRADER)) { blockPos = blockPos2; break; } @@ -139,8 +144,8 @@ public class CustomTraderManager { return blockPos; } - private boolean doesNotSuffocateAt(BlockView world, BlockPos pos) { - for (BlockPos blockPos : BlockPos.iterate(pos, pos.add(1, 2, 1))) { + private boolean doesNotSuffocateAt(BlockGetter world, BlockPos pos) { + for (BlockPos blockPos : BlockPos.betweenClosed(pos, pos.offset(1, 2, 1))) { if (!world.getBlockState(blockPos).getCollisionShape(world, blockPos).isEmpty()) { return false; } @@ -156,12 +161,12 @@ public class CustomTraderManager { .buildAndRegister(id("trader_state_manager"))); ServerWorldEvents.LOAD.register((server, world) -> { - if (World.OVERWORLD.equals(world.getRegistryKey())) + if (Level.OVERWORLD.equals(world.dimension())) world.getAttachedOrCreate(CustomTraderManager.ATTACHMENT.get()); }); ServerTickEvents.END_WORLD_TICK.register(world -> { - if (World.OVERWORLD.equals(world.getRegistryKey())) + if (Level.OVERWORLD.equals(world.dimension())) world.getAttachedOrCreate(CustomTraderManager.ATTACHMENT.get()).tick(); }); } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java index c6f285c5..c6baf8d9 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java @@ -10,7 +10,7 @@ import me.melontini.andromeda.bootstrap.util.Environment; import me.melontini.andromeda.common.config.GameConfig; import me.melontini.andromeda.common.util.commander.bool.BooleanIntermediary; import me.melontini.andromeda.common.util.commander.number.LongIntermediary; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; @ModuleInfo(name = "trading_goat_horn", category = "mechanics", env = Environment.SERVER) public final class GoatHorn extends Module implements PostBootstrapEvent { @@ -28,7 +28,7 @@ public final class GoatHorn extends Module implements PostBootstrapEvent { public static class Config extends GameConfig { public LongIntermediary cooldown = LongIntermediary.of(48000); - public Identifier instrumentId = Identifier.of("minecraft", "sing_goat_horn"); + public ResourceLocation instrumentId = ResourceLocation.tryBuild("minecraft", "sing_goat_horn"); public BooleanIntermediary highlightTrader = BooleanIntermediary.of(false); } } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/mixin/GoatHornMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/mixin/GoatHornMixin.java index 78366032..93cd3f4a 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/mixin/GoatHornMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/mixin/GoatHornMixin.java @@ -6,23 +6,23 @@ import java.util.Optional; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.mechanics.trading_goat_horn.CustomTraderManager; import me.melontini.andromeda.modules.mechanics.trading_goat_horn.GoatHorn; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.GoatHornItem; -import net.minecraft.item.Instrument; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Hand; -import net.minecraft.util.Identifier; -import net.minecraft.util.TypedActionResult; -import net.minecraft.world.GameRules; -import net.minecraft.world.World; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.InstrumentItem; +import net.minecraft.world.item.Instrument; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.Holder; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.level.GameRules; +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; -@Mixin(GoatHornItem.class) +@Mixin(InstrumentItem.class) abstract class GoatHornMixin { @Inject( @@ -30,32 +30,32 @@ abstract class GoatHornMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/player/ItemCooldownManager;set(Lnet/minecraft/item/Item;I)V", + "Lnet/minecraft/world/item/ItemCooldowns;addCooldown(Lnet/minecraft/world/item/Item;I)V", shift = At.Shift.BEFORE), method = "use") private void andromeda$wanderingGoatHorn( - World world, - PlayerEntity user, - Hand hand, - CallbackInfoReturnable> cir, - @Local Optional> optional) { - if (world.isClient()) return; + Level world, + Player user, + InteractionHand hand, + CallbackInfoReturnable> cir, + @Local Optional> optional) { + if (world.isClientSide()) return; - Identifier identifier = optional.orElseThrow().getKey().orElseThrow().getValue(); + ResourceLocation identifier = optional.orElseThrow().unwrapKey().orElseThrow().location(); if (!Objects.equals(identifier, world.am$get(GoatHorn.CONFIG).instrumentId)) return; - ServerWorld sw = (ServerWorld) world; - if (!sw.getGameRules().getBoolean(GameRules.DO_MOB_SPAWNING)) return; + ServerLevel sw = (ServerLevel) world; + if (!sw.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) return; var cfg = world.am$get(GoatHorn.CONFIG); var context = LootContextBuilder.fishing( - user.world, builder -> builder.origin(user).tool(user, hand).thisEntity(user)); + user.level, builder -> builder.origin(user).tool(user, hand).thisEntity(user)); if (!cfg.available.asBoolean(context)) return; sw.getAttachedOrCreate(CustomTraderManager.ATTACHMENT.get()) .trySpawn( - (ServerWorld) world, - sw.getServer().getSaveProperties().getMainWorldProperties(), - user.getStackInHand(hand), + (ServerLevel) world, + sw.getServer().getWorldData().overworldData(), + user.getItemInHand(hand), user, cfg.highlightTrader.asBoolean(context)); } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/GiftTags.java b/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/GiftTags.java index b0f8e06b..6019449d 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/GiftTags.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/GiftTags.java @@ -3,26 +3,26 @@ package me.melontini.andromeda.modules.mechanics.villager_gifting; import static me.melontini.andromeda.common.Andromeda.id; import java.util.Map; -import net.minecraft.item.Item; -import net.minecraft.registry.Registries; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.village.VillageGossipType; +import net.minecraft.world.item.Item; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.ai.gossip.GossipType; public class GiftTags { public static final TagKey MAJOR_POSITIVE = - TagKey.of(Registries.ITEM.getKey(), id("villager_gifts/major_positive")); + TagKey.create(BuiltInRegistries.ITEM.key(), id("villager_gifts/major_positive")); public static final TagKey MINOR_POSITIVE = - TagKey.of(Registries.ITEM.getKey(), id("villager_gifts/minor_positive")); + TagKey.create(BuiltInRegistries.ITEM.key(), id("villager_gifts/minor_positive")); public static final TagKey MINOR_NEGATIVE = - TagKey.of(Registries.ITEM.getKey(), id("villager_gifts/major_negative")); + TagKey.create(BuiltInRegistries.ITEM.key(), id("villager_gifts/major_negative")); public static final TagKey MAJOR_NEGATIVE = - TagKey.of(Registries.ITEM.getKey(), id("villager_gifts/minor_negative")); + TagKey.create(BuiltInRegistries.ITEM.key(), id("villager_gifts/minor_negative")); public static final Map, Action> ACTION_MAP = Map.of( - MAJOR_POSITIVE, new Action((byte) 14, VillageGossipType.MAJOR_POSITIVE), - MINOR_POSITIVE, new Action((byte) 14, VillageGossipType.MINOR_POSITIVE), - MAJOR_NEGATIVE, new Action((byte) 13, VillageGossipType.MAJOR_NEGATIVE), - MINOR_NEGATIVE, new Action((byte) 13, VillageGossipType.MINOR_NEGATIVE)); + MAJOR_POSITIVE, new Action((byte) 14, GossipType.MAJOR_POSITIVE), + MINOR_POSITIVE, new Action((byte) 14, GossipType.MINOR_POSITIVE), + MAJOR_NEGATIVE, new Action((byte) 13, GossipType.MAJOR_NEGATIVE), + MINOR_NEGATIVE, new Action((byte) 13, GossipType.MINOR_NEGATIVE)); - public record Action(byte status, VillageGossipType type) {} + public record Action(byte status, GossipType type) {} } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/mixin/VillagerEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/mixin/VillagerEntityMixin.java index d67fb51c..ea9e603a 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/mixin/VillagerEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/mixin/VillagerEntityMixin.java @@ -4,18 +4,18 @@ import java.util.Map; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.mechanics.villager_gifting.GiftTags; import me.melontini.andromeda.modules.mechanics.villager_gifting.VillagerGifting; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.MerchantEntity; -import net.minecraft.entity.passive.VillagerEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.tag.TagKey; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.village.VillageGossipType; -import net.minecraft.village.VillagerGossips; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.tags.TagKey; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.ai.gossip.GossipType; +import net.minecraft.world.entity.ai.gossip.GossipContainer; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -24,17 +24,17 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(VillagerEntity.class) -abstract class VillagerEntityMixin extends MerchantEntity { +@Mixin(Villager.class) +abstract class VillagerEntityMixin extends AbstractVillager { @Shadow @Final - private VillagerGossips gossip; + private GossipContainer gossips; @Shadow - protected abstract void sayNo(); + protected abstract void setUnhappy(); - public VillagerEntityMixin(EntityType entityType, World world) { + public VillagerEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -43,29 +43,29 @@ abstract class VillagerEntityMixin extends MerchantEntity { @At( value = "INVOKE", target = - "Lnet/minecraft/entity/passive/VillagerEntity;getOffers()Lnet/minecraft/village/TradeOfferList;", + "Lnet/minecraft/world/entity/npc/Villager;getOffers()Lnet/minecraft/world/item/trading/MerchantOffers;", shift = At.Shift.BEFORE), cancellable = true, - method = "interactMob") + method = "mobInteract") private void andromeda$useGifts( - PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { - if (hand != Hand.MAIN_HAND || world.isClient()) return; - ItemStack stack = player.getStackInHand(hand); + Player player, InteractionHand hand, CallbackInfoReturnable cir) { + if (hand != InteractionHand.MAIN_HAND || level.isClientSide()) return; + ItemStack stack = player.getItemInHand(hand); - if (!world + if (!level .am$get(VillagerGifting.CONFIG) .available .asBoolean(LootContextBuilder.fishing( - world, builder -> builder.origin(player).tool(stack).thisEntity(player)))) return; + level, builder -> builder.origin(player).tool(stack).thisEntity(player)))) return; ItemStack gift = stack.copy(); gift.setCount(1); for (Map.Entry, GiftTags.Action> entry : GiftTags.ACTION_MAP.entrySet()) { - if (stack.isIn(entry.getKey())) { + if (stack.is(entry.getKey())) { if (andromeda$tryInsertGift(cir, player, gift, entry.getValue().type())) { - this.world.sendEntityStatus(this, entry.getValue().status()); - if (!player.isCreative()) stack.decrement(1); + this.level.broadcastEntityEvent(this, entry.getValue().status()); + if (!player.isCreative()) stack.shrink(1); break; } } @@ -73,18 +73,18 @@ abstract class VillagerEntityMixin extends MerchantEntity { } @Unique private boolean andromeda$tryInsertGift( - CallbackInfoReturnable cir, - PlayerEntity player, - ItemStack stack, - VillageGossipType type) { - if (this.getInventory().canInsert(stack)) { - this.getInventory().addStack(stack); - this.gossip.startGossip(player.getUuid(), type, 3); - cir.setReturnValue(ActionResult.success(this.world.isClient)); + CallbackInfoReturnable cir, + Player player, + ItemStack stack, + GossipType type) { + if (this.getInventory().canAddItem(stack)) { + this.getInventory().addItem(stack); + this.gossips.add(player.getUUID(), type, 3); + cir.setReturnValue(InteractionResult.sidedSuccess(this.level.isClientSide)); return true; } else { - this.sayNo(); - cir.setReturnValue(ActionResult.success(this.world.isClient)); + this.setUnhappy(); + cir.setReturnValue(InteractionResult.sidedSuccess(this.level.isClientSide)); return false; } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/mixin/PlayerEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/mixin/PlayerEntityMixin.java index 99c7353e..cf3acb9f 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/mixin/PlayerEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/mixin/PlayerEntityMixin.java @@ -4,27 +4,27 @@ import java.util.Objects; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.misc.minor_inconvenience.MinorInconvenience; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.damage.DamageType; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.world.World; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.resources.ResourceKey; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.Level; 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.CallbackInfoReturnable; -@Mixin(PlayerEntity.class) +@Mixin(Player.class) abstract class PlayerEntityMixin extends LivingEntity { - @Unique private static final RegistryKey AGONY = - Andromeda.key(RegistryKeys.DAMAGE_TYPE, "agony"); + @Unique private static final ResourceKey AGONY = + Andromeda.key(Registries.DAMAGE_TYPE, "agony"); - protected PlayerEntityMixin(EntityType entityType, World world) { + protected PlayerEntityMixin(EntityType entityType, Level world) { super(entityType, world); } @@ -33,27 +33,27 @@ abstract class PlayerEntityMixin extends LivingEntity { @At( value = "INVOKE", target = - "net/minecraft/entity/LivingEntity.damage (Lnet/minecraft/entity/damage/DamageSource;F)Z", + "Lnet/minecraft/world/entity/LivingEntity;hurt(Lnet/minecraft/world/damagesource/DamageSource;F)Z", shift = At.Shift.BEFORE), - method = "damage", + method = "hurt", cancellable = true) private void andromeda$damage( - DamageSource source, float amount, CallbackInfoReturnable cir) { - if (!world.isClient - && !source.isOf(AGONY) - && world + DamageSource source, float amount, CallbackInfoReturnable cir) { + if (!level.isClientSide + && !source.is(AGONY) + && level .am$get(MinorInconvenience.CONFIG) .available - .asBoolean(LootContextBuilder.entity(world, builder -> builder - .origin(Objects.requireNonNullElse(source.getPosition(), this.getPos())) + .asBoolean(LootContextBuilder.entity(level, builder -> builder + .origin(Objects.requireNonNullElse(source.getSourcePosition(), this.position())) .thisEntity(this) .sourceOrGeneric(source) - .killer(source.getAttacker()) - .directKiller(source.getSource())))) { - DamageSource damageSource = this.getWorld().getDamageSources().create(AGONY, this); - super.damage(damageSource, Float.MAX_VALUE); - this.getWorld() - .createExplosion( + .killer(source.getEntity()) + .directKiller(source.getDirectEntity())))) { + DamageSource damageSource = this.level().damageSources().source(AGONY, this); + super.hurt(damageSource, Float.MAX_VALUE); + this.level() + .explode( null, damageSource, null, @@ -62,7 +62,7 @@ abstract class PlayerEntityMixin extends LivingEntity { this.getBlockZ() + 0.5, 5.0F, true, - World.ExplosionSourceType.MOB); + Level.ExplosionInteraction.MOB); cir.setReturnValue(false); } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java index 55efaa9c..6f49b66d 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java @@ -15,7 +15,7 @@ import me.melontini.andromeda.bootstrap.event.InitEvents; import me.melontini.andromeda.bootstrap.event.PostBootstrapEvent; import me.melontini.andromeda.bootstrap.util.Environment; import me.melontini.andromeda.common.Andromeda; -import net.minecraft.util.Identifier; +import net.minecraft.resources.ResourceLocation; @ModuleInfo(name = "recipe_advancements_generation", category = "misc", env = Environment.SERVER) public final class AdvancementGeneration extends Module implements PostBootstrapEvent { @@ -36,6 +36,6 @@ public final class AdvancementGeneration extends Module implements PostBootstrap public boolean requireAllItems = true; public boolean ignoreRecipesHiddenInTheRecipeBook = true; public List namespaceBlacklist = Arrays.asList("minecraft", "andromeda", "extshape"); - public List recipeBlacklist = new ArrayList<>(); + public List recipeBlacklist = new ArrayList<>(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/Main.java b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/Main.java index d97836e8..59e64958 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/Main.java @@ -12,27 +12,27 @@ import java.util.function.Function; import me.melontini.andromeda.bootstrap.ModuleManager; import me.melontini.dark_matter.api.base.util.MakeSure; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.minecraft.advancement.Advancement; -import net.minecraft.advancement.AdvancementManager; -import net.minecraft.advancement.AdvancementRewards; -import net.minecraft.advancement.criterion.InventoryChangedCriterion; -import net.minecraft.advancement.criterion.RecipeUnlockedCriterion; -import net.minecraft.item.ItemStack; -import net.minecraft.predicate.entity.LootContextPredicate; -import net.minecraft.predicate.item.ItemPredicate; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.Recipe; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.SpecialCraftingRecipe; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.AdvancementList; +import net.minecraft.advancements.AdvancementRewards; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.RecipeUnlockedTrigger; +import net.minecraft.world.item.ItemStack; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.CustomRecipe; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.Util; import org.jetbrains.annotations.NotNull; public final class Main { private static final Map, Function> RECIPE_TYPE_HANDLERS = new HashMap<>(); - private static final List>> FILTERS = + private static final List>> FILTERS = Collections.synchronizedList(new ArrayList<>()); public static Function basicConsumer( @@ -42,8 +42,8 @@ public final class Main { createAdvBuilder(config, context.id(), context.recipe().getIngredients().get(0))); } - private static Identifier idFromRecipe(Identifier recipe, String typeName) { - return new Identifier( + private static ResourceLocation idFromRecipe(ResourceLocation recipe, String typeName) { + return new ResourceLocation( recipe.getNamespace(), "recipes/gen/" + typeName + "/" + recipe.toString().replace(":", "_")); } @@ -54,12 +54,12 @@ public final class Main { public static void generateRecipeAdvancements( MinecraftServer server, AdvancementGeneration module, AdvancementGeneration.Config config) { - Map advancementBuilders = new ConcurrentHashMap<>(); + Map advancementBuilders = new ConcurrentHashMap<>(); AtomicInteger count = new AtomicInteger(); - List> futures = server.getRecipeManager().values().stream() + List> futures = server.getRecipeManager().getRecipes().stream() .filter(recipe -> { - for (BiPredicate> filter : FILTERS) { + for (BiPredicate> filter : FILTERS) { if (filter.test(recipe.getId(), recipe)) return false; } return true; @@ -75,7 +75,7 @@ public final class Main { if (!recipe.getIngredients().isEmpty()) { count.getAndIncrement(); advancementBuilders.put( - new Identifier( + new ResourceLocation( recipe.getId().getNamespace(), "recipes/gen/generic/" + recipe.getId().toString().replace(":", "_")), createAdvBuilder( @@ -85,15 +85,15 @@ public final class Main { } } }, - Util.getMainWorkerExecutor())) + Util.backgroundExecutor())) .toList(); // and? CompletableFuture future = CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); - server.runTasks(future::isDone); + server.managedBlock(future::isDone); - AdvancementManager advancementManager = server.getAdvancementLoader().manager; - advancementManager.load(advancementBuilders); + AdvancementList advancementManager = server.getAdvancements().advancements; + advancementManager.add(advancementBuilders); module.logger().info("finished generating {} recipe advancements", count.get()); advancementBuilders.clear(); @@ -107,21 +107,21 @@ public final class Main { } @Override - public boolean test(ItemStack stack) { + public boolean matches(ItemStack stack) { return ingredient.test(stack); } @Override - public JsonElement toJson() { - return ANY.toJson(); + public JsonElement serializeToJson() { + return ANY.serializeToJson(); } } public static @NotNull Advancement.Builder createAdvBuilder( - AdvancementGeneration.Config config, Identifier id, Ingredient... ingredients) { + AdvancementGeneration.Config config, ResourceLocation id, Ingredient... ingredients) { MakeSure.notEmpty(ingredients); // shouldn't really happen - var builder = Advancement.Builder.createUntelemetered(); - builder.parent(Identifier.of("minecraft", "recipes/root")); + var builder = Advancement.Builder.recipeAdvancement(); + builder.parent(ResourceLocation.tryBuild("minecraft", "recipes/root")); List names = new ArrayList<>(); Set elements = new HashSet<>(); @@ -133,11 +133,11 @@ public final class Main { var name = String.valueOf(i); names.add(name); - builder.criterion( - name, InventoryChangedCriterion.Conditions.items(new CustomPredicate(ingredient))); + builder.addCriterion( + name, InventoryChangeTrigger.TriggerInstance.hasItems(new CustomPredicate(ingredient))); } - builder.criterion( - "has_recipe", new RecipeUnlockedCriterion.Conditions(LootContextPredicate.create(), id)); + builder.addCriterion( + "has_recipe", new RecipeUnlockedTrigger.TriggerInstance(ContextAwarePredicate.create(), id)); String[][] reqs; if (config.requireAllItems) { @@ -165,7 +165,7 @@ public final class Main { FILTERS.add((id, recipe) -> config.namespaceBlacklist.contains(id.getNamespace())); FILTERS.add((id, recipe) -> config.recipeBlacklist.contains(id)); FILTERS.add((id, recipe) -> - recipe.isIgnoredInRecipeBook() && config.ignoreRecipesHiddenInTheRecipeBook); + recipe.isSpecial() && config.ignoreRecipesHiddenInTheRecipeBook); ModuleManager.get() .getModuleApiListeners(ADVANCEMENT_RECIPE_FILTER) .forEach(listener -> listener.accept(recipeFilter -> { @@ -184,7 +184,7 @@ public final class Main { addRecipeTypeHandler(RecipeType.CAMPFIRE_COOKING, basicConsumer("campfire_cooking", config)); addRecipeTypeHandler(RecipeType.STONECUTTING, basicConsumer("stonecutting", config)); addRecipeTypeHandler(RecipeType.CRAFTING, (context) -> { - if (!(context.recipe() instanceof SpecialCraftingRecipe)) { + if (!(context.recipe() instanceof CustomRecipe)) { if (!context.recipe().getIngredients().isEmpty()) { return new Return( idFromRecipe(context.id(), "crafting"), @@ -198,7 +198,7 @@ public final class Main { }); } - public record Return(Identifier id, Advancement.Builder builder) {} + public record Return(ResourceLocation id, Advancement.Builder builder) {} - public record Context(Recipe recipe, Identifier id) {} + public record Context(Recipe recipe, ResourceLocation id) {} } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/mixin/PlayerManagerMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/mixin/PlayerManagerMixin.java index 3c559f15..bbffb987 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/mixin/PlayerManagerMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/mixin/PlayerManagerMixin.java @@ -2,7 +2,7 @@ package me.melontini.andromeda.modules.misc.recipe_advancements_generation.mixin import me.melontini.andromeda.modules.misc.recipe_advancements_generation.BeforeDataPackSyncEvent; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerManager; +import net.minecraft.server.players.PlayerList; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(PlayerManager.class) +@Mixin(PlayerList.class) abstract class PlayerManagerMixin { @Shadow @@ -24,7 +24,7 @@ abstract class PlayerManagerMixin { target = "Ljava/util/Map;values()Ljava/util/Collection;", ordinal = 0, shift = At.Shift.BEFORE), - method = "onDataPacksReloaded") + method = "reloadResources") private void andromeda$reload(CallbackInfo ci) { // we don't sync until our advancements have been generated BeforeDataPackSyncEvent.EVENT.invoker().beforeDataPackReload(server); diff --git a/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/Main.java b/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/Main.java index 55897a08..fc56a1df 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/Main.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/Main.java @@ -2,8 +2,8 @@ package me.melontini.andromeda.modules.misc.tiny_storage; import me.melontini.andromeda.common.Andromeda; import net.fabricmc.fabric.api.entity.event.v1.ServerPlayerEvents; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.world.GameRules; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.GameRules; public final class Main { static void init() { @@ -11,19 +11,19 @@ public final class Main { if (alive || Andromeda.MAIN.get(TinyStorage.CONFIG).transferMode == TinyStorage.TransferMode.ALWAYS_TRANSFER - || newPlayer.getWorld().getGameRules().getBoolean(GameRules.KEEP_INVENTORY) + || newPlayer.level().getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || oldPlayer.isSpectator()) { copyInputs(oldPlayer, newPlayer); } }); } - public static void copyInputs(ServerPlayerEntity oldPlayer, ServerPlayerEntity newPlayer) { - for (int i = 0; i < newPlayer.playerScreenHandler.getCraftingInput().size(); i++) { + public static void copyInputs(ServerPlayer oldPlayer, ServerPlayer newPlayer) { + for (int i = 0; i < newPlayer.inventoryMenu.getCraftSlots().getContainerSize(); i++) { newPlayer - .playerScreenHandler - .getCraftingInput() - .setStack(i, oldPlayer.playerScreenHandler.getCraftingInput().getStack(i)); + .inventoryMenu + .getCraftSlots() + .setItem(i, oldPlayer.inventoryMenu.getCraftSlots().getItem(i)); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerEntityMixin.java index ef397a44..13455a7d 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerEntityMixin.java @@ -3,12 +3,12 @@ package me.melontini.andromeda.modules.misc.tiny_storage.mixin; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.modules.misc.tiny_storage.TinyStorage; import me.melontini.dark_matter.api.data.nbt.NbtUtil; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.ItemEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.screen.PlayerScreenHandler; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.inventory.InventoryMenu; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -17,29 +17,29 @@ 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) +@Mixin(Player.class) abstract class PlayerEntityMixin { @Shadow @Final - public PlayerScreenHandler playerScreenHandler; + public InventoryMenu inventoryMenu; @Shadow - @Nullable public abstract ItemEntity dropItem( - ItemStack stack, boolean throwRandomly, boolean retainOwnership); + @Nullable public abstract ItemEntity drop( + ItemStack stack, boolean throwRandomly, boolean retainOwnership); - @Inject(at = @At("TAIL"), method = "writeCustomDataToNbt") - private void andromeda$writeNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "addAdditionalSaveData") + private void andromeda$writeNbt(CompoundTag nbt, CallbackInfo ci) { NbtUtil.writeInventoryToNbt( - "AM-Tiny-Storage", nbt, this.playerScreenHandler.getCraftingInput()); + "AM-Tiny-Storage", nbt, this.inventoryMenu.getCraftSlots()); } - @Inject(at = @At("TAIL"), method = "readCustomDataFromNbt") - private void andromeda$readNbt(NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "readAdditionalSaveData") + private void andromeda$readNbt(CompoundTag nbt, CallbackInfo ci) { try { TinyStorage.LOADING.set(true); // We have to skip sending handler updates. NbtUtil.readInventoryFromNbt( - "AM-Tiny-Storage", nbt, this.playerScreenHandler.getCraftingInput()); + "AM-Tiny-Storage", nbt, this.inventoryMenu.getCraftSlots()); } finally { TinyStorage.LOADING.remove(); } @@ -47,16 +47,16 @@ abstract class PlayerEntityMixin { @Inject( at = - @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerInventory;dropAll()V"), - method = "dropInventory") + @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Inventory;dropAll()V"), + method = "dropEquipment") private void andromeda$dropAll(CallbackInfo ci) { if (Andromeda.MAIN.get(TinyStorage.CONFIG).transferMode == TinyStorage.TransferMode.ALWAYS_TRANSFER) return; - for (int i = 0; i < this.playerScreenHandler.getCraftingInput().size(); ++i) { - ItemStack stack = this.playerScreenHandler.getCraftingInput().removeStack(i); + for (int i = 0; i < this.inventoryMenu.getCraftSlots().getContainerSize(); ++i) { + ItemStack stack = this.inventoryMenu.getCraftSlots().removeItemNoUpdate(i); if (!stack.isEmpty() && EnchantmentHelper.hasVanishingCurse(stack)) continue; - this.dropItem(stack, true, false); + this.drop(stack, true, false); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerScreenHandlerMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerScreenHandlerMixin.java index 0ca0ac79..9b29981a 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerScreenHandlerMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/tiny_storage/mixin/PlayerScreenHandlerMixin.java @@ -1,16 +1,16 @@ package me.melontini.andromeda.modules.misc.tiny_storage.mixin; import me.melontini.andromeda.modules.misc.tiny_storage.TinyStorage; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.Inventory; -import net.minecraft.screen.PlayerScreenHandler; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.Container; +import net.minecraft.world.inventory.InventoryMenu; 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.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(PlayerScreenHandler.class) +@Mixin(InventoryMenu.class) abstract class PlayerScreenHandlerMixin { @Redirect( @@ -18,13 +18,13 @@ abstract class PlayerScreenHandlerMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/screen/PlayerScreenHandler;dropInventory(Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/inventory/Inventory;)V"), - method = "onClosed") + "Lnet/minecraft/world/inventory/InventoryMenu;clearContainer(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/Container;)V"), + method = "removed") private void andromeda$doNotDrop( - PlayerScreenHandler instance, PlayerEntity player, Inventory inventory) {} + InventoryMenu instance, Player player, Container inventory) {} - @Inject(at = @At("HEAD"), method = "onContentChanged", cancellable = true) - private void andromeda$skipUpdate(Inventory inventory, CallbackInfo ci) { + @Inject(at = @At("HEAD"), method = "slotsChanged", cancellable = true) + private void andromeda$skipUpdate(Container inventory, CallbackInfo ci) { if (TinyStorage.LOADING.get()) ci.cancel(); } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java index 430421e6..5e6ac9ed 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java @@ -4,8 +4,8 @@ import java.util.concurrent.CompletableFuture; import me.melontini.andromeda.bootstrap.ModuleManager; import me.melontini.andromeda.modules.misc.translations.Client; import me.melontini.andromeda.modules.misc.translations.Translations; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.GameOptions; +import net.minecraft.client.Minecraft; +import net.minecraft.client.Options; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -13,23 +13,23 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) abstract class MinecraftClientMixin { @Shadow @Final - public GameOptions options; + public Options options; @Inject( at = @At( value = "INVOKE", - target = "Lnet/minecraft/resource/ResourcePackManager;scanPacks()V", + target = "Lnet/minecraft/server/packs/repository/PackRepository;reload()V", shift = At.Shift.BEFORE), - method = "reloadResources(Z)Ljava/util/concurrent/CompletableFuture;") + method = "reloadResourcePacks(Z)Ljava/util/concurrent/CompletableFuture;") private void andromeda$downloadLangFiles( boolean force, CallbackInfoReturnable> cir) { Client.onResourceReload( - this.options.language, ModuleManager.get().get(Translations.class).orElseThrow()); + this.options.languageCode, ModuleManager.get().get(Translations.class).orElseThrow()); } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/ReloadableResourceManagerImplMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/ReloadableResourceManagerImplMixin.java index 3d1a75c7..5a8c41d3 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/ReloadableResourceManagerImplMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/translations/mixin/ReloadableResourceManagerImplMixin.java @@ -5,8 +5,12 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef; import java.util.ArrayList; import java.util.List; import me.melontini.andromeda.modules.misc.translations.Translations; -import net.minecraft.resource.*; -import net.minecraft.resource.metadata.ResourceMetadataReader; +import net.minecraft.server.packs.PackResources; +import net.minecraft.server.packs.PackType; +import net.minecraft.server.packs.PathPackResources; +import net.minecraft.server.packs.metadata.MetadataSectionSerializer; +import net.minecraft.server.packs.resources.ReloadInstance; +import net.minecraft.server.packs.resources.ReloadableResourceManager; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -15,33 +19,33 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(ReloadableResourceManagerImpl.class) +@Mixin(ReloadableResourceManager.class) abstract class ReloadableResourceManagerImplMixin { @Shadow @Final - private ResourceType type; + private PackType type; @Inject( at = @At( value = "INVOKE", - target = "Lnet/minecraft/resource/LifecycledResourceManager;close()V", + target = "Lnet/minecraft/server/packs/resources/CloseableResourceManager;close()V", shift = At.Shift.AFTER), - method = "reload") + method = "createReload") private void andromeda$injectDownloadedTranslations( - CallbackInfoReturnable cir, - @Local(argsOnly = true) LocalRef> packs) { - if (this.type != ResourceType.CLIENT_RESOURCES) return; + CallbackInfoReturnable cir, + @Local(argsOnly = true) LocalRef> packs) { + if (this.type != PackType.CLIENT_RESOURCES) return; packs.set(new ArrayList<>(packs.get())); packs .get() .add( - new DirectoryResourcePack( + new PathPackResources( "Andromeda Translations", Translations.TRANSLATION_PACK, true) { @Nullable @Override - public T parseMetadata(ResourceMetadataReader metaReader) { + public T getMetadataSection(MetadataSectionSerializer metaReader) { return null; } }); diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java index f0245725..be2ea595 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java @@ -11,23 +11,23 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap; import net.fabricmc.fabric.api.item.v1.FabricItemSettings; -import net.minecraft.block.AbstractBlock; -import net.minecraft.block.Block; -import net.minecraft.block.Blocks; -import net.minecraft.block.FlowerBlock; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.item.TooltipContext; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemStack; -import net.minecraft.particle.ParticleTypes; -import net.minecraft.registry.Registries; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Rarity; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.FlowerBlock; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public class RoseOfTheValley extends BlockItem { @@ -35,20 +35,20 @@ public class RoseOfTheValley extends BlockItem { public static final Keeper ROSE_OF_THE_VALLEY_BLOCK = Keeper.create(); public static final Keeper ROSE_OF_THE_VALLEY = Keeper.create(); - public RoseOfTheValley(Block block, Settings settings) { + public RoseOfTheValley(Block block, Properties settings) { super(block, settings); } static void init() { RoseOfTheValley.ROSE_OF_THE_VALLEY_BLOCK.init(RegistryUtil.register( - Registries.BLOCK, + BuiltInRegistries.BLOCK, id("rose_of_the_valley"), () -> new FlowerBlock( - StatusEffects.REGENERATION, + MobEffects.REGENERATION, 12, - AbstractBlock.Settings.copy(Blocks.LILY_OF_THE_VALLEY)))); + BlockBehaviour.Properties.copy(Blocks.LILY_OF_THE_VALLEY)))); RoseOfTheValley.ROSE_OF_THE_VALLEY.init(RegistryUtil.register( - Registries.ITEM, + BuiltInRegistries.ITEM, id("rose_of_the_valley"), () -> new RoseOfTheValley( RoseOfTheValley.ROSE_OF_THE_VALLEY_BLOCK.orThrow(), @@ -58,28 +58,28 @@ public class RoseOfTheValley extends BlockItem { @Environment(EnvType.CLIENT) static void onClient() { BlockRenderLayerMap.INSTANCE.putBlocks( - RenderLayer.getCutout(), RoseOfTheValley.ROSE_OF_THE_VALLEY_BLOCK.orThrow()); + RenderType.cutout(), RoseOfTheValley.ROSE_OF_THE_VALLEY_BLOCK.orThrow()); } @Override - public void appendTooltip( - ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + public void appendHoverText( + ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag context) { tooltip.add( - TextUtil.translatable("tooltip.andromeda.rose_of_the_valley").formatted(Formatting.GRAY)); + TextUtil.translatable("tooltip.andromeda.rose_of_the_valley").withStyle(ChatFormatting.GRAY)); } - public static void handleClick(ItemStack stack, ItemStack otherStack, PlayerEntity player) { - player.getInventory().offerOrDrop(new ItemStack(ROSE_OF_THE_VALLEY.orThrow())); - stack.decrement(1); - otherStack.decrement(1); - if (player.world.isClient) { - var client = MinecraftClient.getInstance(); - int x = (int) (client.mouse.getX() - * (double) client.getWindow().getScaledWidth() - / (double) client.getWindow().getWidth()); - int y = (int) (client.mouse.getY() - * (double) client.getWindow().getScaledHeight() - / (double) client.getWindow().getHeight()); + public static void handleClick(ItemStack stack, ItemStack otherStack, Player player) { + player.getInventory().placeItemBackInInventory(new ItemStack(ROSE_OF_THE_VALLEY.orThrow())); + stack.shrink(1); + otherStack.shrink(1); + if (player.level.isClientSide) { + var client = Minecraft.getInstance(); + int x = (int) (client.mouseHandler.xpos() + * (double) client.getWindow().getGuiScaledWidth() + / (double) client.getWindow().getScreenWidth()); + int y = (int) (client.mouseHandler.ypos() + * (double) client.getWindow().getGuiScaledHeight() + / (double) client.getWindow().getScreenHeight()); ScreenParticleHelper.addParticles(ParticleTypes.END_ROD, x, y, 0.5, 0.5, 0.08, 10); } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/UnknownUtil.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/UnknownUtil.java index f2d089fe..4f37e163 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/UnknownUtil.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/UnknownUtil.java @@ -5,10 +5,10 @@ import java.util.Optional; import lombok.NonNull; import lombok.experimental.UtilityClass; import me.melontini.dark_matter.api.base.util.MakeSure; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.World; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; @UtilityClass public class UnknownUtil { @@ -16,12 +16,12 @@ public class UnknownUtil { public static final List AROUND_BLOCK_DIRECTIONS = List.of(Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST); - public static boolean isClear(World world, BlockPos pos) { + public static boolean isClear(Level world, BlockPos pos) { if (!world.getBlockState(pos).isAir()) { return false; } for (Direction dir : AROUND_BLOCK_DIRECTIONS) { - if (!world.getBlockState(pos.offset(dir)).isAir()) { + if (!world.getBlockState(pos.relative(dir)).isAir()) { return false; } } @@ -29,20 +29,20 @@ public class UnknownUtil { } public static Optional pickRandomSpot( - @NonNull World world, @NonNull BlockPos blockPos, int range, @NonNull Random random) { + @NonNull Level world, @NonNull BlockPos blockPos, int range, @NonNull RandomSource random) { MakeSure.isTrue(range > 0, "range can't be negative or zero!"); double j = (range * range * range) * 0.75; while (j > 0) { j--; var pos = new BlockPos( - blockPos.getX() + random.nextBetween(-range, range), - blockPos.getY() + random.nextBetween(-range, range), - blockPos.getZ() + random.nextBetween(-range, range)); - if (world.getBlockState(pos.up()).isAir() + blockPos.getX() + random.nextIntBetweenInclusive(-range, range), + blockPos.getY() + random.nextIntBetweenInclusive(-range, range), + blockPos.getZ() + random.nextIntBetweenInclusive(-range, range)); + if (world.getBlockState(pos.above()).isAir() && world.getBlockState(pos).isAir() && isClear(world, pos) - && isClear(world, pos.up())) { + && isClear(world, pos.above())) { return Optional.of(pos); } } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/nice_level/LevelLoadingScreenMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/nice_level/LevelLoadingScreenMixin.java index 80c82318..e37c672b 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/nice_level/LevelLoadingScreenMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/nice_level/LevelLoadingScreenMixin.java @@ -4,7 +4,7 @@ import com.llamalad7.mixinextras.injector.ModifyReturnValue; import java.util.Objects; import me.melontini.andromeda.bootstrap.util.mixin.MixinEnvironment; import net.fabricmc.api.EnvType; -import net.minecraft.client.gui.screen.LevelLoadingScreen; +import net.minecraft.client.gui.screens.LevelLoadingScreen; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.At; @Mixin(LevelLoadingScreen.class) abstract class LevelLoadingScreenMixin { - @ModifyReturnValue(at = @At("RETURN"), method = "getPercentage") + @ModifyReturnValue(at = @At("RETURN"), method = "getFormattedProgress") private String andromeda$getPercentage(String o) { if (Objects.equals(o, "69%")) { return "Nice%"; diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/rose_of_the_valley/ItemMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/rose_of_the_valley/ItemMixin.java index 98a7976c..c42400ac 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/rose_of_the_valley/ItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/rose_of_the_valley/ItemMixin.java @@ -1,13 +1,13 @@ package me.melontini.andromeda.modules.misc.unknown.mixin.rose_of_the_valley; import me.melontini.andromeda.modules.misc.unknown.RoseOfTheValley; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.StackReference; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.screen.slot.Slot; -import net.minecraft.util.ClickType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.ClickAction; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,18 +16,18 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(Item.class) abstract class ItemMixin { - @Inject(at = @At("HEAD"), method = "onClicked", cancellable = true) + @Inject(at = @At("HEAD"), method = "overrideOtherStackedOnMe", cancellable = true) private void andromeda$onClicked( - ItemStack stack, - ItemStack otherStack, - Slot slot, - ClickType clickType, - PlayerEntity player, - StackReference cursorStackReference, - CallbackInfoReturnable cir) { - if (clickType == ClickType.RIGHT - && stack.isOf(Items.LILY_OF_THE_VALLEY) - && otherStack.isOf(Items.DIAMOND)) { + ItemStack stack, + ItemStack otherStack, + Slot slot, + ClickAction clickType, + Player player, + SlotAccess cursorStackReference, + CallbackInfoReturnable cir) { + if (clickType == ClickAction.SECONDARY + && stack.is(Items.LILY_OF_THE_VALLEY) + && otherStack.is(Items.DIAMOND)) { // I mean .....yeah RoseOfTheValley.handleClick(stack, otherStack, player); cir.setReturnValue(true); diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/useless_info/DebugHudMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/useless_info/DebugHudMixin.java index dfc4b5cc..e8fae09a 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/useless_info/DebugHudMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/useless_info/DebugHudMixin.java @@ -6,8 +6,8 @@ import java.util.function.Supplier; import me.melontini.andromeda.bootstrap.util.mixin.MixinEnvironment; import me.melontini.dark_matter.api.base.util.functions.Memoize; import net.fabricmc.api.EnvType; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.hud.DebugHud; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.DebugScreenOverlay; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -15,12 +15,12 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @MixinEnvironment(EnvType.CLIENT) -@Mixin(DebugHud.class) +@Mixin(DebugScreenOverlay.class) abstract class DebugHudMixin { @Unique private static final Supplier SPLASH = Memoize.supplier(() -> { - var r = MinecraftClient.getInstance().getSplashTextLoader().get(); - return r != null ? r.text : null; + var r = Minecraft.getInstance().getSplashManager().getSplash(); + return r != null ? r.splash : null; }); @Inject( @@ -28,9 +28,9 @@ abstract class DebugHudMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/client/gui/hud/DebugHud;getServerWorldDebugString()Ljava/lang/String;", + "Lnet/minecraft/client/gui/components/DebugScreenOverlay;getServerChunkStats()Ljava/lang/String;", shift = At.Shift.BEFORE), - method = "getLeftText") + method = "getGameInformation") private void andromeda$leftText( CallbackInfoReturnable> cir, @Local List list) { if (SPLASH.get() != null) list.add(SPLASH.get()); diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/wakeup/PlayerEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/wakeup/PlayerEntityMixin.java index 4cea23ff..c6bd5327 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/wakeup/PlayerEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/mixin/wakeup/PlayerEntityMixin.java @@ -3,50 +3,50 @@ package me.melontini.andromeda.modules.misc.unknown.mixin.wakeup; import java.util.Optional; import me.melontini.andromeda.modules.misc.unknown.UnknownUtil; import me.melontini.dark_matter.api.data.nbt.NbtBuilder; -import net.minecraft.entity.EquipmentSlot; -import net.minecraft.entity.decoration.ArmorStandEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.sound.SoundCategory; -import net.minecraft.sound.SoundEvent; -import net.minecraft.sound.SoundEvents; -import net.minecraft.util.math.BlockPos; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.decoration.ArmorStand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.sounds.SoundSource; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.core.BlockPos; 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; -@Mixin(PlayerEntity.class) +@Mixin(Player.class) abstract class PlayerEntityMixin { @Shadow - public abstract void playSound( - SoundEvent event, SoundCategory category, float volume, float pitch); + public abstract void playNotifySound( + SoundEvent event, SoundSource category, float volume, float pitch); - @Inject(at = @At("HEAD"), method = "wakeUp(ZZ)V") + @Inject(at = @At("HEAD"), method = "stopSleepInBed(ZZ)V") private void andromeda$wakeUp( boolean skipSleepTimer, boolean updateSleepingPlayers, CallbackInfo ci) { - PlayerEntity player = (PlayerEntity) (Object) this; + Player player = (Player) (Object) this; - if (!player.world.isClient) - if (player.world.getRandom().nextInt(100000) == 0) { + if (!player.level.isClientSide) + if (player.level.getRandom().nextInt(100000) == 0) { Optional optional = UnknownUtil.pickRandomSpot( - player.world, player.getBlockPos(), 10, player.world.getRandom()); + player.level, player.blockPosition(), 10, player.level.getRandom()); if (optional.isPresent()) { BlockPos pos = optional.get(); - ArmorStandEntity stand = - new ArmorStandEntity(player.world, pos.getX(), pos.getY(), pos.getZ()); + ArmorStand stand = + new ArmorStand(player.level, pos.getX(), pos.getY(), pos.getZ()); ItemStack stack = new ItemStack(Items.PLAYER_HEAD); - stack.setNbt(NbtBuilder.create() + stack.setTag(NbtBuilder.create() .putString("SkullOwner", player.getDisplayName().getString()) .build()); - stand.equipStack(EquipmentSlot.HEAD, stack); - player.world.spawnEntity(stand); - playSound(SoundEvents.ENTITY_LIGHTNING_BOLT_THUNDER, SoundCategory.AMBIENT, 4, 1); + stand.setItemSlot(EquipmentSlot.HEAD, stack); + player.level.addFreshEntity(stand); + playNotifySound(SoundEvents.LIGHTNING_BOLT_THUNDER, SoundSource.AMBIENT, 4, 1); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java b/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java index 8881a082..6f93b27a 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java +++ b/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java @@ -8,7 +8,7 @@ import me.melontini.andromeda.bootstrap.config.ConfigDefinition; import me.melontini.andromeda.bootstrap.config.RegisterConfigEvent; import me.melontini.andromeda.bootstrap.util.Environment; import me.melontini.andromeda.common.config.GameConfig; -import net.minecraft.item.Item; +import net.minecraft.world.item.Item; @ModuleInfo(name = "auto_planting", category = "world", env = Environment.SERVER) public final class AutoPlanting extends Module { diff --git a/src/main/java/me/melontini/andromeda/modules/world/auto_planting/mixin/ItemEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/world/auto_planting/mixin/ItemEntityMixin.java index bf8a723f..e12c76a5 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/auto_planting/mixin/ItemEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/auto_planting/mixin/ItemEntityMixin.java @@ -3,16 +3,16 @@ package me.melontini.andromeda.modules.world.auto_planting.mixin; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.world.auto_planting.AutoPlanting; import me.melontini.dark_matter.api.base.util.MathUtil; -import net.minecraft.block.PlantBlock; -import net.minecraft.entity.Entity; -import net.minecraft.entity.ItemEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.ItemPlacementContext; -import net.minecraft.item.ItemStack; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.RaycastContext; -import net.minecraft.world.World; +import net.minecraft.world.level.block.BushBlock; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.ClipContext; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -23,36 +23,36 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; abstract class ItemEntityMixin { @Shadow - public abstract ItemStack getStack(); + public abstract ItemStack getItem(); @Inject(at = @At("HEAD"), method = "tick") public void andromeda$tryPlant(CallbackInfo ci) { Entity entity = (Entity) (Object) this; - ItemStack stack = this.getStack(); - BlockPos pos = entity.getBlockPos(); - World world = entity.getWorld(); + ItemStack stack = this.getItem(); + BlockPos pos = entity.blockPosition(); + Level world = entity.level(); - if (world.isClient()) return; + if (world.isClientSide()) return; if (!(stack.getItem() instanceof BlockItem blockItem) - || !(blockItem.getBlock() instanceof PlantBlock)) return; + || !(blockItem.getBlock() instanceof BushBlock)) return; - if (entity.age % MathUtil.nextInt(20, 101) != 0) return; + if (entity.tickCount % MathUtil.nextInt(20, 101) != 0) return; var config = world.am$get(AutoPlanting.CONFIG); if (!config.available.asBoolean(LootContextBuilder.fishing( world, builder -> builder.origin(entity).tool(stack).thisEntity(entity)))) return; if (!world.getFluidState(pos).isEmpty()) return; if (config.blacklistMode == config.idList.contains(stack.getItem())) return; - blockItem.place(new ItemPlacementContext( + blockItem.place(new BlockPlaceContext( world, null, null, stack, - world.raycast(new RaycastContext( - Vec3d.add(pos, 0.5, 0.5, 0.5), - Vec3d.add(pos, 0.5, -0.5, 0.5), - RaycastContext.ShapeType.COLLIDER, - RaycastContext.FluidHandling.ANY, + world.clip(new ClipContext( + Vec3.atLowerCornerWithOffset(pos, 0.5, 0.5, 0.5), + Vec3.atLowerCornerWithOffset(pos, 0.5, -0.5, 0.5), + ClipContext.Block.COLLIDER, + ClipContext.Fluid.ANY, entity)))); } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperatureData.java b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperatureData.java index 8b6ff896..d7845a83 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperatureData.java +++ b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperatureData.java @@ -23,21 +23,26 @@ import me.melontini.dark_matter.api.base.util.MathUtil; import me.melontini.dark_matter.api.data.codecs.ExtraCodecs; import me.melontini.dark_matter.api.data.loading.ReloaderType; import me.melontini.dark_matter.api.data.loading.ServerReloadersEvent; -import net.minecraft.block.*; -import net.minecraft.registry.Registries; -import net.minecraft.resource.ResourceManager; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import net.minecraft.util.profiler.Profiler; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.util.profiling.ProfilerFiller; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.BushBlock; +import net.minecraft.world.level.block.GrowingPlantBlock; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; public final class PlantTemperatureData { private static final Codec OLD_CODEC = RecordCodecBuilder.create(data -> data.group( ExtraCodecs.optional("replace", Codec.BOOL, false).forGetter(OldHolder::replace), - ExtraCodecs.list(Registries.BLOCK.getCodec()) + ExtraCodecs.list(BuiltInRegistries.BLOCK.byNameCodec()) .fieldOf("identifier") .forGetter(OldHolder::blocks), Codec.FLOAT.fieldOf("min").forGetter(o -> o.temperatures()[1]), @@ -60,7 +65,7 @@ public final class PlantTemperatureData { private static final Codec BASE_HOLDER = RecordCodecBuilder.create(data -> data.group( ExtraCodecs.optional("replace", Codec.BOOL, false).forGetter(NewHolder::replace), - Codec.unboundedMap(Registries.BLOCK.getCodec(), FLOAT_ARRAY_CODEC) + Codec.unboundedMap(BuiltInRegistries.BLOCK.byNameCodec(), FLOAT_ARRAY_CODEC) .fieldOf("entries") .forGetter(NewHolder::temperatures)) .apply(data, NewHolder::new)); @@ -84,7 +89,7 @@ public final class PlantTemperatureData { public static final ReloaderType RELOADER = ReloaderType.create(Andromeda.id("crop_temperatures")); - public static boolean roll(BlockPos pos, BlockState state, float temp, ServerWorld world) { + public static boolean roll(BlockPos pos, BlockState state, float temp, ServerLevel world) { if (isPlant(state.getBlock())) { float[] data = world.getServer().dm$getReloader(RELOADER).get(state.getBlock()); if (data != null) { @@ -108,9 +113,9 @@ public final class PlantTemperatureData { record NewHolder(boolean replace, Map temperatures) {} public static boolean isPlant(Block block) { - return block instanceof PlantBlock - || block instanceof AbstractPlantPartBlock - || block instanceof Fertilizable; + return block instanceof BushBlock + || block instanceof GrowingPlantBlock + || block instanceof BonemealableBlock; } public static void init() { @@ -120,15 +125,15 @@ public final class PlantTemperatureData { private static void verifyPostLoad(PlantTemperature module, Reloader reloader) { String mapped = Mapper.mapMethod( - AbstractBlock.class, + BlockBehaviour.class, "method_9514", MethodType.methodType( - void.class, BlockState.class, ServerWorld.class, BlockPos.class, Random.class)); + void.class, BlockState.class, ServerLevel.class, BlockPos.class, RandomSource.class)); List override = new ArrayList<>(); List blocks = new ArrayList<>(); - Registries.BLOCK.forEach(block -> { + BuiltInRegistries.BLOCK.forEach(block -> { if (isPlant(block) && reloader.get(block) == null) { if (methodInHierarchyUntil(block.getClass(), mapped, Block.class)) { override.add(block); @@ -143,13 +148,13 @@ public final class PlantTemperatureData { .logger() .warn( "Missing crop temperatures: {}", - override.stream().map(Registries.BLOCK::getId).sorted().toList()); + override.stream().map(BuiltInRegistries.BLOCK::getKey).sorted().toList()); if (!blocks.isEmpty()) module .logger() .warn( "Possible missing crop temperatures: {}", - blocks.stream().map(Registries.BLOCK::getId).sorted().toList()); + blocks.stream().map(BuiltInRegistries.BLOCK::getKey).sorted().toList()); } private static boolean methodInHierarchyUntil(Class cls, String name, Class stopClass) { @@ -177,7 +182,7 @@ public final class PlantTemperatureData { @Override protected void apply( - Map data, ResourceManager manager, Profiler profiler) { + Map data, ResourceManager manager, ProfilerFiller profiler) { IdentityHashMap replace = new IdentityHashMap<>(); IdentityHashMap result = new IdentityHashMap<>(); Maps.transformValues( diff --git a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/BoneMealItemMixin.java b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/BoneMealItemMixin.java index 38fdfe96..4c024d80 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/BoneMealItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/BoneMealItemMixin.java @@ -3,13 +3,13 @@ package me.melontini.andromeda.modules.world.crop_temperature.mixin; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.world.crop_temperature.PlantTemperature; import me.melontini.andromeda.modules.world.crop_temperature.PlantTemperatureData; -import net.minecraft.block.BlockState; -import net.minecraft.item.BoneMealItem; -import net.minecraft.item.ItemUsageContext; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.item.BoneMealItem; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.core.BlockPos; +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; @@ -18,12 +18,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BoneMealItem.class) abstract class BoneMealItemMixin { - @Inject(at = @At("HEAD"), method = "useOnBlock", cancellable = true) + @Inject(at = @At("HEAD"), method = "useOn", cancellable = true) private void andromeda$useOnFertilizable( - ItemUsageContext ctx, CallbackInfoReturnable cir) { - World world = ctx.getWorld(); - BlockPos pos = ctx.getBlockPos(); - if (world.isClient()) return; + UseOnContext ctx, CallbackInfoReturnable cir) { + Level world = ctx.getLevel(); + BlockPos pos = ctx.getClickedPos(); + if (world.isClientSide()) return; BlockState state = world.getBlockState(pos); if (world @@ -32,8 +32,8 @@ abstract class BoneMealItemMixin { .asBoolean( LootContextBuilder.block(world, builder -> builder.origin(pos).state(state)))) { if (!PlantTemperatureData.roll( - pos, state, world.getBiome(pos).value().getTemperature(), (ServerWorld) world)) { - cir.setReturnValue(ActionResult.FAIL); + pos, state, world.getBiome(pos).value().getBaseTemperature(), (ServerLevel) world)) { + cir.setReturnValue(InteractionResult.FAIL); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/ServerWorldMixin.java b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/ServerWorldMixin.java index 550ede98..a9fbc590 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/ServerWorldMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/mixin/ServerWorldMixin.java @@ -2,14 +2,14 @@ package me.melontini.andromeda.modules.world.crop_temperature.mixin; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import me.melontini.andromeda.modules.world.crop_temperature.PlantTemperatureData; -import net.minecraft.block.BlockState; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -@Mixin(ServerWorld.class) +@Mixin(ServerLevel.class) abstract class ServerWorldMixin { @WrapWithCondition( @@ -17,11 +17,11 @@ abstract class ServerWorldMixin { @At( value = "INVOKE", target = - "Lnet/minecraft/block/BlockState;randomTick(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/random/Random;)V"), + "Lnet/minecraft/world/level/block/state/BlockState;randomTick(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/core/BlockPos;Lnet/minecraft/util/RandomSource;)V"), method = "tickChunk") private boolean andromeda$tickPlants( - BlockState state, ServerWorld world, BlockPos pos, Random random) { + BlockState state, ServerLevel world, BlockPos pos, RandomSource random) { return PlantTemperatureData.roll( - pos, state, world.getBiome(pos).value().getTemperature(), world); + pos, state, world.getBiome(pos).value().getBaseTemperature(), world); } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/BeeUtil.java b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/BeeUtil.java index 2d1e3dce..4a8b56fb 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/BeeUtil.java +++ b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/BeeUtil.java @@ -4,38 +4,38 @@ import java.util.List; import lombok.NonNull; import me.melontini.andromeda.common.Andromeda; import me.melontini.dark_matter.api.data.nbt.NbtBuilder; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BeehiveBlockEntity; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.loot.context.LootContextParameterSet; -import net.minecraft.loot.context.LootContextTypes; -import net.minecraft.nbt.NbtHelper; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.state.property.Properties; -import net.minecraft.util.Identifier; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraft.nbt.NbtUtils; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; public class BeeUtil { public static final List AROUND_BLOCK_DIRECTIONS = List.of(Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST); - public static final Identifier BEE_LOOT_ID = Andromeda.id("bee_nest/bee_nest_broken"); + public static final ResourceLocation BEE_LOOT_ID = Andromeda.id("bee_nest/bee_nest_broken"); - public static List prepareLoot(@NonNull World world, @NonNull Identifier lootId) { - return ((ServerWorld) world) + public static List prepareLoot(@NonNull Level world, @NonNull ResourceLocation lootId) { + return ((ServerLevel) world) .getServer() - .getLootManager() + .getLootData() .getLootTable(lootId) - .generateLoot(new LootContextParameterSet.Builder(((ServerWorld) world)) - .build(LootContextTypes.EMPTY)); + .getRandomItems(new LootParams.Builder(((ServerLevel) world)) + .create(LootContextParamSets.EMPTY)); } public static void trySpawnFallingBeeNest( - @NonNull World world, + @NonNull Level world, @NonNull BlockPos pos, @NonNull BlockState state, @NonNull BeehiveBlockEntity beehiveBlockEntity) { @@ -44,22 +44,22 @@ public class BeeUtil { pos.getX() + 0.5, pos.getY(), pos.getZ() + 0.5, - state.contains(Properties.WATERLOGGED) - ? state.with(Properties.WATERLOGGED, Boolean.FALSE) + state.hasProperty(BlockStateProperties.WATERLOGGED) + ? state.setValue(BlockStateProperties.WATERLOGGED, Boolean.FALSE) : state); // Thanks AccessWidener! - fallingBlock.readCustomDataFromNbt(NbtBuilder.create() + fallingBlock.readAdditionalSaveData(NbtBuilder.create() .put( "TileEntityData", NbtBuilder.create() - .put("Bees", beehiveBlockEntity.getBees()) + .put("Bees", beehiveBlockEntity.writeBees()) .putBoolean("AM-FromFallenBlock", true) .build()) - .put("BlockState", NbtHelper.fromBlockState(state)) + .put("BlockState", NbtUtils.writeBlockState(state)) .build()); - world.setBlockState(pos, state.getFluidState().getBlockState(), Block.NOTIFY_ALL); - world.spawnEntity(fallingBlock); + world.setBlock(pos, state.getFluidState().createLegacyBlock(), Block.UPDATE_ALL); + world.addFreshEntity(fallingBlock); } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockEntityMixin.java index 136d40cc..2b6f6852 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockEntityMixin.java @@ -3,16 +3,16 @@ package me.melontini.andromeda.modules.world.falling_beenests.mixin; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.world.falling_beenests.BeeUtil; import me.melontini.andromeda.modules.world.falling_beenests.CanBeeNestsFall; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BeehiveBlockEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.registry.tag.BlockTags; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.tags.BlockTags; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -31,11 +31,11 @@ abstract class BeehiveBlockEntityMixin extends BlockEntity { @Inject(at = @At("HEAD"), method = "serverTick") private static void andromeda$fallingHive( - @NotNull World world, - BlockPos pos, - BlockState state, - BeehiveBlockEntity beehiveBlockEntity, - CallbackInfo ci) { + @NotNull Level world, + BlockPos pos, + BlockState state, + BeehiveBlockEntity beehiveBlockEntity, + CallbackInfo ci) { if (state.getBlock() != Blocks.BEE_NEST) return; if (world @@ -44,13 +44,13 @@ abstract class BeehiveBlockEntityMixin extends BlockEntity { .asBoolean(LootContextBuilder.block( world, builder -> builder.origin(pos).state(state).blockEntity(beehiveBlockEntity))) && world.random.nextInt(32000) == 0) { - if (!world.getBlockState(pos.offset(Direction.DOWN)).isAir()) return; + if (!world.getBlockState(pos.relative(Direction.DOWN)).isAir()) return; - BlockState up = world.getBlockState(pos.offset(Direction.UP)); - if (!up.isIn(BlockTags.LOGS) && !up.isIn(BlockTags.LEAVES)) return; + BlockState up = world.getBlockState(pos.relative(Direction.UP)); + if (!up.is(BlockTags.LOGS) && !up.is(BlockTags.LEAVES)) return; for (Direction direction : BeeUtil.AROUND_BLOCK_DIRECTIONS) { - if (world.getBlockState(pos.offset(direction)).isIn(BlockTags.LOGS)) { + if (world.getBlockState(pos.relative(direction)).is(BlockTags.LOGS)) { BeeUtil.trySpawnFallingBeeNest(world, pos, state, beehiveBlockEntity); break; } @@ -58,14 +58,14 @@ abstract class BeehiveBlockEntityMixin extends BlockEntity { } } - @Inject(at = @At("TAIL"), method = "readNbt") - private void andromeda$readNbt(@NotNull NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "load") + private void andromeda$readNbt(@NotNull CompoundTag nbt, CallbackInfo ci) { if (nbt.contains("AM-FromFallenBlock")) this.andromeda$FromFallen = nbt.getBoolean("AM-FromFallenBlock"); } - @Inject(at = @At("TAIL"), method = "writeNbt") - private void andromeda$writeNbt(@NotNull NbtCompound nbt, CallbackInfo ci) { + @Inject(at = @At("TAIL"), method = "saveAdditional") + private void andromeda$writeNbt(@NotNull CompoundTag nbt, CallbackInfo ci) { if (this.andromeda$FromFallen) nbt.putBoolean("AM-FromFallenBlock", true); } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockMixin.java index 7e8dea7d..c655f5da 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/BeehiveBlockMixin.java @@ -1,13 +1,13 @@ package me.melontini.andromeda.modules.world.falling_beenests.mixin; import me.melontini.andromeda.modules.world.falling_beenests.BeeUtil; -import net.minecraft.block.BeehiveBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BeehiveBlockEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.level.block.BeehiveBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -16,23 +16,23 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BeehiveBlock.class) abstract class BeehiveBlockMixin { - @Inject(at = @At("HEAD"), method = "getStateForNeighborUpdate", cancellable = true) + @Inject(at = @At("HEAD"), method = "updateShape", cancellable = true) private void andromeda$checkSupport( - BlockState state, - Direction direction, - BlockState neighborState, - WorldAccess world, - BlockPos pos, - BlockPos neighborPos, - CallbackInfoReturnable cir) { - if (!(world instanceof World)) return; + BlockState state, + Direction direction, + BlockState neighborState, + LevelAccessor world, + BlockPos pos, + BlockPos neighborPos, + CallbackInfoReturnable cir) { + if (!(world instanceof Level)) return; for (Direction value : Direction.values()) { - if (!world.getBlockState(pos.offset(value)).isAir()) { + if (!world.getBlockState(pos.relative(value)).isAir()) { return; } } BeeUtil.trySpawnFallingBeeNest( - (World) world, pos, state, (BeehiveBlockEntity) world.getBlockEntity(pos)); - cir.setReturnValue(state.getFluidState().getBlockState()); + (Level) world, pos, state, (BeehiveBlockEntity) world.getBlockEntity(pos)); + cir.setReturnValue(state.getFluidState().createLegacyBlock()); } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/FallingBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/FallingBlockMixin.java index 1ca60c5d..cdeef257 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/FallingBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/FallingBlockMixin.java @@ -6,21 +6,21 @@ import me.melontini.andromeda.modules.world.falling_beenests.BeeUtil; import me.melontini.andromeda.modules.world.falling_beenests.CanBeeNestsFall; import me.melontini.dark_matter.api.minecraft.util.ItemStackUtil; import me.melontini.dark_matter.api.minecraft.util.PlayerUtil; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BeehiveBlockEntity; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.FallingBlockEntity; -import net.minecraft.entity.passive.BeeEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtList; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.entity.animal.Bee; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.core.BlockPos; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -32,12 +32,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; abstract class FallingBlockMixin extends Entity { @Shadow - @Nullable public NbtCompound blockEntityData; + @Nullable public CompoundTag blockData; @Shadow - private BlockState block; + private BlockState blockState; - public FallingBlockMixin(EntityType type, World world) { + public FallingBlockMixin(EntityType type, Level world) { super(type, world); } @@ -46,48 +46,48 @@ abstract class FallingBlockMixin extends Entity { @At( value = "INVOKE", target = - "net/minecraft/world/World.getBlockEntity (Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/entity/BlockEntity;", + "Lnet/minecraft/world/level/Level;getBlockEntity(Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/level/block/entity/BlockEntity;", shift = At.Shift.AFTER), method = "tick") public void andromeda$tick(CallbackInfo ci) { - BlockPos blockPos = this.getBlockPos(); - BlockEntity blockEntity = this.world.getBlockEntity(blockPos); + BlockPos blockPos = this.blockPosition(); + BlockEntity blockEntity = this.level.getBlockEntity(blockPos); if (blockEntity == null) return; if (blockEntity instanceof BeehiveBlockEntity beehiveBlockEntity - && this.world + && this.level .am$get(CanBeeNestsFall.CONFIG) .available .asBoolean(LootContextBuilder.block( - world, builder -> builder.origin(this).state(block).blockEntity(blockEntity)))) { - if (this.block.getBlock() != Blocks.BEE_NEST) return; - if (blockEntityData == null || !blockEntityData.getBoolean("AM-FromFallenBlock")) return; + level, builder -> builder.origin(this).state(blockState).blockEntity(blockEntity)))) { + if (this.blockState.getBlock() != Blocks.BEE_NEST) return; + if (blockData == null || !blockData.getBoolean("AM-FromFallenBlock")) return; - blockEntityData.putBoolean("AM-FromFallenBlock", false); + blockData.putBoolean("AM-FromFallenBlock", false); - Optional optional = - PlayerUtil.findClosestNonCreativePlayerInRange(world, this.getBlockPos(), 16); - final NbtList nbeetlist = blockEntityData.getList("Bees", 10); + Optional optional = + PlayerUtil.findClosestNonCreativePlayerInRange(level, this.blockPosition(), 16); + final ListTag nbeetlist = blockData.getList("Bees", 10); - world.breakBlock(beehiveBlockEntity.getPos(), false); + level.destroyBlock(beehiveBlockEntity.getBlockPos(), false); for (int i = 0; i < nbeetlist.size(); ++i) { - NbtCompound entityData = nbeetlist.getCompound(i).getCompound("EntityData"); - BeehiveBlockEntity.removeIrrelevantNbtKeys(entityData); - BeeEntity bee = EntityType.BEE.create(world); + CompoundTag entityData = nbeetlist.getCompound(i).getCompound("EntityData"); + BeehiveBlockEntity.removeIgnoredBeeTags(entityData); + Bee bee = EntityType.BEE.create(level); if (bee == null) continue; - bee.readNbt(entityData); - bee.setPosition(getPos()); - bee.setCannotEnterHiveTicks(400); + bee.load(entityData); + bee.setPos(position()); + bee.setStayOutOfHiveCountdown(400); optional.ifPresent(bee::setTarget); - world.spawnEntity(bee); + level.addFreshEntity(bee); } - optional.ifPresent(player -> world - .getNonSpectatingEntities(BeeEntity.class, new Box(getBlockPos()).expand(50)) + optional.ifPresent(player -> level + .getEntitiesOfClass(Bee.class, new AABB(blockPosition()).inflate(50)) .forEach(bee -> bee.setTarget(player))); - for (ItemStack stack : BeeUtil.prepareLoot(world, BeeUtil.BEE_LOOT_ID)) { - ItemStackUtil.spawnVelocity(this.getPos(), stack, world, -0.3, 0.3, 0.05, 0.2, -0.3, 0.3); + for (ItemStack stack : BeeUtil.prepareLoot(level, BeeUtil.BEE_LOOT_ID)) { + ItemStackUtil.spawnVelocity(this.position(), stack, level, -0.3, 0.3, 0.05, 0.2, -0.3, 0.3); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/PersistentProjectileEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/PersistentProjectileEntityMixin.java index 95737fcb..dd81f9a3 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/PersistentProjectileEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/mixin/PersistentProjectileEntityMixin.java @@ -3,47 +3,47 @@ package me.melontini.andromeda.modules.world.falling_beenests.mixin; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.world.falling_beenests.BeeUtil; import me.melontini.andromeda.modules.world.falling_beenests.CanBeeNestsFall; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.BeehiveBlockEntity; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.projectile.PersistentProjectileEntity; -import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.util.hit.BlockHitResult; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BeehiveBlockEntity; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.projectile.AbstractArrow; +import net.minecraft.world.entity.projectile.Projectile; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +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.CallbackInfo; -@Mixin(PersistentProjectileEntity.class) -abstract class PersistentProjectileEntityMixin extends ProjectileEntity { +@Mixin(AbstractArrow.class) +abstract class PersistentProjectileEntityMixin extends Projectile { public PersistentProjectileEntityMixin( - EntityType entityType, World world) { + EntityType entityType, Level world) { super(entityType, world); } - @Inject(at = @At("TAIL"), method = "onBlockHit") + @Inject(at = @At("TAIL"), method = "onHitBlock") private void andromeda$onBeeNestHit(BlockHitResult blockHitResult, CallbackInfo ci) { BlockPos pos = blockHitResult.getBlockPos(); - BlockState state = world.getBlockState(pos); + BlockState state = level.getBlockState(pos); - if (state.getBlock() == Blocks.BEE_NEST && !world.isClient()) { - BeehiveBlockEntity beehiveBlockEntity = (BeehiveBlockEntity) world.getBlockEntity(pos); + if (state.getBlock() == Blocks.BEE_NEST && !level.isClientSide()) { + BeehiveBlockEntity beehiveBlockEntity = (BeehiveBlockEntity) level.getBlockEntity(pos); if (beehiveBlockEntity == null) return; - if (!world + if (!level .am$get(CanBeeNestsFall.CONFIG) .available .asBoolean(LootContextBuilder.block( - world, builder -> builder.origin(pos).state(state).blockEntity(beehiveBlockEntity)))) + level, builder -> builder.origin(pos).state(state).blockEntity(beehiveBlockEntity)))) return; - if (world.getBlockState(pos.offset(Direction.DOWN)).isAir()) { - BeeUtil.trySpawnFallingBeeNest(world, pos, state, beehiveBlockEntity); + if (level.getBlockState(pos.relative(Direction.DOWN)).isAir()) { + BeeUtil.trySpawnFallingBeeNest(level, pos, state, beehiveBlockEntity); } } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/loot_barrels/LootBarrelFeature.java b/src/main/java/me/melontini/andromeda/modules/world/loot_barrels/LootBarrelFeature.java index 29a83948..1e15a739 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/loot_barrels/LootBarrelFeature.java +++ b/src/main/java/me/melontini/andromeda/modules/world/loot_barrels/LootBarrelFeature.java @@ -6,31 +6,31 @@ import java.util.Arrays; import java.util.Comparator; import me.melontini.andromeda.common.Andromeda; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; -import net.minecraft.block.BarrelBlock; -import net.minecraft.block.Block; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.registry.Registries; -import net.minecraft.registry.Registry; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.util.Identifier; -import net.minecraft.util.Util; -import net.minecraft.util.collection.WeightedList; -import net.minecraft.util.math.Direction; -import net.minecraft.world.dimension.DimensionOptions; -import net.minecraft.world.gen.GenerationStep; -import net.minecraft.world.gen.feature.Feature; -import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.feature.PlacedFeature; -import net.minecraft.world.gen.feature.util.FeatureContext; +import net.minecraft.world.level.block.BarrelBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.RandomizableContainerBlockEntity; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.Util; +import net.minecraft.world.entity.ai.behavior.ShufflingList; +import net.minecraft.core.Direction; +import net.minecraft.world.level.dimension.LevelStem; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; public class LootBarrelFeature extends Feature { private static final Direction[] HORIZONTAL = Arrays.stream(Direction.values()) .filter((direction) -> direction.getAxis().isHorizontal()) - .sorted(Comparator.comparingInt(Direction::getHorizontal)) + .sorted(Comparator.comparingInt(Direction::get2DDataValue)) .toArray(Direction[]::new); public LootBarrelFeature() { @@ -38,49 +38,49 @@ public class LootBarrelFeature extends Feature context) { - var world = context.getWorld(); - if (!world.getBlockState(context.getOrigin()).isAir() - || !world.getBlockState(context.getOrigin().down()).isOpaque()) return false; + public boolean place(FeaturePlaceContext context) { + var world = context.level(); + if (!world.getBlockState(context.origin()).isAir() + || !world.getBlockState(context.origin().below()).canOcclude()) return false; - world.setBlockState( - context.getOrigin(), + world.setBlock( + context.origin(), Blocks.BARREL - .getDefaultState() - .with(BarrelBlock.FACING, Util.getRandom(HORIZONTAL, context.getRandom())), - Block.NOTIFY_LISTENERS); - LootableContainerBlockEntity.setLootTable( - world, context.getRandom(), context.getOrigin(), context.getConfig().loot()); + .defaultBlockState() + .setValue(BarrelBlock.FACING, Util.getRandom(HORIZONTAL, context.random())), + Block.UPDATE_CLIENTS); + RandomizableContainerBlockEntity.setLootTable( + world, context.random(), context.origin(), context.config().loot()); - if (world.getBlockState(context.getOrigin().up()).isAir() - && context.getConfig().decorations().stream().findAny().isPresent()) { - world.setBlockState( - context.getOrigin().up(), - context.getConfig().decorations().shuffle().stream().findFirst().orElseThrow(), - Block.NOTIFY_LISTENERS); + if (world.getBlockState(context.origin().above()).isAir() + && context.config().decorations().stream().findAny().isPresent()) { + world.setBlock( + context.origin().above(), + context.config().decorations().shuffle().stream().findFirst().orElseThrow(), + Block.UPDATE_CLIENTS); } return true; } - public record LootBarrelConfiguration(Identifier loot, WeightedList decorations) - implements FeatureConfig { + public record LootBarrelConfiguration(ResourceLocation loot, ShufflingList decorations) + implements FeatureConfiguration { public static final Codec CODEC = RecordCodecBuilder.create(data -> data.group( - Identifier.CODEC.fieldOf("loot").forGetter(LootBarrelConfiguration::loot), - WeightedList.createCodec(BlockState.CODEC) + ResourceLocation.CODEC.fieldOf("loot").forGetter(LootBarrelConfiguration::loot), + ShufflingList.codec(BlockState.CODEC) .fieldOf("decorations") .forGetter(LootBarrelConfiguration::decorations)) .apply(data, LootBarrelConfiguration::new)); } public static void init() { - Registry.register(Registries.FEATURE, Andromeda.id("loot_barrel"), new LootBarrelFeature()); + Registry.register(BuiltInRegistries.FEATURE, Andromeda.id("loot_barrel"), new LootBarrelFeature()); - RegistryKey key = Andromeda.key(RegistryKeys.PLACED_FEATURE, "loot_barrel"); + ResourceKey key = Andromeda.key(Registries.PLACED_FEATURE, "loot_barrel"); BiomeModifications.addFeature( - context -> context.canGenerateIn(DimensionOptions.OVERWORLD), - GenerationStep.Feature.UNDERGROUND_STRUCTURES, + context -> context.canGenerateIn(LevelStem.OVERWORLD), + GenerationStep.Decoration.UNDERGROUND_STRUCTURES, key); } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/moist_control/mixin/FarmlandMixin.java b/src/main/java/me/melontini/andromeda/modules/world/moist_control/mixin/FarmlandMixin.java index e49bbc47..dd28792a 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/moist_control/mixin/FarmlandMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/moist_control/mixin/FarmlandMixin.java @@ -5,25 +5,25 @@ import com.llamalad7.mixinextras.sugar.Share; import com.llamalad7.mixinextras.sugar.ref.LocalIntRef; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.world.moist_control.MoistControl; -import net.minecraft.block.FarmlandBlock; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.WorldView; +import net.minecraft.world.level.block.FarmBlock; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.LevelReader; 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(FarmlandBlock.class) +@Mixin(FarmBlock.class) abstract class FarmlandMixin { - @Inject(at = @At("HEAD"), method = "isWaterNearby") + @Inject(at = @At("HEAD"), method = "isNearWater") private static void andromeda$prepareRule( - WorldView world, - BlockPos pos, - CallbackInfoReturnable cir, - @Share("value") LocalIntRef ref) { - if (world instanceof ServerWorld sw) { + LevelReader world, + BlockPos pos, + CallbackInfoReturnable cir, + @Share("value") LocalIntRef ref) { + if (world instanceof ServerLevel sw) { ref.set(sw.am$get(MoistControl.CONFIG) .customMoisture .asInt(LootContextBuilder.command(sw, builder -> builder.origin(pos)))); @@ -32,14 +32,14 @@ abstract class FarmlandMixin { @ModifyExpressionValue( at = @At(value = "CONSTANT", args = "intValue=4"), - method = "isWaterNearby") + method = "isNearWater") private static int andromeda$modifyMoisture(int original, @Share("value") LocalIntRef ref) { return ref.get(); } @ModifyExpressionValue( at = @At(value = "CONSTANT", args = "intValue=-4"), - method = "isWaterNearby") + method = "isNearWater") private static int andromeda$modifyMoistureNegative( int original, @Share("value") LocalIntRef ref) { return -ref.get(); diff --git a/src/main/java/me/melontini/andromeda/modules/world/quick_fire/mixin/AbstractFireBlockMixin.java b/src/main/java/me/melontini/andromeda/modules/world/quick_fire/mixin/AbstractFireBlockMixin.java index 49813d06..3f4d6dfc 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/quick_fire/mixin/AbstractFireBlockMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/world/quick_fire/mixin/AbstractFireBlockMixin.java @@ -4,13 +4,13 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.common.util.LootContextBuilder; import me.melontini.andromeda.modules.world.quick_fire.QuickFire; -import net.minecraft.block.AbstractFireBlock; -import net.minecraft.block.BlockState; -import net.minecraft.block.FireBlock; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.random.Random; -import net.minecraft.world.World; +import net.minecraft.world.level.block.BaseFireBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.FireBlock; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.core.BlockPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -20,28 +20,28 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(FireBlock.class) -abstract class AbstractFireBlockMixin extends AbstractFireBlock { +abstract class AbstractFireBlockMixin extends BaseFireBlock { @Shadow - protected abstract void trySpreadingFire( - World world, BlockPos pos, int spreadFactor, Random random, int currentAge); + protected abstract void checkBurnOut( + Level world, BlockPos pos, int spreadFactor, RandomSource random, int currentAge); @Unique private static final ThreadLocal LOCAL = ThreadLocal.withInitial(() -> Boolean.FALSE); - public AbstractFireBlockMixin(Settings settings, float damage) { + public AbstractFireBlockMixin(Properties settings, float damage) { super(settings, damage); } - @ModifyVariable(method = "trySpreadingFire", at = @At("LOAD"), index = 3, argsOnly = true) + @ModifyVariable(method = "checkBurnOut", at = @At("LOAD"), index = 3, argsOnly = true) public int andromeda$spreadFire0( - int value, @Local(argsOnly = true) World world, @Local(argsOnly = true) BlockPos pos) { + int value, @Local(argsOnly = true) Level world, @Local(argsOnly = true) BlockPos pos) { return Boolean.TRUE.equals(LOCAL.get()) ? (int) (value * 0.8) : value; } @ModifyExpressionValue( - method = "trySpreadingFire", + method = "checkBurnOut", at = @At(value = "CONSTANT", args = "intValue=10")) - public int andromeda$spreadFire01(int value, @Local(argsOnly = true) World world) { + public int andromeda$spreadFire01(int value, @Local(argsOnly = true) Level world) { return Boolean.TRUE.equals(LOCAL.get()) ? (int) Math.ceil(value / 3d) : value; } @@ -50,18 +50,18 @@ abstract class AbstractFireBlockMixin extends AbstractFireBlock { @At( value = "INVOKE", target = - "net/minecraft/block/FireBlock.trySpreadingFire (Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;ILnet/minecraft/util/math/random/Random;I)V", + "Lnet/minecraft/world/level/block/FireBlock;checkBurnOut(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;ILnet/minecraft/util/RandomSource;I)V", ordinal = 0, shift = At.Shift.BEFORE), - method = "scheduledTick") + method = "tick") public void andromeda$trySpreadBlocks( - BlockState state, - ServerWorld world, - BlockPos pos, - Random random, - CallbackInfo ci, - @Local(index = 7) int i, - @Local(index = 10) int k) { + BlockState state, + ServerLevel world, + BlockPos pos, + RandomSource random, + CallbackInfo ci, + @Local(index = 7) int i, + @Local(index = 10) int k) { if (world .am$get(QuickFire.CONFIG) .available @@ -71,7 +71,7 @@ abstract class AbstractFireBlockMixin extends AbstractFireBlock { for (int x = -3; x < 3; x++) { for (int y = -3; y < 3; y++) { for (int z = -3; z < 3; z++) { - this.trySpreadingFire( + this.checkBurnOut( world, new BlockPos(pos.getX() + x, pos.getY() + y, pos.getZ() + z), 300 + k, diff --git a/src/main/resources/andromeda.accesswidener b/src/main/resources/andromeda.accesswidener index de8cc42a..43e38c4d 100644 --- a/src/main/resources/andromeda.accesswidener +++ b/src/main/resources/andromeda.accesswidener @@ -1,50 +1,50 @@ accessWidener v2 named -accessible class net/minecraft/server/MinecraftServer$ResourceManagerHolder -accessible field net/minecraft/server/MinecraftServer session Lnet/minecraft/world/level/storage/LevelStorage$Session; +accessible class net/minecraft/server/MinecraftServer$ReloadableResources +accessible field net/minecraft/server/MinecraftServer storageSource Lnet/minecraft/world/level/storage/LevelStorageSource$LevelStorageAccess; -accessible field net/minecraft/client/gui/screen/Screen drawables Ljava/util/List; -accessible field net/minecraft/client/gui/screen/Screen selectables Ljava/util/List; -accessible field net/minecraft/client/gui/screen/Screen children Ljava/util/List; -accessible field net/minecraft/entity/Entity world Lnet/minecraft/world/World; +accessible field net/minecraft/client/gui/screens/Screen renderables Ljava/util/List; +accessible field net/minecraft/client/gui/screens/Screen narratables Ljava/util/List; +accessible field net/minecraft/client/gui/screens/Screen children Ljava/util/List; +accessible field net/minecraft/world/entity/Entity level Lnet/minecraft/world/level/Level; # gui/no_more_adventure -accessible class net/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection +accessible class net/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon # entities/boats (furnaceBoat) -accessible field net/minecraft/client/render/entity/BoatEntityRenderer texturesAndModels Ljava/util/Map; -accessible field net/minecraft/entity/vehicle/BoatEntity location Lnet/minecraft/entity/vehicle/BoatEntity$Location; -extendable method net/minecraft/entity/vehicle/BoatEntity updateVelocity ()V +accessible field net/minecraft/client/renderer/entity/BoatRenderer boatResources Ljava/util/Map; +accessible field net/minecraft/world/entity/vehicle/Boat status Lnet/minecraft/world/entity/vehicle/Boat$Status; +extendable method net/minecraft/world/entity/vehicle/Boat floatBoat ()V # gui/gui_particles (furnaceScreen) -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen y I -accessible field net/minecraft/client/gui/screen/ingame/HandledScreen x I +accessible field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen topPos I +accessible field net/minecraft/client/gui/screens/inventory/AbstractContainerScreen leftPos I # gui/gui_particles (gameModeParticles) -accessible field net/minecraft/client/gui/screen/GameModeSelectionScreen$ButtonWidget gameMode Lnet/minecraft/client/gui/screen/GameModeSelectionScreen$GameModeSelection; -accessible field net/minecraft/client/gui/screen/GameModeSelectionScreen gameModeButtons Ljava/util/List; +accessible field net/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeSlot icon Lnet/minecraft/client/gui/screens/debug/GameModeSwitcherScreen$GameModeIcon; +accessible field net/minecraft/client/gui/screens/debug/GameModeSwitcherScreen slots Ljava/util/List; # misc/recipe_advancements_generation -accessible field net/minecraft/server/ServerAdvancementLoader manager Lnet/minecraft/advancement/AdvancementManager; +accessible field net/minecraft/server/ServerAdvancementManager advancements Lnet/minecraft/advancements/AdvancementList; # items/minecart_block_picking -accessible field net/minecraft/entity/vehicle/FurnaceMinecartEntity fuel I -accessible field net/minecraft/block/entity/AbstractFurnaceBlockEntity burnTime I -accessible field net/minecraft/world/MobSpawnerLogic spawnEntry Lnet/minecraft/world/MobSpawnerEntry; +accessible field net/minecraft/world/entity/vehicle/MinecartFurnace fuel I +accessible field net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity litTime I +accessible field net/minecraft/world/level/BaseSpawner nextSpawnData Lnet/minecraft/world/level/SpawnData; # entities/villagers_follow_emeralds mechanics/throwable_items -accessible field net/minecraft/entity/mob/MobEntity goalSelector Lnet/minecraft/entity/ai/goal/GoalSelector; +accessible field net/minecraft/world/entity/Mob goalSelector Lnet/minecraft/world/entity/ai/goal/GoalSelector; # mechanics/throwable_items -accessible method net/minecraft/loot/context/LootContextTypes register (Ljava/lang/String;Ljava/util/function/Consumer;)Lnet/minecraft/loot/context/LootContextType; +accessible method net/minecraft/world/level/storage/loot/parameters/LootContextParamSets register (Ljava/lang/String;Ljava/util/function/Consumer;)Lnet/minecraft/world/level/storage/loot/parameters/LootContextParamSet; # entities/bee_flower_duplication -accessible method net/minecraft/entity/passive/BeeEntity$PollinateGoal isRunning ()Z -accessible method net/minecraft/entity/passive/BeeEntity$PollinateGoal completedPollination ()Z +accessible method net/minecraft/world/entity/animal/Bee$BeePollinateGoal isPollinating ()Z +accessible method net/minecraft/world/entity/animal/Bee$BeePollinateGoal hasPollinatedLongEnough ()Z # world/falling_beenests -accessible method net/minecraft/entity/FallingBlockEntity readCustomDataFromNbt (Lnet/minecraft/nbt/NbtCompound;)V -accessible method net/minecraft/block/entity/BeehiveBlockEntity removeIrrelevantNbtKeys (Lnet/minecraft/nbt/NbtCompound;)V +accessible method net/minecraft/world/entity/item/FallingBlockEntity readAdditionalSaveData (Lnet/minecraft/nbt/CompoundTag;)V +accessible method net/minecraft/world/level/block/entity/BeehiveBlockEntity removeIgnoredBeeTags (Lnet/minecraft/nbt/CompoundTag;)V # misc/unknown -accessible field net/minecraft/client/gui/screen/SplashTextRenderer text Ljava/lang/String; \ No newline at end of file +accessible field net/minecraft/client/gui/components/SplashRenderer splash Ljava/lang/String; -- 2.51.2