From 5e8942e0a71b6e54d2e10f5c03bdd22e434b3ab8 Mon Sep 17 00:00:00 2001 From: LexManos Date: Wed, 18 Jun 2025 02:34:13 -0700 Subject: [PATCH] 1.21.6 - New EventBus 7 A full rewrite and redesign of the library that offers much better performance, new features and fixes all previous design flaws See the migration guide here: https://gist.github.com/PaintNinja/ad82c224aecee25efac1ea3e2cf19b91 Co-authored-by: Paint_Ninja --- build_forge.gradle | 4 +- fmlcore/build.gradle | 3 +- .../java/net/minecraftforge/fml/Bindings.java | 4 +- .../minecraftforge/fml/IBindingsProvider.java | 4 +- .../minecraftforge/fml/IModLoadingState.java | 7 +- .../fml/IModStateTransition.java | 9 +- .../net/minecraftforge/fml/ModContainer.java | 3 +- .../net/minecraftforge/fml/ModLoader.java | 47 +- .../minecraftforge/fml/ModLoadingState.java | 4 +- .../fml/ModStateTransitionHelper.java | 15 +- .../fml/config/IConfigEvent.java | 4 +- .../fml/event/IModBusEvent.java | 21 +- fmlearlydisplay/build.gradle | 2 +- fmlloader/build.gradle | 4 +- .../minecraftforge/fml/loading/FMLLoader.java | 1 - .../moddiscovery/MinecraftLocator.java | 8 +- gradle.properties | 6 +- javafmllanguage/build.gradle | 2 +- .../net/minecraftforge/fml/common/Mod.java | 40 +- .../javafmlmod/AutomaticEventSubscriber.java | 337 ++++++- .../javafmlmod/FMLJavaModLoadingContext.java | 22 +- .../fml/javafmlmod/FMLModContainer.java | 29 +- lowcodelanguage/build.gradle | 2 +- .../fml/lowcodemod/LowCodeModContainer.java | 21 +- mclanguage/build.gradle | 2 +- mdk/build.gradle | 8 + .../opengl/GlCommandEncoder.java.patch | 2 +- .../mojang/blaze3d/opengl/GlDevice.java.patch | 93 +- .../blaze3d/opengl/GlStateManager.java.patch | 4 +- .../blaze3d/opengl/GlTexture.java.patch | 19 +- .../blaze3d/pipeline/RenderTarget.java.patch | 14 +- .../blaze3d/systems/GpuDevice.java.patch | 22 +- .../blaze3d/textures/GpuTexture.java.patch | 6 +- .../blaze3d/vertex/VertexConsumer.java.patch | 4 +- .../blaze3d/vertex/VertexFormat.java.patch | 8 +- .../net/minecraft/SharedConstants.java.patch | 2 +- .../minecraft/net/minecraft/Util.java.patch | 2 +- .../AdvancementRewards.java.patch | 4 +- .../net/minecraft/client/Camera.java.patch | 6 +- .../client/KeyboardHandler.java.patch | 6 +- .../net/minecraft/client/Minecraft.java.patch | 84 +- .../net/minecraft/client/Options.java.patch | 30 +- .../minecraft/client/Screenshot.java.patch | 4 +- .../net/minecraft/client/data/Main.java.patch | 2 +- .../models/ItemModelGenerators.java.patch | 2 +- .../net/minecraft/client/gui/Font.java.patch | 6 +- .../net/minecraft/client/gui/Gui.java.patch | 24 +- .../client/gui/GuiGraphics.java.patch | 199 ++--- .../gui/components/AbstractButton.java.patch | 6 +- .../gui/components/AbstractWidget.java.patch | 4 +- .../components/BossHealthOverlay.java.patch | 6 +- .../components/DebugScreenOverlay.java.patch | 13 +- .../components/toasts/ToastManager.java.patch | 2 +- .../gui/screens/LoadingOverlay.java.patch | 6 +- .../client/gui/screens/PauseScreen.java.patch | 6 +- .../client/gui/screens/Screen.java.patch | 24 +- .../client/gui/screens/TitleScreen.java.patch | 32 +- .../advancements/AdvancementTab.java.patch | 2 +- .../AdvancementsScreen.java.patch | 8 +- .../AbstractContainerScreen.java.patch | 52 +- .../CreativeModeInventoryScreen.java.patch | 53 +- .../inventory/EffectsInInventory.java.patch | 16 +- .../inventory/EnchantmentScreen.java.patch | 12 +- .../HangingSignEditScreen.java.patch | 2 +- .../inventory/MerchantScreen.java.patch | 8 +- .../tooltip/ClientTooltipComponent.java.patch | 2 +- .../ServerSelectionList.java.patch | 2 +- .../packs/PackSelectionScreen.java.patch | 4 +- .../WorldSelectionList.java.patch | 10 +- .../net/minecraft/client/main/Main.java.patch | 2 +- .../model/geom/LayerDefinitions.java.patch | 2 +- .../client/model/geom/ModelLayers.java.patch | 2 +- .../multiplayer/ClientChunkCache.java.patch | 4 +- .../ClientCommonPacketListenerImpl.java.patch | 2 +- ...ConfigurationPacketListenerImpl.java.patch | 2 +- ...ientHandshakePacketListenerImpl.java.patch | 6 +- .../client/multiplayer/ClientLevel.java.patch | 26 +- .../ClientPacketListener.java.patch | 38 +- .../MultiPlayerGameMode.java.patch | 64 +- .../multiplayer/chat/ChatListener.java.patch | 8 +- .../client/player/LocalPlayer.java.patch | 9 +- .../DimensionSpecialEffects.java.patch | 2 +- .../client/renderer/FogRenderer.java.patch | 27 - .../client/renderer/GameRenderer.java.patch | 46 +- .../renderer/ItemBlockRenderTypes.java.patch | 103 +-- .../client/renderer/LevelRenderer.java.patch | 70 +- .../client/renderer/LightTexture.java.patch | 2 +- .../client/renderer/RenderType.java.patch | 17 +- .../renderer/ScreenEffectRenderer.java.patch | 55 +- .../block/ModelBlockRenderer.java.patch | 2 +- .../block/model/BlockModelPart.java.patch | 11 + .../block/model/FaceBakery.java.patch | 2 +- .../block/model/SimpleModelWrapper.java.patch | 24 + .../block/model/SingleVariant.java.patch | 29 + .../model/multipart/MultiPartModel.java.patch | 27 +- .../blockentity/PistonHeadRenderer.java.patch | 7 +- .../chunk/RenderChunkRegion.java.patch | 12 - .../chunk/RenderSectionRegion.java.patch | 12 + .../renderer/chunk/SectionCompiler.java.patch | 32 +- .../renderer/entity/EntityRenderer.java.patch | 14 +- .../renderer/entity/ItemRenderer.java.patch | 2 +- .../renderer/fog/FogRenderer.java.patch | 24 + .../special/SpecialModelRenderers.java.patch | 2 +- .../texture/AbstractTexture.java.patch | 8 +- .../renderer/texture/TextureAtlas.java.patch | 4 +- .../texture/TextureAtlasSprite.java.patch | 2 +- .../model/WeightedVariants.java.patch | 9 +- .../resources/sounds/SoundInstance.java.patch | 2 +- .../client/sounds/SoundEngine.java.patch | 64 +- .../commands/CommandSourceStack.java.patch | 6 +- .../minecraft/commands/Commands.java.patch | 23 +- .../selector/EntitySelector.java.patch | 2 +- .../ArgumentTypeInfos.java.patch | 2 +- .../registries/BuiltInRegistries.java.patch | 4 +- .../core/registries/Registries.java.patch | 2 +- .../minecraft/data/DataGenerator.java.patch | 2 +- .../net/minecraft/data/Main.java.patch | 2 +- .../data/loot/LootTableProvider.java.patch | 24 +- .../data/recipes/RecipeProvider.java.patch | 8 +- .../registries/VanillaRegistries.java.patch | 8 +- .../tags/BannerPatternTagsProvider.java.patch | 2 +- .../data/tags/BiomeTagsProvider.java.patch | 2 +- .../tags/EnchantmentTagsProvider.java.patch | 13 + .../IntrinsicHolderTagsProvider.java.patch | 56 +- .../data/tags/ItemTagsProvider.java.patch | 36 - .../data/tags/KeyTagProvider.java.patch | 16 + .../PaintingVariantTagsProvider.java.patch | 2 +- .../data/tags/PoiTypeTagsProvider.java.patch | 2 +- .../tags/StructureTagsProvider.java.patch | 2 +- .../data/tags/TagAppender.java.patch | 67 ++ .../data/tags/TagsProvider.java.patch | 53 +- .../tags/VanillaBlockTagsProvider.java.patch | 13 + .../VanillaEnchantmentTagsProvider.java.patch | 13 + .../tags/VanillaItemTagsProvider.java.patch | 26 + .../tags/WorldPresetTagsProvider.java.patch | 2 +- .../gametest/framework/TestCommand.java.patch | 2 +- .../minecraft/network/Connection.java.patch | 46 +- .../network/FriendlyByteBuf.java.patch | 2 +- ...ClientboundStatusResponsePacket.java.patch | 26 - .../resources/RegistryDataLoader.java.patch | 22 +- .../net/minecraft/server/Main.java.patch | 22 +- .../server/MinecraftServer.java.patch | 38 +- .../server/PlayerAdvancements.java.patch | 10 +- .../commands/SpreadPlayersCommand.java.patch | 2 +- .../commands/TeleportCommand.java.patch | 2 +- .../dedicated/DedicatedServer.java.patch | 2 +- .../server/level/ServerChunkCache.java.patch | 2 +- .../server/level/ServerLevel.java.patch | 48 +- .../server/level/ServerPlayer.java.patch | 40 +- .../level/ServerPlayerGameMode.java.patch | 16 +- .../ServerCommonPacketListenerImpl.java.patch | 4 +- .../ServerGamePacketListenerImpl.java.patch | 10 +- .../ServerStatusPacketListenerImpl.java.patch | 9 - ...impleJsonResourceReloadListener.java.patch | 4 +- .../server/players/PlayerList.java.patch | 54 +- .../stats/RecipeBookSettings.java.patch | 37 +- .../net/minecraft/tags/BlockTags.java.patch | 2 +- .../minecraft/tags/EntityTypeTags.java.patch | 2 +- .../net/minecraft/tags/ItemTags.java.patch | 2 +- .../net/minecraft/tags/TagBuilder.java.patch | 31 +- .../minecraft/world/entity/Entity.java.patch | 138 +-- .../world/entity/EntityType.java.patch | 16 +- .../world/entity/ExperienceOrb.java.patch | 4 +- .../world/entity/FlyingMob.java.patch | 21 - .../world/entity/Leashable.java.patch | 12 + .../world/entity/LightningBolt.java.patch | 6 +- .../world/entity/LivingEntity.java.patch | 161 ++-- .../net/minecraft/world/entity/Mob.java.patch | 43 +- .../world/entity/SpawnPlacements.java.patch | 2 +- .../world/entity/TamableAnimal.java.patch | 2 +- .../attributes/DefaultAttributes.java.patch | 2 +- .../ai/behavior/StartAttacking.java.patch | 2 +- .../entity/ai/village/VillageSiege.java.patch | 2 +- .../entity/ai/village/poi/PoiTypes.java.patch | 4 +- .../world/entity/animal/Animal.java.patch | 6 +- .../world/entity/animal/Bee.java.patch | 4 +- .../world/entity/animal/Cat.java.patch | 4 +- .../world/entity/animal/Fox.java.patch | 11 +- .../entity/animal/MushroomCow.java.patch | 18 +- .../world/entity/animal/Ocelot.java.patch | 2 +- .../world/entity/animal/Parrot.java.patch | 2 +- .../world/entity/animal/Pig.java.patch | 10 +- .../world/entity/animal/Rabbit.java.patch | 2 +- .../world/entity/animal/SnowGolem.java.patch | 10 +- .../entity/animal/allay/Allay.java.patch | 2 +- .../entity/animal/camel/Camel.java.patch | 2 +- .../animal/horse/AbstractHorse.java.patch | 12 +- .../entity/animal/horse/Llama.java.patch | 4 +- .../entity/animal/sheep/Sheep.java.patch | 6 +- .../entity/animal/sniffer/Sniffer.java.patch | 2 +- .../world/entity/animal/wolf/Wolf.java.patch | 53 +- .../entity/boss/EnderDragonPart.java.patch | 6 +- .../boss/enderdragon/EnderDragon.java.patch | 14 +- .../entity/boss/wither/WitherBoss.java.patch | 6 +- .../decoration/HangingEntity.java.patch | 8 +- .../entity/item/FallingBlockEntity.java.patch | 4 +- .../world/entity/item/ItemEntity.java.patch | 50 +- .../world/entity/monster/Bogged.java.patch | 4 +- .../world/entity/monster/EnderMan.java.patch | 20 +- .../world/entity/monster/Evoker.java.patch | 2 +- .../world/entity/monster/Pillager.java.patch | 2 +- .../world/entity/monster/Ravager.java.patch | 2 +- .../world/entity/monster/Shulker.java.patch | 6 +- .../world/entity/monster/Skeleton.java.patch | 4 +- .../world/entity/monster/Slime.java.patch | 4 +- .../world/entity/monster/Zombie.java.patch | 6 +- .../entity/monster/ZombieVillager.java.patch | 4 +- .../monster/creaking/Creaking.java.patch | 2 +- .../entity/monster/hoglin/Hoglin.java.patch | 4 +- .../monster/piglin/AbstractPiglin.java.patch | 4 +- .../entity/monster/piglin/Piglin.java.patch | 6 +- .../world/entity/npc/Villager.java.patch | 8 +- .../world/entity/player/Inventory.java.patch | 8 +- .../world/entity/player/Player.java.patch | 91 +- .../projectile/AbstractArrow.java.patch | 10 +- .../AbstractHurtingProjectile.java.patch | 2 +- .../FireworkRocketEntity.java.patch | 2 +- .../entity/projectile/FishingHook.java.patch | 14 +- .../projectile/LargeFireball.java.patch | 2 +- .../entity/projectile/Projectile.java.patch | 2 +- .../projectile/ProjectileUtil.java.patch | 2 +- .../projectile/ShulkerBullet.java.patch | 2 +- .../projectile/ThrownEnderpearl.java.patch | 10 +- .../entity/projectile/WitherSkull.java.patch | 2 +- .../entity/vehicle/AbstractBoat.java.patch | 14 +- .../vehicle/AbstractMinecart.java.patch | 12 +- .../AbstractMinecartContainer.java.patch | 4 +- .../vehicle/MinecartCommandBlock.java.patch | 2 +- .../entity/vehicle/MinecartFurnace.java.patch | 2 +- .../entity/vehicle/MinecartSpawner.java.patch | 2 +- .../world/inventory/AnvilMenu.java.patch | 10 +- .../world/inventory/GrindstoneMenu.java.patch | 2 +- .../world/inventory/RecipeBookType.java.patch | 5 +- .../minecraft/world/item/DyeColor.java.patch | 2 +- .../net/minecraft/world/item/Item.java.patch | 4 +- .../minecraft/world/item/ItemStack.java.patch | 20 +- .../net/minecraft/world/item/Items.java.patch | 4 +- .../world/level/BaseSpawner.java.patch | 34 +- .../minecraft/world/level/Level.java.patch | 8 +- .../level/block/BaseRailBlock.java.patch | 4 +- .../world/level/block/Blocks.java.patch | 2 +- .../level/block/DetectorRailBlock.java.patch | 2 +- .../level/block/DryVegetationBlock.java.patch | 4 +- .../world/level/block/NoteBlock.java.patch | 2 +- .../level/block/PoweredRailBlock.java.patch | 12 +- .../world/level/block/SoundType.java.patch | 2 +- .../AbstractFurnaceBlockEntity.java.patch | 46 +- .../BaseContainerBlockEntity.java.patch | 6 +- .../block/entity/BeaconBlockEntity.java.patch | 2 +- .../level/block/entity/BlockEntity.java.patch | 29 +- .../ChiseledBookShelfBlockEntity.java.patch | 4 +- .../block/entity/SignBlockEntity.java.patch | 2 +- .../entity/SpawnerBlockEntity.java.patch | 2 +- .../piston/PistonMovingBlockEntity.java.patch | 2 +- .../world/level/chunk/ChunkAccess.java.patch | 4 +- .../world/level/chunk/LevelChunk.java.patch | 55 +- .../chunk/status/ChunkStatusTasks.java.patch | 32 +- .../chunk/storage/EntityStorage.java.patch | 27 +- .../StructureTemplate.java.patch | 58 +- .../storage/PlayerDataStorage.java.patch | 10 +- .../level/storage/loot/LootPool.java.patch | 10 +- .../level/storage/loot/LootTable.java.patch | 12 +- settings.gradle | 9 +- .../data/c/tags/block/flowers/tall.json | 2 +- .../data/c/tags/item/flowers/tall.json | 2 +- .../data/forge/tags/block/glass/silica.json | 24 +- .../data/forge/tags/item/glass/silica.json | 24 +- .../generated/data/minecraft/recipe/lead.json | 3 +- .../data/minecraft/recipe/saddle.json | 16 + src/main/generated/pack.mcmeta | 2 +- .../client/ChunkRenderTypeSet.java | 223 ----- .../client/ClientCommandHandler.java | 15 +- .../minecraftforge/client/ClientForgeMod.java | 6 +- .../client/ForgeHooksClient.java | 98 +- .../client/ForgeRenderTypes.java | 59 +- .../client/NamedRenderTypeManager.java | 13 +- .../client/RenderTypeGroup.java | 5 +- .../client/RenderTypeHelper.java | 24 +- .../client/event/ClientChatEvent.java | 23 +- .../client/event/ClientChatReceivedEvent.java | 17 +- .../client/event/ClientPauseChangeEvent.java | 16 +- .../ClientPlayerChangeGameTypeEvent.java | 56 +- .../event/ClientPlayerNetworkEvent.java | 15 +- .../client/event/ComputeFovModifierEvent.java | 9 +- .../client/event/ContainerScreenEvent.java | 15 +- .../CreateSpecialBlockRendererEvent.java | 7 +- .../event/CustomizeGuiOverlayEvent.java | 17 +- .../client/event/EntityRenderersEvent.java | 22 +- .../client/event/ForgeEventFactoryClient.java | 128 ++- .../client/event/InputEvent.java | 64 +- .../client/event/ModelEvent.java | 24 +- .../event/MovementInputUpdateEvent.java | 4 +- .../client/event/RecipesUpdatedEvent.java | 21 +- .../event/RegisterClientCommandsEvent.java | 48 +- .../RegisterClientReloadListenersEvent.java | 17 +- ...rClientTooltipComponentFactoriesEvent.java | 17 +- .../event/RegisterColorHandlersEvent.java | 16 +- .../RegisterDimensionSpecialEffectsEvent.java | 17 +- .../RegisterEntitySpectatorShadersEvent.java | 17 +- .../event/RegisterItemDecorationsEvent.java | 16 +- .../event/RegisterKeyMappingsEvent.java | 17 +- .../event/RegisterNamedRenderTypesEvent.java | 34 +- .../event/RegisterParticleProvidersEvent.java | 21 +- .../event/RegisterPresetEditorsEvent.java | 20 +- ...egisterTextureAtlasSpriteLoadersEvent.java | 10 +- .../client/event/RenderArmEvent.java | 10 +- .../event/RenderBlockScreenEffectEvent.java | 32 +- .../client/event/RenderHandEvent.java | 38 +- .../client/event/RenderHighlightEvent.java | 56 +- .../client/event/RenderItemInFrameEvent.java | 10 +- .../client/event/RenderLivingEvent.java | 18 +- .../client/event/RenderNameTagEvent.java | 22 +- .../client/event/RenderPlayerEvent.java | 18 +- .../client/event/RenderTooltipEvent.java | 26 +- .../client/event/ScreenEvent.java | 123 ++- .../client/event/ScreenshotEvent.java | 9 +- .../event/SystemMessageReceivedEvent.java | 10 +- .../client/event/TextureStitchEvent.java | 19 +- .../client/event/ToastAddEvent.java | 18 +- .../client/event/ViewportEvent.java | 79 +- .../client/event/sound/PlaySoundEvent.java | 31 +- .../event/sound/PlaySoundSourceEvent.java | 10 +- .../event/sound/PlayStreamingSourceEvent.java | 10 +- .../event/sound/SoundEngineLoadEvent.java | 17 +- .../client/event/sound/SoundEvent.java | 32 +- .../extensions/IForgeBlockModelPart.java | 24 + .../extensions/IForgeBlockStateModel.java | 11 +- .../client/extensions/IForgeGuiGraphics.java | 24 +- .../common/IClientFluidTypeExtensions.java | 13 +- .../client/gui/LoadingErrorScreen.java | 6 +- .../client/gui/ModListScreen.java | 7 +- .../gui/TitleScreenModUpdateIndicator.java | 4 +- .../client/gui/widget/ExtendedButton.java | 4 +- .../client/gui/widget/ForgeSlider.java | 6 +- .../client/gui/widget/ModListWidget.java | 15 +- .../client/gui/widget/ScrollPanel.java | 13 +- .../client/loading/ClientModLoader.java | 7 +- .../client/loading/ForgeLoadingOverlay.java | 34 +- .../model/DynamicFluidContainerModel.java | 4 +- .../client/model/data/ModelDataManager.java | 2 +- .../client/model/obj/ObjLoader.java | 3 - .../common/EventBusMigrationHelper.java | 127 +++ .../minecraftforge/common/ForgeConfig.java | 9 +- .../net/minecraftforge/common/ForgeHooks.java | 104 ++- .../common/ForgeInternalHandler.java | 57 +- .../net/minecraftforge/common/ForgeMod.java | 54 +- .../minecraftforge/common/MinecraftForge.java | 5 +- .../common/TagConventionMigrationHelper.java | 2 +- .../common/VillagerTradingManager.java | 4 +- .../capabilities/CapabilityProvider.java | 142 ++- .../capabilities/ICapabilityProvider.java | 3 +- .../RegisterCapabilitiesEvent.java | 11 +- .../common/data/BlockTagsProvider.java | 6 +- .../common/data/EnchantmentTagsProvider.java | 9 +- .../common/data/ForgeBiomeTagsProvider.java | 38 +- .../data/ForgeBlockItemTagsProvider.java | 842 ++++++++++++++++++ .../common/data/ForgeBlockTagsProvider.java | 252 +----- .../data/ForgeEnchantmentTagsProvider.java | 2 +- .../common/data/ForgeFluidTagsProvider.java | 8 +- .../common/data/ForgeItemTagsProvider.java | 210 +---- .../common/extensions/IForgeBlockEntity.java | 14 +- .../common/extensions/IForgeEntity.java | 20 +- .../extensions/IForgeGameTestHelper.java | 13 +- .../IForgeIntrinsicHolderTagAppender.java | 100 --- .../common/extensions/IForgeTagAppender.java | 127 +-- .../common/util/BlockSnapshot.java | 13 +- .../minecraftforge/common/util/HasResult.java | 31 + .../minecraftforge/common/util/Result.java | 70 ++ .../data/event/GatherDataEvent.java | 13 +- .../event/AddPackFindersEvent.java | 9 +- .../event/AddReloadListenerEvent.java | 7 +- .../event/AnvilUpdateEvent.java | 10 +- .../event/AttachCapabilitiesEvent.java | 88 +- .../BuildCreativeModeTabContentsEvent.java | 10 +- .../minecraftforge/event/CommandEvent.java | 26 +- .../event/DifficultyChangeEvent.java | 21 +- .../event/ForgeEventFactory.java | 459 +++++----- .../event/GameShuttingDownEvent.java | 13 +- .../event/GatherComponentsEvent.java | 13 +- .../minecraftforge/event/GrindstoneEvent.java | 66 +- .../event/ItemStackedOnOtherEvent.java | 32 +- .../event/LootTableLoadEvent.java | 23 +- .../event/ModMismatchEvent.java | 64 +- .../event/OnDatapackSyncEvent.java | 7 +- .../event/PlayLevelSoundEvent.java | 16 +- .../event/RegisterCommandsEvent.java | 21 +- .../RegisterStructureConversionsEvent.java | 20 +- .../minecraftforge/event/ServerChatEvent.java | 10 +- .../event/TagsUpdatedEvent.java | 23 +- .../net/minecraftforge/event/TickEvent.java | 72 +- .../event/VanillaGameEvent.java | 29 +- .../brewing/BrewingRecipeRegisterEvent.java | 39 +- .../brewing/PlayerBrewedPotionEvent.java | 12 +- .../event/brewing/PotionBrewEvent.java | 44 +- .../enchanting/EnchantmentLevelSetEvent.java | 34 +- .../entity/EntityAttributeCreationEvent.java | 9 +- .../EntityAttributeModificationEvent.java | 9 +- .../event/entity/EntityEvent.java | 12 +- .../event/entity/EntityJoinLevelEvent.java | 8 +- .../event/entity/EntityLeaveLevelEvent.java | 4 +- .../event/entity/EntityMobGriefingEvent.java | 25 +- .../event/entity/EntityMountEvent.java | 27 +- .../entity/EntityStruckByLightningEvent.java | 15 +- .../event/entity/EntityTeleportEvent.java | 76 +- .../entity/EntityTravelToDimensionEvent.java | 15 +- .../event/entity/ProjectileImpactEvent.java | 3 + .../entity/SpawnPlacementRegisterEvent.java | 11 +- .../event/entity/item/ItemEvent.java | 12 +- .../event/entity/item/ItemExpireEvent.java | 17 +- .../event/entity/item/ItemTossEvent.java | 14 +- .../event/entity/living/AnimalTameEvent.java | 18 +- .../entity/living/BabyEntitySpawnEvent.java | 10 +- .../entity/living/LivingAttackEvent.java | 13 +- .../entity/living/LivingBreatheEvent.java | 4 +- .../living/LivingChangeTargetEvent.java | 14 +- .../entity/living/LivingConversionEvent.java | 16 +- .../entity/living/LivingDamageEvent.java | 13 +- .../event/entity/living/LivingDeathEvent.java | 13 +- .../living/LivingDestroyBlockEvent.java | 12 +- .../event/entity/living/LivingDropsEvent.java | 8 +- .../event/entity/living/LivingDrownEvent.java | 26 +- .../living/LivingEntityUseItemEvent.java | 57 +- .../living/LivingEquipmentChangeEvent.java | 4 +- .../event/entity/living/LivingEvent.java | 48 +- .../living/LivingExperienceDropEvent.java | 24 +- .../event/entity/living/LivingFallEvent.java | 9 +- .../living/LivingGetProjectileEvent.java | 18 +- .../event/entity/living/LivingHealEvent.java | 19 +- .../event/entity/living/LivingHurtEvent.java | 13 +- .../entity/living/LivingKnockBackEvent.java | 15 +- .../entity/living/LivingMakeBrainEvent.java | 14 +- .../entity/living/LivingPackSizeEvent.java | 32 +- .../entity/living/LivingSwapItemsEvent.java | 29 +- .../entity/living/LivingUseTotemEvent.java | 21 +- .../entity/living/LootingLevelEvent.java | 2 + .../event/entity/living/MobEffectEvent.java | 34 +- .../event/entity/living/MobSpawnEvent.java | 74 +- .../entity/living/MonsterDisguiseEvent.java | 10 +- .../event/entity/living/ShieldBlockEvent.java | 8 +- .../event/entity/living/ZombieEvent.java | 31 +- .../event/entity/player/AdvancementEvent.java | 7 + .../event/entity/player/AnvilRepairEvent.java | 9 +- .../event/entity/player/ArrowLooseEvent.java | 12 +- .../event/entity/player/ArrowNockEvent.java | 3 + .../entity/player/AttackEntityEvent.java | 16 +- .../event/entity/player/BonemealEvent.java | 23 +- .../event/entity/player/CriticalHitEvent.java | 37 +- .../entity/player/EntityItemPickupEvent.java | 32 +- .../event/entity/player/FillBucketEvent.java | 26 +- .../event/entity/player/ItemFishedEvent.java | 8 +- .../event/entity/player/ItemTooltipEvent.java | 6 +- .../player/PermissionsChangedEvent.java | 18 +- .../entity/player/PlayerContainerEvent.java | 36 +- .../entity/player/PlayerDestroyItemEvent.java | 5 +- .../event/entity/player/PlayerEvent.java | 223 ++--- .../entity/player/PlayerFlyableFallEvent.java | 9 +- .../entity/player/PlayerInteractEvent.java | 58 +- .../entity/player/PlayerSetSpawnEvent.java | 8 +- .../entity/player/PlayerSleepInBedEvent.java | 19 +- .../player/PlayerSpawnPhantomsEvent.java | 17 +- .../entity/player/PlayerWakeUpEvent.java | 10 +- .../event/entity/player/PlayerXpEvent.java | 21 +- .../player/SleepingLocationCheckEvent.java | 26 +- .../entity/player/SleepingTimeCheckEvent.java | 29 +- .../entity/player/TradeWithVillagerEvent.java | 16 +- .../furnace/FurnaceFuelBurnTimeEvent.java | 37 +- .../event/level/AlterGroundEvent.java | 8 +- .../event/level/BlockEvent.java | 118 ++- .../event/level/ChunkDataEvent.java | 21 +- .../event/level/ChunkEvent.java | 15 +- .../level/ChunkTicketLevelUpdatedEvent.java | 27 +- .../event/level/ChunkWatchEvent.java | 13 +- .../event/level/ExplosionEvent.java | 18 +- .../event/level/LevelEvent.java | 27 +- .../event/level/NoteBlockEvent.java | 19 +- .../event/level/PistonEvent.java | 48 +- .../event/level/SaplingGrowTreeEvent.java | 21 +- .../event/level/SleepFinishedTimeEvent.java | 16 +- .../ChannelRegistrationChangeEvent.java | 11 +- .../event/network/ConnectionStartEvent.java | 19 +- .../event/network/CustomPayloadEvent.java | 50 +- .../GatherLoginConfigurationTasksEvent.java | 7 +- .../event/server/ServerAboutToStartEvent.java | 7 +- .../event/server/ServerLifecycleEvent.java | 13 +- .../event/server/ServerStartedEvent.java | 8 +- .../event/server/ServerStartingEvent.java | 10 +- .../event/server/ServerStoppedEvent.java | 6 +- .../event/server/ServerStoppingEvent.java | 9 +- .../event/server/package-info.java | 9 + .../event/village/VillageSiegeEvent.java | 33 +- .../event/village/VillagerTradesEvent.java | 8 +- .../event/village/WandererTradesEvent.java | 8 +- .../net/minecraftforge/fluids/FluidStack.java | 32 +- .../capability/FluidHandlerBlockEntity.java | 23 +- .../capability/templates/FluidTank.java | 109 +-- .../fml/core/ModStateProvider.java | 4 +- .../fml/core/ParallelTransition.java | 5 +- .../fml/event/config/ModConfigEvent.java | 17 +- .../event/lifecycle/FMLClientSetupEvent.java | 11 +- .../event/lifecycle/FMLCommonSetupEvent.java | 14 +- .../event/lifecycle/FMLConstructModEvent.java | 7 + .../FMLDedicatedServerSetupEvent.java | 14 +- .../event/lifecycle/FMLLoadCompleteEvent.java | 14 +- .../event/lifecycle/InterModEnqueueEvent.java | 12 +- .../event/lifecycle/InterModProcessEvent.java | 13 +- .../event/lifecycle/ModLifecycleEvent.java | 10 +- .../lifecycle/ParallelDispatchEvent.java | 2 +- .../internal/ForgeBindings.java | 7 +- .../items/ItemStackHandler.java | 19 +- .../network/EventNetworkChannel.java | 11 +- .../network/NetworkInstance.java | 28 +- .../network/PacketDistributor.java | 4 +- .../VanillaConnectionNetworkFilter.java | 26 - .../ForgeNetworkConfigurationHandler.java | 8 +- .../registries/DataPackRegistryEvent.java | 28 +- .../registries/DeferredRegister.java | 17 +- .../ForgeDeferredRegistriesSetup.java | 7 +- .../minecraftforge/registries/GameData.java | 4 +- .../registries/IdMappingEvent.java | 31 +- .../registries/MissingMappingsEvent.java | 56 +- .../registries/NewRegistryEvent.java | 9 +- .../registries/RegisterEvent.java | 9 +- .../resource/ResourcePackLoader.java | 2 +- .../server/ServerLifecycleHooks.java | 12 +- .../server/command/CommandHelper.java | 24 + .../command}/CommandTreeCleaner.java | 36 +- .../server/loading/ServerModLoader.java | 4 +- .../server/permission/PermissionAPI.java | 6 +- .../events/PermissionGatherEvent.java | 48 +- .../resources/META-INF/accesstransformer.cfg | 52 +- src/main/resources/META-INF/mods.toml | 2 +- .../additional_model/block_model.json | 7 + .../additional_model/item_model.json | 7 + src/test/generated/mdk_datagen/pack.mcmeta | 2 +- .../generated/test_helper_mod/pack.mcmeta | 2 +- .../java/com/example/examplemod/Config.java | 2 +- .../com/example/examplemod/ExampleMod.java | 31 +- .../debug/chunk/LightingEventTest.java | 4 +- .../debug/client/AdditionalModelTest.java | 24 +- .../client/CustomizeGuiOverlayEventTest.java | 5 +- .../debug/client/GuiLayeringTest.java | 4 +- .../debug/client/LateBoundIdMapperTest.java | 2 +- .../debug/client/ModelRenderLayerTest.java | 17 +- .../creativetabs/CreativeModeTabTest.java | 7 +- .../debug/dist/DistExecutorTest.java | 2 +- .../debug/gameplay/biome/BiomeTestMod.java | 2 +- .../block/ChorusBlockPlacementTest.java | 7 +- .../block/PlantTypePlacementTest.java | 2 +- .../crafting/ConditionalRecipeTest.java | 16 +- .../crafting/CustomIngredientsTest.java | 11 +- .../debug/gameplay/crafting/TagsTest.java | 2 +- .../gameplay/criterion/CriterionTest.java | 30 +- .../DatapackBuiltinEntriesProviderTest.java | 7 +- .../item/GatherComponentsEventTest.java | 7 +- .../gameplay/item/ItemCapabilityTest.java | 9 +- .../gameplay/item/PreventItemDamageTest.java | 6 +- .../gameplay/item/ShieldDisablingTest.java | 4 +- .../level/ForcedChunkLoadingTest.java | 2 +- .../gameplay/loot/ConditionalLootPools.java | 7 +- .../loot/GlobalLootModifiersTest.java | 6 +- .../debug/gameplay/loot/LootEventsTest.java | 11 +- .../debug/gameplay/loot/ShearsLootTests.java | 2 +- .../debug/gameplay/redstone/UpdateOrder.java | 2 +- .../villager/VillagerTypeTestMod.java | 4 +- .../loading/sort/ModLoadSortingAfter.java | 2 +- .../loading/sort/ModLoadSortingBefore.java | 2 +- .../loading/sort/ModLoadSortingTest.java | 2 +- .../modules/automatic/AutomaticModuleMod.java | 2 +- .../debug/modules/closed/ClosedMod.java | 7 +- .../modules/closedtest/ClosedTestsMod.java | 7 +- .../debug/network/PacketTest.java | 5 +- .../NetworkDatapackRegistryTest.java | 5 +- .../java/net/minecraftforge/mdk/Datagen.java | 4 +- .../net/minecraftforge/test/BaseTestMod.java | 86 +- .../minecraftforge/test/TestHelperMod.java | 5 +- .../debug/AddPackFinderEventTest.java | 6 +- .../debug/AlterGroundEventTest.java | 2 +- .../debug/CapabilitiesTest.java | 6 +- .../debug/DataGeneratorTest.java | 2 +- .../debug/DeferredWorkQueueTest.java | 2 +- .../minecraftforge/debug/KeyMappingTest.java | 11 +- .../minecraftforge/debug/PermissionTest.java | 2 +- .../minecraftforge/debug/PotionEventTest.java | 11 +- .../debug/block/BasePlaceEventTest.java | 11 +- .../debug/block/CustomHeadTest.java | 2 +- .../debug/block/CustomPlantTypeTest.java | 2 +- .../debug/block/FarmlandTrampleEventTest.java | 11 +- .../debug/block/FlowerPotTest.java | 2 +- .../debug/block/FullPotsAccessorDemo.java | 2 +- .../debug/block/HideNeighborFaceTest.java | 2 +- .../debug/block/NeighborNotifyEventTest.java | 15 +- .../debug/block/PistonEventTest.java | 28 +- .../debug/block/PlaceEventTest.java | 11 +- .../debug/block/SlipperinessTest.java | 2 +- .../debug/block/StickyBlockTest.java | 2 +- .../debug/chat/ClientChatEventTest.java | 16 +- .../debug/chat/CommandEventTest.java | 2 +- .../debug/client/AudioStreamTest.java | 22 +- .../debug/client/CustomColorResolverTest.java | 2 +- .../debug/client/CustomPresetEditorTest.java | 2 +- .../debug/client/CustomTooltipTest.java | 2 +- .../debug/client/PotionSizeEventTest.java | 2 +- .../client/model/CalculateNormalsTest.java | 2 +- .../model/CustomItemDisplayContextTest.java | 2 +- .../debug/client/model/MegaModelTest.java | 2 +- .../rendering/CustomItemDecorationsTest.java | 2 +- .../rendering/CustomParticleTypeTest.java | 2 +- .../rendering/EntityRendererEventsTest.java | 2 +- .../LinearTextTextureFilteringTest.java | 2 +- .../NameplateRenderingEventTest.java | 2 +- .../rendering/RenderLocalPlayerTest.java | 29 +- .../client/rendering/ShaderResourcesTest.java | 2 +- .../debug/command/EnumArgumentTest.java | 2 +- .../debug/entity/AddEntityAttributeTest.java | 2 +- .../debug/entity/EntityTeleportEventTest.java | 2 +- .../debug/entity/GravityAttributeTest.java | 2 +- .../debug/entity/PartEntityTest.java | 2 +- .../living/LivingConversionEventTest.java | 22 +- .../LivingSetAttackTargetEventTest.java | 25 +- .../living/LivingSwapItemsEventTest.java | 16 +- .../player/PermissionsChangedEventTest.java | 2 +- .../player/PlayerGameModeEventTest.java | 25 +- .../entity/player/PlayerNameEventTest.java | 2 +- .../entity/player/PlayerXpEventTest.java | 2 +- .../player/TradeWithVillagerEventTest.java | 2 +- .../debug/fluid/FiniteWaterTest.java | 2 +- .../debug/item/ForgeSpawnEggItemTest.java | 2 +- .../debug/item/ItemAttributeModifierTest.java | 2 +- .../debug/item/ItemStackedOnOtherTest.java | 23 +- .../debug/item/ShieldBlockTest.java | 2 +- .../debug/item/StopUsingItemTest.java | 2 +- .../debug/item/TagBasedToolTypesTest.java | 2 +- .../debug/misc/FakePlayerTest.java | 2 +- .../debug/misc/GameTestTest.java | 2 +- .../debug/misc/GrindstoneEventTest.java | 14 +- .../debug/misc/OnDatapackSynctEventTest.java | 2 +- .../recipebook/RecipeBookExtensionTest.java | 2 +- .../debug/world/BlockGrowFeatureTest.java | 2 +- .../ChunkDataEventSaveNullWorldTest.java | 2 +- .../world/ChunkEventLoadNewChunkTest.java | 2 +- .../debug/world/ChunkWatchEventTest.java | 2 +- .../debug/world/PotentialSpawnsEventTest.java | 19 +- 642 files changed, 7258 insertions(+), 6187 deletions(-) delete mode 100644 patches/minecraft/net/minecraft/client/renderer/FogRenderer.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/block/model/BlockModelPart.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/block/model/SingleVariant.java.patch delete mode 100644 patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunkRegion.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/chunk/RenderSectionRegion.java.patch create mode 100644 patches/minecraft/net/minecraft/client/renderer/fog/FogRenderer.java.patch create mode 100644 patches/minecraft/net/minecraft/data/tags/EnchantmentTagsProvider.java.patch delete mode 100644 patches/minecraft/net/minecraft/data/tags/ItemTagsProvider.java.patch create mode 100644 patches/minecraft/net/minecraft/data/tags/KeyTagProvider.java.patch create mode 100644 patches/minecraft/net/minecraft/data/tags/TagAppender.java.patch create mode 100644 patches/minecraft/net/minecraft/data/tags/VanillaBlockTagsProvider.java.patch create mode 100644 patches/minecraft/net/minecraft/data/tags/VanillaEnchantmentTagsProvider.java.patch create mode 100644 patches/minecraft/net/minecraft/data/tags/VanillaItemTagsProvider.java.patch delete mode 100644 patches/minecraft/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch delete mode 100644 patches/minecraft/net/minecraft/world/entity/FlyingMob.java.patch create mode 100644 patches/minecraft/net/minecraft/world/entity/Leashable.java.patch create mode 100644 src/main/generated/data/minecraft/recipe/saddle.json delete mode 100644 src/main/java/net/minecraftforge/client/ChunkRenderTypeSet.java create mode 100644 src/main/java/net/minecraftforge/client/extensions/IForgeBlockModelPart.java create mode 100644 src/main/java/net/minecraftforge/common/EventBusMigrationHelper.java create mode 100644 src/main/java/net/minecraftforge/common/data/ForgeBlockItemTagsProvider.java delete mode 100644 src/main/java/net/minecraftforge/common/extensions/IForgeIntrinsicHolderTagAppender.java create mode 100644 src/main/java/net/minecraftforge/common/util/HasResult.java create mode 100644 src/main/java/net/minecraftforge/common/util/Result.java create mode 100644 src/main/java/net/minecraftforge/event/server/package-info.java rename src/main/java/net/minecraftforge/{network/filters => server/command}/CommandTreeCleaner.java (83%) create mode 100644 src/test/generated/additional_model/data/forge/test_instance/additional_model/block_model.json create mode 100644 src/test/generated/additional_model/data/forge/test_instance/additional_model/item_model.json diff --git a/build_forge.gradle b/build_forge.gradle index aa7096a6e9..2cdec0e19a 100644 --- a/build_forge.gradle +++ b/build_forge.gradle @@ -124,7 +124,7 @@ dependencies { installer(libs.bootstrap.api) // Needed by securemodules installer(libs.accesstransformers) installer(libs.eventbus) - installer(libs.typetools) // Dep of EventBus + installer(libs.jspecify) // Dep of EventBus installer(libs.forgespi) installer(libs.coremods) installer(libs.nashorn) // Dep of Coremods @@ -147,6 +147,8 @@ dependencies { runtimeOnly(libs.bootstrap) runtimeOnly(libs.bootstrap.dev) + + //annotationProcessor(libs.eventbus.validator) } tasks.named('extractRangeMap').configure { diff --git a/fmlcore/build.gradle b/fmlcore/build.gradle index 77dde4150c..2c1153c9c9 100644 --- a/fmlcore/build.gradle +++ b/fmlcore/build.gradle @@ -10,9 +10,10 @@ plugins { apply from: rootProject.file('build_shared.gradle') dependencies { - compileOnly(libs.nulls) + compileOnly(libs.jetbrains.annotations) api(libs.eventbus) + annotationProcessor(libs.eventbus.validator) implementation(project(':fmlloader')) implementation(libs.commons.io) diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/Bindings.java b/fmlcore/src/main/java/net/minecraftforge/fml/Bindings.java index 52149f1a51..e51b34d98f 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/Bindings.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/Bindings.java @@ -5,7 +5,7 @@ package net.minecraftforge.fml; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.config.IConfigEvent; import net.minecraftforge.fml.loading.FMLLoader; @@ -29,7 +29,7 @@ public class Bindings { /** * @return A supplier of net.minecraftforge.common.MinecraftForge#EVENT_BUS */ - public static Supplier getForgeBus() { + public static Supplier getForgeBus() { return PROVIDER.getForgeBusSupplier(); } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/IBindingsProvider.java b/fmlcore/src/main/java/net/minecraftforge/fml/IBindingsProvider.java index e13804a710..dbced67831 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/IBindingsProvider.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/IBindingsProvider.java @@ -5,13 +5,13 @@ package net.minecraftforge.fml; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.config.IConfigEvent; import java.util.function.Supplier; public interface IBindingsProvider { - Supplier getForgeBusSupplier(); + Supplier getForgeBusSupplier(); Supplier getMessageParser(); Supplier getConfigConfiguration(); } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/IModLoadingState.java b/fmlcore/src/main/java/net/minecraftforge/fml/IModLoadingState.java index 3574755d73..df2ea454e0 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/IModLoadingState.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/IModLoadingState.java @@ -5,8 +5,6 @@ package net.minecraftforge.fml; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.loading.progress.ProgressMeter; import java.util.Optional; @@ -61,14 +59,13 @@ public interface IModLoadingState { /** * Builds the transition task for this state with a blank pre-sync and post-sync task. * - * @param a type of event fired on the mod-specific event bus * @param syncExecutor a synchronous executor * @param parallelExecutor a parallel executor * @param progressBar a progress meter for tracking progress * @return a transition task for this state * @see #buildTransition(Executor, Executor, ProgressMeter, Function, Function) */ - default Optional> buildTransition( + default Optional> buildTransition( final Executor syncExecutor, final Executor parallelExecutor, final ProgressMeter progressBar @@ -83,7 +80,6 @@ public interface IModLoadingState { * Builds the transition task for this state. The pre-sync and post-sync task functions allow the transition builder * to run these tasks on the same executor as the actual event dispatch and pre/post hooks. * - * @param a type of event fired on the mod-specific event bus * @param syncExecutor a synchronous executor * @param parallelExecutor a parallel executor * @param progressBar a progress meter for tracking progress @@ -91,7 +87,6 @@ public interface IModLoadingState { * @param postSyncTask a function which returns a task to run after event post-dispatch hook * @return a transition task for this state */ - Optional> buildTransition(final Executor syncExecutor, final Executor parallelExecutor, final ProgressMeter progressBar, diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/IModStateTransition.java b/fmlcore/src/main/java/net/minecraftforge/fml/IModStateTransition.java index 73b79af5df..c1c57db993 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/IModStateTransition.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/IModStateTransition.java @@ -5,7 +5,6 @@ package net.minecraftforge.fml; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.loading.progress.ProgressMeter; @@ -20,7 +19,7 @@ import org.jetbrains.annotations.Nullable; public interface IModStateTransition { /** Magic value to allow me to optimize the futures list by ignoring the default value without making old methods nullable. */ - public static final BiFunction, CompletableFuture> NULL_HOOK = (e, g) -> CompletableFuture.completedFuture(null); + BiFunction, CompletableFuture> NULL_HOOK = (e, g) -> CompletableFuture.completedFuture(null); static IModStateTransition buildNoopTransition() { return ModStateTransitionHelper.NOOP; @@ -51,7 +50,7 @@ public interface IModStateTransition { } @Nullable - default EventGenerator eventFunction() { + default EventGenerator eventFunction() { return null; } @@ -74,8 +73,8 @@ public interface IModStateTransition { @Deprecated(since = "1.21.3", forRemoval = true) default BiFunction, CompletableFuture> postDispatchHook() { return NULL_HOOK; } - interface EventGenerator extends Function { - static EventGenerator fromFunction(Function fn) { + interface EventGenerator extends Function { + static EventGenerator fromFunction(Function fn) { return fn::apply; } } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java index 8bc24f8ab3..380c3b9f54 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java @@ -5,7 +5,6 @@ package net.minecraftforge.fml; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.config.IConfigEvent; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.IModBusEvent; @@ -162,5 +161,5 @@ public abstract class ModContainer { * Accept an arbitrary event for processing by the mod. Probably posted to an event bus in the lower level container. * @param e Event to accept */ - protected void acceptEvent(T e) {} + protected void acceptEvent(T e) {} } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java index e9851c44ea..aa3266e38a 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoader.java @@ -6,7 +6,6 @@ package net.minecraftforge.fml; import com.google.common.collect.ImmutableList; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.fml.loading.FMLLoader; @@ -88,7 +87,7 @@ public class ModLoader { this.loadingModList = FMLLoader.getLoadingModList(); this.loadingExceptions = this.loadingModList.getErrors().stream() .flatMap(ModLoadingException::fromEarlyException) - .toList(); + .collect(Collectors.toList()); this.loadingWarnings = this.loadingModList.getBrokenFiles().stream() .map(file -> new ModLoadingWarning(null, ModLoadingStage.VALIDATE, InvalidModIdentifier.identifyJarProblem(file.getFilePath()).orElse("fml.modloading.brokenfile"), file.getFileName())) .collect(Collectors.toList()); @@ -155,11 +154,13 @@ public class ModLoader { loadingStateValid = false; throw new LoadingFailedException(loadingExceptions); } - List failedBounds = loadingModList.getMods().stream() - .map(ModInfo::getForgeFeatures) - .flatMap(List::stream) - .filter(bound -> !ForgeFeature.testFeature(FMLEnvironment.dist, bound)) - .toList(); + var failedBounds = new ArrayList(); + for (var mod : loadingModList.getMods()) { + for (var feature : mod.getForgeFeatures()) { + if (!ForgeFeature.testFeature(FMLEnvironment.dist, feature)) + failedBounds.add(feature); + } + } if (!failedBounds.isEmpty()) { LOGGER.fatal(CORE, "Failed to validate feature bounds for mods: {}", failedBounds); @@ -357,49 +358,53 @@ public class ModLoader { return completedStates.contains(state); } - public void runEventGenerator(Function generator) { + public void runEventGenerator(Function generator) { if (!loadingStateValid) { LOGGER.error("Cowardly refusing to send event generator to a broken mod state"); return; } - ModList.get().forEachModInOrder(mc -> mc.acceptEvent(generator.apply(mc))); + for (var mod : ModList.get().getLoadedMods()) + mod.acceptEvent(generator.apply(mod)); } - public void postEvent(T e) { + public void postEvent(T e) { + var cls = e.getClass(); if (!loadingStateValid) { LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName()); return; } - ModList.get().forEachModInOrder(mc -> mc.acceptEvent(e)); + for (var mod : ModList.get().getLoadedMods()) + mod.acceptEvent(e); } - public T postEventWithReturn(T e) { + public T postEventWithReturn(T e) { if (!loadingStateValid) { LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName()); return e; } - ModList.get().forEachModInOrder(mc -> mc.acceptEvent(e)); + for (var mod : ModList.get().getLoadedMods()) + mod.acceptEvent(e); return e; } @SuppressWarnings("removal") - public void postEventWrapContainerInModOrder(T event) { + public void postEventWrapContainerInModOrder(T event) { postEventWithWrapInModOrder(event, (mc, e) -> ModLoadingContext.get().setActiveContainer(mc), (mc, e) -> ModLoadingContext.get().setActiveContainer(null) ); } - public void postEventWithWrapInModOrder(T e, BiConsumer pre, BiConsumer post) { + public void postEventWithWrapInModOrder(T e, BiConsumer pre, BiConsumer post) { if (!loadingStateValid) { LOGGER.error("Cowardly refusing to send event {} to a broken mod state", e.getClass().getName()); return; } - ModList.get().forEachModInOrder(mc -> { - pre.accept(mc, e); - mc.acceptEvent(e); - post.accept(mc, e); - }); + for (var mod : ModList.get().getLoadedMods()) { + pre.accept(mod, e); + mod.acceptEvent(e); + post.accept(mod, e); + } } public List getWarnings() { @@ -416,7 +421,7 @@ public class ModLoader { return runningDataGen; } - private static class ErroredModContainer extends ModContainer { + private static final class ErroredModContainer extends ModContainer { public ErroredModContainer() { super(); } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingState.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingState.java index 96917e5992..c92c79b9c4 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingState.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingState.java @@ -5,8 +5,6 @@ package net.minecraftforge.fml; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.loading.progress.ProgressMeter; import java.util.Optional; @@ -36,7 +34,7 @@ public record ModLoadingState( Optional transition ) implements IModLoadingState { @Override - public Optional> buildTransition( + public Optional> buildTransition( final Executor syncExecutor, final Executor parallelExecutor, final ProgressMeter progressBar, diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModStateTransitionHelper.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModStateTransitionHelper.java index 4be44759fc..baea870f26 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModStateTransitionHelper.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModStateTransitionHelper.java @@ -9,15 +9,16 @@ import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.CompletionStage; import java.util.concurrent.Executor; import java.util.function.BiFunction; import java.util.function.Function; + import org.jetbrains.annotations.ApiStatus; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.IModStateTransition.EventGenerator; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.loading.progress.ProgressMeter; @@ -41,7 +42,7 @@ class ModStateTransitionHelper { if (t.stream().noneMatch(e -> e.exception() != null)) { return CompletableFuture.completedFuture(null); } else { - final var throwables = t.stream().map(FutureResult::exception).filter(e -> e != null).toList(); + final var throwables = t.stream().map(FutureResult::exception).filter(Objects::nonNull).toList(); CompletableFuture cf = new CompletableFuture<>(); final RuntimeException accumulator = new RuntimeException(); cf.completeExceptionally(accumulator); @@ -70,13 +71,15 @@ class ModStateTransitionHelper { for (var future : futures) { int i = list.size(); list.add(null); - results[i] = future.whenComplete((result, exception) -> list.set(i, new FutureResult<>(result, exception))); + @SuppressWarnings("unchecked") // Bypass a weird javac error with generic by forcing it to be the exact type we want. + var raw = ((CompletableFuture)future); + results[i] = raw.whenComplete((result, exception) -> list.set(i, new FutureResult<>(result, exception))); } return CompletableFuture.allOf(results).handle((r, th)->null).thenApply(res -> list); } - private static void addCompletableFutureTaskForModDispatch( + private static void addCompletableFutureTaskForModDispatch( final IModStateTransition transition, final Executor executor, final List> completableFutures, @@ -135,14 +138,14 @@ class ModStateTransitionHelper { completableFutures.add(postDispatchHook); } - private static CompletableFuture getHook(BiFunction, CompletableFuture> hook, Executor executor, EventGenerator eventGenerator) { + private static CompletableFuture getHook(BiFunction, CompletableFuture> hook, Executor executor, EventGenerator eventGenerator) { if (hook == null || hook == IModStateTransition.NULL_HOOK) return null; @SuppressWarnings("unchecked") var hookTyped = (BiFunction, CompletableFuture>)hook; return hookTyped.apply(executor, eventGenerator); } - static CompletableFuture build( + static CompletableFuture build( final IModStateTransition transition, final String name, final Executor syncExecutor, diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/config/IConfigEvent.java b/fmlcore/src/main/java/net/minecraftforge/fml/config/IConfigEvent.java index 42e34a44fb..21e2060416 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/config/IConfigEvent.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/config/IConfigEvent.java @@ -5,7 +5,7 @@ package net.minecraftforge.fml.config; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.event.InheritableEvent; import net.minecraftforge.fml.Bindings; import java.util.function.Function; @@ -29,7 +29,7 @@ public interface IConfigEvent { ModConfig getConfig(); @SuppressWarnings("unchecked") - default T self() { + default T self() { return (T) this; } } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/event/IModBusEvent.java b/fmlcore/src/main/java/net/minecraftforge/fml/event/IModBusEvent.java index 584e1414d3..e57a55d72f 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/event/IModBusEvent.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/event/IModBusEvent.java @@ -5,8 +5,27 @@ package net.minecraftforge.fml.event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; + /** * Marker interface for events dispatched on the ModLifecycle event bus instead of the primary event bus */ -public interface IModBusEvent { +public interface IModBusEvent extends InheritableEvent { + /** + * @param modEventBusGroup Obtained from {@link net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext#getModBusGroup()} or your language provider's equivalent. + * @param eventClass The event type you want to get the associated bus for. + */ + static EventBus getBus(BusGroup modEventBusGroup, Class eventClass) { + // Do not copy! Temporary solution until the FML rewrite is complete. May throw in future + // without prior notice. + // + // Mods creating their own events should directly assign the result of the create method to a + // static final field in their event class, without wrapping or calling multiple times. + // + // Mods using existing events should instead use the existing static final BUS field in the + // event class (for most events) or getBus(BusGroup) method (for mod bus events). + return EventBus.create(modEventBusGroup, eventClass); + } } diff --git a/fmlearlydisplay/build.gradle b/fmlearlydisplay/build.gradle index 7582e49aa7..78e8905e8f 100644 --- a/fmlearlydisplay/build.gradle +++ b/fmlearlydisplay/build.gradle @@ -28,7 +28,7 @@ java { } dependencies { - compileOnly(libs.nulls) + compileOnly(libs.jetbrains.annotations) implementation(project(':fmlloader')) implementation(project(':fmlcore')) implementation(libs.bundles.lwjgl) diff --git a/fmlloader/build.gradle b/fmlloader/build.gradle index a49f4928b8..bc3badd86c 100644 --- a/fmlloader/build.gradle +++ b/fmlloader/build.gradle @@ -13,7 +13,7 @@ apply from: rootProject.file('build_shared.gradle') configurations.forEach{ it.transitive = false } dependencies { - compileOnly(libs.nulls) + compileOnly(libs.jetbrains.annotations) api(libs.bundles.asm) // Needed by all the black magic api(libs.forgespi) @@ -41,7 +41,7 @@ dependencies { implementation(libs.log4j.core) annotationProcessor(libs.bundles.log4j) - testCompileOnly(libs.nulls) + testCompileOnly(libs.jetbrains.annotations) testRuntimeOnly(libs.bootstrap) } diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java index d068a25915..932a73c5fb 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/FMLLoader.java @@ -56,7 +56,6 @@ public class FMLLoader { checkPackage(ITransformationService.class, "4.0", "ModLauncher"); accessTransformer = getPlugin(env, "accesstransformer", "1.0", "AccessTransformer"); - /*eventBus =*/ getPlugin(env, "eventbus", "1.0", "EventBus"); runtimeDistCleaner = getPlugin(env, "runtimedistcleaner", "1.0", "RuntimeDistCleaner"); coreModProvider = getSingleService(ICoreModProvider.class, "CoreMod"); LOGGER.debug(CORE, "FML found CoreMod version : {}", JarVersionLookupHandler.getInfo(coreModProvider.getClass()).impl().version().orElse("MISSING")); diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/MinecraftLocator.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/MinecraftLocator.java index 430b3f4849..5b983946ea 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/MinecraftLocator.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/MinecraftLocator.java @@ -43,10 +43,10 @@ public final class MinecraftLocator extends AbstractModProvider implements IModL mods.set("modId", "minecraft"); mods.set("version", FMLLoader.versionInfo().mcVersion()); mods.set("displayName", "Minecraft"); - mods.set("logoFile", "mcplogo.png"); - mods.set("credits", "Mojang, deobfuscated by MCP"); - mods.set("authors", "MCP: Searge,ProfMobius,IngisKahn,Fesh0r,ZeuX,R4wk,LexManos,Bspkrs"); - mods.set("description", "Minecraft, decompiled and deobfuscated with MCP technology"); + //mods.set("logoFile", "mcplogo.png"); + //mods.set("credits", "Mojang, deobfuscated by MCP"); + //mods.set("authors", "MCP: Searge,ProfMobius,IngisKahn,Fesh0r,ZeuX,R4wk,LexManos,Bspkrs"); + mods.set("description", "The base Minecraft game, published by Mojang decompiled and deobfuscated by Forge"); conf.set("mods", List.of(mods)); var configWrapper = new NightConfigWrapper(conf); diff --git a/gradle.properties b/gradle.properties index 8a3617efeb..3a573b0d5d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,11 +5,11 @@ org.gradle.daemon=false org.gradle.parallel=true JAVA_VERSION=21 -MC_VERSION=1.21.5 +MC_VERSION=1.21.6 MC_NEXT_VERSION=1.22 -MCP_VERSION=20250325.155543 +MCP_VERSION=20250618.020446 MAPPING_CHANNEL=official -MAPPING_VERSION=1.21.5 +MAPPING_VERSION=1.21.6 # Set to true before the first build of a new MC version, so we don't do compatibility checks CHECK_COMPATIBILITY=false diff --git a/javafmllanguage/build.gradle b/javafmllanguage/build.gradle index da904da2e0..e81fd2b59f 100644 --- a/javafmllanguage/build.gradle +++ b/javafmllanguage/build.gradle @@ -10,7 +10,7 @@ plugins { apply from: rootProject.file('build_shared.gradle') dependencies { - compileOnly(libs.nulls) + compileOnly(libs.jetbrains.annotations) implementation(project(':fmlloader')) implementation(project(':fmlcore')) implementation(libs.unsafe) diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/common/Mod.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/common/Mod.java index b77a5f7a0c..b284de160b 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/common/Mod.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/common/Mod.java @@ -12,9 +12,10 @@ import java.lang.annotation.Target; import java.util.function.Supplier; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.Bindings; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import org.jspecify.annotations.Nullable; /** * This defines a Mod to FML. @@ -24,12 +25,11 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface Mod -{ +public @interface Mod { /** * The unique mod identifier for this mod. - * Required to be lowercased in the english locale for compatibility. Will be truncated to 64 characters long. - * + * Required to be lowercased in the English locale for compatibility. Will be truncated to 64 characters long. + *
* This will be used to identify your mod for third parties (other mods), it will be used to identify your mod for registries such as block and item registries. * By default, you will have a resource domain that matches the modid. All these uses require that constraints are imposed on the format of the modid. */ @@ -61,32 +61,40 @@ public @interface Mod String modid() default ""; /** - * Specify an alternative bus to listen to + * Specify an alternative bus to listen to. + *
+ * If you know all listeners in this class are for a specific bus, you can set it here to speed up registration. * * @return the bus you wish to listen to */ - Bus bus() default Bus.FORGE; + Bus bus() default Bus.BOTH; enum Bus { /** - * The main Forge Event Bus. - * - *

See {@code MinecraftForge#EVENT_BUS}

+ * The main BusGroup that most game events are fired on. */ FORGE(Bindings.getForgeBus()), + /** - * The mod specific Event bus. - * @see FMLJavaModLoadingContext#getModEventBus() + * The mod-specific event BusGroup, usually for mod lifecycle events. + * @see FMLJavaModLoadingContext#getModBusGroup() */ - MOD(()-> FMLJavaModLoadingContext.get().getModEventBus()); + MOD(()-> FMLJavaModLoadingContext.get().getModBusGroup()), - private final Supplier busSupplier; + /** + * Both the {@link #FORGE} and {@link #MOD} buses. This is slower to register events in your class but + * allows you to listen to events from different BusGroup types without needing separate classes annotated + * with {@link EventBusSubscriber}. + */ + BOTH(() -> null); - Bus(final Supplier eventBusSupplier) { + private final Supplier<@Nullable BusGroup> busSupplier; + + Bus(Supplier<@Nullable BusGroup> eventBusSupplier) { this.busSupplier = eventBusSupplier; } - public Supplier bus() { + public Supplier<@Nullable BusGroup> bus() { return busSupplier; } } diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java index 078b13f62b..03e45d157d 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/AutomaticEventSubscriber.java @@ -7,22 +7,40 @@ package net.minecraftforge.fml.javafmlmod; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; +import net.minecraftforge.eventbus.api.listener.EventListener; +import net.minecraftforge.eventbus.api.listener.ObjBooleanBiConsumer; +import net.minecraftforge.eventbus.api.listener.Priority; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; +import net.minecraftforge.eventbus.internal.Event; import net.minecraftforge.fml.Logging; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.forgespi.language.ModFileScanData; import net.minecraftforge.forgespi.language.ModFileScanData.AnnotationData; import net.minecraftforge.forgespi.language.ModFileScanData.EnumData; import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.unsafe.UnsafeHacks; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jspecify.annotations.Nullable; import org.objectweb.asm.Type; -import java.util.Collections; -import java.util.List; -import java.util.Objects; +import java.lang.invoke.LambdaMetafactory; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Predicate; import java.util.stream.Collectors; /** @@ -75,7 +93,7 @@ public class AutomaticEventSubscriber { if (Objects.equals(mod.getModId(), modId) && sides.contains(FMLEnvironment.dist)) { try { LOGGER.debug(Logging.LOADING, "Auto-subscribing {} to {}", data.clazz().getClassName(), busTarget); - busTarget.bus().get().register(Class.forName(data.clazz().getClassName(), true, loader)); + EventBusSubscriberLogic.register(busTarget.bus().get(), Class.forName(data.clazz().getClassName(), true, loader)); } catch (ClassNotFoundException e) { LOGGER.fatal(Logging.LOADING, "Failed to load mod class {} for @EventBusSubscriber annotation", data.clazz(), e); throw new RuntimeException(e); @@ -88,4 +106,315 @@ public class AutomaticEventSubscriber { private static R value(AnnotationData data, String key, R value) { return (R)data.annotationData().getOrDefault(key, value); } + + /** + * This is mostly a carbon copy of EventBus 7's internal EventListenerFactory, with some changes to support adding + * to different BusGroups based on the event type, among other things. + */ + private static final class EventBusSubscriberLogic { + private EventBusSubscriberLogic() {} + + private static final boolean STRICT_RUNTIME_CHECKS = Boolean.getBoolean("eventbus.api.strictRuntimeChecks"); + + /** + * If true, performs exhaustive validation on bulk registration to aid debugging. + */ + private static final boolean STRICT_REGISTRATION_CHECKS = STRICT_RUNTIME_CHECKS || Boolean.getBoolean("eventbus.api.strictRegistrationChecks"); + + private static final MethodType RETURNS_CONSUMER = MethodType.methodType(Consumer.class); + private static final MethodType RETURNS_PREDICATE = MethodType.methodType(Predicate.class); + private static final MethodType RETURNS_MONITOR = MethodType.methodType(ObjBooleanBiConsumer.class); + + /** The method type of the {@link Consumer} functional interface ({@code void accept(Object)}) */ + private static final MethodType CONSUMER_FI_TYPE = MethodType.methodType(void.class, Object.class); + + /** The method type of the {@link Predicate} functional interface ({@code boolean test(Object)}) */ + private static final MethodType PREDICATE_FI_TYPE = CONSUMER_FI_TYPE.changeReturnType(boolean.class); + + /** The method type of the {@link ObjBooleanBiConsumer} functional interface ({@code void accept(Object, boolean)}) */ + private static final MethodType MONITOR_FI_TYPE = MethodType.methodType(void.class, Object.class, boolean.class); + + public static void register(@Nullable BusGroup busGroup, Class listenerClass) { + if (STRICT_REGISTRATION_CHECKS) registerStrict(busGroup, listenerClass); + else registerLenient(busGroup, listenerClass); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + public static void registerLenient(@Nullable BusGroup busGroup, Class listenerClass) { + Method[] declaredMethods = listenerClass.getDeclaredMethods(); + if (declaredMethods.length == 0) + throw new IllegalArgumentException("No declared methods found in " + listenerClass); + + Class firstValidListenerEventType = null; + + int listenersCount = 0; + for (var method : declaredMethods) { + if (!Modifier.isStatic(method.getModifiers())) + continue; + + int paramCount = method.getParameterCount(); + if (paramCount == 0 || paramCount > 2) + continue; + + Class returnType = method.getReturnType(); + if (returnType != void.class && returnType != boolean.class) + continue; + + if (!method.isAnnotationPresent(SubscribeEvent.class)) + continue; + + Class[] parameterTypes = method.getParameterTypes(); + if (!Event.class.isAssignableFrom(parameterTypes[0])) + throw new IllegalArgumentException("First parameter of a @SubscribeEvent method must be an event"); + + Class eventType = (Class) parameterTypes[0]; + var subscribeEventAnnotation = method.getAnnotation(SubscribeEvent.class); + + registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method); + listenersCount++; + + if (firstValidListenerEventType == null) + firstValidListenerEventType = eventType; + } + + if (listenersCount == 0) + throw new IllegalArgumentException("No listeners found in " + listenerClass); + else if (firstValidListenerEventType == null) + throw new IllegalArgumentException("No valid listeners found in " + listenerClass); + } + + @SuppressWarnings({"unchecked"}) + public static void registerStrict(BusGroup busGroup, Class listenerClass) { + Class firstValidListenerEventType = null; + + Method[] declaredMethods = listenerClass.getDeclaredMethods(); + if (declaredMethods.length == 0) { + var errMsg = "No declared methods found in " + listenerClass.getName(); + var superClass = listenerClass.getSuperclass(); + if (superClass != null && superClass != Record.class && superClass != Enum.class) { + errMsg += ". Note that listener inheritance is not supported. " + + "If you are trying to inherit listeners, please use @Override and @SubscribeEvent on the method in the subclass."; + } + throw fail(listenerClass, errMsg); + } + + int listenersCount = 0; + for (var method : declaredMethods) { + var hasSubscribeEvent = method.isAnnotationPresent(SubscribeEvent.class); + int paramCount = method.getParameterCount(); + + if (hasSubscribeEvent && (paramCount == 0 || paramCount > 2)) + throw fail(method, "Invalid number of parameters: " + paramCount + " (expected 1 or 2)"); + + if (paramCount == 0) + continue; + + Class returnType = method.getReturnType(); + Class[] parameterTypes = method.getParameterTypes(); + var firstParamExtendsEvent = Event.class.isAssignableFrom(parameterTypes[0]); + + if (!hasSubscribeEvent && firstParamExtendsEvent) + throw fail(method, "Missing @SubscribeEvent annotation"); + + if (hasSubscribeEvent) { + var firstParamExtendsCancellable = Cancellable.class.isAssignableFrom(parameterTypes[0]); + var subscribeEventAnnotation = method.getAnnotation(SubscribeEvent.class); + var isMonitoringPriority = subscribeEventAnnotation.priority() == Priority.MONITOR; + + if (!firstParamExtendsEvent) + throw fail(method, "First parameter of a @SubscribeEvent method must be an event"); + + var eventType = (Class) parameterTypes[0]; + + if (returnType != void.class && returnType != boolean.class) + throw fail(method, "Invalid return type: " + returnType.getName() + " (expected void or boolean)"); + + if (!Modifier.isStatic(method.getModifiers())) + throw fail(method, "Listener method needs to be static"); + + if (isMonitoringPriority && (returnType == boolean.class || subscribeEventAnnotation.alwaysCancelling())) + throw fail(method, "Monitoring listeners cannot cancel events"); + + if (paramCount == 2) { + if (!firstParamExtendsCancellable) + throw fail(method, "Cancellation-aware monitoring listeners are only valid for cancellable events"); + + if (!boolean.class.isAssignableFrom(parameterTypes[1])) + throw fail(method, "Second parameter of a cancellation-aware monitoring listener must be a boolean"); + + if (!isMonitoringPriority) + throw fail(method, "Cancellation-aware monitoring listeners must have a priority of MONITOR"); + } + + if (!firstParamExtendsCancellable) { + if (subscribeEventAnnotation.alwaysCancelling()) + throw fail(method, "Always cancelling listeners are only valid for cancellable events"); + + if (returnType == boolean.class) + throw fail(method, "Return type boolean is only valid for cancellable events"); + } + + registerListener(busGroup, paramCount, returnType, eventType, subscribeEventAnnotation, method); + listenersCount++; + + if (firstValidListenerEventType == null) + firstValidListenerEventType = eventType; + } + } + + if (listenersCount == 0) + throw fail(listenerClass, "No listeners found"); + else if (firstValidListenerEventType == null) + throw fail(listenerClass, "No valid listeners found"); + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private static EventListener registerListener(@Nullable BusGroup busGroup, + int paramCount, Class returnType, Class eventType, + SubscribeEvent subscribeEventAnnotation, Method method) { + if (busGroup == null) { + busGroup = IModBusEvent.class.isAssignableFrom(eventType) + ? FMLJavaModLoadingContext.get().getModBusGroup() + : BusGroup.DEFAULT; + } + + // determine the listener type from its parameters and return type + if (paramCount == 1) { + var priority = subscribeEventAnnotation.priority(); + if (returnType == void.class) { + if (Cancellable.class.isAssignableFrom(eventType)) { + // Consumer + var eventBus = CancellableEventBus.create(busGroup, (Class) eventType); + if (subscribeEventAnnotation.alwaysCancelling()) { + return eventBus.addListener(priority, true, createConsumer(method)); + } else { + return eventBus.addListener(priority, createConsumer(method)); + } + } else { + // Consumer + return EventBus.create(busGroup, eventType) + .addListener(priority, createConsumer(method)); + } + } else { + // Predicate + if (!Cancellable.class.isAssignableFrom(eventType)) + throw fail(method, "Return type boolean is only valid for cancellable events"); + + if (subscribeEventAnnotation.alwaysCancelling()) + throw new IllegalArgumentException("Always cancelling listeners must have a void return type"); + + return CancellableEventBus.create(busGroup, (Class) eventType) + .addListener(priority, createPredicate(method)); + } + } else { + // ObjBooleanBiConsumer + if (returnType != void.class) + throw new IllegalArgumentException("Cancellation-aware monitoring listeners must have a void return type"); + + if (subscribeEventAnnotation.alwaysCancelling()) + throw new IllegalArgumentException("Monitoring listeners cannot cancel events"); + + return CancellableEventBus.create(busGroup, (Class) eventType).addListener(createMonitor(method)); + } + } + + private static IllegalArgumentException fail(Class listenerClass, String reason) { + return new IllegalArgumentException("Failed to register " + listenerClass.getName() + ": " + reason); + } + + private static IllegalArgumentException fail(Method mtd, String reason) { + return new IllegalArgumentException("Failed to register " + mtd.getDeclaringClass().getName() + "." + mtd.getName() + ": " + reason); + } + + @SuppressWarnings("unchecked") + private static Consumer createConsumer(Method callback) { + var factoryMH = getOrMakeFactory(callback, RETURNS_CONSUMER, CONSUMER_FI_TYPE, "accept"); + + try { + return (Consumer) factoryMH.invokeExact(); + } catch (Exception e) { + throw makeRuntimeException(callback, e); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + @SuppressWarnings("unchecked") + private static Predicate createPredicate(Method callback) { + var factoryMH = getOrMakeFactory(callback, RETURNS_PREDICATE, PREDICATE_FI_TYPE, "test"); + + try { + return (Predicate) factoryMH.invokeExact(); + } catch (Exception e) { + throw makeRuntimeException(callback, e); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + @SuppressWarnings("unchecked") + private static ObjBooleanBiConsumer createMonitor(Method callback) { + var factoryMH = getOrMakeFactory(callback, RETURNS_MONITOR, MONITOR_FI_TYPE, "accept"); + + try { + return (ObjBooleanBiConsumer) factoryMH.invokeExact(); + } catch (Exception e) { + throw makeRuntimeException(callback, e); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } + + private static MethodHandle getOrMakeFactory(Method callback, MethodType factoryReturnType, + MethodType fiMethodType, String fiMethodName) { + return makeFactory(callback, factoryReturnType, fiMethodType, fiMethodName); + } + + private static MethodHandle makeFactory(Method callback, + MethodType factoryReturnType, + MethodType fiMethodType, String fiMethodName) { + final class DodgyLookup { + private DodgyLookup() {} + private static final MethodHandles.Lookup INSTANCE; + static { + try { + var lookupField = MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP"); + UnsafeHacks.setAccessible(lookupField); + INSTANCE = (MethodHandles.Lookup) lookupField.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + + try { + var callbackDeclaredClass = callback.getDeclaringClass(); + var lookup = DodgyLookup.INSTANCE.in(callbackDeclaredClass); + var mh = lookup.unreflect(callback); + + return LambdaMetafactory.metafactory( + lookup, fiMethodName, factoryReturnType, fiMethodType, mh, mh.type() + ).getTarget(); + } catch (Exception e) { + throw makeRuntimeException(callback, e); + } + } + + private static RuntimeException makeRuntimeException(Method callback, Exception e) { + return switch (e) { + case IllegalAccessException iae -> { + var errMsg = "Failed to create listener"; + if (!Modifier.isPublic(callback.getModifiers())) + errMsg += " - is it public?"; + + yield new RuntimeException(errMsg, iae); + } + case NullPointerException npe -> new RuntimeException( + "Failed to create listener - was given a non-static method without an instance to invoke it with", + npe + ); + default -> new RuntimeException("Failed to create listener", e); + }; + } + } } diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext.java index 08d3ef642d..24d09dd17f 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLJavaModLoadingContext.java @@ -5,14 +5,13 @@ package net.minecraftforge.fml.javafmlmod; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.ModLoadingContext; /** * Use the context provided by your language loader in your mod's constructor */ -public class FMLJavaModLoadingContext extends ModLoadingContext -{ +public class FMLJavaModLoadingContext extends ModLoadingContext { private final FMLModContainer container; FMLJavaModLoadingContext(FMLModContainer container) { @@ -20,11 +19,10 @@ public class FMLJavaModLoadingContext extends ModLoadingContext } /** - * @return The mod's event bus, to allow subscription to Mod specific events + * @return The mod's event bus group, to allow subscription to Mod specific events */ - public IEventBus getModEventBus() - { - return container.getEventBus(); + public BusGroup getModBusGroup() { + return container.getModBusGroup(); } /** @@ -39,9 +37,15 @@ public class FMLJavaModLoadingContext extends ModLoadingContext * Helper to get the right instance from the {@link ModLoadingContext} correctly. * @return The FMLJavaMod language specific extension from the ModLoadingContext * - * @deprecated use {@link FMLJavaModLoadingContext} in your mod constructor + * @deprecated use {@link FMLJavaModLoadingContext} in your mod constructor. For example: {@snippet : + * @Mod("examplemod") + * public final class ExampleMod { + * public ExampleMod(FMLJavaModLoadingContext context) { + * // Use context from the param instead of FMLJavaModLoadingContext.get() or ModLoadingContext.get() + * } + * }} */ - @Deprecated(forRemoval = true, since="1.21.1") + @Deprecated(forRemoval = true, since = "1.21.1") public static FMLJavaModLoadingContext get() { return ModLoadingContext.get().extension(); } diff --git a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java index 2df30f64ad..ddf980876f 100644 --- a/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java +++ b/javafmllanguage/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java @@ -5,11 +5,8 @@ package net.minecraftforge.fml.javafmlmod; -import net.minecraftforge.eventbus.EventBusErrorMessage; -import net.minecraftforge.eventbus.api.BusBuilder; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.IEventListener; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingException; import net.minecraftforge.fml.ModLoadingStage; @@ -36,7 +33,7 @@ public class FMLModContainer extends ModContainer { private static final Logger LOGGER = LogManager.getLogger(); private static final Marker LOADING = MarkerManager.getMarker("LOADING"); private final ModFileScanData scanResults; - private final IEventBus eventBus; + private final BusGroup eventBusGroup; private Object modInstance; private final Class modClass; private final FMLJavaModLoadingContext context = new FMLJavaModLoadingContext(this); @@ -46,7 +43,7 @@ public class FMLModContainer extends ModContainer { LOGGER.debug(LOADING,"Creating FMLModContainer instance for {}", className); this.scanResults = modFileScanResults; activityMap.put(ModLoadingStage.CONSTRUCT, this::constructMod); - this.eventBus = BusBuilder.builder().setExceptionHandler(FMLModContainer::onEventFailed).setTrackPhases(false).markerType(IModBusEvent.class).useModLauncher().build(); + this.eventBusGroup = BusGroup.create("modBusFor" + info.getModId()); this.contextExtension = () -> context; try { var moduleName = info.getOwningFile().moduleName(); @@ -128,10 +125,6 @@ public class FMLModContainer extends ModContainer { implAddExportsOrOpens.invoke(target, pkg, reader, open, /*syncVM*/true); } - private static void onEventFailed(IEventBus iEventBus, Event event, IEventListener[] iEventListeners, int i, Throwable throwable) { - LOGGER.error(new EventBusErrorMessage(event, i, iEventListeners, throwable)); - } - private void constructMod() { try { LOGGER.trace(LOADING, "Loading mod instance {} of type {}", getModId(), modClass.getName()); @@ -173,15 +166,17 @@ public class FMLModContainer extends ModContainer { return modInstance; } - public IEventBus getEventBus() { - return this.eventBus; + public BusGroup getModBusGroup() { + return this.eventBusGroup; } @Override - protected void acceptEvent(final T e) { + protected void acceptEvent(final T e) { try { LOGGER.trace(LOADING, "Firing event for modid {} : {}", this.getModId(), e); - this.eventBus.post(e); + @SuppressWarnings("unchecked") + var eventBus = (EventBus) IModBusEvent.getBus(eventBusGroup, e.getClass()); + eventBus.post(e); LOGGER.trace(LOADING, "Fired event for modid {} : {}", this.getModId(), e); } catch (Throwable t) { LOGGER.error(LOADING,"Caught exception during event {} dispatch for modid {}", e, this.getModId(), t); @@ -190,8 +185,10 @@ public class FMLModContainer extends ModContainer { } @Override + @SuppressWarnings({"rawtypes", "unchecked"}) public void dispatchConfigEvent(IConfigEvent event) { - this.eventBus.post(event.self()); + var eventBus = (EventBus) EventBus.create(eventBusGroup, event.self().getClass()); + eventBus.post(event.self()); } @Override diff --git a/lowcodelanguage/build.gradle b/lowcodelanguage/build.gradle index 7ef9c41aac..f4e92d6233 100644 --- a/lowcodelanguage/build.gradle +++ b/lowcodelanguage/build.gradle @@ -15,7 +15,7 @@ java { } dependencies { - compileOnly(libs.nulls) + compileOnly(libs.jetbrains.annotations) implementation(project(':fmlloader')) implementation(project(':fmlcore')) diff --git a/lowcodelanguage/src/main/java/net/minecraftforge/fml/lowcodemod/LowCodeModContainer.java b/lowcodelanguage/src/main/java/net/minecraftforge/fml/lowcodemod/LowCodeModContainer.java index d55bc1935d..58c745d710 100644 --- a/lowcodelanguage/src/main/java/net/minecraftforge/fml/lowcodemod/LowCodeModContainer.java +++ b/lowcodelanguage/src/main/java/net/minecraftforge/fml/lowcodemod/LowCodeModContainer.java @@ -6,41 +6,32 @@ package net.minecraftforge.fml.lowcodemod; import com.mojang.logging.LogUtils; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.IExtensionPoint; import net.minecraftforge.fml.ModContainer; -import net.minecraftforge.fml.event.IModBusEvent; +import net.minecraftforge.fml.loading.LogMarkers; import net.minecraftforge.forgespi.language.IModInfo; import net.minecraftforge.forgespi.language.ModFileScanData; import org.slf4j.Logger; -import java.util.Objects; - -import static net.minecraftforge.fml.loading.LogMarkers.LOADING; - -public class LowCodeModContainer extends ModContainer -{ +public class LowCodeModContainer extends ModContainer { private static final Logger LOGGER = LogUtils.getLogger(); private final Object modInstance; - public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer gameLayer) - { + public LowCodeModContainer(IModInfo info, ModFileScanData modFileScanResults, ModuleLayer gameLayer) { super(info); - LOGGER.debug(LOADING, "Creating LowCodeModContainer for {}", info.getModId()); + LOGGER.debug(LogMarkers.LOADING, "Creating LowCodeModContainer for {}", info.getModId()); this.modInstance = new Object(); this.contextExtension = () -> null; this.extensionPoints.remove(IExtensionPoint.DisplayTest.class); } @Override - public boolean matches(Object mod) - { + public boolean matches(Object mod) { return mod == modInstance; } @Override - public Object getMod() - { + public Object getMod() { return modInstance; } } diff --git a/mclanguage/build.gradle b/mclanguage/build.gradle index 293fda17f8..abf4e79ed2 100644 --- a/mclanguage/build.gradle +++ b/mclanguage/build.gradle @@ -10,7 +10,7 @@ plugins { apply from: rootProject.file('build_shared.gradle') dependencies { - compileOnly(libs.nulls) + compileOnly(libs.jetbrains.annotations) implementation(project(':fmlloader')) implementation(project(':fmlcore')) } diff --git a/mdk/build.gradle b/mdk/build.gradle index 033a4f5f1e..929c6f0bef 100644 --- a/mdk/build.gradle +++ b/mdk/build.gradle @@ -68,6 +68,9 @@ minecraft { property 'forge.logging.console.level', 'debug' + // Recommended for development - enables more descriptive errors at the cost of slower startup and registration. + property 'eventbus.api.strictRuntimeChecks', 'true' + // arg "-mixin.config=${mod_id}.mixins.json" } @@ -139,6 +142,11 @@ dependencies { // then special handling is done to allow a setup of a vanilla dependency without the use of an external repository. minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + // Forge 1.21.6+ uses EventBus 7, which shifts most of its runtime validation to compile-time via an annotation processor + // to improve performance in production environments. This line is required to enable said compile-time validation + // in your development environment, helping you catch issues early. + annotationProcessor 'net.minecraftforge:eventbus-validator:7.0-beta.7' + // Example mod dependency with JEI // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime // compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" diff --git a/patches/minecraft/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch b/patches/minecraft/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch index 79413934aa..d8070c4429 100644 --- a/patches/minecraft/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/opengl/GlCommandEncoder.java.patch @@ -1,6 +1,6 @@ --- a/com/mojang/blaze3d/opengl/GlCommandEncoder.java +++ b/com/mojang/blaze3d/opengl/GlCommandEncoder.java -@@ -109,6 +_,9 @@ +@@ -132,6 +_,9 @@ GlStateManager._colorMask(true, true, true, true); GlStateManager._clear(16384); GlStateManager._glFramebufferTexture2D(36160, 36064, 3553, 0, 0); diff --git a/patches/minecraft/com/mojang/blaze3d/opengl/GlDevice.java.patch b/patches/minecraft/com/mojang/blaze3d/opengl/GlDevice.java.patch index cb5a5d21f5..4775ae7d81 100644 --- a/patches/minecraft/com/mojang/blaze3d/opengl/GlDevice.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/opengl/GlDevice.java.patch @@ -1,53 +1,74 @@ --- a/com/mojang/blaze3d/opengl/GlDevice.java +++ b/com/mojang/blaze3d/opengl/GlDevice.java -@@ -80,11 +_,25 @@ - - @Override - public GpuTexture createTexture(@Nullable Supplier p_397830_, TextureFormat p_394839_, int p_394481_, int p_391831_, int p_395609_) { -- return this.createTexture(this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394839_, p_394481_, p_391831_, p_395609_); -+ return this.createTexture(p_397830_, p_394839_, p_394481_, p_391831_, p_395609_, false); +@@ -88,8 +_,15 @@ + public GpuTexture createTexture( + @Nullable Supplier p_397830_, int p_394481_, TextureFormat p_394839_, int p_391831_, int p_395609_, int p_407582_, int p_408928_ + ) { ++ return createTexture(p_397830_, p_394481_, p_394839_, p_391831_, p_395609_, p_407582_, p_408928_, false); + } + -+ /** @see GpuDevice#createTexture(Supplier, TextureFormat, int, int, int, boolean) */ + @Override -+ public GpuTexture createTexture(@Nullable Supplier p_397830_, TextureFormat p_394839_, int p_394481_, int p_391831_, int p_395609_, boolean stencil) { -+ return this.createTexture(this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394839_, p_394481_, p_391831_, p_395609_, stencil); ++ public GpuTexture createTexture( ++ @Nullable Supplier p_397830_, int p_394481_, TextureFormat p_394839_, int p_391831_, int p_395609_, int p_407582_, int p_408928_, boolean stencil ++ ) { + return this.createTexture( +- this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394481_, p_394839_, p_391831_, p_395609_, p_407582_, p_408928_ ++ this.debugLabels.exists() && p_397830_ != null ? p_397830_.get() : null, p_394481_, p_394839_, p_391831_, p_395609_, p_407582_, p_408928_, stencil + ); } - @Override - public GpuTexture createTexture(@Nullable String p_394142_, TextureFormat p_394951_, int p_395535_, int p_393944_, int p_392329_) { -+ return this.createTexture(p_394142_, p_394951_, p_395535_, p_393944_, p_392329_, false); +@@ -97,6 +_,15 @@ + public GpuTexture createTexture( + @Nullable String p_394142_, int p_395535_, TextureFormat p_394951_, int p_393944_, int p_392329_, int p_408015_, int p_406483_ + ) { ++ return createTexture(p_394142_, p_395535_, p_394951_, p_393944_, p_392329_, p_408015_, p_406483_, false); + } + -+ /** @see GpuDevice#createTexture(String, TextureFormat, int, int, int, boolean) */ + @Override -+ public GpuTexture createTexture(@Nullable String p_394142_, TextureFormat p_394951_, int p_395535_, int p_393944_, int p_392329_, boolean stencil) { ++ public GpuTexture createTexture( ++ @Nullable String p_394142_, int p_395535_, TextureFormat p_394951_, int p_393944_, int p_392329_, int p_408015_, int p_406483_, boolean stencil ++ ) { + // Forge: stencil rendering is only for depth + stencil &= p_394951_.hasDepthAspect(); - if (p_392329_ < 1) { + if (p_406483_ < 1) { throw new IllegalArgumentException("mipLevels must be at least 1"); - } else { -@@ -106,11 +_,14 @@ - GlStateManager._texImage2D( - 3553, - j, -+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8 : - GlConst.toGlInternalId(p_394951_), - p_395535_ >> j, - p_393944_ >> j, - 0, -+ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL : - GlConst.toGlExternalId(p_394951_), -+ stencil ? org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV : - GlConst.toGlType(p_394951_), - null - ); -@@ -122,7 +_,7 @@ - } else if (k != 0) { - throw new IllegalStateException("OpenGL error " + k); + } else if (p_408015_ < 1) { +@@ -147,11 +_,14 @@ + GlStateManager._texImage2D( + k, + l, ++ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8 : + GlConst.toGlInternalId(p_394951_), + p_393944_ >> l, + p_392329_ >> l, + 0, ++ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL : + GlConst.toGlExternalId(p_394951_), ++ stencil ? org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV : + GlConst.toGlType(p_394951_), + null + ); +@@ -162,11 +_,14 @@ + GlStateManager._texImage2D( + j, + i1, ++ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH32F_STENCIL8 : + GlConst.toGlInternalId(p_394951_), + p_393944_ >> i1, + p_392329_ >> i1, + 0, ++ stencil ? org.lwjgl.opengl.GL30.GL_DEPTH_STENCIL : + GlConst.toGlExternalId(p_394951_), ++ stencil ? org.lwjgl.opengl.GL30.GL_FLOAT_32_UNSIGNED_INT_24_8_REV : + GlConst.toGlType(p_394951_), + null + ); +@@ -179,7 +_,7 @@ + } else if (j1 != 0) { + throw new IllegalStateException("OpenGL error " + j1); } else { -- GlTexture gltexture = new GlTexture(p_394142_, p_394951_, p_395535_, p_393944_, p_392329_, i); -+ GlTexture gltexture = new GlTexture(p_394142_, p_394951_, p_395535_, p_393944_, p_392329_, i, stencil); +- GlTexture gltexture = new GlTexture(p_395535_, p_394142_, p_394951_, p_393944_, p_392329_, p_408015_, p_406483_, i); ++ GlTexture gltexture = new GlTexture(p_395535_, p_394142_, p_394951_, p_393944_, p_392329_, p_408015_, p_406483_, i, stencil); this.debugLabels.applyLabel(gltexture); return gltexture; } diff --git a/patches/minecraft/com/mojang/blaze3d/opengl/GlStateManager.java.patch b/patches/minecraft/com/mojang/blaze3d/opengl/GlStateManager.java.patch index bcab727130..1dbc35f1c0 100644 --- a/patches/minecraft/com/mojang/blaze3d/opengl/GlStateManager.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/opengl/GlStateManager.java.patch @@ -1,6 +1,6 @@ --- a/com/mojang/blaze3d/opengl/GlStateManager.java +++ b/com/mojang/blaze3d/opengl/GlStateManager.java -@@ -90,6 +_,11 @@ +@@ -89,6 +_,11 @@ } } @@ -12,7 +12,7 @@ public static void _disableBlend() { RenderSystem.assertOnRenderThread(); BLEND.mode.disable(); -@@ -411,9 +_,17 @@ +@@ -404,9 +_,17 @@ } } diff --git a/patches/minecraft/com/mojang/blaze3d/opengl/GlTexture.java.patch b/patches/minecraft/com/mojang/blaze3d/opengl/GlTexture.java.patch index f0a24cb5bd..54a2d90ad7 100644 --- a/patches/minecraft/com/mojang/blaze3d/opengl/GlTexture.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/opengl/GlTexture.java.patch @@ -1,20 +1,20 @@ --- a/com/mojang/blaze3d/opengl/GlTexture.java +++ b/com/mojang/blaze3d/opengl/GlTexture.java -@@ -18,8 +_,13 @@ - protected boolean modesDirty = true; +@@ -19,8 +_,13 @@ + private int views; - protected GlTexture(String p_393950_, TextureFormat p_392837_, int p_394590_, int p_391379_, int p_391947_, int p_396659_) { -+ this(p_393950_, p_392837_, p_394590_, p_391379_, p_391947_, p_396659_, false); + protected GlTexture(int p_394590_, String p_393950_, TextureFormat p_392837_, int p_391379_, int p_391947_, int p_396659_, int p_408255_, int p_408889_) { ++ this(p_394590_, p_393950_, p_392837_, p_391379_, p_391947_, p_396659_, p_408255_, p_408889_, false); + } + -+ protected GlTexture(String p_393950_, TextureFormat p_392837_, int p_394590_, int p_391379_, int p_391947_, int p_396659_, boolean stencil) { - super(p_393950_, p_392837_, p_394590_, p_391379_, p_391947_); - this.id = p_396659_; ++ protected GlTexture(int p_394590_, String p_393950_, TextureFormat p_392837_, int p_391379_, int p_391947_, int p_396659_, int p_408255_, int p_408889_, boolean stencil) { + super(p_394590_, p_393950_, p_392837_, p_391379_, p_391947_, p_396659_, p_408255_); + this.id = p_408889_; + this.stencilEnabled = stencil; } @Override -@@ -86,5 +_,15 @@ +@@ -93,6 +_,16 @@ public void setTextureFilter(FilterMode p_394977_, FilterMode p_397175_, boolean p_393558_) { super.setTextureFilter(p_394977_, p_397175_, p_393558_); this.modesDirty = true; @@ -29,4 +29,5 @@ + public boolean isStencilEnabled() { + return this.stencilEnabled; } - } + + @Override diff --git a/patches/minecraft/com/mojang/blaze3d/pipeline/RenderTarget.java.patch b/patches/minecraft/com/mojang/blaze3d/pipeline/RenderTarget.java.patch index b1caef68b0..0051e96798 100644 --- a/patches/minecraft/com/mojang/blaze3d/pipeline/RenderTarget.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/pipeline/RenderTarget.java.patch @@ -1,18 +1,18 @@ --- a/com/mojang/blaze3d/pipeline/RenderTarget.java +++ b/com/mojang/blaze3d/pipeline/RenderTarget.java -@@ -75,7 +_,7 @@ +@@ -92,7 +_,7 @@ this.width = p_83951_; this.height = p_83952_; if (this.useDepth) { -- this.depthTexture = RenderSystem.getDevice().createTexture(() -> this.label + " / Depth", TextureFormat.DEPTH32, p_83951_, p_83952_, 1); -+ this.depthTexture = RenderSystem.getDevice().createTexture(() -> this.label + " / Depth", TextureFormat.DEPTH32, p_83951_, p_83952_, 1, this.stencilEnabled); +- this.depthTexture = gpudevice.createTexture(() -> this.label + " / Depth", 15, TextureFormat.DEPTH32, p_83951_, p_83952_, 1, 1); ++ this.depthTexture = gpudevice.createTexture(() -> this.label + " / Depth", 15, TextureFormat.DEPTH32, p_83951_, p_83952_, 1, 1, this.stencilEnabled); + this.depthTextureView = gpudevice.createTextureView(this.depthTexture); this.depthTexture.setTextureFilter(FilterMode.NEAREST, false); this.depthTexture.setAddressMode(AddressMode.CLAMP_TO_EDGE); - } -@@ -134,5 +_,26 @@ +@@ -166,5 +_,26 @@ @Nullable - public GpuTexture getDepthTexture() { - return this.depthTexture; + public GpuTextureView getDepthTextureView() { + return this.depthTextureView; + } + + private boolean stencilEnabled = false; diff --git a/patches/minecraft/com/mojang/blaze3d/systems/GpuDevice.java.patch b/patches/minecraft/com/mojang/blaze3d/systems/GpuDevice.java.patch index 4883dc6739..3c8be4fd1f 100644 --- a/patches/minecraft/com/mojang/blaze3d/systems/GpuDevice.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/systems/GpuDevice.java.patch @@ -1,20 +1,20 @@ --- a/com/mojang/blaze3d/systems/GpuDevice.java +++ b/com/mojang/blaze3d/systems/GpuDevice.java -@@ -25,7 +_,17 @@ +@@ -26,7 +_,17 @@ + @Nullable Supplier p_394357_, int p_395623_, TextureFormat p_395807_, int p_395802_, int p_396157_, int p_408810_, int p_407070_ + ); - GpuTexture createTexture(@Nullable Supplier p_394357_, TextureFormat p_395807_, int p_395623_, int p_395802_, int p_396157_); - -+ /** Forge: same as {@link #createTexture(Supplier, TextureFormat, int, int, int)} but with stencil support */ -+ default GpuTexture createTexture(@Nullable Supplier p_394357_, TextureFormat p_395807_, int p_395623_, int p_395802_, int p_396157_, boolean stencil) { -+ return this.createTexture(p_394357_, p_395807_, p_395623_, p_395802_, p_396157_); ++ /** Forge: same as {@link #createTexture(Supplier, int, TextureFormat, int, int, int)} but with stencil support */ ++ default GpuTexture createTexture(@Nullable Supplier p_394357_, int p_395623_, TextureFormat p_395807_, int p_395802_, int p_396157_, int p_408810_, int p_407070_, boolean stencil) { ++ return this.createTexture(p_394357_, p_395623_, p_395807_, p_395802_, p_396157_, p_408810_, p_407070_); + } + - GpuTexture createTexture(@Nullable String p_391798_, TextureFormat p_393333_, int p_391800_, int p_395600_, int p_394065_); + GpuTexture createTexture(@Nullable String p_391798_, int p_391800_, TextureFormat p_393333_, int p_395600_, int p_394065_, int p_408732_, int p_407125_); + -+ /** Forge: same as {@link #createTexture(String, TextureFormat, int, int, int)} but with stencil support */ -+ default GpuTexture createTexture(@Nullable String p_391798_, TextureFormat p_393333_, int p_391800_, int p_395600_, int p_394065_, boolean stencil) { -+ return this.createTexture(p_391798_, p_393333_, p_391800_, p_395600_, p_394065_); ++ /** Forge: same as {@link #createTexture(String, int, TextureFormat, int, int, int)} but with stencil support */ ++ default GpuTexture createTexture(@Nullable String p_391798_, int p_391800_, TextureFormat p_393333_, int p_395600_, int p_394065_, int p_408732_, int p_407125_, boolean stencil) { ++ return this.createTexture(p_391798_, p_391800_, p_393333_, p_395600_, p_394065_, p_408732_, p_407125_); + } - GpuBuffer createBuffer(@Nullable Supplier p_395215_, BufferType p_392847_, BufferUsage p_391478_, int p_397054_); + GpuTextureView createTextureView(GpuTexture p_409045_); diff --git a/patches/minecraft/com/mojang/blaze3d/textures/GpuTexture.java.patch b/patches/minecraft/com/mojang/blaze3d/textures/GpuTexture.java.patch index caca67f0bf..5708d65b50 100644 --- a/patches/minecraft/com/mojang/blaze3d/textures/GpuTexture.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/textures/GpuTexture.java.patch @@ -6,6 +6,6 @@ @DontObfuscate -public abstract class GpuTexture implements AutoCloseable { +public abstract class GpuTexture implements AutoCloseable, net.minecraftforge.client.extensions.IForgeGpuTexture { - private final TextureFormat format; - private final int width; - private final int height; + public static final int USAGE_COPY_DST = 1; + public static final int USAGE_COPY_SRC = 2; + public static final int USAGE_TEXTURE_BINDING = 4; diff --git a/patches/minecraft/com/mojang/blaze3d/vertex/VertexConsumer.java.patch b/patches/minecraft/com/mojang/blaze3d/vertex/VertexConsumer.java.patch index bc4e67cede..0d80a4fe87 100644 --- a/patches/minecraft/com/mojang/blaze3d/vertex/VertexConsumer.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/vertex/VertexConsumer.java.patch @@ -1,6 +1,6 @@ --- a/com/mojang/blaze3d/vertex/VertexConsumer.java +++ b/com/mojang/blaze3d/vertex/VertexConsumer.java -@@ -13,7 +_,7 @@ +@@ -15,7 +_,7 @@ import org.lwjgl.system.MemoryStack; @OnlyIn(Dist.CLIENT) @@ -9,7 +9,7 @@ VertexConsumer addVertex(float p_344294_, float p_342213_, float p_344859_); VertexConsumer setColor(int p_342749_, int p_344324_, int p_343336_, int p_342831_); -@@ -133,9 +_,11 @@ +@@ -135,9 +_,11 @@ int j1 = ARGB.color(k, (int)f3, (int)f4, (int)f5); int k1 = LightTexture.lightCoordsWithEmission(p_331444_[i1], l); diff --git a/patches/minecraft/com/mojang/blaze3d/vertex/VertexFormat.java.patch b/patches/minecraft/com/mojang/blaze3d/vertex/VertexFormat.java.patch index a780e6721f..ad2bb4c1b3 100644 --- a/patches/minecraft/com/mojang/blaze3d/vertex/VertexFormat.java.patch +++ b/patches/minecraft/com/mojang/blaze3d/vertex/VertexFormat.java.patch @@ -1,6 +1,6 @@ --- a/com/mojang/blaze3d/vertex/VertexFormat.java +++ b/com/mojang/blaze3d/vertex/VertexFormat.java -@@ -20,7 +_,7 @@ +@@ -18,7 +_,7 @@ @OnlyIn(Dist.CLIENT) @DontObfuscate @@ -9,7 +9,7 @@ public static final int UNKNOWN_ELEMENT = -1; private final List elements; private final List names; -@@ -31,6 +_,7 @@ +@@ -29,6 +_,7 @@ private GpuBuffer immediateDrawVertexBuffer; @Nullable private GpuBuffer immediateDrawIndexBuffer; @@ -17,7 +17,7 @@ VertexFormat(List p_343616_, List p_345241_, IntList p_345522_, int p_344162_) { this.elements = p_343616_; -@@ -43,6 +_,11 @@ +@@ -41,6 +_,11 @@ int j = vertexformatelement != null ? p_343616_.indexOf(vertexformatelement) : -1; this.offsetsByElement[i] = j != -1 ? p_345522_.getInt(j) : -1; } @@ -29,7 +29,7 @@ } public static VertexFormat.Builder builder() { -@@ -146,6 +_,9 @@ +@@ -138,6 +_,9 @@ return this.immediateDrawIndexBuffer; } diff --git a/patches/minecraft/net/minecraft/SharedConstants.java.patch b/patches/minecraft/net/minecraft/SharedConstants.java.patch index 224810a1bc..1a3df787be 100644 --- a/patches/minecraft/net/minecraft/SharedConstants.java.patch +++ b/patches/minecraft/net/minecraft/SharedConstants.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/SharedConstants.java +++ b/net/minecraft/SharedConstants.java -@@ -171,6 +_,7 @@ +@@ -175,6 +_,7 @@ } static { diff --git a/patches/minecraft/net/minecraft/Util.java.patch b/patches/minecraft/net/minecraft/Util.java.patch index 677a3c434b..5fc137a640 100644 --- a/patches/minecraft/net/minecraft/Util.java.patch +++ b/patches/minecraft/net/minecraft/Util.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/Util.java +++ b/net/minecraft/Util.java @@ -268,7 +_,7 @@ - .getSchema(DataFixUtils.makeKey(SharedConstants.getCurrentVersion().getDataVersion().getVersion())) + .getSchema(DataFixUtils.makeKey(SharedConstants.getCurrentVersion().dataVersion().version())) .getChoiceType(p_137552_, p_137553_); } catch (IllegalArgumentException illegalargumentexception) { - LOGGER.error("No data fixer registered for {}", p_137553_); diff --git a/patches/minecraft/net/minecraft/advancements/AdvancementRewards.java.patch b/patches/minecraft/net/minecraft/advancements/AdvancementRewards.java.patch index 55fdf25a68..ace50cc35e 100644 --- a/patches/minecraft/net/minecraft/advancements/AdvancementRewards.java.patch +++ b/patches/minecraft/net/minecraft/advancements/AdvancementRewards.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/advancements/AdvancementRewards.java +++ b/net/minecraft/advancements/AdvancementRewards.java -@@ -40,6 +_,7 @@ - LootParams lootparams = new LootParams.Builder(p_9990_.serverLevel()) +@@ -43,6 +_,7 @@ + LootParams lootparams = new LootParams.Builder(serverlevel) .withParameter(LootContextParams.THIS_ENTITY, p_9990_) .withParameter(LootContextParams.ORIGIN, p_9990_.position()) + .withLuck(p_9990_.getLuck()) diff --git a/patches/minecraft/net/minecraft/client/Camera.java.patch b/patches/minecraft/net/minecraft/client/Camera.java.patch index 4ebd9f85f5..b6e7ca64a8 100644 --- a/patches/minecraft/net/minecraft/client/Camera.java.patch +++ b/patches/minecraft/net/minecraft/client/Camera.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/Camera.java +++ b/net/minecraft/client/Camera.java -@@ -118,9 +_,13 @@ +@@ -133,9 +_,13 @@ } protected void setRotation(float p_90573_, float p_90574_) { @@ -15,7 +15,7 @@ FORWARDS.rotate(this.rotation, this.forwards); UP.rotate(this.rotation, this.up); LEFT.rotate(this.rotation, this.left); -@@ -236,6 +_,13 @@ +@@ -251,6 +_,13 @@ public float getPartialTickTime() { return this.partialTickTime; @@ -28,4 +28,4 @@ + return this.level.getBlockState(this.blockPosition).getStateAtViewpoint(this.level, this.blockPosition, this.position); } - @OnlyIn(Dist.CLIENT) + @Override diff --git a/patches/minecraft/net/minecraft/client/KeyboardHandler.java.patch b/patches/minecraft/net/minecraft/client/KeyboardHandler.java.patch index 9d42ba236e..d1cfa7addd 100644 --- a/patches/minecraft/net/minecraft/client/KeyboardHandler.java.patch +++ b/patches/minecraft/net/minecraft/client/KeyboardHandler.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/KeyboardHandler.java +++ b/net/minecraft/client/KeyboardHandler.java -@@ -431,12 +_,12 @@ +@@ -440,12 +_,12 @@ if (screen != null) { try { if (p_90897_ != 1 && p_90897_ != 2) { @@ -15,7 +15,7 @@ return; } } -@@ -495,6 +_,7 @@ +@@ -504,6 +_,7 @@ } } } @@ -23,7 +23,7 @@ } } -@@ -504,10 +_,10 @@ +@@ -513,10 +_,10 @@ if (screen != null && this.minecraft.getOverlay() == null) { try { if (Character.isBmpCodePoint(p_90891_)) { diff --git a/patches/minecraft/net/minecraft/client/Minecraft.java.patch b/patches/minecraft/net/minecraft/client/Minecraft.java.patch index 037fbffe1b..14f54a5979 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.java.patch +++ b/patches/minecraft/net/minecraft/client/Minecraft.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/Minecraft.java +++ b/net/minecraft/client/Minecraft.java -@@ -248,7 +_,7 @@ +@@ -256,7 +_,7 @@ import org.slf4j.Logger; @OnlyIn(Dist.CLIENT) @@ -9,7 +9,7 @@ static Minecraft instance; private static final Logger LOGGER = LogUtils.getLogger(); public static final boolean ON_OSX = Util.getPlatform() == Util.OS.OSX; -@@ -426,7 +_,6 @@ +@@ -435,7 +_,6 @@ } }, Util.nonCriticalIoPool()); LOGGER.info("Setting user: {}", this.user.getName()); @@ -17,7 +17,7 @@ this.demo = p_91084_.game.demo; this.allowsMultiplayer = !p_91084_.game.disableMultiplayer; this.allowsChat = !p_91084_.game.disableChat; -@@ -478,10 +_,9 @@ +@@ -486,10 +_,9 @@ LOGGER.error("Couldn't set icon", (Throwable)ioexception); } @@ -29,7 +29,7 @@ RenderSystem.initRenderer( this.window.getWindow(), this.options.glDebugVerbosity, -@@ -492,6 +_,7 @@ +@@ -500,6 +_,7 @@ LOGGER.info("Using optional rendering extensions: {}", String.join(", ", RenderSystem.getDevice().getEnabledExtensions())); this.mainRenderTarget = new MainTarget(this.window.getWidth(), this.window.getHeight()); this.resourceManager = new ReloadableResourceManager(PackType.CLIENT_RESOURCES); @@ -37,7 +37,7 @@ this.resourcePackRepository.reload(); this.options.loadSelectedResourcePacks(this.resourcePackRepository); this.languageManager = new LanguageManager(this.options.languageCode, p_340763_ -> { -@@ -570,6 +_,7 @@ +@@ -578,6 +_,7 @@ this.blockEntityRenderDispatcher = new BlockEntityRenderDispatcher(this.font, this.modelManager.entityModels(), this.blockRenderer, this.itemModelResolver, this.itemRenderer, this.entityRenderDispatcher); this.resourceManager.registerReloadListener(this.blockEntityRenderDispatcher); this.particleEngine = new ParticleEngine(this.level, this.textureManager); @@ -45,7 +45,7 @@ this.resourceManager.registerReloadListener(this.particleEngine); this.paintingTextures = new PaintingTextureManager(this.textureManager); this.resourceManager.registerReloadListener(this.paintingTextures); -@@ -585,6 +_,9 @@ +@@ -593,6 +_,9 @@ this.resourceManager.registerReloadListener(this.gpuWarnlistManager); this.resourceManager.registerReloadListener(this.regionalCompliancies); this.gui = new Gui(this); @@ -55,7 +55,7 @@ this.debugRenderer = new DebugRenderer(this); RealmsClient realmsclient = RealmsClient.getOrCreate(this); this.realmsDataFetcher = new RealmsDataFetcher(realmsclient); -@@ -618,6 +_,7 @@ +@@ -626,6 +_,7 @@ } } @@ -63,7 +63,7 @@ this.window.updateVsync(this.options.enableVsync().get()); this.window.updateRawMouseInput(this.options.rawMouseInput().get()); this.window.setDefaultErrorCallback(); -@@ -639,16 +_,17 @@ +@@ -648,16 +_,17 @@ GameLoadTimesEvent.INSTANCE.beginStep(TelemetryProperty.LOAD_TIME_LOADING_OVERLAY_MS); Minecraft.GameLoadCookie minecraft$gameloadcookie = new Minecraft.GameLoadCookie(realmsclient, p_91084_.quickPlay); this.setOverlay( @@ -82,9 +82,9 @@ - ) + ).get() ); - this.quickPlayLog = QuickPlayLog.of(p_91084_.quickPlay.path()); + this.quickPlayLog = QuickPlayLog.of(p_91084_.quickPlay.logPath()); this.framerateLimitTracker = new FramerateLimitTracker(this.options, this); -@@ -746,6 +_,7 @@ +@@ -759,6 +_,7 @@ StringBuilder stringbuilder = new StringBuilder("Minecraft"); if (checkModStatus().shouldReportAsModified()) { stringbuilder.append("*"); @@ -92,7 +92,7 @@ } stringbuilder.append(" "); -@@ -769,6 +_,8 @@ +@@ -782,6 +_,8 @@ } private UserApiService createUserApiService(YggdrasilAuthenticationService p_193586_, GameConfig p_193587_) { @@ -101,7 +101,7 @@ return p_193587_.user.user.getType() != User.Type.MSA ? UserApiService.OFFLINE : p_193586_.createUserApiService(p_193587_.user.user.getAccessToken()); -@@ -779,7 +_,7 @@ +@@ -792,7 +_,7 @@ } private void rollbackResourcePacks(Throwable p_91240_, @Nullable Minecraft.GameLoadCookie p_299515_) { @@ -110,7 +110,7 @@ this.clearResourcePacksOnError(p_91240_, null, p_299515_); } else { Util.throwAsRuntime(p_91240_); -@@ -1065,12 +_,6 @@ +@@ -1078,12 +_,6 @@ LOGGER.error("setScreen called from non-game thread"); } @@ -123,7 +123,7 @@ if (p_91153_ == null && this.clientLevelTeardownInProgress) { throw new IllegalStateException("Trying to return to in-game GUI during disconnection"); } else { -@@ -1084,6 +_,23 @@ +@@ -1097,6 +_,23 @@ } } @@ -147,7 +147,7 @@ this.screen = p_91153_; if (this.screen != null) { this.screen.added(); -@@ -1168,6 +_,7 @@ +@@ -1180,6 +_,7 @@ FreeTypeUtil.destroy(); Util.shutdownExecutors(); RenderSystem.getDevice().close(); @@ -155,7 +155,7 @@ } catch (Throwable throwable) { LOGGER.error("Shutdown failure!", throwable); throw throwable; -@@ -1237,9 +_,11 @@ +@@ -1248,9 +_,11 @@ this.mouseHandler.handleAccumulatedMovement(); profilerfiller.pop(); if (!this.noRender) { @@ -167,7 +167,7 @@ } profilerfiller.push("blit"); -@@ -1363,10 +_,12 @@ +@@ -1379,10 +_,12 @@ this.window.setGuiScale(i); if (this.screen != null) { this.screen.resize(this, this.window.getGuiScaledWidth(), this.window.getGuiScaledHeight()); @@ -180,7 +180,7 @@ this.gameRenderer.resize(this.window.getWidth(), this.window.getHeight()); this.mouseHandler.setIgnoreFirstMove(); } -@@ -1504,6 +_,7 @@ +@@ -1520,6 +_,7 @@ } public void stop() { @@ -188,14 +188,14 @@ this.running = false; } -@@ -1532,10 +_,18 @@ +@@ -1547,10 +_,18 @@ if (p_91387_ && this.hitResult != null && this.hitResult.getType() == HitResult.Type.BLOCK) { BlockHitResult blockhitresult = (BlockHitResult)this.hitResult; BlockPos blockpos = blockhitresult.getBlockPos(); - if (!this.level.getBlockState(blockpos).isAir()) { + if (!this.level.isEmptyBlock(blockpos)) { -+ var inputEvent = net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(0, this.options.keyAttack, InteractionHand.MAIN_HAND); -+ if (inputEvent.isCanceled()) { ++ var inputEvent = new net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered(0, this.options.keyAttack, InteractionHand.MAIN_HAND); ++ if (net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered.BUS.post(inputEvent)) { + if (inputEvent.shouldSwingHand()) { + this.particleEngine.addBlockHitEffects(blockpos, blockhitresult); + this.player.swing(InteractionHand.MAIN_HAND); @@ -210,16 +210,16 @@ this.player.swing(InteractionHand.MAIN_HAND); } } -@@ -1563,6 +_,8 @@ +@@ -1578,6 +_,8 @@ return false; } else { boolean flag = false; -+ var inputEvent = net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(0, this.options.keyAttack, InteractionHand.MAIN_HAND); -+ if (!inputEvent.isCanceled()) ++ var inputEvent = new net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered(0, this.options.keyAttack, InteractionHand.MAIN_HAND); ++ if (!net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered.BUS.post(inputEvent)) switch (this.hitResult.getType()) { case ENTITY: this.gameMode.attack(this.player, ((EntityHitResult)this.hitResult).getEntity()); -@@ -1570,7 +_,7 @@ +@@ -1585,7 +_,7 @@ case BLOCK: BlockHitResult blockhitresult = (BlockHitResult)this.hitResult; BlockPos blockpos = blockhitresult.getBlockPos(); @@ -228,7 +228,7 @@ this.gameMode.startDestroyBlock(blockpos, blockhitresult.getDirection()); if (this.level.getBlockState(blockpos).isAir()) { flag = true; -@@ -1583,8 +_,10 @@ +@@ -1598,8 +_,10 @@ } this.player.resetAttackStrengthTicker(); @@ -239,12 +239,12 @@ this.player.swing(InteractionHand.MAIN_HAND); return flag; } -@@ -1600,6 +_,12 @@ +@@ -1615,6 +_,12 @@ } for (InteractionHand interactionhand : InteractionHand.values()) { -+ var inputEvent = net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(1, this.options.keyUse, interactionhand); -+ if (inputEvent.isCanceled()) { ++ var inputEvent = new net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered(1, this.options.keyUse, interactionhand); ++ if (net.minecraftforge.client.event.InputEvent.InteractionKeyMappingTriggered.BUS.post(inputEvent)) { + if (inputEvent.shouldSwingHand()) this.player.swing(interactionhand); + return; + } @@ -252,7 +252,7 @@ ItemStack itemstack = this.player.getItemInHand(interactionhand); if (!itemstack.isItemEnabled(this.level.enabledFeatures())) { return; -@@ -1620,7 +_,7 @@ +@@ -1635,7 +_,7 @@ } if (interactionresult instanceof InteractionResult.Success interactionresult$success2) { @@ -261,7 +261,7 @@ this.player.swing(interactionhand); } -@@ -1632,7 +_,7 @@ +@@ -1647,7 +_,7 @@ int i = itemstack.getCount(); InteractionResult interactionresult1 = this.gameMode.useItemOn(this.player, interactionhand, blockhitresult); if (interactionresult1 instanceof InteractionResult.Success interactionresult$success) { @@ -270,7 +270,7 @@ this.player.swing(interactionhand); if (!itemstack.isEmpty() && (itemstack.getCount() != i || this.player.hasInfiniteMaterials())) { this.gameRenderer.itemInHandRenderer.itemUsed(interactionhand); -@@ -1648,6 +_,9 @@ +@@ -1663,6 +_,9 @@ } } @@ -280,7 +280,7 @@ if (!itemstack.isEmpty() && this.gameMode.useItem(this.player, interactionhand) instanceof InteractionResult.Success interactionresult$success1) { if (interactionresult$success1.swingSource() == InteractionResult.SwingSource.CLIENT) { -@@ -1677,6 +_,8 @@ +@@ -1692,6 +_,8 @@ } ProfilerFiller profilerfiller = Profiler.get(); @@ -289,7 +289,7 @@ profilerfiller.push("gui"); this.chatListener.tick(); this.gui.tick(this.pause); -@@ -1766,6 +_,7 @@ +@@ -1778,6 +_,7 @@ this.tutorial.tick(); @@ -297,7 +297,7 @@ try { this.level.tick(() -> true); } catch (Throwable throwable1) { -@@ -1779,6 +_,7 @@ +@@ -1791,6 +_,7 @@ throw new ReportedException(crashreport1); } @@ -305,7 +305,7 @@ } profilerfiller.popPush("animateTick"); -@@ -1803,6 +_,7 @@ +@@ -1815,6 +_,7 @@ profilerfiller.popPush("keyboard"); this.keyboardHandler.tick(); profilerfiller.pop(); @@ -313,7 +313,7 @@ } private boolean isLevelRunningNormally() { -@@ -2003,6 +_,7 @@ +@@ -2031,6 +_,7 @@ } public void setLevel(ClientLevel p_91157_, ReceivingLevelScreen.Reason p_335893_) { @@ -321,7 +321,7 @@ this.updateScreenAndTick(new ReceivingLevelScreen(() -> false, p_335893_)); this.level = p_91157_; this.updateLevelInEngines(p_91157_); -@@ -2040,6 +_,7 @@ +@@ -2068,6 +_,7 @@ IntegratedServer integratedserver = this.singleplayerServer; this.singleplayerServer = null; this.gameRenderer.resetData(); @@ -329,7 +329,7 @@ this.gameMode = null; this.narrator.clear(); this.clientLevelTeardownInProgress = true; -@@ -2047,6 +_,7 @@ +@@ -2075,6 +_,7 @@ try { this.updateScreenAndTick(p_335030_); if (this.level != null) { @@ -337,7 +337,7 @@ if (integratedserver != null) { ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push("waitForServer"); -@@ -2060,6 +_,7 @@ +@@ -2088,6 +_,7 @@ this.gui.onDisconnected(); this.isLocalServer = false; @@ -345,11 +345,11 @@ } this.level = null; -@@ -2207,6 +_,7 @@ +@@ -2236,6 +_,7 @@ private void pickBlock() { if (this.hitResult != null && this.hitResult.getType() != HitResult.Type.MISS) { -+ if (net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInput(2, this.options.keyPickItem, InteractionHand.MAIN_HAND).isCanceled()) return; ++ if (net.minecraftforge.client.event.ForgeEventFactoryClient.onClickInputPickBlock(this.options.keyPickItem)) return; boolean flag = Screen.hasControlDown(); switch (this.hitResult) { case BlockHitResult blockhitresult: diff --git a/patches/minecraft/net/minecraft/client/Options.java.patch b/patches/minecraft/net/minecraft/client/Options.java.patch index 13383574e1..038f1fb07a 100644 --- a/patches/minecraft/net/minecraft/client/Options.java.patch +++ b/patches/minecraft/net/minecraft/client/Options.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/Options.java +++ b/net/minecraft/client/Options.java -@@ -668,7 +_,8 @@ +@@ -671,7 +_,8 @@ }, new OptionInstance.LazyEnum<>( () -> Stream.concat(Stream.of(""), Minecraft.getInstance().getSoundManager().getAvailableSoundDevices().stream()).toList(), @@ -10,15 +10,15 @@ ? Optional.empty() : Optional.of(p_232011_), Codec.STRING -@@ -683,6 +_,7 @@ - public boolean onboardAccessibility = true; +@@ -705,6 +_,7 @@ + ); public boolean syncWrites; public boolean startedCleanly = true; + private final Map unknownKeys = new java.util.HashMap<>(); public OptionInstance darkMojangStudiosBackground() { return this.darkMojangStudiosBackground; -@@ -1050,6 +_,7 @@ +@@ -1088,6 +_,7 @@ } public Options(Minecraft p_92138_, File p_92139_) { @@ -26,10 +26,10 @@ this.minecraft = p_92138_; this.optionsFile = new File(p_92139_, "options.txt"); boolean flag = Runtime.getRuntime().maxMemory() >= 1000000000L; -@@ -1181,15 +_,28 @@ - this.onboardAccessibility = p_168428_.process("onboardAccessibility", this.onboardAccessibility); - p_168428_.process("menuBackgroundBlurriness", this.menuBackgroundBlurriness); +@@ -1222,15 +_,28 @@ this.startedCleanly = p_168428_.process("startedCleanly", this.startedCleanly); + p_168428_.process("showNowPlayingToast", this.showNowPlayingToast); + p_168428_.process("musicFrequency", this.musicFrequency); + processOptionsKeysOnly(p_168428_); + processOptionsEnd(p_168428_); + } @@ -56,7 +56,7 @@ for (SoundSource soundsource : SoundSource.values()) { p_168428_.process("soundCategory_" + soundsource.getName(), this.soundSourceVolumes.get(soundsource)); } -@@ -1204,6 +_,10 @@ +@@ -1245,6 +_,10 @@ } public void load() { @@ -67,7 +67,7 @@ try { if (!this.optionsFile.exists()) { return; -@@ -1228,7 +_,8 @@ +@@ -1269,7 +_,8 @@ this.graphicsMode.set(isTrue(optional.get()) ? GraphicsStatus.FANCY : GraphicsStatus.FAST); } @@ -77,7 +77,7 @@ new Options.FieldAccess() { @Nullable private String getValue(String p_394210_) { -@@ -1310,6 +_,17 @@ +@@ -1350,6 +_,17 @@ ); compoundtag1.getString("fullscreenResolution").ifPresent(p_389133_ -> this.fullscreenVideoModeString = p_389133_); KeyMapping.resetMapping(); @@ -95,10 +95,10 @@ } catch (Exception exception) { LOGGER.error("Failed to load options", (Throwable)exception); } -@@ -1337,9 +_,11 @@ +@@ -1377,9 +_,11 @@ public void save() { try (final PrintWriter printwriter = new PrintWriter(new OutputStreamWriter(new FileOutputStream(this.optionsFile), StandardCharsets.UTF_8))) { - printwriter.println("version:" + SharedConstants.getCurrentVersion().getDataVersion().getVersion()); + printwriter.println("version:" + SharedConstants.getCurrentVersion().dataVersion().version()); + var seen = new java.util.HashSet(); this.processOptions( new Options.FieldAccess() { @@ -107,7 +107,7 @@ printwriter.print(p_168491_); printwriter.print(':'); } -@@ -1395,6 +_,12 @@ +@@ -1435,6 +_,12 @@ if (s != null) { printwriter.println("fullscreenResolution:" + s); } @@ -120,7 +120,7 @@ } catch (Exception exception) { LOGGER.error("Failed to save options", (Throwable)exception); } -@@ -1433,6 +_,7 @@ +@@ -1473,6 +_,7 @@ } public void broadcastOptions() { @@ -128,7 +128,7 @@ if (this.minecraft.player != null) { this.minecraft.player.connection.broadcastClientInformation(this.buildPlayerInformation()); } -@@ -1546,6 +_,23 @@ +@@ -1586,6 +_,23 @@ public static Component genericValueLabel(Component p_231901_, int p_231902_) { return genericValueLabel(p_231901_, Component.literal(Integer.toString(p_231902_))); diff --git a/patches/minecraft/net/minecraft/client/Screenshot.java.patch b/patches/minecraft/net/minecraft/client/Screenshot.java.patch index 3c58f917d7..cfe3460945 100644 --- a/patches/minecraft/net/minecraft/client/Screenshot.java.patch +++ b/patches/minecraft/net/minecraft/client/Screenshot.java.patch @@ -4,8 +4,8 @@ file2 = new File(file1, p_92297_); } -+ var event = net.minecraftforge.client.event.ForgeEventFactoryClient.onScreenshot(p_389141_, file2); -+ if (event.isCanceled()) { ++ var event = new net.minecraftforge.client.event.ScreenshotEvent(p_389141_, file2); ++ if (net.minecraftforge.client.event.ScreenshotEvent.BUS.post(event)) { + p_92301_.accept(event.getCancelMessage()); + return; + } diff --git a/patches/minecraft/net/minecraft/client/data/Main.java.patch b/patches/minecraft/net/minecraft/client/data/Main.java.patch index bcf0229d80..7c2c9e3a5a 100644 --- a/patches/minecraft/net/minecraft/client/data/Main.java.patch +++ b/patches/minecraft/net/minecraft/client/data/Main.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/data/Main.java +++ b/net/minecraft/client/data/Main.java -@@ -30,13 +_,18 @@ +@@ -31,13 +_,18 @@ OptionSpec optionspec1 = optionparser.accepts("client", "Include client generators"); OptionSpec optionspec2 = optionparser.accepts("all", "Include all generators"); OptionSpec optionspec3 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); diff --git a/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch b/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch index c9e9f4379a..a99474621b 100644 --- a/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch +++ b/patches/minecraft/net/minecraft/client/data/models/ItemModelGenerators.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/data/models/ItemModelGenerators.java +++ b/net/minecraft/client/data/models/ItemModelGenerators.java -@@ -852,6 +_,9 @@ +@@ -870,6 +_,9 @@ this.declareCustomModelItem(Items.COD); this.declareCustomModelItem(Items.FEATHER); this.declareCustomModelItem(Items.LEAD); diff --git a/patches/minecraft/net/minecraft/client/gui/Font.java.patch b/patches/minecraft/net/minecraft/client/gui/Font.java.patch index 6df7351abb..65dab5b929 100644 --- a/patches/minecraft/net/minecraft/client/gui/Font.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/Font.java.patch @@ -6,6 +6,6 @@ @OnlyIn(Dist.CLIENT) -public class Font { +public class Font implements net.minecraftforge.client.extensions.IForgeFont { - private static final float EFFECT_DEPTH = 0.01F; - public static final float SHADOW_DEPTH = 0.03F; - public static final int NO_SHADOW = 0; + private static final float EFFECT_DEPTH = 0.001F; + private static final float OVER_EFFECT_DEPTH = 0.001F; + private static final float UNDER_EFFECT_DEPTH = -0.001F; diff --git a/patches/minecraft/net/minecraft/client/gui/Gui.java.patch b/patches/minecraft/net/minecraft/client/gui/Gui.java.patch index f500066361..b2990bf74a 100644 --- a/patches/minecraft/net/minecraft/client/gui/Gui.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/Gui.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/Gui.java +++ b/net/minecraft/client/gui/Gui.java -@@ -148,7 +_,7 @@ +@@ -151,7 +_,7 @@ public float vignetteBrightness = 1.0F; private int toolHighlightTimer; private ItemStack lastToolHighlight = ItemStack.EMPTY; @@ -9,16 +9,16 @@ private final SubtitleOverlay subtitleOverlay; private final SpectatorGui spectatorGui; private final PlayerTabOverlay tabList; -@@ -347,7 +_,7 @@ - Window window = this.minecraft.getWindow(); +@@ -377,7 +_,7 @@ int i = Mth.floor(this.minecraft.mouseHandler.getScaledXPos(window)); int j = Mth.floor(this.minecraft.mouseHandler.getScaledYPos(window)); + p_329202_.nextStratum(); - this.chat.render(p_329202_, this.tickCount, i, j, false); + net.minecraftforge.client.ForgeHooksClient.onCustomizeChatEvent(p_329202_, this.chat, window, i, j, this.tickCount); } } -@@ -445,6 +_,8 @@ +@@ -472,6 +_,8 @@ for (MobEffectInstance mobeffectinstance : Ordering.natural().reverse().sortedCopy(collection)) { Holder holder = mobeffectinstance.getEffect(); @@ -27,15 +27,15 @@ if (mobeffectinstance.showIcon()) { int k = p_282812_.guiWidth(); int l = 1; -@@ -475,6 +_,7 @@ +@@ -502,6 +_,7 @@ } } + if (renderer.renderGuiIcon(mobeffectinstance, this, p_282812_, k, l, 0, f)) continue; - TextureAtlasSprite textureatlassprite = mobeffecttexturemanager.get(holder); - int l1 = k; - int k1 = l; -@@ -625,6 +_,10 @@ + p_282812_.blitSprite(RenderPipelines.GUI_TEXTURED, getMobEffectSprite(holder), k + 3, l + 3, 18, 18, ARGB.white(f)); + } + } +@@ -598,6 +_,10 @@ } private void renderSelectedItemName(GuiGraphics p_283501_) { @@ -46,7 +46,7 @@ Profiler.get().push("selectedItemName"); if (this.toolHighlightTimer > 0 && !this.lastToolHighlight.isEmpty()) { MutableComponent mutablecomponent = Component.empty().append(this.lastToolHighlight.getHoverName()).withStyle(this.lastToolHighlight.getRarity().color()); -@@ -632,9 +_,13 @@ +@@ -605,9 +_,13 @@ mutablecomponent.withStyle(ChatFormatting.ITALIC); } @@ -62,7 +62,7 @@ if (!this.minecraft.gameMode.canHurtPlayer()) { k += 14; } -@@ -645,7 +_,7 @@ +@@ -618,7 +_,7 @@ } if (l > 0) { @@ -71,7 +71,7 @@ } } -@@ -1154,7 +_,7 @@ +@@ -1148,7 +_,7 @@ ItemStack itemstack = this.minecraft.player.getInventory().getSelectedItem(); if (itemstack.isEmpty()) { this.toolHighlightTimer = 0; diff --git a/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch b/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch index 9b076126b1..0935af9335 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/GuiGraphics.java.patch @@ -1,160 +1,129 @@ --- a/net/minecraft/client/gui/GuiGraphics.java +++ b/net/minecraft/client/gui/GuiGraphics.java -@@ -52,7 +_,7 @@ - import org.joml.Vector2ic; +@@ -72,7 +_,7 @@ + import org.joml.Vector3f; @OnlyIn(Dist.CLIENT) -public class GuiGraphics { +public class GuiGraphics implements net.minecraftforge.client.extensions.IForgeGuiGraphics { - public static final float MAX_GUI_Z = 10000.0F; - public static final float MIN_GUI_Z = -10000.0F; private static final int EXTRA_SPACE_AFTER_FIRST_TOOLTIP_LINE = 2; -@@ -229,6 +_,11 @@ - } - - public int drawString(Font p_283343_, @Nullable String p_281896_, int p_283569_, int p_283418_, int p_281560_, boolean p_282130_) { -+ return this.drawString(p_283343_, p_281896_, (float)p_283569_, (float)p_283418_, p_281560_, p_282130_); -+ } -+ -+ // Forge: Add float variant for x,y coordinates -+ public int drawString(Font p_283343_, @Nullable String p_281896_, float p_283569_, float p_283418_, int p_281560_, boolean p_282130_) { - return p_281896_ == null - ? 0 - : p_283343_.drawInBatch( -@@ -250,6 +_,11 @@ - } - - public int drawString(Font p_282636_, FormattedCharSequence p_281596_, int p_281586_, int p_282816_, int p_281743_, boolean p_282394_) { -+ return this.drawString(p_282636_, p_281596_, (float)p_281586_, (float)p_282816_, p_281743_, p_282394_); -+ } -+ -+ // Forge: Add float variant for x,y coordinates -+ public int drawString(Font p_282636_, FormattedCharSequence p_281596_, float p_281586_, float p_282816_, int p_281743_, boolean p_282394_) { - return p_282636_.drawInBatch( - p_281596_, p_281586_, p_282816_, p_281743_, p_282394_, this.pose.last().pose(), this.bufferSource, Font.DisplayMode.NORMAL, 0, 15728880 - ); -@@ -850,6 +_,7 @@ + private final Minecraft minecraft; + private final Matrix3x2fStack pose; +@@ -870,6 +_,7 @@ CrashReport crashreport = CrashReport.forThrowable(throwable, "Rendering item"); CrashReportCategory crashreportcategory = crashreport.addCategory("Item being rendered"); - crashreportcategory.setDetail("Item Type", () -> String.valueOf(p_281675_.getItem())); -+ crashreportcategory.setDetail("Registry Name", () -> String.valueOf(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(p_281675_.getItem()))); - crashreportcategory.setDetail("Item Components", () -> String.valueOf(p_281675_.getComponents())); - crashreportcategory.setDetail("Item Foil", () -> String.valueOf(p_281675_.hasFoil())); + crashreportcategory.setDetail("Item Type", () -> String.valueOf(p_283653_.getItem())); ++ crashreportcategory.setDetail("Registry Name", () -> String.valueOf(net.minecraftforge.registries.ForgeRegistries.ITEMS.getKey(p_283653_.getItem()))); + crashreportcategory.setDetail("Item Components", () -> String.valueOf(p_283653_.getComponents())); + crashreportcategory.setDetail("Item Foil", () -> String.valueOf(p_283653_.hasFoil())); throw new ReportedException(crashreport); -@@ -870,13 +_,24 @@ - this.renderItemCount(p_282005_, p_283349_, p_282641_, p_282146_, p_282803_); +@@ -888,6 +_,7 @@ this.renderItemCooldown(p_283349_, p_282641_, p_282146_); - this.pose.popPose(); + this.renderItemCount(p_282005_, p_283349_, p_282641_, p_282146_, p_282803_); + this.pose.popMatrix(); + net.minecraftforge.client.ItemDecoratorHandler.of(p_283349_).render(this, p_282005_, p_283349_, p_282641_, p_282146_); } } -+ -+ private ItemStack tooltipStack = ItemStack.EMPTY; - public void renderTooltip(Font p_282308_, ItemStack p_282781_, int p_282687_, int p_282292_) { -+ this.tooltipStack = p_282781_; - this.renderTooltip( - p_282308_, Screen.getTooltipFromItem(this.minecraft, p_282781_), p_282781_.getTooltipImage(), p_282687_, p_282292_, p_282781_.get(DataComponents.TOOLTIP_STYLE) +@@ -899,21 +_,30 @@ + this.setTooltipForNextFrame(this.minecraft.font, p_407686_, DefaultTooltipPositioner.INSTANCE, p_410475_, p_407139_, false); + } + ++ private ItemStack tooltipStack = ItemStack.EMPTY; ++ + public void setTooltipForNextFrame(Font p_408152_, ItemStack p_410145_, int p_410585_, int p_408354_) { ++ this.tooltipStack = p_410145_; + this.setTooltipForNextFrame( + p_408152_, Screen.getTooltipFromItem(this.minecraft, p_410145_), p_410145_.getTooltipImage(), p_410585_, p_408354_, p_410145_.get(DataComponents.TOOLTIP_STYLE) ); + this.tooltipStack = ItemStack.EMPTY; + } + + public void setTooltipForNextFrame(Font p_407170_, List p_407123_, Optional p_409349_, int p_406573_, int p_409911_) { + this.setTooltipForNextFrame(p_407170_, p_407123_, p_409349_, p_406573_, p_409911_, null); + } + ++ public void setTooltipForNextFrame(Font font, List textComponents, Optional tooltipComponent, ItemStack stack, int mouseX, int mouseY) { ++ this.tooltipStack = stack; ++ this.setTooltipForNextFrame(font, textComponents, tooltipComponent, mouseX, mouseY, stack.get(DataComponents.TOOLTIP_STYLE)); ++ this.tooltipStack = ItemStack.EMPTY; + } + -+ public void renderTooltip(Font font, List textComponents, Optional tooltipComponent, ItemStack stack, int mouseX, int mouseY) { -+ this.tooltipStack = stack; -+ this.renderTooltip(font, textComponents, tooltipComponent, mouseX, mouseY, stack.get(DataComponents.TOOLTIP_STYLE)); -+ this.tooltipStack = ItemStack.EMPTY; - } - - public void renderTooltip(Font p_283128_, List p_282716_, Optional p_281682_, int p_283678_, int p_281696_) { -@@ -886,8 +_,7 @@ - public void renderTooltip( - Font p_362491_, List p_368544_, Optional p_362815_, int p_366300_, int p_368952_, @Nullable ResourceLocation p_368469_ + public void setTooltipForNextFrame( + Font p_407847_, List p_408847_, Optional p_410489_, int p_409369_, int p_407472_, @Nullable ResourceLocation p_410303_ ) { -- List list = p_368544_.stream().map(Component::getVisualOrderText).map(ClientTooltipComponent::create).collect(Util.toMutableList()); -- p_362815_.ifPresent(p_325321_ -> list.add(list.isEmpty() ? 0 : 1, ClientTooltipComponent.create(p_325321_))); -+ List list = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_368544_, p_362815_, p_366300_, guiWidth(), guiHeight(), p_362491_); - this.renderTooltipInternal(p_362491_, list, p_366300_, p_368952_, DefaultTooltipPositioner.INSTANCE, p_368469_); +- List list = p_408847_.stream().map(Component::getVisualOrderText).map(ClientTooltipComponent::create).collect(Util.toMutableList()); +- p_410489_.ifPresent(p_325321_ -> list.add(list.isEmpty() ? 0 : 1, ClientTooltipComponent.create(p_325321_))); ++ List list = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_408847_, p_410489_, p_409369_, guiWidth(), guiHeight(), p_407847_); + this.setTooltipForNextFrameInternal(p_407847_, list, p_409369_, p_407472_, DefaultTooltipPositioner.INSTANCE, p_410303_, false); } -@@ -900,7 +_,22 @@ +@@ -926,7 +_,22 @@ } - public void renderComponentTooltip(Font p_282739_, List p_281832_, int p_282191_, int p_282446_) { -- this.renderComponentTooltip(p_282739_, p_281832_, p_282191_, p_282446_, null); -+ List components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_281832_, p_282191_, guiWidth(), guiHeight(), p_282739_); -+ this.renderTooltipInternal(p_282739_, components, p_282191_, p_282446_, DefaultTooltipPositioner.INSTANCE, null); + public void setComponentTooltipForNextFrame(Font p_406239_, List p_410275_, int p_410594_, int p_409343_) { +- this.setComponentTooltipForNextFrame(p_406239_, p_410275_, p_410594_, p_409343_, null); ++ List components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(this.tooltipStack, p_410275_, p_410594_, guiWidth(), guiHeight(), p_406239_); ++ this.setTooltipForNextFrameInternal(p_406239_, components, p_410594_, p_409343_, DefaultTooltipPositioner.INSTANCE, null, false); + } + + public void renderComponentTooltip(Font font, List tooltips, int mouseX, int mouseY, ItemStack stack) { + this.tooltipStack = stack; + List components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponents(stack, tooltips, mouseX, guiWidth(), guiHeight(), font); -+ this.renderTooltipInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null); ++ this.setTooltipForNextFrameInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null, false); + this.tooltipStack = ItemStack.EMPTY; + } + + public void renderComponentTooltipFromElements(Font font, List> elements, int mouseX, int mouseY, ItemStack stack) { + this.tooltipStack = stack; + List components = net.minecraftforge.client.ForgeHooksClient.gatherTooltipComponentsFromElements(stack, elements, mouseX, guiWidth(), guiHeight(), font); -+ this.renderTooltipInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null); ++ this.setTooltipForNextFrameInternal(font, components, mouseX, mouseY, DefaultTooltipPositioner.INSTANCE, null, false); + this.tooltipStack = ItemStack.EMPTY; } - public void renderComponentTooltip(Font p_369090_, List p_365405_, int p_368143_, int p_366244_, @Nullable ResourceLocation p_364763_) { -@@ -942,11 +_,13 @@ - @Nullable ResourceLocation p_368234_ + public void setComponentTooltipForNextFrame(Font p_408650_, List p_407512_, int p_406019_, int p_408123_, @Nullable ResourceLocation p_409993_) { +@@ -989,11 +_,13 @@ + ClientTooltipPositioner p_409451_, + @Nullable ResourceLocation p_409298_ ) { - if (!p_282615_.isEmpty()) { -+ var preEvent = net.minecraftforge.client.ForgeHooksClient.onRenderTooltipPre(this.tooltipStack, this, p_283230_, p_283417_, guiWidth(), guiHeight(), p_282615_, p_282675_, p_282442_); -+ if (preEvent.isCanceled()) return; - int i = 0; - int j = p_282615_.size() == 1 ? -2 : 0; ++ var preEvent = net.minecraftforge.client.ForgeHooksClient.onRenderTooltipPre(this.tooltipStack, this, p_283678_, p_281696_, guiWidth(), guiHeight(), p_282716_, p_283128_, p_409451_); ++ if (preEvent == null) return; + int i = 0; + int j = p_282716_.size() == 1 ? -2 : 0; - for (ClientTooltipComponent clienttooltipcomponent : p_282615_) { -- int k = clienttooltipcomponent.getWidth(p_282675_); -+ int k = clienttooltipcomponent.getWidth(preEvent.getFont()); - if (k > i) { - i = k; - } -@@ -956,18 +_,19 @@ - - int i2 = i; - int j2 = j; -- Vector2ic vector2ic = p_282442_.positionTooltip(this.guiWidth(), this.guiHeight(), p_283230_, p_283417_, i, j); -+ Vector2ic vector2ic = p_282442_.positionTooltip(this.guiWidth(), this.guiHeight(), preEvent.getX(), preEvent.getY(), i2, j2); - int l = vector2ic.x(); - int i1 = vector2ic.y(); - this.pose.pushPose(); - int j1 = 400; -- TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, 400, p_368234_); -+ var background_event = net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderTooltipBackground(this.tooltipStack, this, l, i1, preEvent.getFont(), p_282615_, p_368234_); -+ TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, 400, background_event.getBackground()); - this.pose.translate(0.0F, 0.0F, 400.0F); - int k1 = i1; - - for (int l1 = 0; l1 < p_282615_.size(); l1++) { - ClientTooltipComponent clienttooltipcomponent1 = p_282615_.get(l1); -- clienttooltipcomponent1.renderText(p_282675_, l, k1, this.pose.last().pose(), this.bufferSource); -+ clienttooltipcomponent1.renderText(preEvent.getFont(), l, k1, this.pose.last().pose(), this.bufferSource); - k1 += clienttooltipcomponent1.getHeight(p_282675_) + (l1 == 0 ? 2 : 0); + for (ClientTooltipComponent clienttooltipcomponent : p_282716_) { +- int k = clienttooltipcomponent.getWidth(p_283128_); ++ int k = clienttooltipcomponent.getWidth(preEvent.getFont()); + if (k > i) { + i = k; } +@@ -1003,16 +_,17 @@ -@@ -975,7 +_,7 @@ + int l1 = i; + int i2 = j; +- Vector2ic vector2ic = p_409451_.positionTooltip(this.guiWidth(), this.guiHeight(), p_283678_, p_281696_, i, j); ++ Vector2ic vector2ic = p_409451_.positionTooltip(this.guiWidth(), this.guiHeight(), preEvent.getX(), preEvent.getY(), i, j); + int l = vector2ic.x(); + int i1 = vector2ic.y(); + this.pose.pushMatrix(); +- TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, p_409298_); ++ var background_event = net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderTooltipBackground(this.tooltipStack, this, l, i1, preEvent.getFont(), p_282716_, p_409298_); ++ TooltipRenderUtil.renderTooltipBackground(this, l, i1, i, j, background_event.getBackground()); + int j1 = i1; - for (int k2 = 0; k2 < p_282615_.size(); k2++) { - ClientTooltipComponent clienttooltipcomponent2 = p_282615_.get(k2); -- clienttooltipcomponent2.renderImage(p_282675_, l, k1, i2, j2, this); -+ clienttooltipcomponent2.renderImage(preEvent.getFont(), l, k1, i2, j2, this); - k1 += clienttooltipcomponent2.getHeight(p_282675_) + (k2 == 0 ? 2 : 0); - } - -@@ -1030,6 +_,10 @@ - default: - } + for (int k1 = 0; k1 < p_282716_.size(); k1++) { + ClientTooltipComponent clienttooltipcomponent1 = p_282716_.get(k1); +- clienttooltipcomponent1.renderText(this, p_283128_, l, j1); ++ clienttooltipcomponent1.renderText(this, preEvent.getFont(), l, j1); + j1 += clienttooltipcomponent1.getHeight(p_283128_) + (k1 == 0 ? 2 : 0); + } + +@@ -1020,7 +_,7 @@ + + for (int j2 = 0; j2 < p_282716_.size(); j2++) { + ClientTooltipComponent clienttooltipcomponent2 = p_282716_.get(j2); +- clienttooltipcomponent2.renderImage(p_283128_, l, j1, l1, i2, this); ++ clienttooltipcomponent2.renderImage(preEvent.getFont(), l, j1, l1, i2, this); + j1 += clienttooltipcomponent2.getHeight(p_283128_) + (j2 == 0 ? 2 : 0); } -+ } -+ -+ public MultiBufferSource.BufferSource getBufferSource() { -+ return this.bufferSource; - } - public void drawSpecial(Consumer p_367429_) { diff --git a/patches/minecraft/net/minecraft/client/gui/components/AbstractButton.java.patch b/patches/minecraft/net/minecraft/client/gui/components/AbstractButton.java.patch index 56d0a21b54..1a2a95782b 100644 --- a/patches/minecraft/net/minecraft/client/gui/components/AbstractButton.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/components/AbstractButton.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/client/gui/components/AbstractButton.java +++ b/net/minecraft/client/gui/components/AbstractButton.java -@@ -39,7 +_,7 @@ +@@ -38,7 +_,7 @@ this.getHeight(), ARGB.white(this.alpha) ); -- int i = this.active ? 16777215 : 10526880; +- int i = ARGB.color(this.alpha, this.active ? -1 : -6250336); + int i = getFGColor(); - this.renderString(p_281670_, minecraft.font, i | Mth.ceil(this.alpha * 255.0F) << 24); + this.renderString(p_281670_, minecraft.font, i); } diff --git a/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch b/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch index d64f8cacdc..25ed7fdd42 100644 --- a/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/components/AbstractWidget.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/components/AbstractWidget.java +++ b/net/minecraft/client/gui/components/AbstractWidget.java -@@ -250,6 +_,25 @@ +@@ -236,6 +_,25 @@ this.focused = p_93693_; } @@ -11,7 +11,7 @@ + + public int getFGColor() { + if (packedFGColor != UNSET_FG_COLOR) return packedFGColor; -+ return this.active ? 16777215 : 10526880; // White : Light Grey ++ return net.minecraft.util.ARGB.color(this.alpha, this.active ? -1 : -6250336); // White : Light Grey + } + + public void setFGColor(int color) { diff --git a/patches/minecraft/net/minecraft/client/gui/components/BossHealthOverlay.java.patch b/patches/minecraft/net/minecraft/client/gui/components/BossHealthOverlay.java.patch index 94a2ced220..7b7dd0003d 100644 --- a/patches/minecraft/net/minecraft/client/gui/components/BossHealthOverlay.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/components/BossHealthOverlay.java.patch @@ -1,17 +1,17 @@ --- a/net/minecraft/client/gui/components/BossHealthOverlay.java +++ b/net/minecraft/client/gui/components/BossHealthOverlay.java -@@ -66,13 +_,16 @@ +@@ -67,13 +_,16 @@ for (LerpingBossEvent lerpingbossevent : this.events.values()) { int k = i / 2 - 91; + var event = net.minecraftforge.client.ForgeHooksClient.onCustomizeBossEventProgress(p_283175_, this.minecraft.getWindow(), lerpingbossevent, k, j, 10 + this.minecraft.font.lineHeight); -+ if (!event.isCanceled()) { ++ if (event != null) { this.drawBar(p_283175_, k, j, lerpingbossevent); Component component = lerpingbossevent.getName(); int l = this.minecraft.font.width(component); int i1 = i / 2 - l / 2; int j1 = j - 9; - p_283175_.drawString(this.minecraft.font, component, i1, j1, 16777215); + p_283175_.drawString(this.minecraft.font, component, i1, j1, -1); - j += 10 + 9; + } + j += event.getIncrement(); diff --git a/patches/minecraft/net/minecraft/client/gui/components/DebugScreenOverlay.java.patch b/patches/minecraft/net/minecraft/client/gui/components/DebugScreenOverlay.java.patch index d61101a232..b93cc32e5e 100644 --- a/patches/minecraft/net/minecraft/client/gui/components/DebugScreenOverlay.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/components/DebugScreenOverlay.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/components/DebugScreenOverlay.java +++ b/net/minecraft/client/gui/components/DebugScreenOverlay.java -@@ -134,9 +_,9 @@ +@@ -139,9 +_,9 @@ @Nullable private CompletableFuture serverChunk; private boolean renderDebug; @@ -13,7 +13,7 @@ private final LocalSampleLogger frameTimeLogger = new LocalSampleLogger(1); private final LocalSampleLogger tickTimeLogger = new LocalSampleLogger(TpsDebugDimensions.values().length); private final LocalSampleLogger pingLogger = new LocalSampleLogger(1); -@@ -179,14 +_,18 @@ +@@ -183,15 +_,19 @@ this.clientChunk = null; } @@ -29,13 +29,14 @@ + protected void drawText(ProfilerFiller profilerfiller, GuiGraphics p_281427_) { this.drawGameInformation(p_281427_); this.drawSystemInformation(p_281427_); + p_281427_.nextStratum(); + } + + protected void drawFPSCharts(ProfilerFiller profilerfiller, GuiGraphics p_281427_) { this.profilerPieChart.setBottomOffset(10); if (this.renderFpsCharts) { int i = p_281427_.guiWidth(); -@@ -199,7 +_,9 @@ +@@ -204,7 +_,9 @@ this.profilerPieChart.setBottomOffset(this.tpsChart.getFullHeight()); } @@ -45,7 +46,7 @@ if (this.renderNetworkCharts) { int l = p_281427_.guiWidth(); int i1 = l / 2; -@@ -215,12 +_,22 @@ +@@ -220,12 +_,22 @@ try (Zone zone = profilerfiller.zone("profilerPie")) { this.profilerPieChart.render(p_281427_); } @@ -70,7 +71,7 @@ list.add(""); boolean flag = this.minecraft.getSingleplayerServer() != null; list.add( -@@ -234,11 +_,18 @@ +@@ -239,11 +_,18 @@ + (this.renderNetworkCharts ? " visible" : " hidden") ); list.add("For help: press F3 + Q"); @@ -90,7 +91,7 @@ this.renderLines(p_281261_, list, false); } -@@ -592,6 +_,7 @@ +@@ -597,6 +_,7 @@ list.add(""); list.add(ChatFormatting.UNDERLINE + "Targeted Entity"); list.add(String.valueOf(BuiltInRegistries.ENTITY_TYPE.getKey(entity.getType()))); diff --git a/patches/minecraft/net/minecraft/client/gui/components/toasts/ToastManager.java.patch b/patches/minecraft/net/minecraft/client/gui/components/toasts/ToastManager.java.patch index e657afdccf..5cb30bc409 100644 --- a/patches/minecraft/net/minecraft/client/gui/components/toasts/ToastManager.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/components/toasts/ToastManager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/components/toasts/ToastManager.java +++ b/net/minecraft/client/gui/components/toasts/ToastManager.java -@@ -127,6 +_,7 @@ +@@ -146,6 +_,7 @@ } public void addToast(Toast p_360768_) { diff --git a/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch index 13fd69243a..f0b053d095 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/LoadingOverlay.java.patch @@ -9,7 +9,7 @@ @Override public void render(GuiGraphics p_281839_, int p_282704_, int p_283650_, float p_283394_) { int i = p_281839_.guiWidth(); -@@ -95,6 +_,7 @@ +@@ -97,6 +_,7 @@ f2 = 1.0F; } @@ -17,7 +17,7 @@ int l2 = (int)(p_281839_.guiWidth() * 0.5); int i1 = (int)(p_281839_.guiHeight() * 0.5); double d0 = Math.min(p_281839_.guiWidth() * 0.75, (double)p_281839_.guiHeight()) * 0.25; -@@ -110,12 +_,14 @@ +@@ -112,12 +_,14 @@ if (f < 1.0F) { this.drawProgressBar(p_281839_, i / 2 - k1, i2 - 5, i / 2 + k1, i2 + 5, 1.0F - Mth.clamp(f, 0.0F, 1.0F)); } @@ -32,7 +32,7 @@ try { this.reload.checkExceptions(); this.onFinish.accept(Optional.empty()); -@@ -123,7 +_,6 @@ +@@ -125,7 +_,6 @@ this.onFinish.accept(Optional.of(throwable)); } diff --git a/patches/minecraft/net/minecraft/client/gui/screens/PauseScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/PauseScreen.java.patch index 84f93468af..85d8c4b622 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/PauseScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/PauseScreen.java.patch @@ -1,10 +1,10 @@ --- a/net/minecraft/client/gui/screens/PauseScreen.java +++ b/net/minecraft/client/gui/screens/PauseScreen.java -@@ -95,6 +_,7 @@ +@@ -105,6 +_,7 @@ } else { gridlayout$rowhelper.addChild(this.openScreenButton(PLAYER_REPORTING, () -> new SocialInteractionsScreen(this))); } + gridlayout$rowhelper.addChild(Button.builder(Component.translatable("fml.menu.mods"), button -> this.minecraft.setScreen(new net.minecraftforge.client.gui.ModListScreen(this))).width(BUTTON_WIDTH_FULL).build(), 2); - Component component = this.minecraft.isLocalServer() ? RETURN_TO_MENU : CommonComponents.GUI_DISCONNECT; - this.disconnectButton = gridlayout$rowhelper.addChild(Button.builder(component, p_280815_ -> { + this.disconnectButton = gridlayout$rowhelper.addChild(Button.builder(CommonComponents.disconnectButtonLabel(this.minecraft.isLocalServer()), p_280815_ -> { + p_280815_.active = false; diff --git a/patches/minecraft/net/minecraft/client/gui/screens/Screen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/Screen.java.patch index e2b65e56e0..c5f5674379 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/Screen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/Screen.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/screens/Screen.java +++ b/net/minecraft/client/gui/screens/Screen.java -@@ -197,7 +_,7 @@ +@@ -191,7 +_,7 @@ } public void onClose() { @@ -9,37 +9,37 @@ } protected T addRenderableWidget(T p_169406_) { -@@ -311,8 +_,10 @@ +@@ -339,8 +_,10 @@ this.width = p_96608_; this.height = p_96609_; if (!this.initialized) { -+ if (!net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget))) ++ if (!net.minecraftforge.client.event.ScreenEvent.Init.Pre.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget))) this.init(); this.setInitialFocus(); -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget)); ++ net.minecraftforge.client.event.ScreenEvent.Init.Post.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget)); } else { this.repositionElements(); } -@@ -325,8 +_,10 @@ +@@ -353,8 +_,10 @@ protected void rebuildWidgets() { this.clearWidgets(); this.clearFocus(); -+ if (!net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget))) ++ if (!net.minecraftforge.client.event.ScreenEvent.Init.Pre.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Pre(this, this.children, this::addEventWidget, this::removeWidget))) this.init(); this.setInitialFocus(); -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget)); ++ net.minecraftforge.client.event.ScreenEvent.Init.Post.BUS.post(new net.minecraftforge.client.event.ScreenEvent.Init.Post(this, this.children, this::addEventWidget, this::removeWidget)); } - @Override -@@ -353,6 +_,7 @@ + protected void fadeWidgets(float p_409453_) { +@@ -389,6 +_,7 @@ - this.renderBlurredBackground(); + this.renderBlurredBackground(p_283688_); this.renderMenuBackground(p_283688_); + net.minecraftforge.client.event.ForgeEventFactoryClient.onRenderScreenBackground(this, p_283688_); } - protected void renderBlurredBackground() { -@@ -453,6 +_,19 @@ + protected void renderBlurredBackground(GuiGraphics p_407253_) { +@@ -492,6 +_,19 @@ } public void onFilesDrop(List p_96591_) { diff --git a/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch index 9cf64b4266..f7d61b141b 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/TitleScreen.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/screens/TitleScreen.java +++ b/net/minecraft/client/gui/screens/TitleScreen.java -@@ -58,6 +_,7 @@ +@@ -54,6 +_,7 @@ private boolean fading; private long fadeInStart; private final LogoRenderer logoRenderer; @@ -8,7 +8,7 @@ public TitleScreen() { this(false); -@@ -111,11 +_,15 @@ +@@ -106,11 +_,15 @@ int j = this.width - i - 2; int k = 24; int l = this.height / 4 + 48; @@ -24,7 +24,7 @@ l = this.createTestWorldButton(l, 24); SpriteIconButton spriteiconbutton = this.addRenderableWidget( -@@ -180,7 +_,7 @@ +@@ -175,7 +_,7 @@ }).bounds(this.width / 2 - 100, i = p_96764_ + p_96765_, 200, 20).tooltip(tooltip).build()).active = flag; this.addRenderableWidget( Button.builder(Component.translatable("menu.online"), p_325369_ -> this.minecraft.setScreen(new RealmsMainScreen(this))) @@ -33,22 +33,22 @@ .tooltip(tooltip) .build() ) -@@ -304,10 +_,18 @@ - s = s + I18n.get("menu.modded"); - } +@@ -295,9 +_,18 @@ + s = s + I18n.get("menu.modded"); + } -- p_282860_.drawString(this.font, s, 2, this.height - 10, 16777215 | i); -+ net.minecraftforge.internal.BrandingControl.forEachLine(true, true, (brd, brdline) -> -+ p_282860_.drawString(this.font, brd, 2, this.height - ( 10 + brdline * (this.font.lineHeight + 1)), 16777215 | i) -+ ); +- p_282860_.drawString(this.font, s, 2, this.height - 10, ARGB.color(f, -1)); ++ final float f_f = f; ++ net.minecraftforge.internal.BrandingControl.forEachLine(true, true, (brd, brdline) -> ++ p_282860_.drawString(this.font, brd, 2, this.height - ( 10 + brdline * (this.font.lineHeight + 1)), ARGB.color(f_f, -1)) ++ ); + -+ net.minecraftforge.internal.BrandingControl.forEachAboveCopyrightLine((brd, brdline) -> -+ p_282860_.drawString(this.font, brd, this.width - font.width(brd), this.height - (10 + (brdline + 1) * ( this.font.lineHeight + 1)), 16777215 | i) -+ ); ++ net.minecraftforge.internal.BrandingControl.forEachAboveCopyrightLine((brd, brdline) -> ++ p_282860_.drawString(this.font, brd, this.width - font.width(brd), this.height - (10 + (brdline + 1) * ( this.font.lineHeight + 1)), ARGB.color(f_f, -1)) ++ ); + - if (this.realmsNotificationsEnabled() && f >= 1.0F) { - this.realmsNotificationsScreen.render(p_282860_, p_281753_, p_283539_, p_282628_); - } + if (this.realmsNotificationsEnabled() && f >= 1.0F) { + this.realmsNotificationsScreen.render(p_282860_, p_281753_, p_283539_, p_282628_); + if (f >= 1.0f) this.modUpdateNotification.render(p_282860_, p_281753_, p_283539_, p_282628_); } } diff --git a/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementTab.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementTab.java.patch index 50a625950f..4c47f4391e 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementTab.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementTab.java.patch @@ -24,7 +24,7 @@ public AdvancementTabType getType() { return this.type; } -@@ -148,8 +_,8 @@ +@@ -145,8 +_,8 @@ return null; } else { for (AdvancementTabType advancementtabtype : AdvancementTabType.values()) { diff --git a/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementsScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementsScreen.java.patch index c9e0eceaf0..953ef41261 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementsScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/advancements/AdvancementsScreen.java.patch @@ -37,8 +37,8 @@ this.advancements.setSelectedTab(advancementtab.getRootNode().holder(), true); break; } -@@ -181,10 +_,12 @@ - p_283395_.blit(RenderType::guiTextured, WINDOW_LOCATION, p_281890_, p_282532_, 0.0F, 0.0F, 252, 140, 256, 256); +@@ -183,10 +_,12 @@ + p_283395_.blit(RenderPipelines.GUI_TEXTURED, WINDOW_LOCATION, p_281890_, p_282532_, 0.0F, 0.0F, 252, 140, 256, 256); if (this.tabs.size() > 1) { for (AdvancementTab advancementtab : this.tabs.values()) { + if (advancementtab.getPage() == tabPage) @@ -50,11 +50,11 @@ advancementtab1.drawIcon(p_283395_, p_281890_, p_282532_); } } -@@ -202,6 +_,7 @@ +@@ -205,6 +_,7 @@ if (this.tabs.size() > 1) { for (AdvancementTab advancementtab : this.tabs.values()) { + if (advancementtab.getPage() == tabPage) if (advancementtab.isMouseOver(p_281519_, p_283371_, p_283556_, p_282458_)) { - p_282784_.renderTooltip(this.font, advancementtab.getTitle(), p_283556_, p_282458_); + p_282784_.setTooltipForNextFrame(this.font, advancementtab.getTitle(), p_283556_, p_282458_); } diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch index df022baabc..7cd3a6d178 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java.patch @@ -1,42 +1,42 @@ --- a/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java +++ b/net/minecraft/client/gui/screens/inventory/AbstractContainerScreen.java -@@ -106,6 +_,7 @@ +@@ -107,6 +_,7 @@ int i = this.leftPos; int j = this.topPos; - super.render(p_283479_, p_283661_, p_281248_, p_281886_); -+ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderBackground(this, p_283479_, p_283661_, p_281248_); - p_283479_.pose().pushPose(); - p_283479_.pose().translate(i, j, 0.0F); - Slot slot = this.hoveredSlot; -@@ -117,6 +_,8 @@ + super.render(p_409971_, p_409213_, p_408205_, p_408282_); ++ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderBackground(this, p_409971_, p_409213_, p_408205_); + p_409971_.pose().pushMatrix(); + p_409971_.pose().translate(i, j); + this.renderLabels(p_409971_, p_409213_, p_408205_); +@@ -119,6 +_,8 @@ this.onStopHovering(slot); } -+ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderForeground(this, p_283479_, p_283661_, p_281248_); ++ net.minecraftforge.client.event.ForgeEventFactoryClient.onContainerRenderForeground(this, p_409971_, p_409213_, p_408205_); + - this.renderLabels(p_283479_, p_283661_, p_281248_); - ItemStack itemstack = this.draggingItem.isEmpty() ? this.menu.getCarried() : this.draggingItem; - if (!itemstack.isEmpty()) { -@@ -197,7 +_,7 @@ + p_409971_.pose().popMatrix(); + } + +@@ -202,7 +_,7 @@ ItemStack itemstack = this.hoveredSlot.getItem(); if (this.menu.getCarried().isEmpty() || this.showTooltipWithItemInHand(itemstack)) { - p_283594_.renderTooltip( + p_283594_.setTooltipForNextFrame( - this.font, this.getTooltipFromContainerItem(itemstack), itemstack.getTooltipImage(), p_282171_, p_281909_, itemstack.get(DataComponents.TOOLTIP_STYLE) + this.font, this.getTooltipFromContainerItem(itemstack), itemstack.getTooltipImage(), itemstack, p_282171_, p_281909_ ); } } -@@ -215,7 +_,8 @@ - p_282567_.pose().pushPose(); - p_282567_.pose().translate(0.0F, 0.0F, 232.0F); +@@ -218,7 +_,8 @@ + + private void renderFloatingItem(GuiGraphics p_282567_, ItemStack p_281330_, int p_281772_, int p_281689_, @Nullable String p_282568_) { p_282567_.renderItem(p_281330_, p_281772_, p_281689_); - p_282567_.renderItemDecorations(this.font, p_281330_, p_281772_, p_281689_ - (this.draggingItem.isEmpty() ? 0 : 8), p_282568_); + var font = net.minecraftforge.client.extensions.common.IClientItemExtensions.of(p_281330_).getFont(p_281330_, net.minecraftforge.client.extensions.common.IClientItemExtensions.FontContext.ITEM_COUNT); + p_282567_.renderItemDecorations(font == null ? this.font : font, p_281330_, p_281772_, p_281689_ - (this.draggingItem.isEmpty() ? 0 : 8), p_282568_); - p_282567_.pose().popPose(); } -@@ -321,7 +_,8 @@ + protected void renderLabels(GuiGraphics p_281635_, int p_282681_, int p_283686_) { +@@ -319,7 +_,8 @@ if (super.mouseClicked(p_97748_, p_97749_, p_97750_)) { return true; } else { @@ -46,7 +46,7 @@ Slot slot = this.getHoveredSlot(p_97748_, p_97749_); long i = Util.getMillis(); this.doubleclick = this.lastClickSlot == slot && i - this.lastClickTime < 250L && this.lastClickButton == p_97750_; -@@ -332,6 +_,7 @@ +@@ -330,6 +_,7 @@ int j = this.leftPos; int k = this.topPos; boolean flag1 = this.hasClickedOutside(p_97748_, p_97749_, j, k, p_97750_); @@ -54,7 +54,7 @@ int l = -1; if (slot != null) { l = slot.index; -@@ -357,7 +_,7 @@ +@@ -355,7 +_,7 @@ } } else if (!this.isQuickCrafting) { if (this.menu.getCarried().isEmpty()) { @@ -63,7 +63,7 @@ this.slotClicked(slot, l, p_97750_, ClickType.CLONE); } else { boolean flag2 = l != -999 -@@ -385,7 +_,7 @@ +@@ -383,7 +_,7 @@ this.quickCraftingType = 0; } else if (p_97750_ == 1) { this.quickCraftingType = 1; @@ -72,7 +72,7 @@ this.quickCraftingType = 2; } } -@@ -461,10 +_,13 @@ +@@ -459,10 +_,13 @@ @Override public boolean mouseReleased(double p_97812_, double p_97813_, int p_97814_) { @@ -86,7 +86,7 @@ int k = -1; if (slot != null) { k = slot.index; -@@ -481,7 +_,7 @@ +@@ -479,7 +_,7 @@ if (slot2 != null && slot2.mayPickup(this.minecraft.player) && slot2.hasItem() @@ -116,7 +116,7 @@ this.onClose(); return true; } else { -@@ -698,4 +_,11 @@ +@@ -698,6 +_,13 @@ super.onClose(); } @@ -127,4 +127,6 @@ + public int getGuiTop() { return topPos; } + public int getXSize() { return imageWidth; } + public int getYSize() { return imageHeight; } - } + + @OnlyIn(Dist.CLIENT) + record SnapbackData(ItemStack item, Vector2i start, Vector2i end, long time) { diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch index eeddd2a4d7..a19c4873ed 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java +++ b/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java -@@ -114,6 +_,8 @@ +@@ -113,6 +_,8 @@ private final Set> visibleTags = new HashSet<>(); private final boolean displayOperatorCreativeTab; private final EffectsInInventory effects; @@ -9,7 +9,7 @@ public CreativeModeInventoryScreen(LocalPlayer p_344408_, FeatureFlagSet p_260074_, boolean p_259569_) { super(new CreativeModeInventoryScreen.ItemPickerMenu(p_344408_), p_344408_.getInventory(), CommonComponents.EMPTY); -@@ -162,7 +_,7 @@ +@@ -161,7 +_,7 @@ private void refreshCurrentTabContents(Collection p_261591_) { int i = this.menu.getRowIndexForScroll(this.scrollOffs); this.menu.items.clear(); @@ -18,7 +18,7 @@ this.refreshSearchResults(); } else { this.menu.items.addAll(p_261591_); -@@ -330,6 +_,35 @@ +@@ -329,6 +_,35 @@ protected void init() { if (this.minecraft.player.hasInfiniteMaterials()) { super.init(); @@ -54,7 +54,7 @@ this.searchBox = new EditBox(this.font, this.leftPos + 82, this.topPos + 6, 80, 9, Component.translatable("itemGroup.search")); this.searchBox.setMaxLength(50); this.searchBox.setBordered(false); -@@ -376,7 +_,7 @@ +@@ -375,7 +_,7 @@ public boolean charTyped(char p_98521_, int p_98522_) { if (this.ignoreTextInput) { return false; @@ -63,7 +63,7 @@ return false; } else { String s = this.searchBox.getValue(); -@@ -395,7 +_,7 @@ +@@ -394,7 +_,7 @@ @Override public boolean keyPressed(int p_98547_, int p_98548_, int p_98549_) { this.ignoreTextInput = false; @@ -72,7 +72,7 @@ if (this.minecraft.options.keyChat.matches(p_98547_, p_98548_)) { this.ignoreTextInput = true; this.selectTab(CreativeModeTabs.searchTab()); -@@ -431,6 +_,7 @@ +@@ -430,6 +_,7 @@ } private void refreshSearchResults() { @@ -80,7 +80,7 @@ this.menu.items.clear(); this.visibleTags.clear(); String s = this.searchBox.getValue(); -@@ -443,10 +_,10 @@ +@@ -442,10 +_,10 @@ SearchTree searchtree; if (s.startsWith("#")) { s = s.substring(1); @@ -93,17 +93,17 @@ } this.menu.items.addAll(searchtree.search(s.toLowerCase(Locale.ROOT))); -@@ -478,7 +_,8 @@ +@@ -477,7 +_,8 @@ @Override protected void renderLabels(GuiGraphics p_283168_, int p_281774_, int p_281466_) { if (selectedTab.showTitle()) { -- p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, 4210752, false); +- p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, -12566464, false); + com.mojang.blaze3d.opengl.GlStateManager._disableBlend(); + p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, selectedTab.getLabelColor(), false); } } -@@ -488,7 +_,7 @@ +@@ -487,7 +_,7 @@ double d0 = p_98531_ - this.leftPos; double d1 = p_98532_ - this.topPos; @@ -112,7 +112,7 @@ if (this.checkTabClicked(creativemodetab, d0, d1)) { return true; } -@@ -510,7 +_,7 @@ +@@ -509,7 +_,7 @@ double d1 = p_98623_ - this.topPos; this.scrolling = false; @@ -121,7 +121,7 @@ if (this.checkTabClicked(creativemodetab, d0, d1)) { this.selectTab(creativemodetab); return true; -@@ -604,13 +_,15 @@ +@@ -603,13 +_,15 @@ this.originalSlots = null; } @@ -138,31 +138,22 @@ this.refreshSearchResults(); } else { -@@ -673,7 +_,15 @@ +@@ -673,7 +_,14 @@ super.render(p_283000_, p_281317_, p_282770_, p_281295_); - this.effects.render(p_283000_, p_281317_, p_282770_, p_281295_); + this.effects.renderTooltip(p_283000_, p_281317_, p_282770_); - for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) { + if (this.pages.size() != 1) { + Component page = Component.literal(String.format("%d / %d", this.pages.indexOf(this.currentPage) + 1, this.pages.size())); -+ p_283000_.pose().pushPose(); -+ p_283000_.pose().translate(0F, 0F, 300F); ++ p_283000_.pose().pushMatrix(); + p_283000_.drawString(font, page.getVisualOrderText(), leftPos + (imageWidth / 2) - (font.width(page) / 2), topPos - 44, -1); -+ p_283000_.pose().popPose(); ++ p_283000_.pose().popMatrix(); + } + + for (CreativeModeTab creativemodetab : currentPage.getVisibleTabs()) { if (this.checkTabHovering(p_283000_, creativemodetab, p_281317_, p_282770_)) { break; } -@@ -685,6 +_,7 @@ - p_283000_.renderTooltip(this.font, TRASH_SLOT_TOOLTIP, p_281317_, p_282770_); - } - -+ com.mojang.blaze3d.systems.RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - this.renderTooltip(p_283000_, p_281317_, p_282770_); - } - @@ -697,7 +_,7 @@ public List getTooltipFromContainerItem(ItemStack p_281769_) { boolean flag = this.hoveredSlot != null && this.hoveredSlot instanceof CreativeModeInventoryScreen.CustomCreativeSlot; @@ -191,7 +182,7 @@ this.renderTabButton(p_282663_, creativemodetab); } @@ -745,6 +_,7 @@ - p_282663_.blitSprite(RenderType::guiTextured, resourcelocation, j, k + (int)((i - k - 17) * this.scrollOffs), 12, 15); + p_282663_.blitSprite(RenderPipelines.GUI_TEXTURED, resourcelocation, j, k + (int)((i - k - 17) * this.scrollOffs), 12, 15); } + if (currentPage.getVisibleTabs().contains(selectedTab)) //Forge: only display tab selection when the selected tab is on the current page @@ -232,10 +223,10 @@ } + com.mojang.blaze3d.opengl.GlStateManager._enableBlend(); //Forge: Make sure blend is enabled else tabs show a white border. - p_283590_.blitSprite(RenderType::guiTextured, aresourcelocation[Mth.clamp(i, 0, aresourcelocation.length)], j, k, 26, 32); - p_283590_.pose().pushPose(); - p_283590_.pose().translate(0.0F, 0.0F, 100.0F); -@@ -855,6 +_,14 @@ + p_283590_.blitSprite(RenderPipelines.GUI_TEXTURED, aresourcelocation[Mth.clamp(i, 0, aresourcelocation.length)], j, k, 26, 32); + int l = j + 13 - 8; + int i1 = k + 16 - 8 + (flag1 ? 1 : -1); +@@ -850,6 +_,14 @@ } } @@ -250,7 +241,7 @@ @OnlyIn(Dist.CLIENT) static class CustomCreativeSlot extends Slot { public CustomCreativeSlot(Container p_98633_, int p_98634_, int p_98635_, int p_98636_) { -@@ -1036,6 +_,22 @@ +@@ -1031,6 +_,22 @@ @Override public boolean mayPickup(Player p_98665_) { return this.target.mayPickup(p_98665_); diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java.patch index 3834589086..5df0c85a09 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java +++ b/net/minecraft/client/gui/screens/inventory/EffectsInInventory.java -@@ -48,12 +_,16 @@ +@@ -47,12 +_,16 @@ Collection collection = this.minecraft.player.getActiveEffects(); if (!collection.isEmpty() && j >= 32) { boolean flag = j >= 120; + var event = net.minecraftforge.client.event.ForgeEventFactoryClient.onScreenEffectSize(this.screen, j, !flag, i); -+ if (event.isCanceled()) return; ++ if (event == null) return; + flag = !event.isCompact(); + i = event.getHorizontalOffset(); int k = 33; @@ -18,7 +18,7 @@ this.renderBackgrounds(p_362146_, i, k, iterable, flag); this.renderIcons(p_362146_, i, k, iterable, flag); if (flag) { -@@ -99,6 +_,11 @@ +@@ -98,6 +_,11 @@ int i = this.screen.topPos; for (MobEffectInstance mobeffectinstance : p_361981_) { @@ -28,9 +28,9 @@ + continue; + } Holder holder = mobeffectinstance.getEffect(); - TextureAtlasSprite textureatlassprite = mobeffecttexturemanager.get(holder); - p_367085_.blitSprite(RenderType::guiTextured, textureatlassprite, p_367644_ + (p_368681_ ? 6 : 7), i + 7, 18, 18); -@@ -110,6 +_,11 @@ + ResourceLocation resourcelocation = Gui.getMobEffectSprite(holder); + p_367085_.blitSprite(RenderPipelines.GUI_TEXTURED, resourcelocation, p_367644_ + (p_368681_ ? 6 : 7), i + 7, 18, 18); +@@ -109,6 +_,11 @@ int i = this.screen.topPos; for (MobEffectInstance mobeffectinstance : p_365480_) { @@ -40,9 +40,9 @@ + continue; + } Component component = this.getEffectName(mobeffectinstance); - p_361851_.drawString(this.screen.getFont(), component, p_367468_ + 10 + 18, i + 6, 16777215); + p_361851_.drawString(this.screen.getFont(), component, p_367468_ + 10 + 18, i + 6, -1); Component component1 = MobEffectUtil.formatDuration(mobeffectinstance, 1.0F, this.minecraft.level.tickRateManager().tickrate()); -@@ -125,5 +_,9 @@ +@@ -124,5 +_,9 @@ } return mutablecomponent; diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch index 8901e5d902..f8d0c4866c 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java +++ b/net/minecraft/client/gui/screens/inventory/EnchantmentScreen.java -@@ -109,7 +_,7 @@ +@@ -106,7 +_,7 @@ int l1 = 86 - this.font.width(s); FormattedText formattedtext = EnchantmentNames.getInstance().getRandomName(this.font, l1); - int i2 = 6839882; + int i2 = -9937334; - if ((k < l + 1 || this.minecraft.player.experienceLevel < k1) && !this.minecraft.player.hasInfiniteMaterials()) { + if (((k < l + 1 || this.minecraft.player.experienceLevel < k1) && !this.minecraft.player.hasInfiniteMaterials()) || this.menu.enchantClue[l] == -1) { // Forge: render buttons as disabled when enchantable but enchantability not met on lower levels{ - p_282430_.blitSprite(RenderType::guiTextured, ENCHANTMENT_SLOT_DISABLED_SPRITE, i1, j + 14 + 19 * l, 108, 19); - p_282430_.blitSprite(RenderType::guiTextured, DISABLED_LEVEL_SPRITES[l], i1 + 1, j + 15 + 19 * l, 16, 16); - p_282430_.drawWordWrap(this.font, formattedtext, j1, j + 16 + 19 * l, l1, (i2 & 16711422) >> 1, false); -@@ -175,13 +_,16 @@ + p_282430_.blitSprite(RenderPipelines.GUI_TEXTURED, ENCHANTMENT_SLOT_DISABLED_SPRITE, i1, j + 14 + 19 * l, 108, 19); + p_282430_.blitSprite(RenderPipelines.GUI_TEXTURED, DISABLED_LEVEL_SPRITES[l], i1 + 1, j + 15 + 19 * l, 16, 16); + p_282430_.drawWordWrap(this.font, formattedtext, j1, j + 16 + 19 * l, l1, ARGB.opaque((i2 & 16711422) >> 1), false); +@@ -157,13 +_,16 @@ .registryAccess() .lookupOrThrow(Registries.ENCHANTMENT) .get(this.menu.enchantClue[j]); diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java.patch index 0b4bbf6b6e..74155da1f7 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java +++ b/net/minecraft/client/gui/screens/inventory/HangingSignEditScreen.java -@@ -16,7 +_,7 @@ +@@ -15,7 +_,7 @@ private static final Vector3f TEXT_SCALE = new Vector3f(1.0F, 1.0F, 1.0F); private static final int TEXTURE_WIDTH = 16; private static final int TEXTURE_HEIGHT = 16; diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/MerchantScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/MerchantScreen.java.patch index a86f0be302..7209688fef 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/MerchantScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/MerchantScreen.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/screens/inventory/MerchantScreen.java +++ b/net/minecraft/client/gui/screens/inventory/MerchantScreen.java -@@ -232,6 +_,14 @@ +@@ -229,6 +_,14 @@ } else { p_281357_.renderItemDecorations(this.font, p_282046_, p_282403_, p_283601_, p_282046_.getCount() == 1 ? "1" : null); p_281357_.renderItemDecorations(this.font, p_283466_, p_282403_ + 14, p_283601_, p_283466_.getCount() == 1 ? "1" : null); @@ -12,6 +12,6 @@ + font.drawInBatch(count, (float) (p_282403_ + 14) + 19 - 2 - font.width(count), (float)p_283601_ + 6 + 3, 0xFFFFFF, true, p_281357_.pose().last().pose(), p_281357_.bufferSource(), net.minecraft.client.gui.Font.DisplayMode.NORMAL, 0, 15728880, false); + p_281357_.pose().popPose(); + */ - p_281357_.pose().pushPose(); - p_281357_.pose().translate(0.0F, 0.0F, 300.0F); - p_281357_.blitSprite(RenderType::guiTextured, DISCOUNT_STRIKETHRUOGH_SPRITE, p_282403_ + 7, p_283601_ + 12, 9, 2); + p_281357_.blitSprite(RenderPipelines.GUI_TEXTURED, DISCOUNT_STRIKETHRUOGH_SPRITE, p_282403_ + 7, p_283601_ + 12, 9, 2); + } + } diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java.patch index 5fa71a34da..4fb7987094 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java +++ b/net/minecraft/client/gui/screens/inventory/tooltip/ClientTooltipComponent.java -@@ -22,7 +_,7 @@ +@@ -20,7 +_,7 @@ case ClientActivePlayersTooltip.ActivePlayersTooltip clientactiveplayerstooltip$activeplayerstooltip -> new ClientActivePlayersTooltip( clientactiveplayerstooltip$activeplayerstooltip ); diff --git a/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch index 02981c1a46..d3272eaf0f 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java +++ b/net/minecraft/client/gui/screens/multiplayer/ServerSelectionList.java @@ -371,6 +_,8 @@ - this.screen.setTooltipForNextRenderPass(Lists.transform(this.onlinePlayersTooltip, Component::getVisualOrderText)); + p_281406_.setTooltipForNextFrame(Lists.transform(this.onlinePlayersTooltip, Component::getVisualOrderText), p_283567_, p_282864_); } + net.minecraftforge.client.ForgeHooksClient.drawForgePingInfo(this.screen, serverData, p_281406_, p_281363_, p_282921_, p_283596_, p_283567_ - p_281363_, p_282864_ - p_282921_); diff --git a/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch index 04e2ad228e..f4b8047cfe 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/packs/PackSelectionScreen.java.patch @@ -6,6 +6,6 @@ p_100014_.setSelected(null); - p_100015_.forEach( + p_100015_.filter(PackSelectionModel.Entry::notHidden).forEach( - p_389318_ -> { + p_404866_ -> { TransferableSelectionList.PackEntry transferableselectionlist$packentry1 = new TransferableSelectionList.PackEntry( - this.minecraft, p_100014_, p_389318_ + this.minecraft, p_100014_, p_404866_ diff --git a/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch index 6bd3d9a61a..bdc822f29a 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/worldselection/WorldSelectionList.java.patch @@ -11,13 +11,13 @@ @@ -400,6 +_,7 @@ p_281612_.drawString(this.minecraft.font, s1, p_282820_ + 32 + 3, p_283181_ + 9 + 3, -8355712); p_281612_.drawString(this.minecraft.font, component, p_282820_ + 32 + 3, p_283181_ + 9 + 9 + 3, -8355712); - p_281612_.blit(RenderType::guiTextured, this.icon.textureLocation(), p_282820_, p_283181_, 0.0F, 0.0F, 32, 32, 32, 32); + p_281612_.blit(RenderPipelines.GUI_TEXTURED, this.icon.textureLocation(), p_282820_, p_283181_, 0.0F, 0.0F, 32, 32, 32, 32); + renderExperimentalWarning(p_281612_, p_283204_, p_283025_, p_283181_, p_282820_); if (this.minecraft.options.touchscreen().get() || p_283396_) { p_281612_.fill(p_282820_, p_283181_, p_282820_ + 32, p_283181_ + 32, -1601138544); int j = p_283204_ - p_282820_; -@@ -446,6 +_,19 @@ - p_281612_.blitSprite(RenderType::guiTextured, resourcelocation, p_282820_, p_283181_, 32, 32); +@@ -450,6 +_,19 @@ + p_281612_.blitSprite(RenderPipelines.GUI_TEXTURED, resourcelocation, p_282820_, p_283181_, 32, 32); } } + } @@ -26,11 +26,11 @@ + private void renderExperimentalWarning(GuiGraphics guiGraphics, int mouseX, int mouseY, int top, int left) { + if (this.summary.isLifecycleExperimental()) { + int leftStart = left + WorldSelectionList.this.getRowWidth(); -+ guiGraphics.blit(RenderType::guiTextured, WorldSelectionList.FORGE_EXPERIMENTAL_WARNING_ICON, leftStart - 36, top, 0.0F, 0.0F, 32, 32, 32, 32); ++ guiGraphics.blit(RenderPipelines.GUI_TEXTURED, WorldSelectionList.FORGE_EXPERIMENTAL_WARNING_ICON, leftStart - 36, top, 0.0F, 0.0F, 32, 32, 32, 32); + if (WorldSelectionList.this.getEntryAtPosition(mouseX, mouseY) == this && mouseX > leftStart - 36 && mouseX < leftStart) { + var font = Minecraft.getInstance().font; + List tooltip = font.split(Component.translatable("forge.experimentalsettings.tooltip"), 200); -+ guiGraphics.renderTooltip(font, tooltip, mouseX, mouseY); ++ guiGraphics.setTooltipForNextFrame(font, tooltip, mouseX, mouseY); + } + } } diff --git a/patches/minecraft/net/minecraft/client/main/Main.java.patch b/patches/minecraft/net/minecraft/client/main/Main.java.patch index 00ebccb940..e6af997fa7 100644 --- a/patches/minecraft/net/minecraft/client/main/Main.java.patch +++ b/patches/minecraft/net/minecraft/client/main/Main.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/main/Main.java +++ b/net/minecraft/client/main/Main.java -@@ -121,8 +_,8 @@ +@@ -123,8 +_,8 @@ CrashReport.preload(); logger = LogUtils.getLogger(); s1 = "Bootstrap"; diff --git a/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch b/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch index 2dad4bbb94..4db8ff6800 100644 --- a/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch +++ b/patches/minecraft/net/minecraft/client/model/geom/LayerDefinitions.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/model/geom/LayerDefinitions.java +++ b/net/minecraft/client/model/geom/LayerDefinitions.java -@@ -497,6 +_,7 @@ +@@ -505,6 +_,7 @@ builder.put(ModelLayers.createHangingSignModelName(p_374591_, hangingsignrenderer$attachmenttype), layerdefinition60); } }); diff --git a/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch b/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch index 41d5b58fc6..5b72e719bd 100644 --- a/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch +++ b/patches/minecraft/net/minecraft/client/model/geom/ModelLayers.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/model/geom/ModelLayers.java +++ b/net/minecraft/client/model/geom/ModelLayers.java -@@ -330,15 +_,18 @@ +@@ -336,15 +_,18 @@ } public static ModelLayerLocation createStandingSignModelName(WoodType p_171292_) { diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch index 57ea968d12..66bdf33a29 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientChunkCache.java.patch @@ -4,7 +4,7 @@ int i = this.storage.getIndex(p_298665_.x, p_298665_.z); LevelChunk levelchunk = this.storage.getChunk(i); if (isValidChunk(levelchunk, p_298665_.x, p_298665_.z)) { -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.level.ChunkEvent.Unload(levelchunk)); ++ net.minecraftforge.event.level.ChunkEvent.Unload.BUS.post(new net.minecraftforge.event.level.ChunkEvent.Unload(levelchunk)); this.storage.drop(i, levelchunk); } } @@ -12,7 +12,7 @@ } this.level.onChunkLoaded(chunkpos); -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.level.ChunkEvent.Load(levelchunk, false)); ++ net.minecraftforge.event.level.ChunkEvent.Load.BUS.post(new net.minecraftforge.event.level.ChunkEvent.Load(levelchunk, false)); return levelchunk; } } diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java.patch index 03a46c905e..71d7815ee4 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java +++ b/net/minecraft/client/multiplayer/ClientCommonPacketListenerImpl.java -@@ -142,6 +_,7 @@ +@@ -153,6 +_,7 @@ @Override public void handleCustomPayload(ClientboundCustomPayloadPacket p_298103_) { diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java.patch index 2598d4df90..a279702d69 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java +++ b/net/minecraft/client/multiplayer/ClientConfigurationPacketListenerImpl.java -@@ -147,6 +_,7 @@ +@@ -157,6 +_,7 @@ return true; } })); diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java.patch index 7a283dfa4a..56d09764a0 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java.patch @@ -1,14 +1,14 @@ --- a/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java +++ b/net/minecraft/client/multiplayer/ClientHandshakePacketListenerImpl.java -@@ -209,6 +_,7 @@ +@@ -208,6 +_,7 @@ Component component = this.wasTransferredTo ? CommonComponents.TRANSFER_CONNECT_FAILED : CommonComponents.CONNECT_FAILED; if (this.serverData != null && this.serverData.isRealm()) { - this.minecraft.setScreen(new DisconnectedRealmsScreen(this.parent, component, p_342266_.reason())); + this.minecraft.setScreen(new DisconnectedScreen(this.parent, component, p_342266_.reason(), CommonComponents.GUI_BACK)); + } else if (net.minecraftforge.client.ForgeHooksClient.onClientDisconnect(this.connection, this.minecraft, this.parent, p_342266_.reason())) { } else { this.minecraft.setScreen(new DisconnectedScreen(this.parent, component, p_342266_)); } -@@ -233,6 +_,7 @@ +@@ -232,6 +_,7 @@ @Override public void handleCustomQuery(ClientboundCustomQueryPacket p_104545_) { diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch index c499b9fea9..0315f3865a 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientLevel.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/multiplayer/ClientLevel.java +++ b/net/minecraft/client/multiplayer/ClientLevel.java -@@ -126,6 +_,7 @@ +@@ -130,6 +_,7 @@ p_389331_.put(BiomeColors.FOLIAGE_COLOR_RESOLVER, new BlockTintCache(p_194177_ -> this.calculateBlockTint(p_194177_, BiomeColors.FOLIAGE_COLOR_RESOLVER))); p_389331_.put(BiomeColors.DRY_FOLIAGE_COLOR_RESOLVER, new BlockTintCache(p_389335_ -> this.calculateBlockTint(p_389335_, BiomeColors.DRY_FOLIAGE_COLOR_RESOLVER))); p_389331_.put(BiomeColors.WATER_COLOR_RESOLVER, new BlockTintCache(p_194168_ -> this.calculateBlockTint(p_194168_, BiomeColors.WATER_COLOR_RESOLVER))); @@ -8,7 +8,7 @@ }); private final ClientChunkCache chunkSource; private final Deque lightUpdateQueue = Queues.newArrayDeque(); -@@ -134,6 +_,8 @@ +@@ -139,6 +_,8 @@ private final int seaLevel; private boolean tickDayTime; private static final Set MARKER_PARTICLE_ITEMS = Set.of(Items.BARRIER, Items.LIGHT); @@ -17,7 +17,7 @@ public void handleBlockChangedAck(int p_233652_) { this.blockStatePredictionHandler.endPredictionsUpTo(p_233652_, this); -@@ -200,6 +_,8 @@ +@@ -217,6 +_,8 @@ this.serverSimulationDistance = p_364305_; this.updateSkyBrightness(); this.prepareWeather(); @@ -26,7 +26,7 @@ } public void queueLightUpdate(Runnable p_194172_) { -@@ -282,6 +_,7 @@ +@@ -299,6 +_,7 @@ p_104640_.setOldPosAndRot(); p_104640_.tickCount++; Profiler.get().push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_104640_.getType()).toString()); @@ -34,7 +34,7 @@ p_104640_.tick(); Profiler.get().pop(); -@@ -333,8 +_,10 @@ +@@ -350,8 +_,10 @@ } public void addEntity(Entity p_104741_) { @@ -45,12 +45,12 @@ } public void removeEntity(int p_171643_, Entity.RemovalReason p_171644_) { -@@ -516,6 +_,12 @@ +@@ -532,6 +_,12 @@ float p_263349_, long p_263408_ ) { + var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtPosition(this, p_263372_, p_263404_, p_263365_, p_263335_, p_263417_, p_263416_, p_263349_); -+ if (event.isCanceled() || event.getSound() == null) return; ++ if (event == null || event.getSound() == null) return; + p_263335_ = event.getSound(); + p_263417_ = event.getSource(); + p_263416_ = event.getNewVolume(); @@ -58,12 +58,12 @@ if (p_394722_ == this.minecraft.player) { this.playSound(p_263372_, p_263404_, p_263365_, p_263335_.value(), p_263417_, p_263416_, p_263349_, false, p_263408_); } -@@ -525,6 +_,12 @@ +@@ -541,6 +_,12 @@ public void playSeededSound( @Nullable Entity p_263536_, Entity p_396496_, Holder p_263518_, SoundSource p_263487_, float p_263538_, float p_263524_, long p_263509_ ) { + var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtEntity(this.minecraft.level, p_263536_, p_263518_, p_263487_, p_263538_, p_263524_); -+ if (event.isCanceled() || event.getSound() == null) return; ++ if (event == null || event.getSound() == null) return; + p_263518_ = event.getSound(); + p_263487_ = event.getSource(); + p_263538_ = event.getNewVolume(); @@ -71,7 +71,7 @@ if (p_263536_ == this.minecraft.player) { this.minecraft.getSoundManager().play(new EntityBoundSoundInstance(p_263518_.value(), p_263487_, p_263538_, p_263524_, p_396496_, p_263509_)); } -@@ -975,6 +_,16 @@ +@@ -991,6 +_,16 @@ this.connection.registerForCleaning(p_396040_); } @@ -88,7 +88,7 @@ @OnlyIn(Dist.CLIENT) public static class ClientLevelData implements WritableLevelData { private final boolean hardcore; -@@ -1063,6 +_,7 @@ +@@ -1079,6 +_,7 @@ } public void setDifficulty(Difficulty p_104852_) { @@ -96,7 +96,7 @@ this.difficulty = p_104852_; } -@@ -1105,6 +_,12 @@ +@@ -1121,6 +_,12 @@ break; default: } @@ -109,7 +109,7 @@ } public void onTrackingEnd(Entity p_171716_) { -@@ -1117,6 +_,15 @@ +@@ -1133,6 +_,15 @@ ClientLevel.this.dragonParts.removeAll(Arrays.asList(enderdragon.getSubEntities())); break; default: diff --git a/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch index c265cd2777..f5492b2a76 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/ClientPacketListener.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/multiplayer/ClientPacketListener.java +++ b/net/minecraft/client/multiplayer/ClientPacketListener.java -@@ -477,6 +_,7 @@ +@@ -528,6 +_,7 @@ this.minecraft.debugRenderer.clear(); this.minecraft.player.resetPos(); @@ -8,7 +8,7 @@ this.minecraft.player.setId(p_105030_.playerId()); this.level.addEntity(this.minecraft.player); this.minecraft.player.input = new KeyboardInput(this.minecraft.options); -@@ -1263,6 +_,8 @@ +@@ -1315,6 +_,8 @@ localplayer1.getAttributes().assignBaseValues(localplayer.getAttributes()); } @@ -17,27 +17,27 @@ this.level.addEntity(localplayer1); localplayer1.input = new KeyboardInput(this.minecraft.options); this.minecraft.gameMode.adjustPlayer(localplayer1); -@@ -1407,7 +_,7 @@ - PacketUtils.ensureRunningOnSameThread(p_104976_, this, this.minecraft); - BlockPos blockpos = p_104976_.getPos(); - this.minecraft.level.getBlockEntity(blockpos, p_104976_.getType()).ifPresent(p_389343_ -> { -- p_389343_.loadWithComponents(p_104976_.getTag(), this.registryAccess); -+ p_389343_.onDataPacket(connection, p_104976_, this.registryAccess); - if (p_389343_ instanceof CommandBlockEntity && this.minecraft.screen instanceof CommandBlockEditScreen) { - ((CommandBlockEditScreen)this.minecraft.screen).updateGui(); - } -@@ -1567,7 +_,9 @@ +@@ -1462,7 +_,7 @@ + ProblemReporter.ScopedCollector problemreporter$scopedcollector = new ProblemReporter.ScopedCollector(p_404890_.problemPath(), LOGGER); + + try { +- p_404890_.loadWithComponents(TagValueInput.create(problemreporter$scopedcollector, this.registryAccess, p_104976_.getTag())); ++ p_404890_.onDataPacket(connection, TagValueInput.create(problemreporter$scopedcollector, this.registryAccess, p_104976_.getTag()), this.registryAccess); + } catch (Throwable throwable1) { + try { + problemreporter$scopedcollector.close(); +@@ -1630,7 +_,9 @@ @Override public void handleCommands(ClientboundCommandsPacket p_104990_) { PacketUtils.ensureRunningOnSameThread(p_104990_, this, this.minecraft); -- this.commands = new CommandDispatcher<>(p_104990_.getRoot(CommandBuildContext.simple(this.registryAccess, this.enabledFeatures))); +- this.commands = new CommandDispatcher<>(p_104990_.getRoot(CommandBuildContext.simple(this.registryAccess, this.enabledFeatures), COMMAND_NODE_BUILDER)); + var context = CommandBuildContext.simple(this.registryAccess, this.enabledFeatures); -+ this.commands = new CommandDispatcher<>(p_104990_.getRoot(context)); ++ this.commands = new CommandDispatcher<>(p_104990_.getRoot(context, COMMAND_NODE_BUILDER)); + this.commands = net.minecraftforge.client.ClientCommandHandler.mergeServerCommands(this.commands, context); } @Override -@@ -1668,6 +_,7 @@ +@@ -1731,6 +_,7 @@ if (this.minecraft.screen instanceof RecipeUpdateListener recipeupdatelistener) { recipeupdatelistener.recipesUpdated(); } @@ -45,7 +45,7 @@ } @Override -@@ -1706,6 +_,8 @@ +@@ -1769,6 +_,8 @@ this.fuelValues = FuelValues.vanillaBurnTimes(this.registryAccess, this.enabledFeatures); List list1 = List.copyOf(CreativeModeTabs.searchTab().getDisplayItems()); this.searchTrees.updateCreativeTags(list1); @@ -54,7 +54,7 @@ } @Override -@@ -2548,6 +_,8 @@ +@@ -2617,6 +_,8 @@ } public void sendChat(String p_249888_) { @@ -63,11 +63,11 @@ Instant instant = Instant.now(); long i = Crypt.SaltSupplier.getLong(); LastSeenMessagesTracker.Update lastseenmessagestracker$update = this.lastSeenMessages.generateAndApplyUpdate(); -@@ -2556,6 +_,7 @@ +@@ -2625,6 +_,7 @@ } public void sendCommand(String p_250092_) { + if (net.minecraftforge.client.ClientCommandHandler.runCommand(p_250092_)) return; - SignableCommand signablecommand = SignableCommand.of(this.parseCommand(p_250092_)); + SignableCommand signablecommand = SignableCommand.of(this.commands.parse(p_250092_, this.suggestionsProvider)); if (signablecommand.arguments().isEmpty()) { this.send(new ServerboundChatCommandPacket(p_250092_)); diff --git a/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch index d597ce606b..04c7d256d0 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/MultiPlayerGameMode.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/multiplayer/MultiPlayerGameMode.java +++ b/net/minecraft/client/multiplayer/MultiPlayerGameMode.java -@@ -110,6 +_,7 @@ +@@ -111,6 +_,7 @@ } public boolean destroyBlock(BlockPos p_105268_) { @@ -8,7 +8,7 @@ if (this.minecraft.player.blockActionRestricted(this.minecraft.level, p_105268_, this.localPlayerMode)) { return false; } else { -@@ -124,9 +_,8 @@ +@@ -125,9 +_,8 @@ } else if (blockstate.isAir()) { return false; } else { @@ -19,15 +19,15 @@ if (flag) { block.destroy(level, p_105268_, blockstate); } -@@ -147,6 +_,7 @@ +@@ -148,6 +_,7 @@ BlockState blockstate = this.minecraft.level.getBlockState(p_105270_); this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105270_, blockstate, 1.0F); this.startPrediction(this.minecraft.level, p_233757_ -> { -+ if (!net.minecraftforge.event.ForgeEventFactory.onLeftClickBlock(this.minecraft.player, p_105270_, p_105271_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK).isCanceled()) ++ if (!net.minecraftforge.event.ForgeEventFactory.isLeftClickBlockCancelled(this.minecraft.player, p_105270_, p_105271_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK)) this.destroyBlock(p_105270_); return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233757_); }); -@@ -156,15 +_,18 @@ +@@ -157,15 +_,18 @@ this.connection .send(new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.ABORT_DESTROY_BLOCK, this.destroyBlockPos, p_105271_)); } @@ -38,15 +38,15 @@ this.startPrediction(this.minecraft.level, p_233728_ -> { boolean flag = !blockstate1.isAir(); if (flag && this.destroyProgress == 0.0F) { -+ if (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY) ++ if (event != null && !event.getUseBlock().isDenied()) blockstate1.attack(this.minecraft.level, p_105270_, this.minecraft.player); } -+ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ if (event != null && !event.getUseItem().isDenied()) { if (flag && blockstate1.getDestroyProgress(this.minecraft.player, this.minecraft.player.level(), p_105270_) >= 1.0F) { this.destroyBlock(p_105270_); } else { -@@ -175,6 +_,7 @@ +@@ -176,6 +_,7 @@ this.destroyTicks = 0.0F; this.minecraft.level.destroyBlockProgress(this.minecraft.player.getId(), this.destroyBlockPos, this.getDestroyStage()); } @@ -54,15 +54,15 @@ return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105270_, p_105271_, p_233728_); }); -@@ -207,6 +_,7 @@ +@@ -208,6 +_,7 @@ BlockState blockstate1 = this.minecraft.level.getBlockState(p_105284_); this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105284_, blockstate1, 1.0F); this.startPrediction(this.minecraft.level, p_233753_ -> { -+ if (!net.minecraftforge.event.ForgeEventFactory.onLeftClickBlock(this.minecraft.player, p_105284_, p_105285_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK).isCanceled()) ++ if (!net.minecraftforge.event.ForgeEventFactory.isLeftClickBlockCancelled(this.minecraft.player, p_105284_, p_105285_, ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK)) this.destroyBlock(p_105284_); return new ServerboundPlayerActionPacket(ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK, p_105284_, p_105285_, p_233753_); }); -@@ -219,7 +_,7 @@ +@@ -220,7 +_,7 @@ } else { this.destroyProgress = this.destroyProgress + blockstate.getDestroyProgress(this.minecraft.player, this.minecraft.player.level(), p_105284_); if (this.destroyTicks % 4.0F == 0.0F) { @@ -71,15 +71,15 @@ this.minecraft .getSoundManager() .play( -@@ -236,6 +_,7 @@ +@@ -237,6 +_,7 @@ this.destroyTicks++; this.minecraft.getTutorial().onDestroyBlock(this.minecraft.level, p_105284_, blockstate, Mth.clamp(this.destroyProgress, 0.0F, 1.0F)); -+ if (net.minecraftforge.event.ForgeEventFactory.onLeftClickBlockHold(this.minecraft.player, p_105284_, p_105285_).getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return true; ++ if (net.minecraftforge.event.ForgeEventFactory.onLeftClickBlockHold(this.minecraft.player, p_105284_, p_105285_).getUseItem().isDenied()) return true; if (this.destroyProgress >= 1.0F) { this.isDestroying = false; this.startPrediction(this.minecraft.level, p_233739_ -> { -@@ -274,7 +_,7 @@ +@@ -275,7 +_,7 @@ private boolean sameDestroyTarget(BlockPos p_105282_) { ItemStack itemstack = this.minecraft.player.getMainHandItem(); @@ -88,12 +88,12 @@ } private void ensureHasSentCarriedItem() { -@@ -302,12 +_,23 @@ +@@ -303,12 +_,23 @@ private InteractionResult performUseItemOn(LocalPlayer p_233747_, InteractionHand p_233748_, BlockHitResult p_233749_) { BlockPos blockpos = p_233749_.getBlockPos(); ItemStack itemstack = p_233747_.getItemInHand(p_233748_); -+ var event = net.minecraftforge.event.ForgeEventFactory.onRightClickBlock(p_233747_, p_233748_, blockpos, p_233749_); -+ if (event.isCanceled()) { ++ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock(p_233747_, p_233748_, blockpos, p_233749_); ++ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock.BUS.post(event)) { + return event.getCancellationResult(); + } if (this.localPlayerMode == GameType.SPECTATOR) { @@ -101,7 +101,7 @@ } else { - boolean flag = !p_233747_.getMainHandItem().isEmpty() || !p_233747_.getOffhandItem().isEmpty(); + UseOnContext useoncontext = new UseOnContext(p_233747_, p_233748_, p_233749_); -+ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ if (!event.getUseItem().isDenied()) { + InteractionResult result = itemstack.onItemUseFirst(useoncontext); + if (result != InteractionResult.PASS) { + return result; @@ -110,36 +110,36 @@ + boolean flag = !p_233747_.getMainHandItem().doesSneakBypassUse(p_233747_.level(), blockpos, p_233747_) || !p_233747_.getOffhandItem().doesSneakBypassUse(p_233747_.level(), blockpos, p_233747_); boolean flag1 = p_233747_.isSecondaryUseActive() && flag; - if (!flag1) { -+ if (event.getUseBlock() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY && !flag1)) { ++ if (event.getUseBlock().isAllowed() || (!event.getUseBlock().isDenied() && !flag1)) { BlockState blockstate = this.minecraft.level.getBlockState(blockpos); if (!this.connection.isFeatureEnabled(blockstate.getBlock().requiredFeatures())) { return InteractionResult.FAIL; -@@ -328,8 +_,10 @@ +@@ -329,8 +_,10 @@ } } - if (!itemstack.isEmpty() && !p_233747_.getCooldowns().isOnCooldown(itemstack)) { - UseOnContext useoncontext = new UseOnContext(p_233747_, p_233748_, p_233749_); -+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ if (event.getUseItem().isDenied()) { + return InteractionResult.PASS; + } -+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (!itemstack.isEmpty() && !p_233747_.getCooldowns().isOnCooldown(itemstack))) { ++ if (event.getUseItem().isAllowed() || (!itemstack.isEmpty() && !p_233747_.getCooldowns().isOnCooldown(itemstack))) { InteractionResult interactionresult2; if (p_233747_.hasInfiniteMaterials()) { int i = itemstack.getCount(); -@@ -363,6 +_,11 @@ +@@ -364,6 +_,11 @@ mutableobject.setValue(InteractionResult.PASS); return serverbounduseitempacket; } else { -+ var event = net.minecraftforge.event.ForgeEventFactory.onRightClickItem(p_233722_, p_233723_); -+ if (event.isCanceled()) { ++ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem(p_233722_, p_233723_); ++ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickItem.BUS.post(event)) { + mutableobject.setValue(event.getCancellationResult()); + return serverbounduseitempacket; + } InteractionResult interactionresult = itemstack.use(this.minecraft.level, p_233722_, p_233723_); ItemStack itemstack1; if (interactionresult instanceof InteractionResult.Success interactionresult$success) { -@@ -373,6 +_,9 @@ +@@ -374,6 +_,9 @@ if (itemstack1 != itemstack) { p_233722_.setItemInHand(p_233723_, itemstack1); @@ -149,24 +149,24 @@ } mutableobject.setValue(interactionresult); -@@ -404,6 +_,10 @@ +@@ -405,6 +_,10 @@ public InteractionResult interact(Player p_105227_, Entity p_105228_, InteractionHand p_105229_) { this.ensureHasSentCarriedItem(); this.connection.send(ServerboundInteractPacket.createInteractionPacket(p_105228_, p_105227_.isShiftKeyDown(), p_105229_)); + if (this.localPlayerMode != GameType.SPECTATOR) { -+ var event = net.minecraftforge.event.ForgeEventFactory.onEntityInteract(p_105227_, p_105228_, p_105229_); -+ if (event.isCanceled()) return event.getCancellationResult(); ++ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract(p_105227_, p_105229_, p_105228_); ++ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract.BUS.post(event)) return event.getCancellationResult(); + } return (InteractionResult)(this.localPlayerMode == GameType.SPECTATOR ? InteractionResult.PASS : p_105227_.interactOn(p_105228_, p_105229_)); } -@@ -411,6 +_,10 @@ +@@ -412,6 +_,10 @@ this.ensureHasSentCarriedItem(); Vec3 vec3 = p_105233_.getLocation().subtract(p_105232_.getX(), p_105232_.getY(), p_105232_.getZ()); this.connection.send(ServerboundInteractPacket.createInteractionPacket(p_105232_, p_105231_.isShiftKeyDown(), p_105234_, vec3)); + if (this.localPlayerMode != GameType.SPECTATOR) { -+ var event = net.minecraftforge.event.ForgeEventFactory.onEntityInteractSpecific(p_105231_, p_105232_, p_105234_, vec3); -+ if (event.isCanceled()) return event.getCancellationResult(); ++ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific(p_105231_, p_105234_, p_105232_, vec3); ++ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteractSpecific.BUS.post(event)) return event.getCancellationResult(); + } return (InteractionResult)(this.localPlayerMode == GameType.SPECTATOR ? InteractionResult.PASS : p_105232_.interactAt(p_105231_, vec3, p_105234_)); } diff --git a/patches/minecraft/net/minecraft/client/multiplayer/chat/ChatListener.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/chat/ChatListener.java.patch index 0ea804a8b6..0776c332e6 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/chat/ChatListener.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/chat/ChatListener.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/multiplayer/chat/ChatListener.java +++ b/net/minecraft/client/multiplayer/chat/ChatListener.java -@@ -123,7 +_,9 @@ +@@ -124,7 +_,9 @@ Instant instant = Instant.now(); this.handleMessage(null, () -> { Component component = p_251256_.decorate(p_250375_); @@ -11,7 +11,7 @@ this.narrateChatMessage(p_251256_, p_250375_); this.logSystemMessage(component, instant); this.previousMessageTime = Util.getMillis(); -@@ -142,12 +_,16 @@ +@@ -143,12 +_,16 @@ MessageSignature messagesignature = p_249430_.signature(); FilterMask filtermask = p_249430_.filterMask(); if (filtermask.isEmpty()) { @@ -30,7 +30,7 @@ this.narrateChatMessage(p_251766_, component); } } -@@ -180,6 +_,8 @@ +@@ -181,6 +_,8 @@ public void handleSystemMessage(Component p_240522_, boolean p_240642_) { if (!this.minecraft.options.hideMatchedNames().get() || !this.minecraft.isBlocked(this.guessChatUUID(p_240522_))) { @@ -38,4 +38,4 @@ + if (p_240522_ == null) return; if (p_240642_) { this.minecraft.gui.setOverlayMessage(p_240522_, false); - } else { + this.minecraft.getNarrator().saySystemQueued(p_240522_); diff --git a/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch b/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch index addbf83de3..6fa16a050f 100644 --- a/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch +++ b/patches/minecraft/net/minecraft/client/player/LocalPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/player/LocalPlayer.java +++ b/net/minecraft/client/player/LocalPlayer.java -@@ -303,6 +_,7 @@ +@@ -297,6 +_,7 @@ ServerboundPlayerActionPacket.Action serverboundplayeractionpacket$action = p_108701_ ? ServerboundPlayerActionPacket.Action.DROP_ALL_ITEMS : ServerboundPlayerActionPacket.Action.DROP_ITEM; @@ -8,14 +8,14 @@ ItemStack itemstack = this.getInventory().removeFromSelected(p_108701_); this.connection.send(new ServerboundPlayerActionPacket(serverboundplayeractionpacket$action, BlockPos.ZERO, Direction.DOWN)); return !itemstack.isEmpty(); -@@ -483,7 +_,11 @@ +@@ -478,7 +_,11 @@ @Override public void playSound(SoundEvent p_108651_, float p_108652_, float p_108653_) { - this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), p_108651_, this.getSoundSource(), p_108652_, p_108653_, false); + var holder = net.minecraft.core.registries.BuiltInRegistries.SOUND_EVENT.wrapAsHolder(p_108651_); + var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtEntity(this.level(), this, holder, this.getSoundSource(), p_108652_, p_108653_); -+ if (event.isCanceled() || event.getSound() == null) return; ++ if (event == null || event.getSound() == null) return; + this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), event.getSound().get(), event.getSource(), event.getNewVolume(), event.getNewPitch(), false); + } @@ -76,7 +76,7 @@ } private boolean vehicleCanSprint(Entity p_265184_) { -@@ -1169,6 +_,18 @@ +@@ -1169,6 +_,17 @@ @Override public float getVisualRotationYInDegrees() { return this.getYRot(); @@ -89,7 +89,6 @@ + this.yRotLast = old.yRotLast; + this.xRotLast = old.xRotLast; + this.lastOnGround = old.lastOnGround; -+ this.wasShiftKeyDown = old.wasShiftKeyDown; + this.wasSprinting = old.wasSprinting; + this.positionReminder = old.positionReminder; } diff --git a/patches/minecraft/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch b/patches/minecraft/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch index f56cf7ec53..00c1d7efeb 100644 --- a/patches/minecraft/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/DimensionSpecialEffects.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/DimensionSpecialEffects.java +++ b/net/minecraft/client/renderer/DimensionSpecialEffects.java -@@ -36,7 +_,7 @@ +@@ -32,7 +_,7 @@ } public static DimensionSpecialEffects forType(DimensionType p_108877_) { diff --git a/patches/minecraft/net/minecraft/client/renderer/FogRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/FogRenderer.java.patch deleted file mode 100644 index 6c6c933d70..0000000000 --- a/patches/minecraft/net/minecraft/client/renderer/FogRenderer.java.patch +++ /dev/null @@ -1,27 +0,0 @@ ---- a/net/minecraft/client/renderer/FogRenderer.java -+++ b/net/minecraft/client/renderer/FogRenderer.java -@@ -187,6 +_,12 @@ - f2 = f2 * (1.0F - f10) + f2 * f12 * f10; - } - -+ Vector3f fogColor = net.minecraftforge.client.ForgeHooksClient.getFogColor(p_362477_, p_364035_, p_361507_, p_361512_, p_367602_, f, f1, f2); -+ -+ f = fogColor.x(); -+ f1 = fogColor.y(); -+ f2 = fogColor.z(); -+ - return new Vector4f(f, f1, f2, 1.0F); - } - -@@ -265,9 +_,10 @@ - fogrenderer$fogdata.shape = FogShape.CYLINDER; - } - -- return new FogParameters( -+ var original = new FogParameters( - fogrenderer$fogdata.start, fogrenderer$fogdata.end, fogrenderer$fogdata.shape, p_365589_.x, p_365589_.y, p_365589_.z, p_365589_.w - ); -+ return net.minecraftforge.client.ForgeHooksClient.getFogParameters(p_234174_, fogtype, p_234173_, p_234177_, p_234175_, original); - } - } - diff --git a/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch index 89eceda991..aae10ebe77 100644 --- a/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/GameRenderer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/GameRenderer.java +++ b/net/minecraft/client/renderer/GameRenderer.java -@@ -168,6 +_,10 @@ +@@ -194,6 +_,10 @@ this.setPostEffect(ResourceLocation.withDefaultNamespace("spider")); } else if (p_109107_ instanceof EnderMan) { this.setPostEffect(ResourceLocation.withDefaultNamespace("invert")); @@ -11,21 +11,21 @@ } } -@@ -181,7 +_,13 @@ - if (!(f < 1.0F)) { - PostChain postchain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS); - if (postchain != null) { -+ // TODO: [Forge][Rendering] Check if this blend management is needed anymnore with the new render pipeline changes -+ boolean wasBlendEnabled = com.mojang.blaze3d.opengl.GlStateManager._isBlendEnabled(); -+ if (wasBlendEnabled) -+ com.mojang.blaze3d.opengl.GlStateManager._disableBlend(); - postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool, p_389358_ -> p_389358_.setUniform("Radius", f)); -+ if (wasBlendEnabled) -+ com.mojang.blaze3d.opengl.GlStateManager._enableBlend(); - } +@@ -205,7 +_,13 @@ + public void processBlurEffect() { + PostChain postchain = this.minecraft.getShaderManager().getPostChain(BLUR_POST_CHAIN_ID, LevelTargetBundle.MAIN_TARGETS); + if (postchain != null) { ++ // TODO: [Forge][Rendering] Check if this blend management is needed anymnore with the new render pipeline changes ++ boolean wasBlendEnabled = com.mojang.blaze3d.opengl.GlStateManager._isBlendEnabled(); ++ if (wasBlendEnabled) ++ com.mojang.blaze3d.opengl.GlStateManager._disableBlend(); + postchain.process(this.minecraft.getMainRenderTarget(), this.resourcePool); ++ if (wasBlendEnabled) ++ com.mojang.blaze3d.opengl.GlStateManager._enableBlend(); } } -@@ -347,7 +_,7 @@ + +@@ -364,7 +_,7 @@ f *= Mth.lerp(f2, 1.0F, 0.85714287F); } @@ -34,21 +34,7 @@ } } -@@ -490,11 +_,11 @@ - RenderTarget rendertarget = this.minecraft.getMainRenderTarget(); - RenderSystem.getDevice().createCommandEncoder().clearDepthTexture(rendertarget.getDepthTexture(), 1.0); - Matrix4f matrix4f = new Matrix4f() -- .setOrtho(0.0F, (float)(window.getWidth() / window.getGuiScale()), (float)(window.getHeight() / window.getGuiScale()), 0.0F, 1000.0F, 21000.0F); -+ .setOrtho(0.0F, (float)(window.getWidth() / window.getGuiScale()), (float)(window.getHeight() / window.getGuiScale()), 0.0F, 1000.0F, net.minecraftforge.client.ForgeHooksClient.getGuiFarPlane()); - RenderSystem.setProjectionMatrix(matrix4f, ProjectionType.ORTHOGRAPHIC); - Matrix4fStack matrix4fstack = RenderSystem.getModelViewStack(); - matrix4fstack.pushMatrix(); -- matrix4fstack.translation(0.0F, 0.0F, -11000.0F); -+ matrix4fstack.translation(0.0F, 0.0F, 10000F - net.minecraftforge.client.ForgeHooksClient.getGuiFarPlane()); - Lighting.setupFor3DItems(); - GuiGraphics guigraphics = new GuiGraphics(this.minecraft, this.renderBuffers.bufferSource()); - if (flag && p_109096_ && this.minecraft.level != null) { -@@ -520,7 +_,7 @@ +@@ -512,7 +_,7 @@ } } else if (flag && this.minecraft.screen != null) { try { @@ -57,7 +43,7 @@ } catch (Throwable throwable1) { CrashReport crashreport1 = CrashReport.forThrowable(throwable1, "Rendering screen"); CrashReportCategory crashreportcategory1 = crashreport1.addCategory("Screen render details"); -@@ -654,6 +_,9 @@ +@@ -646,6 +_,9 @@ if (this.minecraft.options.bobView().get()) { this.bobView(posestack, camera.getPartialTickTime()); } diff --git a/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch b/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch index 7bfc36b098..973cbe31e2 100644 --- a/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/ItemBlockRenderTypes.java.patch @@ -1,63 +1,62 @@ --- a/net/minecraft/client/renderer/ItemBlockRenderTypes.java +++ b/net/minecraft/client/renderer/ItemBlockRenderTypes.java -@@ -18,6 +_,7 @@ +@@ -19,6 +_,7 @@ @OnlyIn(Dist.CLIENT) public class ItemBlockRenderTypes { + @Deprecated - private static final Map TYPE_BY_BLOCK = Util.make(Maps.newHashMap(), p_389364_ -> { - RenderType rendertype = RenderType.tripwire(); - p_389364_.put(Blocks.TRIPWIRE, rendertype); -@@ -352,6 +_,7 @@ - p_389364_.put(Blocks.BUBBLE_COLUMN, rendertype3); - p_389364_.put(Blocks.TINTED_GLASS, rendertype3); + private static final Map TYPE_BY_BLOCK = Util.make(Maps.newHashMap(), p_389364_ -> { + ChunkSectionLayer chunksectionlayer = ChunkSectionLayer.TRIPWIRE; + p_389364_.put(Blocks.TRIPWIRE, chunksectionlayer); +@@ -353,12 +_,15 @@ + p_389364_.put(Blocks.BUBBLE_COLUMN, chunksectionlayer3); + p_389364_.put(Blocks.TINTED_GLASS, chunksectionlayer3); }); + @Deprecated - private static final Map TYPE_BY_FLUID = Util.make(Maps.newHashMap(), p_109290_ -> { - RenderType rendertype = RenderType.translucent(); - p_109290_.put(Fluids.FLOWING_WATER, rendertype); -@@ -359,6 +_,8 @@ + private static final Map LAYER_BY_FLUID = Util.make(Maps.newHashMap(), p_404902_ -> { + p_404902_.put(Fluids.FLOWING_WATER, ChunkSectionLayer.TRANSLUCENT); + p_404902_.put(Fluids.WATER, ChunkSectionLayer.TRANSLUCENT); }); private static boolean renderCutout; + /** @deprecated Forge: Use {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */ + @Deprecated // Note: this method does NOT support model-based render types - public static RenderType getChunkRenderType(BlockState p_109283_) { + public static ChunkSectionLayer getChunkRenderType(BlockState p_109283_) { Block block = p_109283_.getBlock(); if (block instanceof LeavesBlock) { @@ -369,6 +_,8 @@ } } -+ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getMovingBlockRenderType(RenderType)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */ ++ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getMovingBlockRenderType(ChunkSectionLayer)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */ + @Deprecated // Note: this method does NOT support model-based render types public static RenderType getMovingBlockRenderType(BlockState p_109294_) { Block block = p_109294_.getBlock(); if (block instanceof LeavesBlock) { -@@ -383,11 +_,14 @@ +@@ -389,11 +_,14 @@ } } -+ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getEntityRenderType(RenderType)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */ ++ /** @deprecated Forge: Use {@link net.minecraftforge.client.RenderTypeHelper#getEntityRenderType(ChunkSectionLayer)} while iterating through {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */ + @Deprecated // Note: this method does NOT support model-based render types public static RenderType getRenderType(BlockState p_364446_) { - RenderType rendertype = getChunkRenderType(p_364446_); - return rendertype == RenderType.translucent() ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet(); + ChunkSectionLayer chunksectionlayer = getChunkRenderType(p_364446_); + return chunksectionlayer == ChunkSectionLayer.TRANSLUCENT ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet(); } + /* Forge: Use {@link net.minecraft.client.resources.model.BakedModel#getRenderPasses(ItemStack, boolean)} and {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(ItemStack, boolean)}. */ public static RenderType getRenderType(ItemStack p_363859_) { if (p_363859_.getItem() instanceof BlockItem blockitem) { Block block = blockitem.getBlock(); -@@ -397,12 +_,81 @@ +@@ -403,12 +_,71 @@ } } + // Note: this method does NOT support model-based render types - public static RenderType getRenderLayer(FluidState p_109288_) { -- RenderType rendertype = TYPE_BY_FLUID.get(p_109288_.getType()); -+ RenderType rendertype = FLUID_RENDER_TYPES.get(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(p_109288_.getType())); - return rendertype != null ? rendertype : RenderType.solid(); + public static ChunkSectionLayer getRenderLayer(FluidState p_109288_) { +- ChunkSectionLayer chunksectionlayer = LAYER_BY_FLUID.get(p_109288_.getType()); ++ var chunksectionlayer = FLUID_RENDER_TYPES.get(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(p_109288_.getType())); + return chunksectionlayer != null ? chunksectionlayer : ChunkSectionLayer.SOLID; } public static void setFancy(boolean p_109292_) { @@ -69,24 +68,21 @@ + return renderCutout; + } + -+ private static final net.minecraftforge.client.ChunkRenderTypeSet CUTOUT_MIPPED = net.minecraftforge.client.ChunkRenderTypeSet.of(RenderType.cutoutMipped()); -+ private static final net.minecraftforge.client.ChunkRenderTypeSet SOLID = net.minecraftforge.client.ChunkRenderTypeSet.of(RenderType.solid()); -+ private static final Map, net.minecraftforge.client.ChunkRenderTypeSet> BLOCK_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(TYPE_BY_BLOCK.size(), 0.5F), map -> { ++ private static final java.util.Collection CUTOUT_MIPPED = java.util.EnumSet.of(ChunkSectionLayer.CUTOUT_MIPPED); ++ private static final java.util.Collection SOLID = java.util.EnumSet.of(ChunkSectionLayer.SOLID); ++ private static final Map, java.util.Collection> BLOCK_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(TYPE_BY_BLOCK.size(), 0.5F), map -> { + map.defaultReturnValue(SOLID); -+ for(Map.Entry entry : TYPE_BY_BLOCK.entrySet()) { -+ map.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(entry.getKey()), net.minecraftforge.client.ChunkRenderTypeSet.of(entry.getValue())); -+ } ++ for(Map.Entry entry : TYPE_BY_BLOCK.entrySet()) ++ map.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(entry.getKey()), java.util.EnumSet.of(entry.getValue())); + }); -+ private static final Map, RenderType> FLUID_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(TYPE_BY_FLUID.size(), 0.5F), map -> { -+ map.defaultReturnValue(RenderType.solid()); -+ for(Map.Entry entry : TYPE_BY_FLUID.entrySet()) { ++ private static final Map, ChunkSectionLayer> FLUID_RENDER_TYPES = Util.make(new it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap<>(LAYER_BY_FLUID.size(), 0.5F), map -> { ++ map.defaultReturnValue(ChunkSectionLayer.SOLID); ++ for(var entry : LAYER_BY_FLUID.entrySet()) + map.put(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(entry.getKey()), entry.getValue()); -+ } + }); + + /** @deprecated Use {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)}. */ -+ @Deprecated(forRemoval = true, since = "1.21.4") -+ public static net.minecraftforge.client.ChunkRenderTypeSet getRenderLayers(BlockState state) { ++ public static java.util.Collection getRenderLayers(BlockState state) { + Block block = state.getBlock(); + if (block instanceof LeavesBlock) { + return renderCutout ? CUTOUT_MIPPED : SOLID; @@ -95,28 +91,25 @@ + } + } + -+ /** @deprecated Set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) or override {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)} */ -+ @Deprecated(forRemoval = true, since = "1.21.4") -+ public static void setRenderLayer(Block block, RenderType type) { -+ com.google.common.base.Preconditions.checkArgument(type.getChunkLayerId() >= 0, "The argument must be a valid chunk render type returned by RenderType#chunkBufferLayers()."); -+ setRenderLayer(block, net.minecraftforge.client.ChunkRenderTypeSet.of(type)); -+ } -+ -+ /** @deprecated Set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) or override {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)} */ -+ @Deprecated(forRemoval = true, since = "1.21.4") -+ public static synchronized void setRenderLayer(Block block, java.util.function.Predicate predicate) { -+ setRenderLayer(block, createSetFromPredicate(predicate)); -+ } -+ -+ /** @deprecated Set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) or override {@link net.minecraft.client.resources.model.BakedModel#getRenderTypes(BlockState, net.minecraft.util.RandomSource, net.minecraftforge.client.model.data.ModelData)} */ -+ @Deprecated(forRemoval = true, since = "1.21.4") -+ public static synchronized void setRenderLayer(Block block, net.minecraftforge.client.ChunkRenderTypeSet layers) { ++ /** ++ * It is recommended to set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) so that it can be data driven. ++ * But if you want to set it in code feel free to set it here like vanilla does. ++ */ ++ public static void setRenderLayer(Block block, ChunkSectionLayer type) { + checkClientLoading(); -+ BLOCK_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(block), layers); ++ BLOCK_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(block), java.util.EnumSet.of(type)); + } + -+ public static synchronized void setRenderLayer(Fluid fluid, RenderType type) { -+ com.google.common.base.Preconditions.checkArgument(type.getChunkLayerId() >= 0, "The argument must be a valid chunk render type returned by RenderType#chunkBufferLayers()."); ++ /** ++ * It is recommended to set your render type in your block model's JSON (eg. {@code "render_type": "cutout"}) so that it can be data driven. ++ * But if you want to set it in code feel free to set it here like vanilla does. ++ */ ++ public static synchronized void setRenderLayer(Block block, ChunkSectionLayer first, ChunkSectionLayer... others) { ++ checkClientLoading(); ++ BLOCK_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.BLOCKS.getDelegateOrThrow(block), java.util.EnumSet.of(first, others)); ++ } ++ ++ public static synchronized void setRenderLayer(Fluid fluid, ChunkSectionLayer type) { + checkClientLoading(); + FLUID_RENDER_TYPES.put(net.minecraftforge.registries.ForgeRegistries.FLUIDS.getDelegateOrThrow(fluid), type); + } @@ -126,9 +119,5 @@ + "Render layers can only be set during client loading! " + + "This might ideally be done from `FMLClientSetupEvent`." + ); -+ } -+ -+ private static net.minecraftforge.client.ChunkRenderTypeSet createSetFromPredicate(java.util.function.Predicate predicate) { -+ return net.minecraftforge.client.ChunkRenderTypeSet.of(RenderType.chunkBufferLayers().stream().filter(predicate).toArray(RenderType[]::new)); } } diff --git a/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch index a94b392ad4..f75ac4e2be 100644 --- a/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/LevelRenderer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/LevelRenderer.java +++ b/net/minecraft/client/renderer/LevelRenderer.java -@@ -113,7 +_,7 @@ +@@ -121,7 +_,7 @@ private final SkyRenderer skyRenderer = new SkyRenderer(); private final CloudRenderer cloudRenderer = new CloudRenderer(); private final WorldBorderRenderer worldBorderRenderer = new WorldBorderRenderer(); @@ -9,28 +9,16 @@ @Nullable private ClientLevel level; private final SectionOcclusionGraph sectionOcclusionGraph = new SectionOcclusionGraph(); -@@ -483,7 +_,7 @@ - postchain1.addToFrame(framegraphbuilder, i, j, this.targets, null); +@@ -480,7 +_,7 @@ + postchain1.addToFrame(framegraphbuilder, i, j, this.targets); } -- this.addParticlesPass(framegraphbuilder, p_109604_, f, fogparameters); -+ this.addParticlesPass(framegraphbuilder, p_109604_, f, fogparameters, frustum); +- this.addParticlesPass(framegraphbuilder, p_109604_, f, p_407881_); ++ this.addParticlesPass(framegraphbuilder, p_109604_, f, p_407881_, frustum); CloudStatus cloudstatus = this.minecraft.options.getCloudsType(); if (cloudstatus != CloudStatus.OFF) { - float f2 = this.level.effects().getCloudHeight(); -@@ -561,7 +_,11 @@ - double d2 = vec3.z(); - p_369478_.push("terrain"); - this.renderSectionLayer(RenderType.solid(), d0, d1, d2, p_361439_, p_369924_); -+ // FORGE: fix flickering leaves when mods mess up the blurMipmap settings -+ var atlas = this.minecraft.getModelManager().getAtlas(net.minecraft.client.renderer.texture.TextureAtlas.LOCATION_BLOCKS); -+ atlas.setBlurMipmap(false, this.minecraft.options.mipmapLevels().get() > 0); - this.renderSectionLayer(RenderType.cutoutMipped(), d0, d1, d2, p_361439_, p_369924_); -+ atlas.restoreLastBlurMipmap(); - this.renderSectionLayer(RenderType.cutout(), d0, d1, d2, p_361439_, p_369924_); - if (this.level.effects().constantAmbientLight()) { - Lighting.setupNetherLevel(); -@@ -586,7 +_,7 @@ + Optional optional = this.level.dimensionType().cloudHeight(); +@@ -577,7 +_,7 @@ multibuffersource$buffersource.endLastBatch(); this.checkPoseStack(posestack); p_369478_.popPush("blockentities"); @@ -39,7 +27,7 @@ multibuffersource$buffersource.endLastBatch(); this.checkPoseStack(posestack); multibuffersource$buffersource.endBatch(RenderType.solid()); -@@ -600,8 +_,8 @@ +@@ -591,8 +_,8 @@ multibuffersource$buffersource.endBatch(Sheets.hangingSignSheet()); multibuffersource$buffersource.endBatch(Sheets.chestSheet()); this.renderBuffers.outlineBufferSource().endOutlineBatch(); @@ -50,10 +38,10 @@ } p_369478_.popPush("debug"); -@@ -629,8 +_,8 @@ - this.renderSectionLayer(RenderType.translucent(), d0, d1, d2, p_361439_, p_369924_); +@@ -620,8 +_,8 @@ + chunksectionstorender.renderGroup(ChunkSectionLayerGroup.TRANSLUCENT); p_369478_.popPush("string"); - this.renderSectionLayer(RenderType.tripwire(), d0, d1, d2, p_361439_, p_369924_); + chunksectionstorender.renderGroup(ChunkSectionLayerGroup.TRIPWIRE); - if (p_362593_) { - this.renderBlockOutline(p_364769_, multibuffersource$buffersource, posestack, true); + if (renderOutline) { @@ -61,16 +49,16 @@ } multibuffersource$buffersource.endBatch(); -@@ -638,7 +_,7 @@ +@@ -629,7 +_,7 @@ }); } -- private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, FogParameters p_363695_) { -+ private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, FogParameters p_363695_, Frustum frustum) { +- private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, GpuBufferSlice p_405857_) { ++ private void addParticlesPass(FrameGraphBuilder p_366471_, Camera p_363128_, float p_365755_, GpuBufferSlice p_405857_, Frustum frustum) { FramePass framepass = p_366471_.addPass("particles"); if (this.targets.particles != null) { this.targets.particles = framepass.readsAndWrites(this.targets.particles); -@@ -655,7 +_,7 @@ +@@ -646,7 +_,7 @@ resourcehandle1.get().copyDepthFrom(resourcehandle.get()); } @@ -79,7 +67,7 @@ }); } -@@ -725,9 +_,9 @@ +@@ -716,9 +_,9 @@ || p_365712_.isDetached() || p_365712_.getEntity() instanceof LivingEntity && ((LivingEntity)p_365712_.getEntity()).isSleeping() ) @@ -91,7 +79,7 @@ flag = true; } } -@@ -767,9 +_,10 @@ +@@ -758,9 +_,10 @@ } } @@ -104,15 +92,15 @@ Vec3 vec3 = p_369847_.getPosition(); double d0 = vec3.x(); double d1 = vec3.y(); -@@ -779,6 +_,7 @@ - List list = sectionrenderdispatcher$rendersection.getCompiled().getRenderableBlockEntities(); +@@ -770,6 +_,7 @@ + List list = sectionrenderdispatcher$rendersection.getSectionMesh().getRenderableBlockEntities(); if (!list.isEmpty()) { for (BlockEntity blockentity : list) { + if (!frustum.isVisible(blockentity.getRenderBoundingBox())) continue; BlockPos blockpos = blockentity.getBlockPos(); MultiBufferSource multibuffersource = p_362022_; p_366168_.pushPose(); -@@ -798,6 +_,9 @@ +@@ -789,6 +_,9 @@ } } @@ -122,10 +110,10 @@ this.blockEntityRenderDispatcher.render(blockentity, p_367074_, p_366168_, multibuffersource); p_366168_.popPose(); } -@@ -806,13 +_,18 @@ - - synchronized (this.globalBlockEntities) { - for (BlockEntity blockentity1 : this.globalBlockEntities) { +@@ -802,13 +_,18 @@ + if (blockentity1.isRemoved()) { + iterator.remove(); + } else { + if (!frustum.isVisible(blockentity1.getRenderBoundingBox())) continue; BlockPos blockpos1 = blockentity1.getBlockPos(); p_366168_.pushPose(); @@ -141,7 +129,7 @@ } private void renderBlockDestroyAnimation(PoseStack p_366956_, Camera p_369324_, MultiBufferSource.BufferSource p_365998_) { -@@ -831,14 +_,14 @@ +@@ -827,14 +_,14 @@ p_366956_.translate(blockpos.getX() - d0, blockpos.getY() - d1, blockpos.getZ() - d2); PoseStack.Pose posestack$pose = p_366956_.last(); VertexConsumer vertexconsumer = new SheetedDecalTextureGenerator(p_365998_.getBuffer(ModelBakery.DESTROY_TYPES.get(i)), posestack$pose, 1.0F); @@ -158,7 +146,7 @@ if (this.minecraft.hitResult instanceof BlockHitResult blockhitresult) { if (blockhitresult.getType() != HitResult.Type.MISS) { BlockPos blockpos = blockhitresult.getBlockPos(); -@@ -849,6 +_,9 @@ +@@ -845,6 +_,9 @@ return; } @@ -168,7 +156,7 @@ Vec3 vec3 = p_367935_.getPosition(); Boolean obool = this.minecraft.options.highContrastBlockOutline().get(); if (obool) { -@@ -864,6 +_,8 @@ +@@ -860,6 +_,8 @@ p_367206_.endLastBatch(); } } @@ -177,7 +165,7 @@ } } -@@ -1359,7 +_,7 @@ +@@ -1344,7 +_,7 @@ } else { int i = p_398213_.packedBrightness(p_109538_, p_109540_); int j = LightTexture.block(i); @@ -186,7 +174,7 @@ if (j < k) { int l = LightTexture.sky(i); return LightTexture.pack(k, l); -@@ -1422,6 +_,22 @@ +@@ -1406,6 +_,22 @@ public CloudRenderer getCloudRenderer() { return this.cloudRenderer; diff --git a/patches/minecraft/net/minecraft/client/renderer/LightTexture.java.patch b/patches/minecraft/net/minecraft/client/renderer/LightTexture.java.patch index 55ee25fdb7..c74d3334bd 100644 --- a/patches/minecraft/net/minecraft/client/renderer/LightTexture.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/LightTexture.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/LightTexture.java +++ b/net/minecraft/client/renderer/LightTexture.java -@@ -142,7 +_,7 @@ +@@ -171,7 +_,7 @@ } public static int block(int p_109884_) { diff --git a/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch b/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch index d71b63d3d6..5e8d3b6a3d 100644 --- a/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/RenderType.java.patch @@ -1,15 +1,6 @@ --- a/net/minecraft/client/renderer/RenderType.java +++ b/net/minecraft/client/renderer/RenderType.java -@@ -633,9 +_,20 @@ - .createCompositeState(false) - ); - private static final ImmutableList CHUNK_BUFFER_LAYERS = ImmutableList.of(solid(), cutoutMipped(), cutout(), translucent(), tripwire()); -+ static { -+ int i = 0; -+ for (var layer : CHUNK_BUFFER_LAYERS) -+ layer.chunkLayerId = i++; -+ } -+ +@@ -521,6 +_,11 @@ private final int bufferSize; private final boolean affectsCrumbling; private final boolean sortOnUpload; @@ -21,7 +12,7 @@ public static RenderType solid() { return SOLID; -@@ -820,7 +_,7 @@ +@@ -701,7 +_,7 @@ } public static RenderType text(ResourceLocation p_110498_) { @@ -30,7 +21,7 @@ } public static RenderType textBackground() { -@@ -828,19 +_,19 @@ +@@ -709,19 +_,19 @@ } public static RenderType textIntensity(ResourceLocation p_173238_) { @@ -54,7 +45,7 @@ } public static RenderType textBackgroundSeeThrough() { -@@ -848,7 +_,7 @@ +@@ -729,7 +_,7 @@ } public static RenderType textIntensitySeeThrough(ResourceLocation p_173241_) { diff --git a/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch index dde920d9ad..bd971ff8f8 100644 --- a/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/ScreenEffectRenderer.java.patch @@ -1,33 +1,32 @@ --- a/net/minecraft/client/renderer/ScreenEffectRenderer.java +++ b/net/minecraft/client/renderer/ScreenEffectRenderer.java -@@ -27,17 +_,24 @@ - Player player = p_110719_.player; - if (!player.noPhysics) { - BlockState blockstate = getViewBlockingState(player); -- if (blockstate != null) { -- renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockstate), p_110720_, p_378238_); -+ var overlay = getOverlayBlock(player); -+ if (overlay != null) { -+ if (!net.minecraftforge.client.ForgeHooksClient.renderBlockOverlay(player, p_110720_, net.minecraftforge.client.event.RenderBlockScreenEffectEvent.OverlayType.BLOCK, overlay.getLeft(), overlay.getRight())) { -+ renderTex(p_110719_.getBlockRenderer().getBlockModelShaper().getParticleIcon(overlay.getLeft(), p_110719_.level, overlay.getRight()), p_110720_, p_378238_); -+ } - } - } - - if (!p_110719_.player.isSpectator()) { - if (p_110719_.player.isEyeInFluid(FluidTags.WATER)) { -+ if (!net.minecraftforge.client.ForgeHooksClient.renderWaterOverlay(player, p_110720_)) - renderWater(p_110719_, p_110720_, p_378238_); -+ } else if (!player.getEyeInFluidType().isAir()) { -+ net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions.of(player.getEyeInFluidType()).renderOverlay(p_110719_, p_110720_, p_378238_); +@@ -55,18 +_,24 @@ + Player player = this.minecraft.player; + if (this.minecraft.options.getCameraType().isFirstPerson() && !p_409640_) { + if (!player.noPhysics) { +- BlockState blockstate = getViewBlockingState(player); ++ var overlay = getOverlayBlock(player); ++ BlockState blockstate = overlay == null ? null : overlay.getLeft(); + if (blockstate != null) { ++ if (!net.minecraftforge.client.ForgeHooksClient.renderBlockOverlay(player, posestack, net.minecraftforge.client.event.RenderBlockScreenEffectEvent.OverlayType.BLOCK, overlay.getLeft(), overlay.getRight())) + renderTex(this.minecraft.getBlockRenderer().getBlockModelShaper().getParticleIcon(blockstate), posestack, this.bufferSource); + } } - if (p_110719_.player.isOnFire()) { -+ if (!net.minecraftforge.client.ForgeHooksClient.renderFireOverlay(player, p_110720_)) - renderFire(p_110720_, p_378238_); + if (!this.minecraft.player.isSpectator()) { + if (this.minecraft.player.isEyeInFluid(FluidTags.WATER)) { ++ if (!net.minecraftforge.client.ForgeHooksClient.renderWaterOverlay(player, posestack)) + renderWater(this.minecraft, posestack, this.bufferSource); ++ } else if (!player.getEyeInFluidType().isAir()) { ++ net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions.of(player.getEyeInFluidType()).renderOverlay(this.minecraft, posestack, this.bufferSource); + } + + if (this.minecraft.player.isOnFire()) { ++ if (!net.minecraftforge.client.ForgeHooksClient.renderFireOverlay(player, posestack)) + renderFire(posestack, this.bufferSource); + } } - } -@@ -45,6 +_,12 @@ +@@ -116,6 +_,12 @@ @Nullable private static BlockState getViewBlockingState(Player p_110717_) { @@ -40,7 +39,7 @@ BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); for (int i = 0; i < 8; i++) { -@@ -54,7 +_,7 @@ +@@ -125,7 +_,7 @@ blockpos$mutableblockpos.set(d0, d1, d2); BlockState blockstate = p_110717_.level().getBlockState(blockpos$mutableblockpos); if (blockstate.getRenderShape() != RenderShape.INVISIBLE && blockstate.isViewBlocking(p_110717_.level(), blockpos$mutableblockpos)) { @@ -49,7 +48,7 @@ } } -@@ -82,6 +_,10 @@ +@@ -153,6 +_,10 @@ } private static void renderWater(Minecraft p_110726_, PoseStack p_110727_, MultiBufferSource p_376402_) { @@ -60,7 +59,7 @@ BlockPos blockpos = BlockPos.containing(p_110726_.player.getX(), p_110726_.player.getEyeY(), p_110726_.player.getZ()); float f = LightTexture.getBrightness(p_110726_.player.level().dimensionType(), p_110726_.player.level().getMaxLocalRawBrightness(blockpos)); int i = ARGB.colorFromFloat(0.1F, f, f, f); -@@ -94,7 +_,7 @@ +@@ -165,7 +_,7 @@ float f7 = -p_110726_.player.getYRot() / 64.0F; float f8 = p_110726_.player.getXRot() / 64.0F; Matrix4f matrix4f = p_110727_.last().pose(); diff --git a/patches/minecraft/net/minecraft/client/renderer/block/ModelBlockRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/ModelBlockRenderer.java.patch index 9287bddb8e..ee887bd3a4 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/ModelBlockRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/ModelBlockRenderer.java.patch @@ -28,7 +28,7 @@ - int p_111076_ + int p_111076_, + net.minecraftforge.client.model.data.ModelData modelData, -+ @org.jetbrains.annotations.Nullable net.minecraft.client.renderer.RenderType renderType ++ @org.jetbrains.annotations.Nullable net.minecraft.client.renderer.chunk.ChunkSectionLayer renderType ) { - for (BlockModelPart blockmodelpart : p_397754_.collectParts(RandomSource.create(42L))) { + for (BlockModelPart blockmodelpart : p_397754_.collectParts(RandomSource.create(42L), modelData, renderType)) { diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModelPart.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModelPart.java.patch new file mode 100644 index 0000000000..775c8f68f9 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/BlockModelPart.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/client/renderer/block/model/BlockModelPart.java ++++ b/net/minecraft/client/renderer/block/model/BlockModelPart.java +@@ -10,7 +_,7 @@ + import net.minecraftforge.api.distmarker.OnlyIn; + + @OnlyIn(Dist.CLIENT) +-public interface BlockModelPart { ++public interface BlockModelPart extends net.minecraftforge.client.extensions.IForgeBlockModelPart { + List getQuads(@Nullable Direction p_395320_); + + boolean useAmbientOcclusion(); diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch index 705f6f07b5..4a6b471805 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/FaceBakery.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/block/model/FaceBakery.java +++ b/net/minecraft/client/renderer/block/model/FaceBakery.java -@@ -67,7 +_,14 @@ +@@ -65,7 +_,14 @@ recalculateWinding(aint, direction); } diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java.patch new file mode 100644 index 0000000000..ce2be91fb8 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java.patch @@ -0,0 +1,24 @@ +--- a/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java ++++ b/net/minecraft/client/renderer/block/model/SimpleModelWrapper.java +@@ -13,14 +_,19 @@ + import net.minecraftforge.api.distmarker.OnlyIn; + + @OnlyIn(Dist.CLIENT) +-public record SimpleModelWrapper(QuadCollection quads, boolean useAmbientOcclusion, TextureAtlasSprite particleIcon) implements BlockModelPart { ++public record SimpleModelWrapper(QuadCollection quads, boolean useAmbientOcclusion, TextureAtlasSprite particleIcon, net.minecraft.client.renderer.chunk.ChunkSectionLayer layer, net.minecraft.client.renderer.chunk.ChunkSectionLayer layerFast) implements BlockModelPart { + public static SimpleModelWrapper bake(ModelBaker p_395631_, ResourceLocation p_396950_, ModelState p_396899_) { + ResolvedModel resolvedmodel = p_395631_.getModel(p_396950_); + TextureSlots textureslots = resolvedmodel.getTopTextureSlots(); + boolean flag = resolvedmodel.getTopAmbientOcclusion(); + TextureAtlasSprite textureatlassprite = resolvedmodel.resolveParticleSprite(textureslots, p_395631_); + QuadCollection quadcollection = resolvedmodel.bakeTopGeometry(textureslots, p_395631_, p_396899_); +- return new SimpleModelWrapper(quadcollection, flag, textureatlassprite); ++ var ctx = resolvedmodel.getContext(); ++ return new SimpleModelWrapper(quadcollection, flag, textureatlassprite, ctx.getRenderType().block(), ctx.getRenderTypeFast().block()); ++ } ++ ++ public SimpleModelWrapper(QuadCollection quads, boolean useAmbientOcclusion, TextureAtlasSprite particleIcon) { ++ this(quads, useAmbientOcclusion, particleIcon, null, null); + } + + @Override diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/SingleVariant.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/SingleVariant.java.patch new file mode 100644 index 0000000000..738a4fe743 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/SingleVariant.java.patch @@ -0,0 +1,29 @@ +--- a/net/minecraft/client/renderer/block/model/SingleVariant.java ++++ b/net/minecraft/client/renderer/block/model/SingleVariant.java +@@ -12,9 +_,13 @@ + @OnlyIn(Dist.CLIENT) + public class SingleVariant implements BlockStateModel { + private final BlockModelPart model; ++ private final java.util.Collection layer; ++ private final java.util.Collection layerFast; + + public SingleVariant(BlockModelPart p_394592_) { + this.model = p_394592_; ++ this.layer = this.model.layer() == null ? null : java.util.EnumSet.of(this.model.layer()); ++ this.layerFast = this.model.layerFast() == null ? null : java.util.EnumSet.of(this.model.layerFast()); + } + + @Override +@@ -25,6 +_,12 @@ + @Override + public TextureAtlasSprite particleIcon() { + return this.model.particleIcon(); ++ } ++ ++ @Override ++ public java.util.Collection getRenderTypes(net.minecraft.world.level.block.state.BlockState state, RandomSource rand, net.minecraftforge.client.model.data.ModelData data) { ++ var type = net.minecraft.client.renderer.ItemBlockRenderTypes.isFancy() ? layer : layerFast; ++ return type != null ? type : BlockStateModel.super.getRenderTypes(state, rand, data); + } + + @OnlyIn(Dist.CLIENT) diff --git a/patches/minecraft/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java.patch b/patches/minecraft/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java.patch index ac60287467..c084fc6f0d 100644 --- a/patches/minecraft/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java.patch @@ -1,5 +1,15 @@ --- a/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java +++ b/net/minecraft/client/renderer/block/model/multipart/MultiPartModel.java +@@ -26,6 +_,9 @@ + private final BlockState blockState; + @Nullable + private List models; ++ private boolean cacheKey = false; ++ @Nullable ++ private java.util.Collection cache; + + MultiPartModel(MultiPartModel.SharedBakedState p_391554_, BlockState p_397918_) { + this.shared = p_391554_; @@ -38,6 +_,11 @@ } @@ -12,12 +22,12 @@ public void collectParts(RandomSource p_391247_, List p_397207_) { if (this.models == null) { this.models = this.shared.selectModels(this.blockState); -@@ -51,6 +_,20 @@ +@@ -51,6 +_,33 @@ } } + @Override -+ public void collectParts(RandomSource rand, List dest, net.minecraftforge.client.model.data.ModelData extraData, net.minecraft.client.renderer.RenderType renderType) { ++ public void collectParts(RandomSource rand, List dest, net.minecraftforge.client.model.data.ModelData extraData, net.minecraft.client.renderer.chunk.ChunkSectionLayer renderType) { + if (this.models == null) { + this.models = this.shared.selectModels(this.blockState); + } @@ -29,6 +39,19 @@ + blockstatemodel.collectParts(rand, dest, extraData, renderType); + } + } ++ ++ @Override ++ public java.util.Collection getRenderTypes(BlockState state, RandomSource rand, net.minecraftforge.client.model.data.ModelData data) { ++ if (this.models == null) ++ this.models = this.shared.selectModels(this.blockState); ++ if (this.cache == null || this.cacheKey != net.minecraft.client.renderer.ItemBlockRenderTypes.isFancy()) { ++ var tmp = java.util.EnumSet.noneOf(net.minecraft.client.renderer.chunk.ChunkSectionLayer.class); ++ for (var model : this.models) ++ tmp.addAll(model.getRenderTypes(state, rand, data)); ++ this.cache = tmp; ++ } ++ return !this.cache.isEmpty() ? this.cache : BlockStateModel.super.getRenderTypes(state, rand, data); ++ } + @OnlyIn(Dist.CLIENT) public record Selector(Predicate condition, T model) { diff --git a/patches/minecraft/net/minecraft/client/renderer/blockentity/PistonHeadRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/blockentity/PistonHeadRenderer.java.patch index 40b64348a8..f151d43ac6 100644 --- a/patches/minecraft/net/minecraft/client/renderer/blockentity/PistonHeadRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/blockentity/PistonHeadRenderer.java.patch @@ -5,14 +5,15 @@ BlockPos p_112459_, BlockState p_112460_, PoseStack p_112461_, MultiBufferSource p_112462_, Level p_112463_, boolean p_112464_, int p_112465_ ) { - RenderType rendertype = ItemBlockRenderTypes.getMovingBlockRenderType(p_112460_); +- VertexConsumer vertexconsumer = p_112462_.getBuffer(rendertype); +- List list = this.blockRenderer.getBlockModel(p_112460_).collectParts(RandomSource.create(p_112460_.getSeed(p_112459_))); + var model = this.blockRenderer.getBlockModel(p_112460_); + var rand = RandomSource.create(p_112460_.getSeed(p_112459_)); + var data = net.minecraftforge.client.model.data.ModelData.EMPTY; + for (var rendertype : model.getRenderTypes(p_112460_, rand, data)) { + rand = RandomSource.create(p_112460_.getSeed(p_112459_)); // Reset rand to keep - VertexConsumer vertexconsumer = p_112462_.getBuffer(rendertype); -- List list = this.blockRenderer.getBlockModel(p_112460_).collectParts(RandomSource.create(p_112460_.getSeed(p_112459_))); -+ List list = model.collectParts(rand, data, net.minecraftforge.client.RenderTypeHelper.getMovingBlockRenderType(rendertype)); ++ VertexConsumer vertexconsumer = p_112462_.getBuffer(net.minecraftforge.client.RenderTypeHelper.getMovingBlockRenderType(rendertype)); ++ List list = model.collectParts(rand, data, rendertype); this.blockRenderer.getModelRenderer().tesselateBlock(p_112463_, list, p_112460_, p_112459_, p_112461_, vertexconsumer, p_112464_, p_112465_); + } } diff --git a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunkRegion.java.patch b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunkRegion.java.patch deleted file mode 100644 index 1f8c0993ea..0000000000 --- a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderChunkRegion.java.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- a/net/minecraft/client/renderer/chunk/RenderChunkRegion.java -+++ b/net/minecraft/client/renderer/chunk/RenderChunkRegion.java -@@ -78,4 +_,9 @@ - public static int index(int p_345383_, int p_342744_, int p_343921_, int p_343462_) { - return p_343921_ - p_345383_ + (p_343462_ - p_342744_) * 3; - } -+ -+ @Override -+ public net.minecraftforge.client.model.data.ModelDataManager getModelDataManager() { -+ return level.getModelDataManager(); -+ } - } diff --git a/patches/minecraft/net/minecraft/client/renderer/chunk/RenderSectionRegion.java.patch b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderSectionRegion.java.patch new file mode 100644 index 0000000000..bf894c0791 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/chunk/RenderSectionRegion.java.patch @@ -0,0 +1,12 @@ +--- a/net/minecraft/client/renderer/chunk/RenderSectionRegion.java ++++ b/net/minecraft/client/renderer/chunk/RenderSectionRegion.java +@@ -90,4 +_,9 @@ + public static int index(int p_409495_, int p_409337_, int p_407713_, int p_409077_, int p_406510_, int p_408332_) { + return p_409077_ - p_409495_ + (p_406510_ - p_409337_) * 3 + (p_408332_ - p_407713_) * 3 * 3; + } ++ ++ @Override ++ public net.minecraftforge.client.model.data.ModelDataManager getModelDataManager() { ++ return level.getModelDataManager(); ++ } + } diff --git a/patches/minecraft/net/minecraft/client/renderer/chunk/SectionCompiler.java.patch b/patches/minecraft/net/minecraft/client/renderer/chunk/SectionCompiler.java.patch index 180639fc93..c6cae53317 100644 --- a/patches/minecraft/net/minecraft/client/renderer/chunk/SectionCompiler.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/chunk/SectionCompiler.java.patch @@ -1,47 +1,35 @@ --- a/net/minecraft/client/renderer/chunk/SectionCompiler.java +++ b/net/minecraft/client/renderer/chunk/SectionCompiler.java -@@ -43,6 +_,7 @@ +@@ -42,6 +_,7 @@ } - public SectionCompiler.Results compile(SectionPos p_344383_, RenderChunkRegion p_342669_, VertexSorting p_342522_, SectionBufferBuilderPack p_343546_) { + public SectionCompiler.Results compile(SectionPos p_344383_, RenderSectionRegion p_409909_, VertexSorting p_342522_, SectionBufferBuilderPack p_343546_) { + var modelDataMap = net.minecraft.client.Minecraft.getInstance().level.getModelDataManager().getAt(p_344383_); SectionCompiler.Results sectioncompiler$results = new SectionCompiler.Results(); BlockPos blockpos = p_344383_.origin(); BlockPos blockpos1 = blockpos.offset(15, 15, 15); -@@ -74,10 +_,14 @@ +@@ -73,10 +_,14 @@ } if (blockstate.getRenderShape() == RenderShape.MODEL) { -- RenderType rendertype2 = ItemBlockRenderTypes.getChunkRenderType(blockstate); +- ChunkSectionLayer chunksectionlayer2 = ItemBlockRenderTypes.getChunkRenderType(blockstate); + var model = this.blockRenderer.getBlockModel(blockstate); + var data = modelDataMap.getOrDefault(blockpos2, net.minecraftforge.client.model.data.ModelData.EMPTY); -+ data = model.getModelData(p_342669_, blockpos2, blockstate, data); ++ data = model.getModelData(p_409909_, blockpos2, blockstate, data); + randomsource.setSeed(blockstate.getSeed(blockpos2)); // Forge: We set this on purpose twice so that getRenderTypes can have the same RNG as collectParts -+ for (RenderType rendertype2 : model.getRenderTypes(blockstate, randomsource, data)) { - BufferBuilder bufferbuilder1 = this.getOrBeginLayer(map, p_343546_, rendertype2); ++ for (ChunkSectionLayer chunksectionlayer2 : model.getRenderTypes(blockstate, randomsource, data)) { + BufferBuilder bufferbuilder1 = this.getOrBeginLayer(map, p_343546_, chunksectionlayer2); randomsource.setSeed(blockstate.getSeed(blockpos2)); - this.blockRenderer.getBlockModel(blockstate).collectParts(randomsource, list); -+ model.collectParts(randomsource, list, data, rendertype2); ++ model.collectParts(randomsource, list, data, chunksectionlayer2); posestack.pushPose(); posestack.translate( SectionPos.sectionRelative(blockpos2.getX()), SectionPos.sectionRelative(blockpos2.getY()), SectionPos.sectionRelative(blockpos2.getZ()) -@@ -85,6 +_,7 @@ - this.blockRenderer.renderBatched(blockstate, blockpos2, p_342669_, posestack, bufferbuilder1, true, list); +@@ -84,6 +_,7 @@ + this.blockRenderer.renderBatched(blockstate, blockpos2, p_409909_, posestack, bufferbuilder1, true, list); posestack.popPose(); list.clear(); + } } } -@@ -119,9 +_,10 @@ - private void handleBlockEntity(SectionCompiler.Results p_343713_, E p_343478_) { - BlockEntityRenderer blockentityrenderer = this.blockEntityRenderer.getRenderer(p_343478_); - if (blockentityrenderer != null) { -- p_343713_.blockEntities.add(p_343478_); - if (blockentityrenderer.shouldRenderOffScreen(p_343478_)) { - p_343713_.globalBlockEntities.add(p_343478_); -+ } else { -+ p_343713_.blockEntities.add(p_343478_); //FORGE: Fix MC-112730 - } - } - } diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch index 3f7003b501..93f2945054 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/entity/EntityRenderer.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/client/renderer/entity/EntityRenderer.java +++ b/net/minecraft/client/renderer/entity/EntityRenderer.java -@@ -109,8 +_,9 @@ - renderLeash(p_114488_, p_114489_, entityrenderstate$leashstate); +@@ -113,8 +_,9 @@ + } } - if (p_370221_.nameTag != null) { @@ -12,16 +12,16 @@ } } -@@ -278,7 +_,7 @@ +@@ -252,7 +_,7 @@ } p_367427_.distanceToCameraSq = this.entityRenderDispatcher.distanceToSqr(p_367571_); -- boolean flag = p_367427_.distanceToCameraSq < 4096.0 && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq); -+ boolean flag = net.minecraftforge.client.ForgeHooksClient.isNameplateInRenderDistance(p_367571_, p_367427_.distanceToCameraSq) && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq); - if (flag) { +- boolean flag1 = p_367427_.distanceToCameraSq < 4096.0 && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq); ++ boolean flag1 = net.minecraftforge.client.ForgeHooksClient.isNameplateInRenderDistance(p_367571_, p_367427_.distanceToCameraSq) && this.shouldShowName(p_367571_, p_367427_.distanceToCameraSq); + if (flag1) { p_367427_.nameTag = this.getNameTag(p_367571_); p_367427_.nameTagAttachment = p_367571_.getAttachments().getNullable(EntityAttachment.NAME_TAG, 0, p_367571_.getYRot(p_363243_)); -@@ -372,6 +_,7 @@ +@@ -387,6 +_,7 @@ } protected void extractAdditionalHitboxes(T p_392955_, Builder p_395671_, float p_395030_) { diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch index f6da161137..dea6a8307b 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/entity/ItemRenderer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/entity/ItemRenderer.java +++ b/net/minecraft/client/renderer/entity/ItemRenderer.java -@@ -114,7 +_,7 @@ +@@ -116,7 +_,7 @@ f3 = 1.0F; } diff --git a/patches/minecraft/net/minecraft/client/renderer/fog/FogRenderer.java.patch b/patches/minecraft/net/minecraft/client/renderer/fog/FogRenderer.java.patch new file mode 100644 index 0000000000..68b76de594 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/renderer/fog/FogRenderer.java.patch @@ -0,0 +1,24 @@ +--- a/net/minecraft/client/renderer/fog/FogRenderer.java ++++ b/net/minecraft/client/renderer/fog/FogRenderer.java +@@ -155,6 +_,13 @@ + f2 = Mth.lerp(f6, f2, f2 * f7); + } + ++ ++ var fogColor = net.minecraftforge.client.ForgeHooksClient.getFogColor(p_407993_, p_409359_, p_409862_, p_409400_, p_406105_, f, f1, f2); ++ ++ f = fogColor.x(); ++ f1 = fogColor.y(); ++ f2 = fogColor.z(); ++ + return new Vector4f(f5, f1, f2, 1.0F); + } + } +@@ -181,6 +_,7 @@ + float f2 = Mth.clamp(f1 / 10.0F, 4.0F, 64.0F); + fogdata.renderDistanceStart = f1 - f2; + fogdata.renderDistanceEnd = f1; ++ vector4f = net.minecraftforge.client.ForgeHooksClient.setupFog(fogtype, p_407701_, p_406871_, fogdata, vector4f); + + try (GpuBuffer.MappedView gpubuffer$mappedview = RenderSystem.getDevice().createCommandEncoder().mapBuffer(this.regularBuffer.currentBuffer(), false, true)) { + this.updateBuffer( diff --git a/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch b/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch index 96a59eefef..08d16bc5eb 100644 --- a/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/special/SpecialModelRenderers.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/special/SpecialModelRenderers.java +++ b/net/minecraft/client/renderer/special/SpecialModelRenderers.java -@@ -180,6 +_,8 @@ +@@ -181,6 +_,8 @@ map.put(Blocks.TRAPPED_CHEST, GIFT_CHEST); } diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch index a5034ed573..cb66eaadd2 100644 --- a/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/texture/AbstractTexture.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/texture/AbstractTexture.java +++ b/net/minecraft/client/renderer/texture/AbstractTexture.java -@@ -30,6 +_,8 @@ +@@ -27,6 +_,8 @@ if (this.texture == null) { throw new IllegalStateException("Texture does not exist, can't get change its filter before something initializes it"); } else { @@ -9,9 +9,9 @@ this.texture.setTextureFilter(p_117961_ ? FilterMode.LINEAR : FilterMode.NEAREST, p_117962_); } } -@@ -40,6 +_,19 @@ - this.texture.close(); - this.texture = null; +@@ -50,6 +_,19 @@ + this.textureView.close(); + this.textureView = null; } + } + diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch index 4db27b4adc..6c44cb57bf 100644 --- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlas.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/texture/TextureAtlas.java +++ b/net/minecraft/client/renderer/texture/TextureAtlas.java -@@ -84,6 +_,7 @@ +@@ -88,6 +_,7 @@ this.sprites = List.copyOf(list); this.animatedTextures = List.copyOf(list1); } @@ -8,7 +8,7 @@ } @Override -@@ -161,5 +_,10 @@ +@@ -165,5 +_,10 @@ int getHeight() { return this.height; diff --git a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch index 3c0bc43131..2aa4c30281 100644 --- a/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch +++ b/patches/minecraft/net/minecraft/client/renderer/texture/TextureAtlasSprite.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/renderer/texture/TextureAtlasSprite.java +++ b/net/minecraft/client/renderer/texture/TextureAtlasSprite.java -@@ -138,4 +_,13 @@ +@@ -145,4 +_,13 @@ @Override void close(); } diff --git a/patches/minecraft/net/minecraft/client/resources/model/WeightedVariants.java.patch b/patches/minecraft/net/minecraft/client/resources/model/WeightedVariants.java.patch index 0b61bdb924..3c20275ef8 100644 --- a/patches/minecraft/net/minecraft/client/resources/model/WeightedVariants.java.patch +++ b/patches/minecraft/net/minecraft/client/resources/model/WeightedVariants.java.patch @@ -16,7 +16,7 @@ } @Override -@@ -27,8 +_,18 @@ +@@ -27,8 +_,23 @@ } @Override @@ -30,8 +30,13 @@ + } + + @Override -+ public void collectParts(RandomSource random, List dest, net.minecraftforge.client.model.data.ModelData data, net.minecraft.client.renderer.RenderType renderType) { ++ public void collectParts(RandomSource random, List dest, net.minecraftforge.client.model.data.ModelData data, net.minecraft.client.renderer.chunk.ChunkSectionLayer renderType) { + this.list.getRandomOrThrow(random).collectParts(random, dest, data, renderType); ++ } ++ ++ @Override ++ public java.util.Collection getRenderTypes(net.minecraft.world.level.block.state.BlockState state, RandomSource random, net.minecraftforge.client.model.data.ModelData data) { ++ return this.list.getRandomOrThrow(random).getRenderTypes(state, random, data); } @OnlyIn(Dist.CLIENT) diff --git a/patches/minecraft/net/minecraft/client/resources/sounds/SoundInstance.java.patch b/patches/minecraft/net/minecraft/client/resources/sounds/SoundInstance.java.patch index d1bec80ccd..853cfc7857 100644 --- a/patches/minecraft/net/minecraft/client/resources/sounds/SoundInstance.java.patch +++ b/patches/minecraft/net/minecraft/client/resources/sounds/SoundInstance.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/resources/sounds/SoundInstance.java +++ b/net/minecraft/client/resources/sounds/SoundInstance.java -@@ -55,4 +_,8 @@ +@@ -56,4 +_,8 @@ NONE, LINEAR; } diff --git a/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch b/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch index 21c6323e61..0740452a8d 100644 --- a/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch +++ b/patches/minecraft/net/minecraft/client/sounds/SoundEngine.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/client/sounds/SoundEngine.java +++ b/net/minecraft/client/sounds/SoundEngine.java -@@ -79,6 +_,7 @@ +@@ -81,6 +_,7 @@ this.soundManager = p_120236_; this.options = p_120237_; this.soundBuffers = new SoundBufferLibrary(p_249332_); @@ -8,7 +8,7 @@ } public void reload() { -@@ -96,6 +_,7 @@ +@@ -98,6 +_,7 @@ this.destroy(); this.loadLibrary(); @@ -16,38 +16,32 @@ } private synchronized void loadLibrary() { -@@ -334,7 +_,8 @@ - - public void play(SoundInstance p_120313_) { - if (this.loaded) { -- if (p_120313_.canPlaySound()) { +@@ -352,6 +_,9 @@ + } else if (!p_120313_.canPlaySound()) { + return SoundEngine.PlayResult.NOT_STARTED; + } else { + p_120313_ = net.minecraftforge.client.ForgeHooksClient.playSound(this, p_120313_); -+ if (p_120313_ != null && p_120313_.canPlaySound()) { - WeighedSoundEvents weighedsoundevents = p_120313_.resolve(this.soundManager); - ResourceLocation resourcelocation = p_120313_.getLocation(); - if (weighedsoundevents == null) { -@@ -398,19 +_,22 @@ - p_194488_.setSelfPosition(vec3); - p_194488_.setRelative(flag); - }); -+ SoundInstance soundinstance = p_120313_; - if (!flag2) { - this.soundBuffers - .getCompleteBuffer(sound.getPath()) - .thenAccept(p_377326_ -> channelaccess$channelhandle.execute(p_194495_ -> { - p_194495_.attachStaticBuffer(p_377326_); - p_194495_.play(); -+ net.minecraftforge.client.event.ForgeEventFactoryClient.onPlaySoundSource(this, soundinstance, p_194495_); - })); - } else { -- this.soundBuffers -- .getStream(sound.getPath(), flag1) -+ soundinstance -+ .getStream(this.soundBuffers, sound, flag1) - .thenAccept(p_376862_ -> channelaccess$channelhandle.execute(p_194498_ -> { - p_194498_.attachBufferStream(p_376862_); - p_194498_.play(); -+ net.minecraftforge.client.event.ForgeEventFactoryClient.onPlayStreamingSource(this, soundinstance, p_194498_); - })); - } ++ if (p_120313_ == null || !p_120313_.canPlaySound()) ++ return SoundEngine.PlayResult.NOT_STARTED; + WeighedSoundEvents weighedsoundevents = p_120313_.resolve(this.soundManager); + ResourceLocation resourcelocation = p_120313_.getLocation(); + if (weighedsoundevents == null) { +@@ -430,15 +_,18 @@ + p_194488_.setSelfPosition(vec3); + p_194488_.setRelative(flag); + }); ++ SoundInstance soundinstance = p_120313_; + if (!flag1) { + this.soundBuffers.getCompleteBuffer(sound.getPath()).thenAccept(p_377326_ -> channelaccess$channelhandle.execute(p_194495_ -> { + p_194495_.attachStaticBuffer(p_377326_); + p_194495_.play(); ++ net.minecraftforge.client.event.ForgeEventFactoryClient.onPlaySoundSource(this, soundinstance, p_194495_); + })); + } else { + this.soundBuffers.getStream(sound.getPath(), flag3).thenAccept(p_376862_ -> channelaccess$channelhandle.execute(p_194498_ -> { + p_194498_.attachBufferStream(p_376862_); + p_194498_.play(); ++ net.minecraftforge.client.event.ForgeEventFactoryClient.onPlayStreamingSource(this, soundinstance, p_194498_); + })); + } diff --git a/patches/minecraft/net/minecraft/commands/CommandSourceStack.java.patch b/patches/minecraft/net/minecraft/commands/CommandSourceStack.java.patch index 582c6309e6..e343df59b0 100644 --- a/patches/minecraft/net/minecraft/commands/CommandSourceStack.java.patch +++ b/patches/minecraft/net/minecraft/commands/CommandSourceStack.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/commands/CommandSourceStack.java +++ b/net/minecraft/commands/CommandSourceStack.java -@@ -46,7 +_,7 @@ +@@ -48,7 +_,7 @@ import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; --public class CommandSourceStack implements ExecutionCommandSource, SharedSuggestionProvider { -+public class CommandSourceStack implements ExecutionCommandSource, SharedSuggestionProvider, net.minecraftforge.common.extensions.IForgeCommandSourceStack { +-public class CommandSourceStack implements ExecutionCommandSource, PermissionSource, SharedSuggestionProvider { ++public class CommandSourceStack implements ExecutionCommandSource, PermissionSource, SharedSuggestionProvider, net.minecraftforge.common.extensions.IForgeCommandSourceStack { public static final SimpleCommandExceptionType ERROR_NOT_PLAYER = new SimpleCommandExceptionType(Component.translatable("permissions.requires.player")); public static final SimpleCommandExceptionType ERROR_NOT_ENTITY = new SimpleCommandExceptionType(Component.translatable("permissions.requires.entity")); public final CommandSource source; diff --git a/patches/minecraft/net/minecraft/commands/Commands.java.patch b/patches/minecraft/net/minecraft/commands/Commands.java.patch index 38ec27a11e..f560d22248 100644 --- a/patches/minecraft/net/minecraft/commands/Commands.java.patch +++ b/patches/minecraft/net/minecraft/commands/Commands.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -220,7 +_,7 @@ +@@ -248,7 +_,7 @@ JfrCommand.register(this.dispatcher); } @@ -9,7 +9,7 @@ RaidCommand.register(this.dispatcher, p_230944_); DebugPathCommand.register(this.dispatcher); DebugMobSpawningCommand.register(this.dispatcher); -@@ -253,6 +_,7 @@ +@@ -281,6 +_,7 @@ if (p_230943_.includeIntegrated) { PublishCommand.register(this.dispatcher); } @@ -17,7 +17,7 @@ this.dispatcher.setConsumer(ExecutionCommandSource.resultConsumer()); } -@@ -271,9 +_,18 @@ +@@ -303,9 +_,18 @@ public void performCommand(ParseResults p_242844_, String p_242841_) { CommandSourceStack commandsourcestack = p_242844_.getContext().getSource(); Profiler.get().push(() -> "/" + p_242841_); @@ -25,7 +25,7 @@ try { + var event = new net.minecraftforge.event.CommandEvent(p_242844_); -+ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) { ++ if (net.minecraftforge.event.CommandEvent.BUS.post(event)) { + if (event.getException() instanceof Exception exception) { + throw exception; + } else if (event.getException() != null) { @@ -37,13 +37,16 @@ if (contextchain != null) { executeCommandInContext( commandsourcestack, -@@ -364,7 +_,8 @@ - Map, CommandNode> map = Maps.newHashMap(); - RootCommandNode rootcommandnode = new RootCommandNode<>(); +@@ -395,8 +_,11 @@ + public void sendCommands(ServerPlayer p_82096_) { + Map, CommandNode> map = new HashMap<>(); + RootCommandNode rootcommandnode = new RootCommandNode<>(); ++ // FORGE: Clean any modded command content if the client is vanilla ++ rootcommandnode = net.minecraftforge.server.command.CommandHelper.filterCommandList(p_82096_.connection.getConnection(), rootcommandnode); map.put(this.dispatcher.getRoot(), rootcommandnode); -- this.fillUsableCommands(this.dispatcher.getRoot(), rootcommandnode, p_82096_.createCommandSourceStack(), map); +- fillUsableCommands(this.dispatcher.getRoot(), rootcommandnode, p_82096_.createCommandSourceStack(), map); + // FORGE: Use our own command node merging method to handle redirect nodes properly, see issue #7551 -+ net.minecraftforge.server.command.CommandHelper.mergeCommandNode(this.dispatcher.getRoot(), rootcommandnode, map, p_82096_.createCommandSourceStack(), ctx -> 0, suggest -> SuggestionProviders.safelySwap((com.mojang.brigadier.suggestion.SuggestionProvider) (com.mojang.brigadier.suggestion.SuggestionProvider) suggest)); - p_82096_.connection.send(new ClientboundCommandsPacket(rootcommandnode)); ++ net.minecraftforge.server.command.CommandHelper.mergeCommandNode(this.dispatcher.getRoot(), rootcommandnode, map, p_82096_.createCommandSourceStack(), ctx -> 0, suggest -> suggest); + p_82096_.connection.send(new ClientboundCommandsPacket(rootcommandnode, COMMAND_NODE_INSPECTOR)); } diff --git a/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelector.java.patch b/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelector.java.patch index e0637c19f6..82bf9377fc 100644 --- a/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelector.java.patch +++ b/patches/minecraft/net/minecraft/commands/arguments/selector/EntitySelector.java.patch @@ -4,7 +4,7 @@ } private void checkPermissions(CommandSourceStack p_121169_) throws CommandSyntaxException { -- if (this.usesSelector && !p_121169_.hasPermission(2)) { +- if (this.usesSelector && !p_121169_.allowsSelectors()) { + if (this.usesSelector && !net.minecraftforge.common.ForgeHooks.canUseEntitySelectors(p_121169_)) { throw EntityArgument.ERROR_SELECTORS_NOT_ALLOWED.create(); } diff --git a/patches/minecraft/net/minecraft/commands/synchronization/ArgumentTypeInfos.java.patch b/patches/minecraft/net/minecraft/commands/synchronization/ArgumentTypeInfos.java.patch index e7dd7cfb10..3058bf6c05 100644 --- a/patches/minecraft/net/minecraft/commands/synchronization/ArgumentTypeInfos.java.patch +++ b/patches/minecraft/net/minecraft/commands/synchronization/ArgumentTypeInfos.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/commands/synchronization/ArgumentTypeInfos.java +++ b/net/minecraft/commands/synchronization/ArgumentTypeInfos.java -@@ -66,6 +_,20 @@ +@@ -67,6 +_,20 @@ public class ArgumentTypeInfos { private static final Map, ArgumentTypeInfo> BY_CLASS = Maps.newHashMap(); diff --git a/patches/minecraft/net/minecraft/core/registries/BuiltInRegistries.java.patch b/patches/minecraft/net/minecraft/core/registries/BuiltInRegistries.java.patch index 333e1b2f4c..eefab0a61d 100644 --- a/patches/minecraft/net/minecraft/core/registries/BuiltInRegistries.java.patch +++ b/patches/minecraft/net/minecraft/core/registries/BuiltInRegistries.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/core/registries/BuiltInRegistries.java +++ b/net/minecraft/core/registries/BuiltInRegistries.java -@@ -257,7 +_,9 @@ +@@ -269,7 +_,9 @@ ) { Bootstrap.checkBootstrapCalled(() -> "registry " + p_259230_.location()); ResourceLocation resourcelocation = p_259230_.location(); @@ -11,7 +11,7 @@ WRITABLE_REGISTRY.register((ResourceKey)p_259230_, p_260327_, RegistrationInfo.BUILT_IN); return p_260327_; } -@@ -293,7 +_,7 @@ +@@ -305,7 +_,7 @@ if (p_358159_ instanceof DefaultedRegistry) { ResourceLocation resourcelocation = ((DefaultedRegistry)p_358159_).getDefaultKey(); diff --git a/patches/minecraft/net/minecraft/core/registries/Registries.java.patch b/patches/minecraft/net/minecraft/core/registries/Registries.java.patch index 93de7ef64d..f47095905a 100644 --- a/patches/minecraft/net/minecraft/core/registries/Registries.java.patch +++ b/patches/minecraft/net/minecraft/core/registries/Registries.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/core/registries/Registries.java +++ b/net/minecraft/core/registries/Registries.java -@@ -266,10 +_,14 @@ +@@ -275,10 +_,14 @@ } public static String elementsDirPath(ResourceKey> p_343743_) { diff --git a/patches/minecraft/net/minecraft/data/DataGenerator.java.patch b/patches/minecraft/net/minecraft/data/DataGenerator.java.patch index cd596e0048..e7fa704d6f 100644 --- a/patches/minecraft/net/minecraft/data/DataGenerator.java.patch +++ b/patches/minecraft/net/minecraft/data/DataGenerator.java.patch @@ -9,7 +9,7 @@ public DataGenerator(Path p_251724_, WorldVersion p_250554_, boolean p_251323_) { this.rootOutputFolder = p_251724_; @@ -38,6 +_,7 @@ - LOGGER.debug("Generator {} already run for version {}", p_254418_, this.version.getName()); + LOGGER.debug("Generator {} already run for version {}", p_254418_, this.version.name()); } else { LOGGER.info("Starting provider: {}", p_254418_); + net.minecraftforge.fml.StartupMessageManager.addModMessage("Generating: " + p_254418_); diff --git a/patches/minecraft/net/minecraft/data/Main.java.patch b/patches/minecraft/net/minecraft/data/Main.java.patch index a064ddb166..efaa93b791 100644 --- a/patches/minecraft/net/minecraft/data/Main.java.patch +++ b/patches/minecraft/net/minecraft/data/Main.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/data/Main.java +++ b/net/minecraft/data/Main.java -@@ -75,14 +_,17 @@ +@@ -76,14 +_,17 @@ OptionSpec optionspec4 = optionparser.accepts("all", "Include all generators"); OptionSpec optionspec5 = optionparser.accepts("output", "Output folder").withRequiredArg().defaultsTo("generated"); OptionSpec optionspec6 = optionparser.accepts("input", "Input folder").withRequiredArg(); diff --git a/patches/minecraft/net/minecraft/data/loot/LootTableProvider.java.patch b/patches/minecraft/net/minecraft/data/loot/LootTableProvider.java.patch index 7fc2b24cd4..22c4a49a04 100644 --- a/patches/minecraft/net/minecraft/data/loot/LootTableProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/loot/LootTableProvider.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/data/loot/LootTableProvider.java +++ b/net/minecraft/data/loot/LootTableProvider.java -@@ -62,7 +_,7 @@ +@@ -61,7 +_,7 @@ private CompletableFuture run(CachedOutput p_327970_, HolderLookup.Provider p_331092_) { WritableRegistry writableregistry = new MappedRegistry<>(Registries.LOOT_TABLE, Lifecycle.experimental()); Map map = new Object2ObjectOpenHashMap<>(); @@ -9,26 +9,26 @@ ResourceLocation resourcelocation = sequenceIdForLootTable(p_358218_); ResourceLocation resourcelocation1 = map.put(RandomSequence.seedForKey(resourcelocation), resourcelocation); if (resourcelocation1 != null) { -@@ -78,18 +_,8 @@ +@@ -77,18 +_,8 @@ HolderGetter.Provider holdergetter$provider = new RegistryAccess.ImmutableRegistryAccess(List.of(writableregistry)).freeze(); ValidationContext validationcontext = new ValidationContext(problemreporter$collector, LootContextParamSets.ALL_PARAMS, holdergetter$provider); - for (ResourceKey resourcekey : Sets.difference(this.requiredTables, writableregistry.registryKeySet())) { -- problemreporter$collector.report("Missing built-in table: " + resourcekey.location()); +- problemreporter$collector.report(new LootTableProvider.MissingTableProblem(resourcekey)); - } + validate(writableregistry, validationcontext, problemreporter$collector); - writableregistry.listElements() - .forEach( -- p_358221_ -> p_358221_.value() +- p_405062_ -> p_405062_.value() - .validate( -- validationcontext.setContextKeySet(p_358221_.value().getParamSet()) -- .enterElement("{" + p_358221_.key().location() + "}", p_358221_.key()) +- validationcontext.setContextKeySet(p_405062_.value().getParamSet()) +- .enterElement(new ProblemReporter.RootElementPathElement(p_405062_.key()), p_405062_.key()) - ) - ); - Multimap multimap = problemreporter$collector.get(); - if (!multimap.isEmpty()) { - multimap.forEach((p_124446_, p_124447_) -> LOGGER.warn("Found validation problem in {}: {}", p_124446_, p_124447_)); + if (!problemreporter$collector.isEmpty()) { + problemreporter$collector.forEach( + (p_405059_, p_405060_) -> LOGGER.warn("Found validation problem in {}: {}", p_405059_, p_405060_.description()) @@ -111,6 +_,21 @@ @Override public final String getName() { @@ -41,13 +41,13 @@ + + protected void validate(net.minecraft.core.Registry map, ValidationContext validationcontext, ProblemReporter report) { + for (ResourceKey resourcekey : Sets.difference(this.requiredTables, map.registryKeySet())) { -+ report.report("Missing built-in table: " + resourcekey.location()); ++ report.report(new LootTableProvider.MissingTableProblem(resourcekey)); + } + + map.listElements().forEach(table -> table.value().validate( + validationcontext.setContextKeySet(table.value().getParamSet()) -+ .enterElement("{" + table.key().location() + "}", table.key()) ++ .enterElement(new ProblemReporter.RootElementPathElement(table.key()), table.key()) + )); } - public record SubProviderEntry(Function provider, ContextKeySet paramSet) { + public record MissingTableProblem(ResourceKey id) implements ProblemReporter.Problem { diff --git a/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch b/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch index a140cd2800..6cf26ff1bd 100644 --- a/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/recipes/RecipeProvider.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/data/recipes/RecipeProvider.java +++ b/net/minecraft/data/recipes/RecipeProvider.java -@@ -735,7 +_,7 @@ +@@ -759,7 +_,7 @@ RecipeBuilder create(RecipeProvider p_363045_, ItemLike p_362746_, ItemLike p_364674_); } @@ -9,7 +9,7 @@ private final PackOutput packOutput; private final CompletableFuture registries; -@@ -755,13 +_,13 @@ +@@ -779,13 +_,13 @@ final List> list = new ArrayList<>(); RecipeOutput recipeoutput = new RecipeOutput() { @Override @@ -26,7 +26,7 @@ } } } -@@ -776,7 +_,9 @@ +@@ -800,7 +_,9 @@ AdvancementHolder advancementholder = Advancement.Builder.recipeAdvancement() .addCriterion("impossible", CriteriaTriggers.IMPOSSIBLE.createCriterion(new ImpossibleTrigger.TriggerInstance())) .build(RecipeBuilder.ROOT_RECIPE_ADVANCEMENT); @@ -37,7 +37,7 @@ } private void saveRecipe(ResourceKey> p_368864_, Recipe p_368184_) { -@@ -787,16 +_,19 @@ +@@ -811,16 +_,19 @@ ); } diff --git a/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch b/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch index c1525a14e0..d036ad7ea8 100644 --- a/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch +++ b/patches/minecraft/net/minecraft/data/registries/VanillaRegistries.java.patch @@ -1,14 +1,14 @@ --- a/net/minecraft/data/registries/VanillaRegistries.java +++ b/net/minecraft/data/registries/VanillaRegistries.java -@@ -88,6 +_,7 @@ - .add(Registries.TEST_INSTANCE, GameTestInstances::bootstrap) +@@ -90,6 +_,7 @@ .add(Registries.FROG_VARIANT, FrogVariants::bootstrap) - .add(Registries.CAT_VARIANT, CatVariants::bootstrap); + .add(Registries.CAT_VARIANT, CatVariants::bootstrap) + .add(Registries.DIALOG, Dialogs::bootstrap); + public static final List>> DATAPACK_REGISTRY_KEYS = BUILDER.getEntryKeys(); private static void validateThatAllBiomeFeaturesHaveBiomeFilter(HolderLookup.Provider p_256242_) { validateThatAllBiomeFeaturesHaveBiomeFilter(p_256242_.lookupOrThrow(Registries.PLACED_FEATURE), p_256242_.lookupOrThrow(Registries.BIOME)); -@@ -119,5 +_,9 @@ +@@ -121,5 +_,9 @@ HolderLookup.Provider holderlookup$provider = BUILDER.build(registryaccess$frozen); validateThatAllBiomeFeaturesHaveBiomeFilter(holderlookup$provider); return holderlookup$provider; diff --git a/patches/minecraft/net/minecraft/data/tags/BannerPatternTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/BannerPatternTagsProvider.java.patch index 1780e78625..ae99ba015b 100644 --- a/patches/minecraft/net/minecraft/data/tags/BannerPatternTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/BannerPatternTagsProvider.java.patch @@ -3,7 +3,7 @@ @@ -9,8 +_,14 @@ import net.minecraft.world.level.block.entity.BannerPatterns; - public class BannerPatternTagsProvider extends TagsProvider { + public class BannerPatternTagsProvider extends KeyTagProvider { + /** @deprecated Forge: Use the {@linkplain #BannerPatternTagsProvider(PackOutput, CompletableFuture, String, net.minecraftforge.common.data.ExistingFileHelper) mod id variant} */ + @Deprecated public BannerPatternTagsProvider(PackOutput p_256451_, CompletableFuture p_256420_) { diff --git a/patches/minecraft/net/minecraft/data/tags/BiomeTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/BiomeTagsProvider.java.patch index 11eb46c978..c37ccb8d70 100644 --- a/patches/minecraft/net/minecraft/data/tags/BiomeTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/BiomeTagsProvider.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/data/tags/BiomeTagsProvider.java +++ b/net/minecraft/data/tags/BiomeTagsProvider.java -@@ -15,6 +_,10 @@ +@@ -16,6 +_,10 @@ super(p_255800_, Registries.BIOME, p_256205_); } diff --git a/patches/minecraft/net/minecraft/data/tags/EnchantmentTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/EnchantmentTagsProvider.java.patch new file mode 100644 index 0000000000..9ec606e2a8 --- /dev/null +++ b/patches/minecraft/net/minecraft/data/tags/EnchantmentTagsProvider.java.patch @@ -0,0 +1,13 @@ +--- a/net/minecraft/data/tags/EnchantmentTagsProvider.java ++++ b/net/minecraft/data/tags/EnchantmentTagsProvider.java +@@ -17,6 +_,10 @@ + super(p_332794_, Registries.ENCHANTMENT, p_331070_); + } + ++ public EnchantmentTagsProvider(PackOutput p_332794_, CompletableFuture p_331070_, String modId, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { ++ super(p_332794_, Registries.ENCHANTMENT, p_331070_, modId, existingFileHelper); ++ } ++ + protected void tooltipOrder(HolderLookup.Provider p_335292_, ResourceKey... p_343612_) { + this.tag(EnchantmentTags.TOOLTIP_ORDER).add(p_343612_); + Set> set = Set.of(p_343612_); diff --git a/patches/minecraft/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch index 4e851aca45..5623dd4ab8 100644 --- a/patches/minecraft/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java +++ b/net/minecraft/data/tags/IntrinsicHolderTagsProvider.java -@@ -13,37 +_,50 @@ +@@ -12,14 +_,26 @@ public abstract class IntrinsicHolderTagsProvider extends TagsProvider { private final Function> keyExtractor; + public IntrinsicHolderTagsProvider(PackOutput p_256164_, ResourceKey> p_256155_, CompletableFuture p_256488_, Function> p_256168_) { -+ this(p_256164_, p_256155_, p_256488_, p_256168_, "vanilla", null); ++ super(p_256164_, p_256155_, p_256488_); ++ this.keyExtractor = p_256168_; + } + public IntrinsicHolderTagsProvider( @@ -14,60 +15,37 @@ CompletableFuture p_256488_, - Function> p_256168_ + Function> p_256168_, -+ String modId, ++ String modid, + @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper ) { - super(p_256164_, p_256155_, p_256488_); -+ super(p_256164_, p_256155_, p_256488_, modId, existingFileHelper); ++ super(p_256164_, p_256155_, p_256488_, modid, existingFileHelper); this.keyExtractor = p_256168_; - } - -+ -+ public IntrinsicHolderTagsProvider(PackOutput p_275304_, ResourceKey> p_275709_, CompletableFuture p_275227_, CompletableFuture> p_275311_, Function> p_275566_) { -+ this(p_275304_, p_275709_, p_275227_, p_275311_, p_275566_, "vanilla", null); + } + ++ public IntrinsicHolderTagsProvider(PackOutput p_275304_, ResourceKey> p_275709_, CompletableFuture p_275227_, CompletableFuture> p_275311_, Function> p_275566_) { ++ super(p_275304_, p_275709_, p_275227_, p_275311_); ++ this.keyExtractor = p_275566_; + } + public IntrinsicHolderTagsProvider( - PackOutput p_275304_, +@@ -27,14 +_,16 @@ ResourceKey> p_275709_, CompletableFuture p_275227_, CompletableFuture> p_275311_, - Function> p_275566_ + Function> p_275566_, -+ String modId, ++ String modid, + @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper ) { - super(p_275304_, p_275709_, p_275227_, p_275311_); -+ super(p_275304_, p_275709_, p_275227_, p_275311_, modId, existingFileHelper); ++ super(p_275304_, p_275709_, p_275227_, p_275311_, modid, existingFileHelper); this.keyExtractor = p_275566_; } - protected IntrinsicHolderTagsProvider.IntrinsicTagAppender tag(TagKey p_255730_) { - TagBuilder tagbuilder = this.getOrCreateRawBuilder(p_255730_); -- return new IntrinsicHolderTagsProvider.IntrinsicTagAppender<>(tagbuilder, this.keyExtractor); -+ return new IntrinsicHolderTagsProvider.IntrinsicTagAppender<>(tagbuilder, this.keyExtractor, this.modId); - } - -- public static class IntrinsicTagAppender extends TagsProvider.TagAppender { -+ public static class IntrinsicTagAppender extends TagsProvider.TagAppender implements net.minecraftforge.common.extensions.IForgeIntrinsicHolderTagAppender { - private final Function> keyExtractor; - -- IntrinsicTagAppender(TagBuilder p_256108_, Function> p_256433_) { -- super(p_256108_); -+ IntrinsicTagAppender(TagBuilder p_256108_, Function> p_256433_, String modid) { -+ super(p_256108_, modid); - this.keyExtractor = p_256433_; - } - -@@ -61,6 +_,11 @@ - public final IntrinsicHolderTagsProvider.IntrinsicTagAppender add(T... p_255868_) { - Stream.of(p_255868_).map(this.keyExtractor).forEach(this::add); - return this; -+ } -+ -+ @Override -+ public final ResourceKey getKey(T value) { -+ return this.keyExtractor.apply(value); - } + protected TagAppender tag(TagKey p_255793_) { + TagBuilder tagbuilder = this.getOrCreateRawBuilder(p_255793_); +- return TagAppender.forBuilder(tagbuilder).map(this.keyExtractor); ++ return TagAppender.forBuilder(tagbuilder, this.modId).map(this.keyExtractor); } } diff --git a/patches/minecraft/net/minecraft/data/tags/ItemTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/ItemTagsProvider.java.patch deleted file mode 100644 index cedc0a5f5d..0000000000 --- a/patches/minecraft/net/minecraft/data/tags/ItemTagsProvider.java.patch +++ /dev/null @@ -1,36 +0,0 @@ ---- a/net/minecraft/data/tags/ItemTagsProvider.java -+++ b/net/minecraft/data/tags/ItemTagsProvider.java -@@ -19,17 +_,30 @@ - public ItemTagsProvider( - PackOutput p_275343_, CompletableFuture p_275729_, CompletableFuture> p_275322_ - ) { -- super(p_275343_, Registries.ITEM, p_275729_, p_255790_ -> p_255790_.builtInRegistryHolder().key()); -+ this(p_275343_, p_275729_, p_275322_, "vanilla", null); -+ } -+ -+ public ItemTagsProvider( -+ PackOutput p_275343_, CompletableFuture p_275729_, CompletableFuture> p_275322_, -+ String modId, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper -+ ) { -+ super(p_275343_, Registries.ITEM, p_275729_, p_255790_ -> p_255790_.builtInRegistryHolder().key(), modId, existingFileHelper); - this.blockTags = p_275322_; - } - -+ public ItemTagsProvider(PackOutput p_275204_, CompletableFuture p_275194_, CompletableFuture> p_275207_, CompletableFuture> p_275634_) { -+ this(p_275204_, p_275194_, p_275207_, p_275634_, "vanilla", null); -+ } -+ - public ItemTagsProvider( - PackOutput p_275204_, - CompletableFuture p_275194_, - CompletableFuture> p_275207_, -- CompletableFuture> p_275634_ -+ CompletableFuture> p_275634_, -+ String modId, -+ @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper - ) { -- super(p_275204_, Registries.ITEM, p_275194_, p_275207_, p_274765_ -> p_274765_.builtInRegistryHolder().key()); -+ super(p_275204_, Registries.ITEM, p_275194_, p_275207_, p_274765_ -> p_274765_.builtInRegistryHolder().key(), modId, existingFileHelper); - this.blockTags = p_275634_; - } - diff --git a/patches/minecraft/net/minecraft/data/tags/KeyTagProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/KeyTagProvider.java.patch new file mode 100644 index 0000000000..b2e9e34276 --- /dev/null +++ b/patches/minecraft/net/minecraft/data/tags/KeyTagProvider.java.patch @@ -0,0 +1,16 @@ +--- a/net/minecraft/data/tags/KeyTagProvider.java ++++ b/net/minecraft/data/tags/KeyTagProvider.java +@@ -13,8 +_,12 @@ + super(p_407442_, p_405854_, p_409645_); + } + ++ protected KeyTagProvider(PackOutput p_407442_, ResourceKey> p_405854_, CompletableFuture p_409645_, String modId, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { ++ super(p_407442_, p_405854_, p_409645_, modId, existingFileHelper); ++ } ++ + protected TagAppender, T> tag(TagKey p_406138_) { + TagBuilder tagbuilder = this.getOrCreateRawBuilder(p_406138_); +- return TagAppender.forBuilder(tagbuilder); ++ return TagAppender.forBuilder(tagbuilder, this.modId); + } + } diff --git a/patches/minecraft/net/minecraft/data/tags/PaintingVariantTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/PaintingVariantTagsProvider.java.patch index 60cd784975..d5f1d175ef 100644 --- a/patches/minecraft/net/minecraft/data/tags/PaintingVariantTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/PaintingVariantTagsProvider.java.patch @@ -3,7 +3,7 @@ @@ -9,8 +_,13 @@ import net.minecraft.world.entity.decoration.PaintingVariants; - public class PaintingVariantTagsProvider extends TagsProvider { + public class PaintingVariantTagsProvider extends KeyTagProvider { + /** @deprecated Forge: Use the {@linkplain #PaintingVariantTagsProvider(PackOutput, CompletableFuture, String, net.minecraftforge.common.data.ExistingFileHelper) mod id variant} */ public PaintingVariantTagsProvider(PackOutput p_255750_, CompletableFuture p_256184_) { super(p_255750_, Registries.PAINTING_VARIANT, p_256184_); diff --git a/patches/minecraft/net/minecraft/data/tags/PoiTypeTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/PoiTypeTagsProvider.java.patch index ddbedeec2a..245388cfb8 100644 --- a/patches/minecraft/net/minecraft/data/tags/PoiTypeTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/PoiTypeTagsProvider.java.patch @@ -3,7 +3,7 @@ @@ -9,8 +_,13 @@ import net.minecraft.world.entity.ai.village.poi.PoiTypes; - public class PoiTypeTagsProvider extends TagsProvider { + public class PoiTypeTagsProvider extends KeyTagProvider { + /** @deprecated Forge: Use the {@linkplain #PoiTypeTagsProvider(PackOutput, CompletableFuture, String, net.minecraftforge.common.data.ExistingFileHelper) mod id variant} */ public PoiTypeTagsProvider(PackOutput p_256012_, CompletableFuture p_256617_) { super(p_256012_, Registries.POINT_OF_INTEREST_TYPE, p_256617_); diff --git a/patches/minecraft/net/minecraft/data/tags/StructureTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/StructureTagsProvider.java.patch index 8a014741ba..4a129a98d2 100644 --- a/patches/minecraft/net/minecraft/data/tags/StructureTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/StructureTagsProvider.java.patch @@ -3,7 +3,7 @@ @@ -9,8 +_,13 @@ import net.minecraft.world.level.levelgen.structure.Structure; - public class StructureTagsProvider extends TagsProvider { + public class StructureTagsProvider extends KeyTagProvider { + /** @deprecated Forge: Use the {@linkplain #StructureTagsProvider(PackOutput, CompletableFuture, String, net.minecraftforge.common.data.ExistingFileHelper) mod id variant} */ public StructureTagsProvider(PackOutput p_256522_, CompletableFuture p_256661_) { super(p_256522_, Registries.STRUCTURE, p_256661_); diff --git a/patches/minecraft/net/minecraft/data/tags/TagAppender.java.patch b/patches/minecraft/net/minecraft/data/tags/TagAppender.java.patch new file mode 100644 index 0000000000..f01ff184df --- /dev/null +++ b/patches/minecraft/net/minecraft/data/tags/TagAppender.java.patch @@ -0,0 +1,67 @@ +--- a/net/minecraft/data/tags/TagAppender.java ++++ b/net/minecraft/data/tags/TagAppender.java +@@ -8,7 +_,7 @@ + import net.minecraft.tags.TagBuilder; + import net.minecraft.tags.TagKey; + +-public interface TagAppender { ++public interface TagAppender extends net.minecraftforge.common.extensions.IForgeTagAppender { + TagAppender add(E p_406816_); + + default TagAppender add(E... p_406204_) { +@@ -32,6 +_,10 @@ + TagAppender addOptionalTag(TagKey p_406169_); + + static TagAppender, T> forBuilder(final TagBuilder p_407840_) { ++ return forBuilder(p_407840_, "unknown"); ++ } ++ ++ static TagAppender, T> forBuilder(final TagBuilder p_407840_, String source) { + return new TagAppender, T>() { + public TagAppender, T> add(ResourceKey p_406023_) { + p_407840_.addElement(p_406023_.location()); +@@ -54,6 +_,21 @@ + p_407840_.addOptionalTag(p_407223_.location()); + return this; + } ++ ++ @Override ++ public TagBuilder getInternalBuilder() { ++ return p_407840_; ++ } ++ ++ @Override ++ public String getSourceName() { ++ return source; ++ } ++ ++ @Override ++ public TagAppender, T> remove(ResourceKey value) { ++ return this.remove(value.location()); ++ } + }; + } + +@@ -81,6 +_,22 @@ + @Override + public TagAppender addOptionalTag(TagKey p_409695_) { + tagappender.addOptionalTag(p_409695_); ++ return this; ++ } ++ ++ @Override ++ public TagBuilder getInternalBuilder() { ++ return tagappender.getInternalBuilder(); ++ } ++ ++ @Override ++ public String getSourceName() { ++ return tagappender.getSourceName(); ++ } ++ ++ @Override ++ public TagAppender remove(U value) { ++ tagappender.remove(p_409081_.apply(value)); + return this; + } + }; diff --git a/patches/minecraft/net/minecraft/data/tags/TagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/TagsProvider.java.patch index f153569cba..3b6d62518c 100644 --- a/patches/minecraft/net/minecraft/data/tags/TagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/TagsProvider.java.patch @@ -99,12 +99,7 @@ } } ) -@@ -106,11 +_,16 @@ - - protected TagsProvider.TagAppender tag(TagKey p_206425_) { - TagBuilder tagbuilder = this.getOrCreateRawBuilder(p_206425_); -- return new TagsProvider.TagAppender<>(tagbuilder); -+ return new TagsProvider.TagAppender<>(tagbuilder, modId); +@@ -105,7 +_,12 @@ } protected TagBuilder getOrCreateRawBuilder(TagKey p_236452_) { @@ -118,51 +113,19 @@ } public CompletableFuture> contentsGetter() { -@@ -125,11 +_,26 @@ +@@ -118,6 +_,15 @@ + this.addTags(p_274768_); + return (HolderLookup.Provider)p_274768_; }); - } - -- public static class TagAppender { ++ } ++ ++ + private boolean missing(TagEntry reference) { + // Optional tags should not be validated -+ + if (reference.isRequired()) { + return existingFileHelper == null || !existingFileHelper.exists(reference.getId(), reference.isTag() ? resourceType : elementResourceType); + } + return false; -+ } -+ -+ public static class TagAppender implements net.minecraftforge.common.extensions.IForgeTagAppender { - private final TagBuilder builder; -+ private final String modid; - - protected TagAppender(TagBuilder p_256426_) { -+ this(p_256426_, "vanilla"); -+ } -+ -+ protected TagAppender(TagBuilder p_256426_, String modid) { - this.builder = p_256426_; -+ this.modid = modid; - } - - public final TagsProvider.TagAppender add(ResourceKey p_256138_) { -@@ -167,6 +_,19 @@ - public TagsProvider.TagAppender addOptionalTag(ResourceLocation p_176842_) { - this.builder.addOptionalTag(p_176842_); - return this; -+ } -+ -+ public TagsProvider.TagAppender add(TagEntry tag) { -+ builder.add(tag); -+ return this; -+ } -+ -+ public TagBuilder getInternalBuilder() { -+ return builder; -+ } -+ -+ public String getModID() { -+ return modid; - } } + @FunctionalInterface diff --git a/patches/minecraft/net/minecraft/data/tags/VanillaBlockTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/VanillaBlockTagsProvider.java.patch new file mode 100644 index 0000000000..52eec03c99 --- /dev/null +++ b/patches/minecraft/net/minecraft/data/tags/VanillaBlockTagsProvider.java.patch @@ -0,0 +1,13 @@ +--- a/net/minecraft/data/tags/VanillaBlockTagsProvider.java ++++ b/net/minecraft/data/tags/VanillaBlockTagsProvider.java +@@ -16,6 +_,10 @@ + super(p_256406_, Registries.BLOCK, p_256525_, p_255627_ -> p_255627_.builtInRegistryHolder().key()); + } + ++ public VanillaBlockTagsProvider(PackOutput p_256406_, CompletableFuture p_256525_, String modId, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { ++ super(p_256406_, Registries.BLOCK, p_256525_, p_255627_ -> p_255627_.builtInRegistryHolder().key(), modId, existingFileHelper); ++ } ++ + @Override + protected void addTags(HolderLookup.Provider p_255662_) { + (new BlockItemTagsProvider() { diff --git a/patches/minecraft/net/minecraft/data/tags/VanillaEnchantmentTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/VanillaEnchantmentTagsProvider.java.patch new file mode 100644 index 0000000000..62eb7f71c2 --- /dev/null +++ b/patches/minecraft/net/minecraft/data/tags/VanillaEnchantmentTagsProvider.java.patch @@ -0,0 +1,13 @@ +--- a/net/minecraft/data/tags/VanillaEnchantmentTagsProvider.java ++++ b/net/minecraft/data/tags/VanillaEnchantmentTagsProvider.java +@@ -12,6 +_,10 @@ + super(p_335915_, p_330302_); + } + ++ public VanillaEnchantmentTagsProvider(PackOutput p_335915_, CompletableFuture p_330302_, String modId, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { ++ super(p_335915_, p_330302_, modId, existingFileHelper); ++ } ++ + @Override + protected void addTags(HolderLookup.Provider p_331944_) { + this.tooltipOrder( diff --git a/patches/minecraft/net/minecraft/data/tags/VanillaItemTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/VanillaItemTagsProvider.java.patch new file mode 100644 index 0000000000..8e0b3cae21 --- /dev/null +++ b/patches/minecraft/net/minecraft/data/tags/VanillaItemTagsProvider.java.patch @@ -0,0 +1,26 @@ +--- a/net/minecraft/data/tags/VanillaItemTagsProvider.java ++++ b/net/minecraft/data/tags/VanillaItemTagsProvider.java +@@ -19,6 +_,10 @@ + super(p_275657_, Registries.ITEM, p_275712_, p_405065_ -> p_405065_.builtInRegistryHolder().key()); + } + ++ public VanillaItemTagsProvider(PackOutput p_275657_, CompletableFuture p_275712_, String modId, @org.jetbrains.annotations.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { ++ super(p_275657_, Registries.ITEM, p_275712_, p_405065_ -> p_405065_.builtInRegistryHolder().key(), modId, existingFileHelper); ++ } ++ + @Override + protected void addTags(HolderLookup.Provider p_255639_) { + (new BlockItemTagsProvider() { +@@ -459,6 +_,12 @@ + @Override + public TagAppender addOptionalTag(TagKey p_407315_) { + this.itemAppender.addOptionalTag(blockTagToItemTag(p_407315_)); ++ return this; ++ } ++ ++ @Override ++ public TagAppender remove(Block value) { ++ this.itemAppender.remove(Objects.requireNonNull(value.asItem())); + return this; + } + } diff --git a/patches/minecraft/net/minecraft/data/tags/WorldPresetTagsProvider.java.patch b/patches/minecraft/net/minecraft/data/tags/WorldPresetTagsProvider.java.patch index aa1a221063..dbeabd9e77 100644 --- a/patches/minecraft/net/minecraft/data/tags/WorldPresetTagsProvider.java.patch +++ b/patches/minecraft/net/minecraft/data/tags/WorldPresetTagsProvider.java.patch @@ -3,7 +3,7 @@ @@ -9,8 +_,14 @@ import net.minecraft.world.level.levelgen.presets.WorldPresets; - public class WorldPresetTagsProvider extends TagsProvider { + public class WorldPresetTagsProvider extends KeyTagProvider { + /** @deprecated Forge: Use the {@linkplain #WorldPresetTagsProvider(PackOutput, CompletableFuture, String, net.minecraftforge.common.data.ExistingFileHelper) mod id variant} */ + @Deprecated public WorldPresetTagsProvider(PackOutput p_255701_, CompletableFuture p_255974_) { diff --git a/patches/minecraft/net/minecraft/gametest/framework/TestCommand.java.patch b/patches/minecraft/net/minecraft/gametest/framework/TestCommand.java.patch index 3144f625e0..67e01f3e44 100644 --- a/patches/minecraft/net/minecraft/gametest/framework/TestCommand.java.patch +++ b/patches/minecraft/net/minecraft/gametest/framework/TestCommand.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/gametest/framework/TestCommand.java +++ b/net/minecraft/gametest/framework/TestCommand.java -@@ -490,7 +_,12 @@ +@@ -485,7 +_,12 @@ return Optional.empty(); } else { Holder.Reference reference = optional.get(); diff --git a/patches/minecraft/net/minecraft/network/Connection.java.patch b/patches/minecraft/net/minecraft/network/Connection.java.patch index 97953cba6a..6209c3ed41 100644 --- a/patches/minecraft/net/minecraft/network/Connection.java.patch +++ b/patches/minecraft/net/minecraft/network/Connection.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java -@@ -107,9 +_,17 @@ +@@ -106,9 +_,17 @@ private volatile DisconnectionDetails delayedDisconnect; @Nullable BandwidthDebugMonitor bandwidthDebugMonitor; @@ -18,7 +18,7 @@ } @Override -@@ -117,6 +_,7 @@ +@@ -116,6 +_,7 @@ super.channelActive(p_129525_); this.channel = p_129525_.channel(); this.address = this.channel.remoteAddress(); @@ -26,7 +26,7 @@ if (this.delayedDisconnect != null) { this.disconnect(this.delayedDisconnect); } -@@ -177,6 +_,7 @@ +@@ -176,6 +_,7 @@ } else { if (packetlistener.shouldHandleMessage(p_129488_)) { try { @@ -34,7 +34,7 @@ genericsFtw(p_129488_, packetlistener); } catch (RunningOnDifferentThreadException runningondifferentthreadexception) { } catch (RejectedExecutionException rejectedexecutionexception) { -@@ -226,6 +_,7 @@ +@@ -225,6 +_,7 @@ if (p_333271_.flow() != this.getReceiving()) { throw new IllegalStateException("Invalid inbound protocol: " + p_333271_.id()); } else { @@ -42,7 +42,7 @@ this.packetListener = p_330962_; this.disconnectListener = null; UnconfiguredPipelineHandler.InboundConfigurationTask unconfiguredpipelinehandler$inboundconfigurationtask = UnconfiguredPipelineHandler.setupInboundProtocol( -@@ -249,6 +_,8 @@ +@@ -248,6 +_,8 @@ } else { UnconfiguredPipelineHandler.OutboundConfigurationTask unconfiguredpipelinehandler$outboundconfigurationtask = UnconfiguredPipelineHandler.setupOutboundProtocol( p_329145_ @@ -51,25 +51,31 @@ ); BundlerInfo bundlerinfo = p_329145_.bundlerInfo(); if (bundlerinfo != null) { -@@ -298,7 +_,8 @@ +@@ -297,7 +_,8 @@ this.disconnectListener = p_330656_; - this.runOnceConnected(p_326042_ -> { + this.runOnceConnected(p_405096_ -> { this.setupInboundProtocol(p_329827_, p_330656_); -- p_326042_.sendPacket(new ClientIntentionPacket(SharedConstants.getCurrentVersion().getProtocolVersion(), p_300730_, p_300598_, p_297789_), null, true); +- p_405096_.sendPacket(new ClientIntentionPacket(SharedConstants.getCurrentVersion().protocolVersion(), p_300730_, p_300598_, p_297789_), null, true); + // TODO: Change this to be a immediately sent login custom payload packet? -+ p_326042_.sendPacket(new ClientIntentionPacket(SharedConstants.getCurrentVersion().getProtocolVersion(), net.minecraftforge.network.NetworkContext.enhanceHostName(p_300730_), p_300598_, p_297789_), null, true); ++ p_405096_.sendPacket(new ClientIntentionPacket(SharedConstants.getCurrentVersion().protocolVersion(), net.minecraftforge.network.NetworkContext.enhanceHostName(p_300730_), p_300598_, p_297789_), null, true); this.setupOutboundProtocol(p_328134_); }); } -@@ -341,6 +_,7 @@ +@@ -342,10 +_,13 @@ + if (p_405953_ != null) { + ChannelFuture channelfuture = p_299937_ ? this.channel.writeAndFlush(p_243260_) : this.channel.write(p_243260_); + channelfuture.addListener(p_405953_); ++ channelfuture.addListener(f -> packetLogger.send(p_243260_)); + } else if (p_299937_) { + this.channel.writeAndFlush(p_243260_, this.channel.voidPromise()); ++ packetLogger.send(p_243260_); + } else { + this.channel.write(p_243260_, this.channel.voidPromise()); ++ packetLogger.send(p_243260_); + } + } - private void doSendPacket(Packet p_243260_, @Nullable PacketSendListener p_243290_, boolean p_299937_) { - ChannelFuture channelfuture = p_299937_ ? this.channel.writeAndFlush(p_243260_) : this.channel.write(p_243260_); -+ channelfuture.addListener(f -> packetLogger.send(p_243260_)); - if (p_243290_ != null) { - channelfuture.addListener(p_243167_ -> { - if (p_243167_.isSuccess()) { -@@ -423,7 +_,7 @@ +@@ -414,7 +_,7 @@ if (this.address == null) { return "local"; } else { @@ -78,7 +84,7 @@ } } -@@ -466,6 +_,8 @@ +@@ -457,6 +_,8 @@ } public static ChannelFuture connect(InetSocketAddress p_290034_, boolean p_290035_, final Connection p_290031_) { @@ -87,7 +93,7 @@ Class oclass; EventLoopGroup eventloopgroup; if (Epoll.isAvailable() && p_290035_) { -@@ -537,6 +_,7 @@ +@@ -528,6 +_,7 @@ public static Connection connectToLocalServer(SocketAddress p_129494_) { final Connection connection = new Connection(PacketFlow.CLIENTBOUND); @@ -95,7 +101,7 @@ new Bootstrap().group(LOCAL_WORKER_GROUP.get()).handler(new ChannelInitializer() { @Override protected void initChannel(Channel p_332618_) { -@@ -630,6 +_,22 @@ +@@ -621,6 +_,22 @@ public float getAverageSentPackets() { return this.averageSentPackets; diff --git a/patches/minecraft/net/minecraft/network/FriendlyByteBuf.java.patch b/patches/minecraft/net/minecraft/network/FriendlyByteBuf.java.patch index 13100047fa..7096c2322f 100644 --- a/patches/minecraft/net/minecraft/network/FriendlyByteBuf.java.patch +++ b/patches/minecraft/net/minecraft/network/FriendlyByteBuf.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/network/FriendlyByteBuf.java +++ b/net/minecraft/network/FriendlyByteBuf.java -@@ -1632,4 +_,8 @@ +@@ -1649,4 +_,8 @@ public boolean release(int p_130347_) { return this.source.release(p_130347_); } diff --git a/patches/minecraft/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch b/patches/minecraft/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch deleted file mode 100644 index db8640a673..0000000000 --- a/patches/minecraft/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java.patch +++ /dev/null @@ -1,26 +0,0 @@ ---- a/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java -+++ b/net/minecraft/network/protocol/status/ClientboundStatusResponsePacket.java -@@ -5,16 +_,22 @@ - import net.minecraft.network.protocol.Packet; - import net.minecraft.network.protocol.PacketType; - --public record ClientboundStatusResponsePacket(ServerStatus status) implements Packet { -+public record ClientboundStatusResponsePacket(ServerStatus status, @org.jetbrains.annotations.Nullable String cachedStatus) implements Packet { - public static final StreamCodec STREAM_CODEC = Packet.codec( - ClientboundStatusResponsePacket::write, ClientboundStatusResponsePacket::new - ); - -+ public ClientboundStatusResponsePacket(ServerStatus status) { -+ this(status, null); -+ } -+ - private ClientboundStatusResponsePacket(FriendlyByteBuf p_179834_) { - this(p_179834_.readJsonWithCodec(ServerStatus.CODEC)); - } - - private void write(FriendlyByteBuf p_134899_) { -+ if (cachedStatus != null) p_134899_.writeUtf(cachedStatus); -+ else - p_134899_.writeJsonWithCodec(ServerStatus.CODEC, this.status); - } - diff --git a/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch b/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch index 002ec203ca..d8a2e49240 100644 --- a/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch +++ b/patches/minecraft/net/minecraft/resources/RegistryDataLoader.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/resources/RegistryDataLoader.java +++ b/net/minecraft/resources/RegistryDataLoader.java -@@ -88,7 +_,7 @@ +@@ -89,7 +_,7 @@ Lifecycle lifecycle = p_326161_.map(KnownPack::isVanilla).map(p_326166_ -> Lifecycle.stable()).orElse(Lifecycle.experimental()); return new RegistrationInfo(p_326161_, lifecycle); }); @@ -9,7 +9,7 @@ new RegistryDataLoader.RegistryData<>(Registries.DIMENSION_TYPE, DimensionType.DIRECT_CODEC), new RegistryDataLoader.RegistryData<>(Registries.BIOME, Biome.DIRECT_CODEC), new RegistryDataLoader.RegistryData<>(Registries.CHAT_TYPE, ChatType.DIRECT_CODEC), -@@ -128,7 +_,7 @@ +@@ -130,7 +_,7 @@ public static final List> DIMENSION_REGISTRIES = List.of( new RegistryDataLoader.RegistryData<>(Registries.LEVEL_STEM, LevelStem.CODEC) ); @@ -18,8 +18,8 @@ new RegistryDataLoader.RegistryData<>(Registries.BIOME, Biome.NETWORK_CODEC), new RegistryDataLoader.RegistryData<>(Registries.CHAT_TYPE, ChatType.DIRECT_CODEC), new RegistryDataLoader.RegistryData<>(Registries.TRIM_PATTERN, TrimPattern.DIRECT_CODEC), -@@ -151,6 +_,10 @@ - new RegistryDataLoader.RegistryData<>(Registries.TEST_INSTANCE, GameTestInstance.DIRECT_CODEC) +@@ -154,6 +_,10 @@ + new RegistryDataLoader.RegistryData<>(Registries.DIALOG, Dialog.DIRECT_CODEC) ); + public static java.util.stream.Stream> getWorldGenAndDimensionStream() { @@ -29,7 +29,7 @@ public static RegistryAccess.Frozen load( ResourceManager p_252046_, List> p_250344_, List> p_366741_ ) { -@@ -267,7 +_,7 @@ +@@ -270,7 +_,7 @@ private static void loadElementFromResource( WritableRegistry p_330991_, @@ -38,10 +38,10 @@ RegistryOps p_332135_, ResourceKey p_332850_, Resource p_335244_, -@@ -275,7 +_,23 @@ +@@ -278,7 +_,23 @@ ) throws IOException { try (Reader reader = p_335244_.openAsReader()) { - JsonElement jsonelement = JsonParser.parseReader(reader); + JsonElement jsonelement = StrictJsonParser.parse(reader); - DataResult dataresult = p_333909_.parse(p_332135_, jsonelement); + + var result = p_333909_.decode(p_332135_, jsonelement); @@ -63,7 +63,7 @@ E e = dataresult.getOrThrow(); p_330991_.register(p_332850_, e, p_332222_); } -@@ -290,6 +_,7 @@ +@@ -293,6 +_,7 @@ ) { FileToIdConverter filetoidconverter = FileToIdConverter.registry(p_331358_.key()); RegistryOps registryops = RegistryOps.create(JsonOps.INSTANCE, p_333035_); @@ -71,7 +71,7 @@ for (Entry entry : filetoidconverter.listMatchingResources(p_335634_).entrySet()) { ResourceLocation resourcelocation = entry.getKey(); -@@ -298,7 +_,7 @@ +@@ -301,7 +_,7 @@ RegistrationInfo registrationinfo = REGISTRATION_INFO_CACHE.apply(resource.knownPackInfo()); try { @@ -80,7 +80,7 @@ } catch (Exception exception) { p_335074_.put( resourcekey, -@@ -321,7 +_,8 @@ +@@ -324,7 +_,8 @@ RegistryDataLoader.NetworkedRegistryData registrydataloader$networkedregistrydata = p_331925_.get(p_332518_.key()); if (registrydataloader$networkedregistrydata != null) { RegistryOps registryops = RegistryOps.create(NbtOps.INSTANCE, p_329253_); @@ -90,7 +90,7 @@ FileToIdConverter filetoidconverter = FileToIdConverter.registry(p_332518_.key()); for (RegistrySynchronization.PackedRegistryEntry registrysynchronization$packedregistryentry : registrydataloader$networkedregistrydata.elements) { -@@ -343,7 +_,7 @@ +@@ -346,7 +_,7 @@ try { Resource resource = p_332010_.getResourceOrThrow(resourcelocation); diff --git a/patches/minecraft/net/minecraft/server/Main.java.patch b/patches/minecraft/net/minecraft/server/Main.java.patch index e43baca411..c3827a7322 100644 --- a/patches/minecraft/net/minecraft/server/Main.java.patch +++ b/patches/minecraft/net/minecraft/server/Main.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/Main.java +++ b/net/minecraft/server/Main.java -@@ -87,6 +_,17 @@ +@@ -88,6 +_,17 @@ OptionSpec optionspec13 = optionparser.accepts("jfrProfile"); OptionSpec optionspec14 = optionparser.accepts("pidFile").withRequiredArg().withValuesConvertedBy(new PathConverter()); OptionSpec optionspec15 = optionparser.nonOptions(); @@ -18,7 +18,7 @@ try { OptionSet optionset = optionparser.parse(p_129699_); -@@ -95,6 +_,14 @@ +@@ -96,6 +_,14 @@ return; } @@ -33,7 +33,7 @@ Path path = optionset.valueOf(optionspec14); if (path != null) { writePidFile(path); -@@ -109,24 +_,29 @@ +@@ -110,24 +_,29 @@ Bootstrap.validate(); Util.startTimerHackThread(); Path path1 = Paths.get("server.properties"); @@ -70,7 +70,7 @@ LevelStorageSource levelstoragesource = LevelStorageSource.createDefault(file1.toPath()); LevelStorageSource.LevelStorageAccess levelstoragesource$levelstorageaccess = levelstoragesource.validateAndCreateAccess(s); Dynamic dynamic; -@@ -177,6 +_,10 @@ +@@ -178,6 +_,10 @@ PackRepository packrepository = ServerPacksSource.createPackRepository(levelstoragesource$levelstorageaccess); @@ -81,7 +81,7 @@ WorldStem worldstem; try { WorldLoader.InitConfig worldloader$initconfig = loadOrCreateConfig(dedicatedserversettings.getProperties(), dynamic1, flag, packrepository); -@@ -216,6 +_,16 @@ +@@ -217,6 +_,16 @@ worlddimensions = dedicatedserverproperties.createDimensions(p_358511_.datapackWorldgen()); } @@ -98,13 +98,13 @@ WorldDimensions.Complete worlddimensions$complete = worlddimensions.bake(registry); Lifecycle lifecycle = worlddimensions$complete.lifecycle().add(p_358511_.datapackWorldgen().allRegistriesLifecycle()); return new WorldLoader.DataLoadOutput<>( -@@ -254,9 +_,20 @@ +@@ -255,9 +_,20 @@ } levelstoragesource$levelstorageaccess.saveDataTag(registryaccess$frozen, worlddata); - final DedicatedServer dedicatedserver = MinecraftServer.spin( + final MinecraftServer dedicatedserver = MinecraftServer.spin( - p_296433_ -> { + p_405123_ -> { - DedicatedServer dedicatedserver1 = new DedicatedServer( + MinecraftServer dedicatedserver1; + // TODO: [Forge][GameTest] URGENT !!! FIX GAME TESTS !!! @@ -118,10 +118,10 @@ + } else { + */ + dedicatedserver1 = new DedicatedServer( - p_296433_, + p_405123_, levelstoragesource$levelstorageaccess, packrepository, -@@ -270,8 +_,8 @@ +@@ -271,8 +_,8 @@ dedicatedserver1.setDemo(optionset.has(optionspec2)); dedicatedserver1.setId(optionset.valueOf(optionspec12)); boolean flag2 = !optionset.has(optionspec) && !optionset.valuesOf(optionspec15).contains("nogui"); @@ -131,8 +131,8 @@ + ds.showGui(); } - return dedicatedserver1; -@@ -280,7 +_,10 @@ + GameTestTicker.SINGLETON.startTicking(); +@@ -282,7 +_,10 @@ Thread thread = new Thread("Server Shutdown Thread") { @Override public void run() { diff --git a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch index 8460a7d528..33871c0779 100644 --- a/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch +++ b/patches/minecraft/net/minecraft/server/MinecraftServer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -273,7 +_,7 @@ +@@ -274,7 +_,7 @@ public static S spin(Function p_129873_) { AtomicReference atomicreference = new AtomicReference<>(); @@ -9,7 +9,7 @@ thread.setUncaughtExceptionHandler((p_177909_, p_177910_) -> LOGGER.error("Uncaught exception in server thread", p_177910_)); if (Runtime.getRuntime().availableProcessors() > 4) { thread.setPriority(8); -@@ -379,6 +_,7 @@ +@@ -380,6 +_,7 @@ this.readScoreboard(dimensiondatastorage); this.commandStorage = new CommandStorage(dimensiondatastorage); WorldBorder worldborder = serverlevel.getWorldBorder(); @@ -17,7 +17,7 @@ if (!serverleveldata.isInitialized()) { try { setInitialSpawn(serverlevel, serverleveldata, worldoptions.generateBonusChest(), flag); -@@ -428,6 +_,7 @@ +@@ -429,6 +_,7 @@ ); worldborder.addListener(new BorderChangeListener.DelegateBorderChangeListener(serverlevel1.getWorldBorder())); this.levels.put(resourcekey1, serverlevel1); @@ -25,7 +25,7 @@ } } -@@ -439,6 +_,7 @@ +@@ -440,6 +_,7 @@ p_177898_.setSpawn(BlockPos.ZERO.above(80), 0.0F); } else { ServerChunkCache serverchunkcache = p_177897_.getChunkSource(); @@ -33,7 +33,7 @@ ChunkPos chunkpos = new ChunkPos(serverchunkcache.randomState().sampler().findSpawnPosition()); int i = serverchunkcache.getGenerator().getSpawnHeight(p_177897_); if (i < p_177897_.getMinY()) { -@@ -621,6 +_,7 @@ +@@ -622,6 +_,7 @@ for (ServerLevel serverlevel2 : this.getAllLevels()) { if (serverlevel2 != null) { try { @@ -41,7 +41,7 @@ serverlevel2.close(); } catch (IOException ioexception1) { LOGGER.error("Exception closing the level", (Throwable)ioexception1); -@@ -667,9 +_,11 @@ +@@ -668,9 +_,11 @@ throw new IllegalStateException("Failed to initialize server"); } @@ -53,7 +53,7 @@ while (this.running) { long i; -@@ -721,6 +_,8 @@ +@@ -722,6 +_,8 @@ this.isReady = true; JvmProfiler.INSTANCE.onServerTick(this.smoothedTickTimeMillis); } @@ -62,7 +62,7 @@ } catch (Throwable throwable2) { LOGGER.error("Encountered an unexpected exception", throwable2); CrashReport crashreport = constructOrExtractCrashReport(throwable2); -@@ -732,6 +_,7 @@ +@@ -733,6 +_,7 @@ LOGGER.error("We were unable to save this crash report to disk."); } @@ -70,7 +70,7 @@ this.onServerCrash(crashreport); } finally { try { -@@ -744,6 +_,7 @@ +@@ -745,6 +_,7 @@ this.services.profileCache().clearExecutor(); } @@ -78,7 +78,7 @@ this.onServerExit(); } } -@@ -933,12 +_,14 @@ +@@ -934,12 +_,14 @@ } } @@ -93,7 +93,7 @@ } this.ticksUntilAutosave--; -@@ -956,6 +_,7 @@ +@@ -957,6 +_,7 @@ this.smoothedTickTimeMillis = this.smoothedTickTimeMillis * 0.8F + (float)k / (float)TimeUtil.NANOSECONDS_PER_MILLISECOND * 0.19999999F; this.logTickMethodTime(i); profilerfiller.pop(); @@ -101,7 +101,7 @@ } private void autoSave() { -@@ -1005,7 +_,8 @@ +@@ -1006,7 +_,8 @@ Optional.of(serverstatus$players), Optional.of(ServerStatus.Version.current()), Optional.ofNullable(this.statusIcon), @@ -111,7 +111,7 @@ ); } -@@ -1036,7 +_,8 @@ +@@ -1037,7 +_,8 @@ this.getFunctions().tick(); profilerfiller.popPush("levels"); @@ -121,7 +121,7 @@ profilerfiller.push(() -> serverlevel + " " + serverlevel.dimension().location()); if (this.tickCount % 20 == 0) { profilerfiller.push("timeSync"); -@@ -1045,6 +_,7 @@ +@@ -1046,6 +_,7 @@ } profilerfiller.push("tick"); @@ -129,7 +129,7 @@ try { serverlevel.tick(p_129954_); -@@ -1053,16 +_,18 @@ +@@ -1054,16 +_,18 @@ serverlevel.fillReportDetails(crashreport); throw new ReportedException(crashreport); } @@ -149,7 +149,7 @@ GameTestTicker.SINGLETON.tick(); } -@@ -1163,7 +_,7 @@ +@@ -1164,7 +_,7 @@ @DontObfuscate public String getServerModName() { @@ -158,7 +158,7 @@ } public SystemReport fillSystemReport(SystemReport p_177936_) { -@@ -1515,6 +_,7 @@ +@@ -1516,6 +_,7 @@ this.functionManager.replaceLibrary(this.resources.managers.getFunctionLibrary()); this.structureTemplateManager.onResourceManagerReload(this.resources.resourceManager); this.fuelValues = FuelValues.vanillaBurnTimes(this.registries.compositeAccess(), this.worldData.enabledFeatures()); @@ -166,7 +166,7 @@ }, this); if (this.isSameThread()) { this.managedBlock(completablefuture::isDone); -@@ -1524,12 +_,15 @@ +@@ -1525,12 +_,15 @@ } public static WorldDataConfiguration configurePackRepository(PackRepository p_248681_, WorldDataConfiguration p_331931_, boolean p_249869_, boolean p_330480_) { @@ -183,7 +183,7 @@ } else { Set set = Sets.newLinkedHashSet(); -@@ -2033,6 +_,48 @@ +@@ -2038,6 +_,48 @@ public ServerLinks serverLinks() { return ServerLinks.EMPTY; diff --git a/patches/minecraft/net/minecraft/server/PlayerAdvancements.java.patch b/patches/minecraft/net/minecraft/server/PlayerAdvancements.java.patch index 29ec4b54ef..064beb4994 100644 --- a/patches/minecraft/net/minecraft/server/PlayerAdvancements.java.patch +++ b/patches/minecraft/net/minecraft/server/PlayerAdvancements.java.patch @@ -1,22 +1,22 @@ --- a/net/minecraft/server/PlayerAdvancements.java +++ b/net/minecraft/server/PlayerAdvancements.java -@@ -173,6 +_,7 @@ +@@ -172,6 +_,7 @@ this.unregisterListeners(p_298135_); this.progressChanged.add(p_298135_); flag = true; + net.minecraftforge.event.ForgeEventFactory.onAdvancementGrant(this.player, p_298135_, advancementprogress, p_135990_); if (!flag1 && advancementprogress.isDone()) { p_298135_.value().rewards().grant(this.player); - p_298135_.value().display().ifPresent(p_358518_ -> { -@@ -180,6 +_,7 @@ - this.playerList.broadcastSystemMessage(p_358518_.getType().createAnnouncement(p_298135_, this.player), false); + p_298135_.value().display().ifPresent(p_405125_ -> { +@@ -179,6 +_,7 @@ + this.playerList.broadcastSystemMessage(p_405125_.getType().createAnnouncement(p_298135_, this.player), false); } }); + net.minecraftforge.event.ForgeEventFactory.onAdvancementEarned(this.player, p_298135_); } } -@@ -198,6 +_,7 @@ +@@ -197,6 +_,7 @@ this.registerListeners(p_297905_); this.progressChanged.add(p_297905_); flag = true; diff --git a/patches/minecraft/net/minecraft/server/commands/SpreadPlayersCommand.java.patch b/patches/minecraft/net/minecraft/server/commands/SpreadPlayersCommand.java.patch index aec5340431..a5e7f8bbcd 100644 --- a/patches/minecraft/net/minecraft/server/commands/SpreadPlayersCommand.java.patch +++ b/patches/minecraft/net/minecraft/server/commands/SpreadPlayersCommand.java.patch @@ -9,7 +9,7 @@ + (double)spreadplayerscommand$position.getSpawnY(p_138731_, p_138733_), + (double)Mth.floor(spreadplayerscommand$position.z) + 0.5D + ); -+ if (!event.isCanceled()) ++ if (event != null) entity.teleportTo( p_138731_, - Mth.floor(spreadplayerscommand$position.x) + 0.5, diff --git a/patches/minecraft/net/minecraft/server/commands/TeleportCommand.java.patch b/patches/minecraft/net/minecraft/server/commands/TeleportCommand.java.patch index 83a61e854a..1b2746057e 100644 --- a/patches/minecraft/net/minecraft/server/commands/TeleportCommand.java.patch +++ b/patches/minecraft/net/minecraft/server/commands/TeleportCommand.java.patch @@ -5,7 +5,7 @@ @Nullable LookAt p_365991_ ) throws CommandSyntaxException { + var event = net.minecraftforge.event.ForgeEventFactory.onEntityTeleportCommand(p_139016_, p_139018_, p_139019_, p_139020_); -+ if (event.isCanceled()) return; ++ if (event == null) return; + p_139018_ = event.getTargetX(); p_139019_ = event.getTargetY(); p_139020_ = event.getTargetZ(); BlockPos blockpos = BlockPos.containing(p_139018_, p_139019_, p_139020_); if (!Level.isInSpawnableBounds(blockpos)) { diff --git a/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch b/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch index cd2a55769d..49a052cf1a 100644 --- a/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/patches/minecraft/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -63,7 +63,7 @@ @Override public void stopServer() { -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.GameShuttingDownEvent()); ++ net.minecraftforge.event.GameShuttingDownEvent.BUS.post(new net.minecraftforge.event.GameShuttingDownEvent()); super.stopServer(); + if (this.dediLanPinger != null) { + this.dediLanPinger.interrupt(); diff --git a/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch b/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch index 76f8ba5dba..76e7e9f82d 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerChunkCache.java.patch @@ -11,7 +11,7 @@ ChunkAccess chunkaccess1 = chunkholder.getChunkIfPresent(ChunkStatus.FULL); if (chunkaccess1 != null) { this.storeInCache(i, chunkaccess1, ChunkStatus.FULL); -@@ -621,5 +_,17 @@ +@@ -624,5 +_,17 @@ return super.pollTask(); } } diff --git a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch index 37cab5ae8b..01f3d05329 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerLevel.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -200,10 +_,12 @@ +@@ -203,10 +_,12 @@ @Nullable private EndDragonFight dragonFight; final Int2ObjectMap dragonParts = new Int2ObjectOpenHashMap<>(); @@ -13,10 +13,10 @@ public ServerLevel( MinecraftServer p_214999_, -@@ -286,6 +_,18 @@ - this.sleepStatus = new SleepStatus(); +@@ -290,6 +_,18 @@ this.gameEventDispatcher = new GameEventDispatcher(this); this.randomSequences = Objects.requireNonNullElseGet(p_288977_, () -> this.getDataStorage().computeIfAbsent(RandomSequences.TYPE)); + this.waypointManager = new ServerWaypointManager(); + this.initCapabilities(); + } + @@ -32,7 +32,7 @@ } @Deprecated -@@ -327,8 +_,8 @@ +@@ -331,8 +_,8 @@ int i = this.getGameRules().getInt(GameRules.RULE_PLAYERS_SLEEPING_PERCENTAGE); if (this.sleepStatus.areEnoughSleeping(i) && this.sleepStatus.areEnoughDeepSleeping(i, this.players)) { if (this.getGameRules().getBoolean(GameRules.RULE_DAYLIGHT)) { @@ -43,7 +43,7 @@ } this.wakeUpAllPlayers(); -@@ -395,6 +_,7 @@ +@@ -399,6 +_,7 @@ p_358707_.stopRiding(); } @@ -51,7 +51,7 @@ profilerfiller.push("tick"); this.guardEntityTick(this::tickNonPassenger, p_358707_); profilerfiller.pop(); -@@ -530,6 +_,7 @@ +@@ -534,6 +_,7 @@ BlockPos blockpos = this.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, p_300602_); BlockPos blockpos1 = blockpos.below(); Biome biome = this.getBiome(blockpos).value(); @@ -59,7 +59,7 @@ if (biome.shouldFreeze(this, blockpos1)) { this.setBlockAndUpdate(blockpos1, Blocks.ICE.defaultBlockState()); } -@@ -705,8 +_,8 @@ +@@ -713,8 +_,8 @@ this.server.getPlayerList().broadcastAll(new ClientboundGameEventPacket(ClientboundGameEventPacket.START_RAINING, 0.0F)); } @@ -70,7 +70,7 @@ } } -@@ -743,6 +_,7 @@ +@@ -751,6 +_,7 @@ p_8648_.tickCount++; profilerfiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_8648_.getType()).toString()); profilerfiller.incrementCounter("tickNonPassenger"); @@ -78,7 +78,7 @@ p_8648_.tick(); profilerfiller.pop(); -@@ -760,6 +_,7 @@ +@@ -768,6 +_,7 @@ ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push(() -> BuiltInRegistries.ENTITY_TYPE.getKey(p_8664_.getType()).toString()); profilerfiller.incrementCounter("tickPassenger"); @@ -86,7 +86,7 @@ p_8664_.rideTick(); profilerfiller.pop(); -@@ -792,6 +_,7 @@ +@@ -814,6 +_,7 @@ } else { this.entityManager.autoSave(); } @@ -94,7 +94,7 @@ } } -@@ -886,6 +_,7 @@ +@@ -908,6 +_,7 @@ } private void addPlayer(ServerPlayer p_8854_) { @@ -102,7 +102,7 @@ Entity entity = this.getEntity(p_8854_.getUUID()); if (entity != null) { LOGGER.warn("Force-added player with duplicate UUID {}", p_8854_.getUUID()); -@@ -893,7 +_,8 @@ +@@ -915,7 +_,8 @@ this.removePlayerImmediately((ServerPlayer)entity, Entity.RemovalReason.DISCARDED); } @@ -112,7 +112,7 @@ } private boolean addEntity(Entity p_8873_) { -@@ -901,7 +_,12 @@ +@@ -923,7 +_,12 @@ LOGGER.warn("Tried to add entity {} but it was marked as removed already", EntityType.getKey(p_8873_.getType())); return false; } else { @@ -126,12 +126,12 @@ } } -@@ -949,6 +_,12 @@ +@@ -971,6 +_,12 @@ float p_263520_, long p_263490_ ) { + var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtPosition(this, p_393402_, p_397340_, p_394643_, p_263491_, p_263542_, p_263530_, p_263520_); -+ if (event.isCanceled() || event.getSound() == null) return; ++ if (event == null || event.getSound() == null) return; + p_263491_ = event.getSound(); + p_263542_ = event.getSource(); + p_263530_ = event.getNewVolume(); @@ -139,12 +139,12 @@ this.server .getPlayerList() .broadcast( -@@ -966,6 +_,12 @@ +@@ -988,6 +_,12 @@ public void playSeededSound( @Nullable Entity p_392657_, Entity p_394285_, Holder p_263412_, SoundSource p_263338_, float p_263352_, float p_263390_, long p_263403_ ) { + var event = net.minecraftforge.event.ForgeEventFactory.onPlaySoundAtEntity(p_394285_.level(), p_394285_, p_263412_, p_263338_, p_263352_, p_263390_); -+ if (event.isCanceled() || event.getSound() == null) return; ++ if (event == null || event.getSound() == null) return; + p_263412_ = event.getSound(); + p_263338_ = event.getSource(); + p_263352_ = event.getNewVolume(); @@ -152,7 +152,7 @@ this.server .getPlayerList() .broadcast( -@@ -1024,6 +_,7 @@ +@@ -1046,6 +_,7 @@ @Override public void gameEvent(Holder p_334475_, Vec3 p_215042_, GameEvent.Context p_215043_) { @@ -160,7 +160,7 @@ this.gameEventDispatcher.post(p_334475_, p_215042_, p_215043_); } -@@ -1062,16 +_,24 @@ +@@ -1084,16 +_,24 @@ @Override public void updateNeighborsAt(BlockPos p_215045_, Block p_215046_) { @@ -185,7 +185,7 @@ this.neighborUpdater.updateNeighborsAtExceptFromFacing(p_215052_, p_215053_, p_215054_, p_370072_); } -@@ -1117,12 +_,14 @@ +@@ -1139,12 +_,14 @@ Explosion.BlockInteraction explosion$blockinteraction = switch (p_255827_) { case NONE -> Explosion.BlockInteraction.KEEP; case BLOCK -> this.getDestroyType(GameRules.RULE_BLOCK_EXPLOSION_DROP_DECAY); @@ -201,7 +201,7 @@ serverexplosion.explode(); ParticleOptions particleoptions = serverexplosion.isSmall() ? p_310962_ : p_310322_; -@@ -1698,6 +_,11 @@ +@@ -1737,6 +_,11 @@ return this.chunkSource.getGenerator().getSeaLevel(); } @@ -212,8 +212,8 @@ + final class EntityCallbacks implements LevelCallback { public void onCreated(Entity p_143355_) { - } -@@ -1738,6 +_,12 @@ + if (p_143355_ instanceof WaypointTransmitter waypointtransmitter && waypointtransmitter.isTransmittingWaypoint()) { +@@ -1792,6 +_,12 @@ } } @@ -226,7 +226,7 @@ p_143371_.updateDynamicGameEventListener(DynamicGameEventListener::add); } -@@ -1765,7 +_,16 @@ +@@ -1820,7 +_,16 @@ } } diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch index 4bc0191e67..94682be64f 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -190,7 +_,8 @@ +@@ -196,7 +_,8 @@ import net.minecraft.world.scores.criteria.ObjectiveCriteria; import org.slf4j.Logger; @@ -10,15 +10,15 @@ private static final Logger LOGGER = LogUtils.getLogger(); private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_XZ = 32; private static final int NEUTRAL_MOB_DEATH_NOTIFICATION_RADII_Y = 10; -@@ -800,6 +_,7 @@ +@@ -813,6 +_,7 @@ @Override public void die(DamageSource p_9035_) { + if (net.minecraftforge.event.ForgeEventFactory.onLivingDeath(this, p_9035_)) return; this.gameEvent(GameEvent.ENTITY_DIE); - boolean flag = this.serverLevel().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); + boolean flag = this.level().getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); if (flag) { -@@ -979,6 +_,7 @@ +@@ -1010,6 +_,7 @@ @Nullable public ServerPlayer teleport(TeleportTransition p_361322_) { @@ -26,7 +26,7 @@ if (this.isRemoved()) { return null; } else { -@@ -1006,7 +_,7 @@ +@@ -1037,7 +_,7 @@ PlayerList playerlist = this.server.getPlayerList(); playerlist.sendPlayerPermissionLevel(this); serverlevel1.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION); @@ -35,15 +35,15 @@ ProfilerFiller profilerfiller = Profiler.get(); profilerfiller.push("moving"); if (resourcekey == Level.OVERWORLD && serverlevel.dimension() == Level.NETHER) { -@@ -1030,6 +_,7 @@ - this.lastSentExp = -1; +@@ -1062,6 +_,7 @@ this.lastSentHealth = -1.0F; this.lastSentFood = -1; + this.teleportSpectators(p_361322_, serverlevel1); + net.minecraftforge.event.ForgeEventFactory.onPlayerChangedDimension(this, resourcekey, p_361322_.newLevel().dimension()); return this; } } -@@ -1070,6 +_,9 @@ +@@ -1102,6 +_,9 @@ @Override public Either startSleepInBed(BlockPos p_9115_) { @@ -53,7 +53,7 @@ Direction direction = this.level().getBlockState(p_9115_).getValue(HorizontalDirectionalBlock.FACING); if (this.isSleeping() || !this.isAlive()) { return Either.left(Player.BedSleepingProblem.OTHER_PROBLEM); -@@ -1081,7 +_,7 @@ +@@ -1113,7 +_,7 @@ return Either.left(Player.BedSleepingProblem.OBSTRUCTED); } else { this.setRespawnPosition(new ServerPlayer.RespawnConfig(this.level().dimension(), p_9115_, this.getYRot(), false), true); @@ -62,7 +62,7 @@ return Either.left(Player.BedSleepingProblem.NOT_POSSIBLE_NOW); } else { if (!this.isCreative()) { -@@ -1127,6 +_,7 @@ +@@ -1159,6 +_,7 @@ } private boolean bedInRange(BlockPos p_9117_, Direction p_9118_) { @@ -70,7 +70,7 @@ return this.isReachableBedBlock(p_9117_) || this.isReachableBedBlock(p_9117_.relative(p_9118_.getOpposite())); } -@@ -1225,6 +_,7 @@ +@@ -1262,6 +_,7 @@ this.connection.send(new ClientboundOpenScreenPacket(abstractcontainermenu.containerId, abstractcontainermenu.getType(), p_9033_.getDisplayName())); this.initMenu(abstractcontainermenu); this.containerMenu = abstractcontainermenu; @@ -78,7 +78,7 @@ return OptionalInt.of(this.containerCounter); } } -@@ -1274,6 +_,7 @@ +@@ -1311,6 +_,7 @@ public void doCloseContainer() { this.containerMenu.removed(this); this.inventoryMenu.transferState(this.containerMenu); @@ -86,14 +86,14 @@ this.containerMenu = this.inventoryMenu; } -@@ -1497,6 +_,15 @@ +@@ -1536,6 +_,15 @@ this.setShoulderEntityLeft(p_9016_.getShoulderEntityLeft()); this.setShoulderEntityRight(p_9016_.getShoulderEntityRight()); this.setLastDeathLocation(p_9016_.getLastDeathLocation()); + + //Copy over a section of the Entity Data from the old player. + //Allows mods to specify data that persists after players respawn. -+ CompoundTag old = p_9016_.getPersistentData(); ++ var old = p_9016_.getPersistentData(); + if (old.contains(PERSISTED_NBT_TAG)) + getPersistentData().put(PERSISTED_NBT_TAG, old.get(PERSISTED_NBT_TAG)); + net.minecraftforge.event.ForgeEventFactory.onPlayerClone(this, p_9016_, !p_9017_); @@ -102,7 +102,7 @@ } @Override -@@ -1596,6 +_,7 @@ +@@ -1635,6 +_,7 @@ public boolean setGameMode(GameType p_143404_) { boolean flag = this.isSpectator(); @@ -110,7 +110,7 @@ if (!this.gameMode.changeGameModeForPlayer(p_143404_)) { return false; } else { -@@ -1756,6 +_,9 @@ +@@ -1787,6 +_,9 @@ public void setCamera(@Nullable Entity p_9214_) { Entity entity = this.getCamera(); this.camera = (Entity)(p_9214_ == null ? this : p_9214_); @@ -120,7 +120,7 @@ if (entity != this.camera) { if (this.camera.level() instanceof ServerLevel serverlevel) { this.teleportTo( -@@ -1794,7 +_,11 @@ +@@ -1825,7 +_,11 @@ @Nullable public Component getTabListDisplayName() { @@ -133,7 +133,7 @@ } public int getTabListOrder() { -@@ -1829,6 +_,7 @@ +@@ -1860,6 +_,7 @@ } public void setRespawnPosition(@Nullable ServerPlayer.RespawnConfig p_396560_, boolean p_9162_) { @@ -141,7 +141,7 @@ if (p_9162_ && p_396560_ != null && !p_396560_.isSamePosition(this.respawnConfig)) { this.sendSystemMessage(SPAWN_SET_MESSAGE); } -@@ -1938,9 +_,12 @@ +@@ -1969,9 +_,12 @@ public boolean drop(boolean p_182295_) { Inventory inventory = this.getInventory(); @@ -155,7 +155,7 @@ } @Override -@@ -2044,6 +_,75 @@ +@@ -2075,6 +_,75 @@ @Nullable public BlockPos getRaidOmenPosition() { return this.raidOmenPosition; diff --git a/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch index 5d1e15969a..1ef958d867 100644 --- a/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch +++ b/patches/minecraft/net/minecraft/server/level/ServerPlayerGameMode.java.patch @@ -5,7 +5,7 @@ public void handleBlockBreakAction(BlockPos p_215120_, ServerboundPlayerActionPacket.Action p_215121_, Direction p_215122_, int p_215123_, int p_215124_) { + var event = net.minecraftforge.event.ForgeEventFactory.onLeftClickBlock(player, p_215120_, p_215122_, p_215121_); -+ if (event.isCanceled() || (!this.isCreative() && event.getResult().isDenied())) { ++ if (event == null || !this.isCreative()) { + return; + } if (!this.player.canInteractWithBlock(p_215120_, 1.0)) { @@ -15,7 +15,7 @@ float f = 1.0F; BlockState blockstate = this.level.getBlockState(p_215120_); if (!blockstate.isAir()) { -+ if (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ if (!event.getUseBlock().isDenied()) { EnchantmentHelper.onHitBlock( this.level, this.player.getMainHandItem(), @@ -107,8 +107,8 @@ } else if (this.gameModeForPlayer == GameType.SPECTATOR) { + } + -+ var event = net.minecraftforge.event.ForgeEventFactory.onRightClickBlock(p_9266_, p_9269_, blockpos, p_9270_); -+ if (event.isCanceled()) return event.getCancellationResult(); ++ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock(p_9266_, p_9269_, blockpos, p_9270_); ++ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.RightClickBlock.BUS.post(event)) return event.getCancellationResult(); + if (this.gameModeForPlayer == GameType.SPECTATOR) { MenuProvider menuprovider = blockstate.getMenuProvider(p_9267_, blockpos); if (menuprovider != null) { @@ -118,7 +118,7 @@ } } else { + UseOnContext useoncontext = new UseOnContext(p_9266_, p_9269_, p_9270_); -+ if (event.getUseItem() != net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ if (!event.getUseItem().isDenied()) { + InteractionResult result = p_9268_.onItemUseFirst(useoncontext); + if (result != InteractionResult.PASS) return result; + } @@ -127,7 +127,7 @@ + flag1 &= !(p_9266_.getMainHandItem().doesSneakBypassUse(p_9267_, blockpos, p_9266_) && p_9266_.getOffhandItem().doesSneakBypassUse(p_9267_, blockpos, p_9266_)); ItemStack itemstack = p_9268_.copy(); - if (!flag1) { -+ if (event.getUseBlock() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (event.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY && !flag1)) { ++ if (event.getUseBlock().isAllowed() || (!event.getUseBlock().isDenied() && !flag1)) { InteractionResult interactionresult = blockstate.useItemOn(p_9266_.getItemInHand(p_9269_), p_9267_, p_9266_, p_9269_, p_9270_); if (interactionresult.consumesAction()) { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(p_9266_, blockpos, itemstack); @@ -137,8 +137,8 @@ - if (!p_9268_.isEmpty() && !p_9266_.getCooldowns().isOnCooldown(p_9268_)) { - UseOnContext useoncontext = new UseOnContext(p_9266_, p_9269_, p_9270_); -+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.ALLOW || (!p_9268_.isEmpty() && !p_9266_.getCooldowns().isOnCooldown(p_9268_))) { -+ if (event.getUseItem() == net.minecraftforge.eventbus.api.Event.Result.DENY) return InteractionResult.PASS; ++ if (event.getUseItem().isAllowed() || (!p_9268_.isEmpty() && !p_9266_.getCooldowns().isOnCooldown(p_9268_))) { ++ if (event.getUseItem().isDenied()) return InteractionResult.PASS; InteractionResult interactionresult2; if (p_9266_.hasInfiniteMaterials()) { int i = p_9268_.getCount(); diff --git a/patches/minecraft/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch index 2424aebd03..8d77df36e5 100644 --- a/patches/minecraft/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/server/network/ServerCommonPacketListenerImpl.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/ServerCommonPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerCommonPacketListenerImpl.java -@@ -90,6 +_,7 @@ +@@ -92,6 +_,7 @@ @Override public void handleCustomPayload(ServerboundCustomPayloadPacket p_300164_) { @@ -8,7 +8,7 @@ } @Override -@@ -193,5 +_,9 @@ +@@ -201,5 +_,9 @@ protected CommonListenerCookie createCookie(ClientInformation p_297318_) { return new CommonListenerCookie(this.playerProfile(), this.latency, p_297318_, this.transferred); diff --git a/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index 0f672dce8c..6e63a38bcf 100644 --- a/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -1156,9 +_,10 @@ +@@ -1168,9 +_,10 @@ switch (serverboundplayeractionpacket$action) { case SWAP_ITEM_WITH_OFFHAND: if (!this.player.isSpectator()) { @@ -8,13 +8,13 @@ - this.player.setItemInHand(InteractionHand.OFF_HAND, this.player.getItemInHand(InteractionHand.MAIN_HAND)); - this.player.setItemInHand(InteractionHand.MAIN_HAND, itemstack); + var event = net.minecraftforge.event.ForgeEventFactory.onLivingSwapHandItems(this.player); -+ if (event.isCanceled()) return; ++ if (event == null) return; + this.player.setItemInHand(InteractionHand.OFF_HAND, event.getItemSwappedToOffHand()); + this.player.setItemInHand(InteractionHand.MAIN_HAND, event.getItemSwappedToMainHand()); this.player.stopUsingItem(); } -@@ -1356,8 +_,9 @@ +@@ -1368,8 +_,9 @@ } CompletableFuture completablefuture = this.filterTextPacket(playerchatmessage.signedContent()); @@ -25,7 +25,7 @@ PlayerChatMessage playerchatmessage1 = playerchatmessage.withUnsignedContent(component).filter(p_296589_.mask()); this.broadcastChatMessage(playerchatmessage1); }); -@@ -1693,7 +_,7 @@ +@@ -1699,7 +_,7 @@ @Override public void onInteraction(InteractionHand p_143682_, Vec3 p_143683_) { @@ -34,7 +34,7 @@ } @Override -@@ -1991,6 +_,7 @@ +@@ -2011,6 +_,7 @@ @Override public void handleCustomPayload(ServerboundCustomPayloadPacket p_329963_) { diff --git a/patches/minecraft/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch b/patches/minecraft/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch index ae4bd2b0fc..c44dab44cc 100644 --- a/patches/minecraft/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch +++ b/patches/minecraft/net/minecraft/server/network/ServerStatusPacketListenerImpl.java.patch @@ -19,12 +19,3 @@ } @Override -@@ -36,7 +_,7 @@ - this.connection.disconnect(DISCONNECT_REASON); - } else { - this.hasRequestedStatus = true; -- this.connection.send(new ClientboundStatusResponsePacket(this.status)); -+ this.connection.send(new ClientboundStatusResponsePacket(this.status, this.statusCache)); - } - } - diff --git a/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch b/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch index 9f6167e70f..3ea94afaf4 100644 --- a/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch +++ b/patches/minecraft/net/minecraft/server/packs/resources/SimpleJsonResourceReloadListener.java.patch @@ -15,8 +15,8 @@ ResourceLocation resourcelocation1 = p_377980_.fileToId(resourcelocation); try (Reader reader = entry.getValue().openAsReader()) { -- p_376362_.parse(p_378080_, JsonParser.parseReader(reader)).ifSuccess(p_370131_ -> { -+ var json = JsonParser.parseReader(reader); +- p_376362_.parse(p_378080_, StrictJsonParser.parse(reader)).ifSuccess(p_370131_ -> { ++ var json = StrictJsonParser.parse(reader); + json = net.minecraftforge.common.ForgeHooks.readConditional(p_378080_, json); + if (json == null) { + LOGGER.debug("Skipping loading {} as its conditions were not met", resourcelocation); diff --git a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch index 5e54ef0ef6..64c6341a6d 100644 --- a/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch +++ b/patches/minecraft/net/minecraft/server/players/PlayerList.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -129,6 +_,7 @@ +@@ -128,6 +_,7 @@ private boolean allowCommandsForAllPlayers; private static final boolean ALLOW_LOGOUTIVATOR = false; private int sendAllPlayerInfoIn; @@ -8,31 +8,31 @@ public PlayerList(MinecraftServer p_203842_, LayeredRegistryAccess p_251844_, PlayerDataStorage p_203844_, int p_203845_) { this.server = p_203842_; -@@ -204,6 +_,7 @@ - servergamepacketlistenerimpl.send(new ClientboundPlayerAbilitiesPacket(p_11263_.getAbilities())); - servergamepacketlistenerimpl.send(new ClientboundSetHeldSlotPacket(p_11263_.getInventory().getSelectedSlot())); - RecipeManager recipemanager = this.server.getRecipeManager(); -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.OnDatapackSyncEvent(this, p_11263_)); - servergamepacketlistenerimpl.send(new ClientboundUpdateRecipesPacket(recipemanager.getSynchronizedItemProperties(), recipemanager.getSynchronizedStonecutterRecipes())); - this.sendPlayerPermissionLevel(p_11263_); - p_11263_.getStats().markAllDirty(); -@@ -237,6 +_,7 @@ - p_11263_.loadAndSpawnParentVehicle(p_390188_); - }); - p_11263_.initInventoryMenu(); +@@ -207,6 +_,7 @@ + servergamepacketlistenerimpl.send(new ClientboundPlayerAbilitiesPacket(p_11263_.getAbilities())); + servergamepacketlistenerimpl.send(new ClientboundSetHeldSlotPacket(p_11263_.getInventory().getSelectedSlot())); + RecipeManager recipemanager = this.server.getRecipeManager(); ++ net.minecraftforge.event.OnDatapackSyncEvent.BUS.post(new net.minecraftforge.event.OnDatapackSyncEvent(this, p_11263_)); + servergamepacketlistenerimpl.send(new ClientboundUpdateRecipesPacket(recipemanager.getSynchronizedItemProperties(), recipemanager.getSynchronizedStonecutterRecipes())); + this.sendPlayerPermissionLevel(p_11263_); + p_11263_.getStats().markAllDirty(); +@@ -241,6 +_,7 @@ + }); + p_11263_.initInventoryMenu(); + } + net.minecraftforge.event.ForgeEventFactory.firePlayerLoggedIn(p_11263_); } protected void updateEntireScoreboard(ServerScoreboard p_11274_, ServerPlayer p_11275_) { -@@ -302,6 +_,7 @@ - optional = Optional.of(compoundtag); - p_11225_.load(compoundtag); +@@ -307,6 +_,7 @@ + optional = Optional.of(valueinput); + p_11225_.load(valueinput); LOGGER.debug("loading single player"); + net.minecraftforge.event.ForgeEventFactory.firePlayerLoadingEvent(p_11225_, this.playerIo, p_11225_.getUUID().toString()); } else { - optional = this.playerIo.load(p_11225_); + optional = this.playerIo.load(p_11225_, p_410534_); } -@@ -310,6 +_,7 @@ +@@ -315,6 +_,7 @@ } protected void save(ServerPlayer p_11277_) { @@ -40,15 +40,15 @@ this.playerIo.save(p_11277_); ServerStatsCounter serverstatscounter = this.stats.get(p_11277_.getUUID()); if (serverstatscounter != null) { -@@ -323,6 +_,7 @@ +@@ -328,6 +_,7 @@ } public void remove(ServerPlayer p_11287_) { + net.minecraftforge.event.ForgeEventFactory.firePlayerLoggedOut(p_11287_); - ServerLevel serverlevel = p_11287_.serverLevel(); + ServerLevel serverlevel = p_11287_.level(); p_11287_.awardStat(Stats.LEAVE_GAME); this.save(p_11287_); -@@ -448,6 +_,7 @@ +@@ -449,6 +_,7 @@ this.playersByUUID.put(serverplayer.getUUID(), serverplayer); serverplayer.initInventoryMenu(); serverplayer.setHealth(serverplayer.getHealth()); @@ -56,7 +56,7 @@ ServerPlayer.RespawnConfig serverplayer$respawnconfig = serverplayer.getRespawnConfig(); if (!p_11238_ && serverplayer$respawnconfig != null) { ServerLevel serverlevel2 = this.server.getLevel(serverplayer$respawnconfig.dimension()); -@@ -557,6 +_,7 @@ +@@ -558,6 +_,7 @@ } public void op(GameProfile p_11254_) { @@ -64,7 +64,7 @@ this.ops.add(new ServerOpListEntry(p_11254_, this.server.getOperatorUserPermissionLevel(), this.ops.canBypassPlayerLimit(p_11254_))); ServerPlayer serverplayer = this.getPlayer(p_11254_.getId()); if (serverplayer != null) { -@@ -565,6 +_,7 @@ +@@ -566,6 +_,7 @@ } public void deop(GameProfile p_11281_) { @@ -72,7 +72,7 @@ this.ops.remove(p_11281_); ServerPlayer serverplayer = this.getPlayer(p_11281_.getId()); if (serverplayer != null) { -@@ -778,13 +_,6 @@ +@@ -779,13 +_,6 @@ if (serverstatscounter == null) { File file1 = this.server.getWorldPath(LevelResource.PLAYER_STATS_DIR).toFile(); File file2 = new File(file1, uuid + ".json"); @@ -86,7 +86,7 @@ serverstatscounter = new ServerStatsCounter(this.server, file2); this.stats.put(uuid, serverstatscounter); -@@ -829,7 +_,7 @@ +@@ -830,7 +_,7 @@ } public List getPlayers() { @@ -95,11 +95,11 @@ } @Nullable -@@ -846,6 +_,7 @@ +@@ -847,6 +_,7 @@ playeradvancements.reload(this.server.getAdvancements()); } -+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.OnDatapackSyncEvent(this, null)); ++ net.minecraftforge.event.OnDatapackSyncEvent.BUS.post(new net.minecraftforge.event.OnDatapackSyncEvent(this, null)); this.broadcastAll(new ClientboundUpdateTagsPacket(TagNetworkSerialization.serializeTagsToNetwork(this.registries))); RecipeManager recipemanager = this.server.getRecipeManager(); ClientboundUpdateRecipesPacket clientboundupdaterecipespacket = new ClientboundUpdateRecipesPacket(recipemanager.getSynchronizedItemProperties(), recipemanager.getSynchronizedStonecutterRecipes()); diff --git a/patches/minecraft/net/minecraft/stats/RecipeBookSettings.java.patch b/patches/minecraft/net/minecraft/stats/RecipeBookSettings.java.patch index 40f1016c00..193fe7c77e 100644 --- a/patches/minecraft/net/minecraft/stats/RecipeBookSettings.java.patch +++ b/patches/minecraft/net/minecraft/stats/RecipeBookSettings.java.patch @@ -1,31 +1,24 @@ --- a/net/minecraft/stats/RecipeBookSettings.java +++ b/net/minecraft/stats/RecipeBookSettings.java -@@ -14,7 +_,7 @@ - public static final StreamCodec STREAM_CODEC = StreamCodec.ofMember( - RecipeBookSettings::write, RecipeBookSettings::read - ); -- private static final Map> TAG_FIELDS = ImmutableMap.of( -+ private static final Map> TAG_FIELDS = new java.util.HashMap<>(ImmutableMap.of( - RecipeBookType.CRAFTING, - Pair.of("isGuiOpen", "isFilteringCraftable"), - RecipeBookType.FURNACE, -@@ -23,7 +_,7 @@ - Pair.of("isBlastingFurnaceGuiOpen", "isBlastingFurnaceFilteringCraftable"), - RecipeBookType.SMOKER, - Pair.of("isSmokerGuiOpen", "isSmokerFilteringCraftable") -- ); -+ )); - private final Map states; +@@ -12,6 +_,7 @@ + import net.minecraft.network.codec.StreamCodec; + import net.minecraft.world.inventory.RecipeBookType; - private RecipeBookSettings(Map p_12730_) { -@@ -146,5 +_,10 @@ - public RecipeBookSettings.TypeSettings setFiltering(boolean p_366242_) { - return new RecipeBookSettings.TypeSettings(this.open, p_366242_); ++// TODO: [Forge][Custom Recipe Book Types - Add Optional> to network codecs + public final class RecipeBookSettings { + public static final StreamCodec STREAM_CODEC = StreamCodec.composite( + RecipeBookSettings.TypeSettings.STREAM_CODEC, +@@ -148,5 +_,13 @@ + .apply(p_407394_, RecipeBookSettings.TypeSettings::new) + ); } + } + + // FORGE -- called automatically on Enum creation - used for serialization -+ public static void addTagsForType(RecipeBookType type, String openTag, String filteringTag) { -+ TAG_FIELDS.put(type, Pair.of(openTag, filteringTag)); ++ public static void register(RecipeBookType type) { ++ String name = type.name().toLowerCase(java.util.Locale.ROOT).replace("_",""); ++ var codec = TypeSettings.codec("is" + name + "GuiOpen", "is" + name + "FilteringCraftable"); ++ //TAG_FIELDS.put(type, Pair.of(openTag, filteringTag)); ++ throw new IllegalStateException("This is not implemented yet, poke Forge if you actually use this"); } } diff --git a/patches/minecraft/net/minecraft/tags/BlockTags.java.patch b/patches/minecraft/net/minecraft/tags/BlockTags.java.patch index 89705caa1b..3c90de5b9f 100644 --- a/patches/minecraft/net/minecraft/tags/BlockTags.java.patch +++ b/patches/minecraft/net/minecraft/tags/BlockTags.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/tags/BlockTags.java +++ b/net/minecraft/tags/BlockTags.java -@@ -203,4 +_,12 @@ +@@ -206,4 +_,12 @@ private static TagKey create(String p_203847_) { return TagKey.create(Registries.BLOCK, ResourceLocation.withDefaultNamespace(p_203847_)); } diff --git a/patches/minecraft/net/minecraft/tags/EntityTypeTags.java.patch b/patches/minecraft/net/minecraft/tags/EntityTypeTags.java.patch index 2f774e615f..c252acc12f 100644 --- a/patches/minecraft/net/minecraft/tags/EntityTypeTags.java.patch +++ b/patches/minecraft/net/minecraft/tags/EntityTypeTags.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/tags/EntityTypeTags.java +++ b/net/minecraft/tags/EntityTypeTags.java -@@ -46,4 +_,12 @@ +@@ -48,4 +_,12 @@ private static TagKey> create(String p_203849_) { return TagKey.create(Registries.ENTITY_TYPE, ResourceLocation.withDefaultNamespace(p_203849_)); } diff --git a/patches/minecraft/net/minecraft/tags/ItemTags.java.patch b/patches/minecraft/net/minecraft/tags/ItemTags.java.patch index f331a44ef1..cdf43dcd61 100644 --- a/patches/minecraft/net/minecraft/tags/ItemTags.java.patch +++ b/patches/minecraft/net/minecraft/tags/ItemTags.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/tags/ItemTags.java +++ b/net/minecraft/tags/ItemTags.java -@@ -188,4 +_,12 @@ +@@ -191,4 +_,12 @@ private static TagKey bind(String p_203855_) { return TagKey.create(Registries.ITEM, ResourceLocation.withDefaultNamespace(p_203855_)); } diff --git a/patches/minecraft/net/minecraft/tags/TagBuilder.java.patch b/patches/minecraft/net/minecraft/tags/TagBuilder.java.patch index bde0e8edaf..ac138195a3 100644 --- a/patches/minecraft/net/minecraft/tags/TagBuilder.java.patch +++ b/patches/minecraft/net/minecraft/tags/TagBuilder.java.patch @@ -9,10 +9,37 @@ private final List entries = new ArrayList<>(); public static TagBuilder create() { -@@ -34,5 +_,30 @@ +@@ -15,24 +_,48 @@ + return List.copyOf(this.entries); + } + +- public TagBuilder add(TagEntry p_215903_) { +- this.entries.add(p_215903_); +- return this; +- } +- + public TagBuilder addElement(ResourceLocation p_215901_) { +- return this.add(TagEntry.element(p_215901_)); ++ this.entries.add(TagEntry.element(p_215901_)); ++ return this; + } + + public TagBuilder addOptionalElement(ResourceLocation p_215906_) { +- return this.add(TagEntry.optionalElement(p_215906_)); ++ this.entries.add(TagEntry.optionalElement(p_215906_)); ++ return this; + } + + public TagBuilder addTag(ResourceLocation p_215908_) { +- return this.add(TagEntry.tag(p_215908_)); ++ this.entries.add(TagEntry.tag(p_215908_)); ++ return this; + } public TagBuilder addOptionalTag(ResourceLocation p_215910_) { - return this.add(TagEntry.optionalTag(p_215910_)); +- return this.add(TagEntry.optionalTag(p_215910_)); ++ this.entries.add(TagEntry.optionalTag(p_215910_)); ++ return this; + } + + /** Forge: Used for datagen */ diff --git a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch index bfef156035..0cc141b684 100644 --- a/patches/minecraft/net/minecraft/world/entity/Entity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Entity.java.patch @@ -1,25 +1,25 @@ --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -141,7 +_,7 @@ - import net.minecraft.world.scores.Team; +@@ -148,7 +_,7 @@ import org.jetbrains.annotations.Contract; + import org.slf4j.Logger; -public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter { -+public abstract class Entity extends net.minecraftforge.common.capabilities.CapabilityProvider implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter, net.minecraftforge.common.extensions.IForgeEntity { - public static final String ID_TAG = "id"; - public static final String PASSENGERS_TAG = "Passengers"; - private static final String DATA_TAG = "data"; -@@ -165,6 +_,7 @@ ++public abstract class Entity extends net.minecraftforge.common.capabilities.CapabilityProvider.Entities implements SyncedDataHolder, Nameable, EntityAccess, ScoreHolder, DataComponentGetter, net.minecraftforge.common.extensions.IForgeEntity { + public static final Logger LOGGER = LogUtils.getLogger(); + public static final String TAG_ID = "id"; + public static final String TAG_UUID = "UUID"; +@@ -185,6 +_,7 @@ + private static final double LAVA_FAST_FLOW_SCALE = 0.007; private static final double LAVA_SLOW_FLOW_SCALE = 0.0023333333333333335; - public static final String UUID_TAG = "UUID"; private static double viewScale = 1.0; + @Deprecated // Forge: Use the getter to allow overriding in mods private final EntityType type; + private boolean requiresPrecisePosition; private int id = ENTITY_COUNTER.incrementAndGet(); - public boolean blocksBuilding; -@@ -208,8 +_,10 @@ +@@ -229,8 +_,10 @@ public int tickCount; - private int remainingFireTicks = -this.getFireImmuneTicks(); + private int remainingFireTicks; protected boolean wasTouchingWater; + @Deprecated // Forge: Use forgeFluidTypeHeight instead protected Object2DoubleMap> fluidHeight = new Object2DoubleArrayMap<>(2); @@ -28,15 +28,15 @@ private final Set> fluidOnEyes = new HashSet<>(); public int invulnerableTime; protected boolean firstTick = true; -@@ -260,6 +_,7 @@ +@@ -282,6 +_,7 @@ private CustomData customData = CustomData.EMPTY; public Entity(EntityType p_19870_, Level p_19871_) { -+ super(Entity.class); ++ super(); this.type = p_19870_; this.level = p_19871_; this.dimensions = p_19870_.getDimensions(); -@@ -279,6 +_,8 @@ +@@ -301,6 +_,8 @@ this.entityData = synchedentitydata$builder.build(); this.setPos(0.0, 0.0, 0.0); this.eyeHeight = this.dimensions.eyeHeight(); @@ -45,7 +45,7 @@ } public boolean isColliding(BlockPos p_20040_, BlockState p_20041_) { -@@ -365,6 +_,7 @@ +@@ -395,6 +_,7 @@ public void remove(Entity.RemovalReason p_146834_) { this.setRemoved(p_146834_); @@ -53,7 +53,7 @@ } public void onClientRemoval() { -@@ -482,7 +_,7 @@ +@@ -509,7 +_,7 @@ } if (this.isInLava()) { @@ -62,7 +62,7 @@ } this.checkBelowWorld(); -@@ -912,9 +_,7 @@ +@@ -946,9 +_,7 @@ return blockpos; } else { BlockState blockstate = this.level().getBlockState(blockpos); @@ -73,7 +73,7 @@ ? blockpos.atY(Mth.floor(this.position.y - p_216987_)) : blockpos; } -@@ -1193,19 +_,19 @@ +@@ -1253,19 +_,19 @@ return !blockstate.is(BlockTags.INSIDE_STEP_SOUND_BLOCKS) && !blockstate.is(BlockTags.COMBINATION_STEP_SOUND_BLOCKS) ? p_278049_ : blockpos; } @@ -99,7 +99,7 @@ this.playSound(soundtype.getStepSound(), soundtype.getVolume() * 0.15F, soundtype.getPitch()); } -@@ -1338,6 +_,10 @@ +@@ -1398,6 +_,10 @@ return this.wasTouchingWater; } @@ -110,7 +110,7 @@ boolean isInRain() { BlockPos blockpos = this.blockPosition(); return this.level().isRainingAt(blockpos) -@@ -1358,24 +_,32 @@ +@@ -1433,24 +_,32 @@ public void updateSwimming() { if (this.isSwimming()) { @@ -150,7 +150,7 @@ if (!this.wasTouchingWater && !this.firstTick) { this.doWaterSplashEffect(); } -@@ -1390,6 +_,7 @@ +@@ -1465,6 +_,7 @@ private void updateFluidOnEyes() { this.wasEyeInWater = this.isEyeInFluid(FluidTags.WATER); this.fluidOnEyes.clear(); @@ -158,7 +158,7 @@ double d0 = this.getEyeY(); if (!( this.getVehicle() instanceof AbstractBoat abstractboat -@@ -1401,7 +_,7 @@ +@@ -1476,7 +_,7 @@ FluidState fluidstate = this.level().getFluidState(blockpos); double d1 = blockpos.getY() + fluidstate.getHeight(this.level(), blockpos); if (d1 > d0) { @@ -167,7 +167,7 @@ } } } -@@ -1455,12 +_,13 @@ +@@ -1530,12 +_,13 @@ } public boolean canSpawnSprintParticle() { @@ -182,7 +182,7 @@ if (blockstate.getRenderShape() != RenderShape.INVISIBLE) { Vec3 vec3 = this.getDeltaMovement(); BlockPos blockpos1 = this.blockPosition(); -@@ -1476,7 +_,7 @@ +@@ -1551,7 +_,7 @@ this.level() .addParticle( @@ -191,7 +191,7 @@ d0, this.getY() + 0.1, d1, -@@ -1487,12 +_,15 @@ +@@ -1562,12 +_,15 @@ } } @@ -208,38 +208,46 @@ } public void moveRelative(float p_19921_, Vec3 p_19922_) { -@@ -1862,6 +_,11 @@ - p_20241_.putBoolean("HasVisualFire", this.hasVisualFire); +@@ -1932,6 +_,10 @@ + p_409187_.putBoolean("HasVisualFire", this.hasVisualFire); } -+ p_20241_.putBoolean("CanUpdate", canUpdate); -+ CompoundTag caps = serializeCaps(this.registryAccess()); -+ if (caps != null) p_20241_.put("ForgeCaps", caps); -+ if (persistentData != null) p_20241_.put("ForgeData", persistentData.copy()); ++ p_409187_.putBoolean("CanUpdate", canUpdate); ++ p_409187_.storeNullable("ForgeCaps", net.minecraft.nbt.CompoundTag.CODEC, serializeCaps(this.registryAccess())); ++ p_409187_.storeNullable("ForgeData", net.minecraft.nbt.CompoundTag.CODEC, persistentData); + if (!this.tags.isEmpty()) { - p_20241_.store("Tags", TAG_LIST_CODEC, List.copyOf(this.tags)); + p_409187_.store("Tags", TAG_LIST_CODEC, List.copyOf(this.tags)); } -@@ -1940,6 +_,9 @@ - this.setGlowingTag(p_20259_.getBooleanOr("Glowing", false)); - this.setTicksFrozen(p_20259_.getIntOr("TicksFrozen", 0)); - this.hasVisualFire = p_20259_.getBooleanOr("HasVisualFire", false); -+ p_20259_.getCompound("ForgeData").ifPresent(data -> this.persistentData = data); -+ p_20259_.getBoolean("CanUpdate").ifPresent(this::canUpdate); -+ p_20259_.getCompound("ForgeCaps").ifPresent(caps -> this.deserializeCaps(this.registryAccess(), caps)); - this.customData = p_20259_.read("data", CustomData.CODEC).orElse(CustomData.EMPTY); +@@ -2007,6 +_,9 @@ + this.setGlowingTag(p_408698_.getBooleanOr("Glowing", false)); + this.setTicksFrozen(p_408698_.getIntOr("TicksFrozen", 0)); + this.hasVisualFire = p_408698_.getBooleanOr("HasVisualFire", false); ++ this.canUpdate(p_408698_.getBooleanOr("CanUpdate", true)); ++ this.persistentData = p_408698_.read("ForgeData", net.minecraft.nbt.CompoundTag.CODEC).orElse(null); ++ p_408698_.read("ForgeCaps", net.minecraft.nbt.CompoundTag.CODEC).ifPresent(caps -> this.deserializeCaps(this.registryAccess(), caps)); + this.customData = p_408698_.read("data", CustomData.CODEC).orElse(CustomData.EMPTY); this.tags.clear(); - p_20259_.read("Tags", TAG_LIST_CODEC).ifPresent(this.tags::addAll); -@@ -1995,6 +_,8 @@ - } else { - ItemEntity itementity = new ItemEntity(p_364149_, this.getX(), this.getY() + p_367722_, this.getZ(), p_366908_); + p_408698_.read("Tags", TAG_LIST_CODEC).ifPresent(this.tags::addAll); +@@ -2064,6 +_,8 @@ + p_409579_, this.getX() + p_408228_.x, this.getY() + p_408228_.y, this.getZ() + p_408228_.z, p_407826_ + ); itementity.setDefaultPickUpDelay(); + if (captureDrops() != null) captureDrops().add(itementity); + else - p_364149_.addFreshEntity(itementity); + p_409579_.addFreshEntity(itementity); return itementity; } -@@ -2062,6 +_,7 @@ +@@ -2127,7 +_,7 @@ + itemstack.hurtAndBreak(1, p_19978_, p_19979_); + return InteractionResult.SUCCESS; + } else if (this instanceof Mob mob +- && itemstack.is(Items.SHEARS) ++ && itemstack.canPerformAction(net.minecraftforge.common.ToolActions.SHEARS_HARVEST) + && mob.canShearEquipment(p_19978_) + && !p_19978_.isSecondaryUseActive() + && this.attemptToShearEquipment(p_19978_, p_19979_, itemstack, mob)) { +@@ -2232,6 +_,7 @@ public void rideTick() { this.setDeltaMovement(Vec3.ZERO); @@ -247,7 +255,7 @@ this.tick(); if (this.isPassenger()) { this.getVehicle().positionRider(this); -@@ -2122,6 +_,7 @@ +@@ -2292,6 +_,7 @@ } } @@ -255,7 +263,7 @@ if (p_19967_ || this.canRide(p_19966_) && p_19966_.canAddPassenger(this)) { if (this.isPassenger()) { this.stopRiding(); -@@ -2153,6 +_,7 @@ +@@ -2323,6 +_,7 @@ public void removeVehicle() { if (this.vehicle != null) { Entity entity = this.vehicle; @@ -263,7 +271,7 @@ this.vehicle = null; entity.removePassenger(this); } -@@ -2202,6 +_,8 @@ +@@ -2372,6 +_,8 @@ return this.passengers.isEmpty(); } @@ -272,7 +280,7 @@ protected boolean couldAcceptPassenger() { return true; } -@@ -2381,7 +_,7 @@ +@@ -2551,7 +_,7 @@ } public boolean isVisuallyCrawling() { @@ -281,7 +289,7 @@ } public void setSwimming(boolean p_20283_) { -@@ -2498,7 +_,7 @@ +@@ -2668,7 +_,7 @@ this.igniteForSeconds(8.0F); } @@ -290,7 +298,7 @@ } public void onAboveBubbleColumn(boolean p_392709_, BlockPos p_391902_) { -@@ -2631,7 +_,7 @@ +@@ -2801,7 +_,7 @@ } protected Component getTypeName() { @@ -299,7 +307,7 @@ } public boolean is(Entity p_20356_) { -@@ -2919,6 +_,7 @@ +@@ -3106,6 +_,7 @@ return this.stringUUID; } @@ -307,7 +315,7 @@ public boolean isPushedByFluid() { return true; } -@@ -3325,9 +_,17 @@ +@@ -3500,9 +_,17 @@ return Mth.lerp(p_344421_, this.yRotO, this.yRot); } @@ -326,7 +334,7 @@ } else { AABB aabb = this.getBoundingBox().deflate(0.001); int i = Mth.floor(aabb.minX); -@@ -3342,25 +_,28 @@ +@@ -3517,25 +_,28 @@ Vec3 vec3 = Vec3.ZERO; int k1 = 0; BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(); @@ -362,7 +370,7 @@ } } } -@@ -3368,27 +_,28 @@ +@@ -3543,27 +_,28 @@ } } @@ -401,7 +409,7 @@ } } -@@ -3401,7 +_,10 @@ +@@ -3576,7 +_,10 @@ return !this.level().hasChunksAt(i, k, j, l); } @@ -412,7 +420,7 @@ return this.fluidHeight.getDouble(p_204037_); } -@@ -3417,7 +_,9 @@ +@@ -3592,7 +_,9 @@ return this.dimensions.height(); } @@ -422,9 +430,9 @@ return new ClientboundAddEntityPacket(this, p_344981_); } -@@ -3538,6 +_,11 @@ - - this.levelCallback.onMove(); +@@ -3722,6 +_,11 @@ + } + } } + + // Forge - ensure target chunk is loaded. @@ -434,7 +442,7 @@ } public void checkDespawn() { -@@ -3693,6 +_,100 @@ +@@ -3895,6 +_,100 @@ float f1 = (float)Mth.lerp(d0, this.getXRot(), p_298926_); this.setPos(d1, d2, d3); this.setRot(f, f1); @@ -464,11 +472,11 @@ + return ret; + } + -+ private CompoundTag persistentData; ++ private net.minecraft.nbt.CompoundTag persistentData; + @Override -+ public CompoundTag getPersistentData() { ++ public net.minecraft.nbt.CompoundTag getPersistentData() { + if (persistentData == null) -+ persistentData = new CompoundTag(); ++ persistentData = new net.minecraft.nbt.CompoundTag(); + return persistentData; + } + diff --git a/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch b/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch index 0d5dafa1c7..06f29bd348 100644 --- a/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/EntityType.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/EntityType.java +++ b/net/minecraft/world/entity/EntityType.java -@@ -877,6 +_,11 @@ +@@ -887,6 +_,11 @@ private final float spawnDimensionsScale; private final FeatureFlagSet requiredFeatures; @@ -12,7 +12,7 @@ private static EntityType register(ResourceKey> p_368406_, EntityType.Builder p_363129_) { return Registry.register(BuiltInRegistries.ENTITY_TYPE, p_368406_, p_363129_.build(p_368406_)); } -@@ -911,7 +_,8 @@ +@@ -921,7 +_,8 @@ int p_273451_, String p_367006_, Optional> p_364691_, @@ -22,7 +22,7 @@ ) { this.factory = p_273268_; this.category = p_272918_; -@@ -927,6 +_,10 @@ +@@ -937,6 +_,10 @@ this.descriptionId = p_367006_; this.lootTable = p_364691_; this.requiredFeatures = p_273518_; @@ -33,7 +33,7 @@ } @Nullable -@@ -1181,14 +_,26 @@ +@@ -1197,14 +_,26 @@ } public int clientTrackingRange() { @@ -60,7 +60,7 @@ return this != PLAYER && this != LLAMA_SPIT && this != WITHER -@@ -1244,6 +_,12 @@ +@@ -1260,6 +_,12 @@ return OP_ONLY_CUSTOM_DATA.contains(this); } @@ -73,7 +73,7 @@ public static class Builder { private final EntityType.EntityFactory factory; private final MobCategory category; -@@ -1262,6 +_,10 @@ +@@ -1278,6 +_,10 @@ ResourceKey.create(Registries.LOOT_TABLE, p_358877_.location().withPrefix("entities/")) ); private final DependantName, String> descriptionId = p_358878_ -> Util.makeDescriptionId("entity", p_358878_.location()); @@ -84,7 +84,7 @@ private Builder(EntityType.EntityFactory p_20696_, MobCategory p_20697_) { this.factory = p_20696_; -@@ -1375,6 +_,30 @@ +@@ -1391,6 +_,30 @@ return this; } @@ -115,7 +115,7 @@ public EntityType build(ResourceKey> p_369693_) { if (this.serialize) { Util.fetchChoiceType(References.ENTITY_TREE, p_369693_.location().toString()); -@@ -1394,7 +_,8 @@ +@@ -1410,7 +_,8 @@ this.updateInterval, this.descriptionId.get(p_369693_), this.lootTable.get(p_369693_), diff --git a/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch b/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch index 53ccf9fcc9..68d5e4acfd 100644 --- a/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ExperienceOrb.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ExperienceOrb.java +++ b/net/minecraft/world/entity/ExperienceOrb.java -@@ -109,7 +_,8 @@ +@@ -137,7 +_,8 @@ this.applyEffectsFromBlocks(); float f = 0.98F; if (this.onGround()) { @@ -10,7 +10,7 @@ } this.setDeltaMovement(this.getDeltaMovement().scale(f)); -@@ -247,6 +_,7 @@ +@@ -279,6 +_,7 @@ public void playerTouch(Player p_20792_) { if (p_20792_ instanceof ServerPlayer serverplayer) { if (p_20792_.takeXpDelay == 0) { diff --git a/patches/minecraft/net/minecraft/world/entity/FlyingMob.java.patch b/patches/minecraft/net/minecraft/world/entity/FlyingMob.java.patch deleted file mode 100644 index 5efbdd8d6d..0000000000 --- a/patches/minecraft/net/minecraft/world/entity/FlyingMob.java.patch +++ /dev/null @@ -1,21 +0,0 @@ ---- a/net/minecraft/world/entity/FlyingMob.java -+++ b/net/minecraft/world/entity/FlyingMob.java -@@ -25,15 +_,16 @@ - this.move(MoverType.SELF, this.getDeltaMovement()); - this.setDeltaMovement(this.getDeltaMovement().scale(0.5)); - } else { -+ BlockPos ground = getBlockPosBelowThatAffectsMyMovement(); - float f = 0.91F; - if (this.onGround()) { -- f = this.level().getBlockState(this.getBlockPosBelowThatAffectsMyMovement()).getBlock().getFriction() * 0.91F; -+ f = this.level().getBlockState(ground).getFriction(this.level(), ground, this) * 0.91F; - } - - float f1 = 0.16277137F / (f * f * f); - f = 0.91F; - if (this.onGround()) { -- f = this.level().getBlockState(this.getBlockPosBelowThatAffectsMyMovement()).getBlock().getFriction() * 0.91F; -+ f = this.level().getBlockState(ground).getFriction(this.level(), ground, this) * 0.91F; - } - - this.moveRelative(this.onGround() ? 0.1F * f1 : 0.02F, p_20818_); diff --git a/patches/minecraft/net/minecraft/world/entity/Leashable.java.patch b/patches/minecraft/net/minecraft/world/entity/Leashable.java.patch new file mode 100644 index 0000000000..dc8e0d4bf3 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/entity/Leashable.java.patch @@ -0,0 +1,12 @@ +--- a/net/minecraft/world/entity/Leashable.java ++++ b/net/minecraft/world/entity/Leashable.java +@@ -186,7 +_,8 @@ + + static float angularFriction(E p_408063_) { + if (p_408063_.onGround()) { +- return p_408063_.level().getBlockState(p_408063_.getBlockPosBelowThatAffectsMyMovement()).getBlock().getFriction() * 0.91F; ++ var pos = p_408063_.getBlockPosBelowThatAffectsMyMovement(); ++ return p_408063_.level().getBlockState(pos).getFriction(p_408063_.level(), pos, p_408063_) * 0.91F; + } else { + return p_408063_.isInLiquid() ? 0.8F : 0.91F; + } diff --git a/patches/minecraft/net/minecraft/world/entity/LightningBolt.java.patch b/patches/minecraft/net/minecraft/world/entity/LightningBolt.java.patch index 8b84f83a8f..4cded85e32 100644 --- a/patches/minecraft/net/minecraft/world/entity/LightningBolt.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LightningBolt.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/LightningBolt.java +++ b/net/minecraft/world/entity/LightningBolt.java -@@ -39,6 +_,7 @@ +@@ -40,6 +_,7 @@ private ServerPlayer cause; private final Set hitEntities = Sets.newHashSet(); private int blocksSetOnFire; @@ -8,7 +8,7 @@ public LightningBolt(EntityType p_20865_, Level p_20866_) { super(p_20865_, p_20866_); -@@ -65,6 +_,14 @@ +@@ -66,6 +_,14 @@ this.cause = p_20880_; } @@ -23,7 +23,7 @@ private void powerLightningRod() { BlockPos blockpos = this.getStrikePosition(); BlockState blockstate = this.level().getBlockState(blockpos); -@@ -163,6 +_,7 @@ +@@ -164,6 +_,7 @@ ); for (Entity entity : list1) { diff --git a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch index 222e49566e..a124758b0c 100644 --- a/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/LivingEntity.java.patch @@ -1,44 +1,46 @@ --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -135,7 +_,7 @@ +@@ -139,7 +_,7 @@ import org.jetbrains.annotations.Contract; import org.slf4j.Logger; --public abstract class LivingEntity extends Entity implements Attackable { -+public abstract class LivingEntity extends Entity implements Attackable, net.minecraftforge.common.extensions.IForgeLivingEntity { +-public abstract class LivingEntity extends Entity implements Attackable, WaypointTransmitter { ++public abstract class LivingEntity extends Entity implements Attackable, WaypointTransmitter, net.minecraftforge.common.extensions.IForgeLivingEntity { private static final Logger LOGGER = LogUtils.getLogger(); private static final String TAG_ACTIVE_EFFECTS = "active_effects"; - private static final ResourceLocation SPEED_MODIFIER_POWDER_SNOW_ID = ResourceLocation.withDefaultNamespace("powder_snow"); -@@ -171,6 +_,8 @@ + public static final String TAG_ATTRIBUTES = "attributes"; +@@ -183,6 +_,8 @@ + protected static final EntityDimensions SLEEPING_DIMENSIONS = EntityDimensions.fixed(0.2F, 0.2F).withEyeHeight(0.2F); public static final float EXTRA_RENDER_CULLING_SIZE_WITH_BIG_HAT = 0.5F; public static final float DEFAULT_BABY_SCALE = 0.5F; - public static final String ATTRIBUTES_FIELD = "attributes"; + /** Forge: Use a variant that calls {@link ItemStack#isMonsterDisguise(Player, net.minecraft.world.entity.monster.Monster)} and {@link net.minecraftforge.event.entity.living.MonsterDisguiseEvent} */ + @Deprecated public static final Predicate PLAYER_NOT_WEARING_DISGUISE_ITEM = p_390518_ -> { if (p_390518_ instanceof Player player) { ItemStack itemstack = player.getItemBySlot(EquipmentSlot.HEAD); -@@ -254,7 +_,8 @@ +@@ -267,7 +_,7 @@ + this.reapplyPosition(); this.setYRot((float)(Math.random() * (float) (Math.PI * 2))); this.yHeadRot = this.getYRot(); - NbtOps nbtops = NbtOps.INSTANCE; -- this.brain = this.makeBrain(new Dynamic<>(nbtops, nbtops.createMap(ImmutableMap.of(nbtops.createString("memories"), nbtops.emptyMap())))); -+ var dyn = new Dynamic<>(nbtops, nbtops.createMap(ImmutableMap.of(nbtops.createString("memories"), nbtops.emptyMap()))); -+ this.brain = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.makeBrain(dyn), dyn); +- this.brain = this.makeBrain(EMPTY_BRAIN); ++ this.brain = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.makeBrain(EMPTY_BRAIN), EMPTY_BRAIN); } @Contract( -@@ -315,7 +_,8 @@ +@@ -328,9 +_,10 @@ .add(Attributes.EXPLOSION_KNOCKBACK_RESISTANCE) .add(Attributes.WATER_MOVEMENT_EFFICIENCY) .add(Attributes.MOVEMENT_EFFICIENCY) -- .add(Attributes.ATTACK_KNOCKBACK); +- .add(Attributes.ATTACK_KNOCKBACK) + .add(Attributes.CAMERA_DISTANCE) +- .add(Attributes.WAYPOINT_TRANSMIT_RANGE); + .add(Attributes.ATTACK_KNOCKBACK) ++ .add(Attributes.WAYPOINT_TRANSMIT_RANGE) + .add(Attributes.JUMP_STRENGTH); } @Override -@@ -342,7 +_,8 @@ +@@ -357,7 +_,8 @@ double d7 = Math.min(0.2F + d6 / 15.0, 2.5); int i = (int)(150.0 * d7); @@ -48,15 +50,15 @@ } } -@@ -352,6 +_,7 @@ +@@ -367,6 +_,7 @@ } } + @Deprecated //FORGE: Use canDrownInFluidType instead - public final boolean canBreatheUnderwater() { + public boolean canBreatheUnderwater() { return this.getType().is(EntityTypeTags.CAN_BREATHE_UNDER_WATER); } -@@ -396,6 +_,10 @@ +@@ -411,6 +_,10 @@ } } @@ -67,7 +69,7 @@ if (this.isEyeInFluid(FluidTags.WATER) && !serverlevel1.getBlockState(BlockPos.containing(this.getX(), this.getEyeY(), this.getZ())).is(Blocks.BUBBLE_COLUMN)) { boolean flag1 = !this.canBreatheUnderwater() && !MobEffectUtil.hasWaterBreathing(this) && (!flag || !((Player)this).getAbilities().invulnerable); -@@ -731,6 +_,9 @@ +@@ -757,6 +_,9 @@ } else { ItemEntity itementity = this.createItemStackToDrop(p_395943_, p_393118_, p_392158_); if (itementity != null) { @@ -77,19 +79,16 @@ this.level().addFreshEntity(itementity); } -@@ -773,7 +_,10 @@ +@@ -798,7 +_,7 @@ this.setPosToBed(p_390515_); } }, this::clearSleepingPos); -- p_21096_.getCompound("Brain").ifPresent(p_390523_ -> this.brain = this.makeBrain(new Dynamic<>(NbtOps.INSTANCE, p_390523_))); -+ p_21096_.getCompound("Brain").ifPresent(p_390523_ -> { -+ var dyn = new Dynamic<>(NbtOps.INSTANCE, p_390523_); -+ this.brain = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.makeBrain(dyn), dyn); -+ }); - this.lastHurtByPlayer = EntityReference.read(p_21096_, "last_hurt_by_player"); - this.lastHurtByPlayerMemoryTime = p_21096_.getIntOr("last_hurt_by_player_memory_time", 0); - this.lastHurtByMob = EntityReference.read(p_21096_, "last_hurt_by_mob"); -@@ -790,8 +_,10 @@ +- p_406679_.read("Brain", Codec.PASSTHROUGH).ifPresent(p_405289_ -> this.brain = this.makeBrain((Dynamic)p_405289_)); ++ p_406679_.read("Brain", Codec.PASSTHROUGH).ifPresent(p_405289_ -> this.brain = net.minecraftforge.common.ForgeHooks.onLivingMakeBrain(this, this.makeBrain((Dynamic)p_405289_), (Dynamic)p_405289_)); + this.lastHurtByPlayer = EntityReference.read(p_406679_, "last_hurt_by_player"); + this.lastHurtByPlayerMemoryTime = p_406679_.getIntOr("last_hurt_by_player_memory_time", 0); + this.lastHurtByMob = EntityReference.read(p_406679_, "last_hurt_by_mob"); +@@ -816,8 +_,10 @@ Holder holder = iterator.next(); MobEffectInstance mobeffectinstance = this.activeEffects.get(holder); if (!mobeffectinstance.tickServer(serverlevel, this, () -> this.onEffectUpdated(mobeffectinstance, true, null))) { @@ -100,7 +99,7 @@ } else if (mobeffectinstance.getDuration() % 600 == 0) { this.onEffectUpdated(mobeffectinstance, false, null); } -@@ -871,6 +_,7 @@ +@@ -897,6 +_,7 @@ } } @@ -108,7 +107,7 @@ return d0; } -@@ -945,6 +_,7 @@ +@@ -971,6 +_,7 @@ } else { MobEffectInstance mobeffectinstance = this.activeEffects.get(p_147208_.getEffect()); boolean flag = false; @@ -116,7 +115,7 @@ if (mobeffectinstance == null) { this.activeEffects.put(p_147208_.getEffect(), p_147208_); this.onEffectAdded(p_147208_, p_147209_); -@@ -961,6 +_,10 @@ +@@ -987,6 +_,10 @@ } public boolean canBeAffected(MobEffectInstance p_21197_) { @@ -127,7 +126,7 @@ if (this.getType().is(EntityTypeTags.IMMUNE_TO_INFESTED)) { return !p_21197_.is(MobEffects.INFESTED); } else if (this.getType().is(EntityTypeTags.IMMUNE_TO_OOZING)) { -@@ -994,6 +_,9 @@ +@@ -1020,6 +_,9 @@ } public boolean removeEffect(Holder p_335910_) { @@ -137,7 +136,7 @@ MobEffectInstance mobeffectinstance = this.removeEffectNoUpdate(p_335910_); if (mobeffectinstance != null) { this.onEffectsRemoved(List.of(mobeffectinstance)); -@@ -1038,6 +_,9 @@ +@@ -1064,6 +_,9 @@ this.effectsDirty = true; for (MobEffectInstance mobeffectinstance : p_364717_) { @@ -147,7 +146,7 @@ mobeffectinstance.getEffect().value().removeAttributeModifiers(this.getAttributes()); for (Entity entity : this.getPassengers()) { -@@ -1078,6 +_,10 @@ +@@ -1111,6 +_,10 @@ } public void heal(float p_21116_) { @@ -158,7 +157,7 @@ float f = this.getHealth(); if (f > 0.0F) { this.setHealth(f + p_21116_); -@@ -1098,6 +_,9 @@ +@@ -1131,6 +_,9 @@ @Override public boolean hurtServer(ServerLevel p_361743_, DamageSource p_361865_, float p_365677_) { @@ -168,18 +167,18 @@ if (this.isInvulnerableTo(p_361743_, p_361865_)) { return false; } else if (this.isDeadOrDying()) { -@@ -1244,6 +_,10 @@ +@@ -1277,6 +_,10 @@ } float f = blocksattacks.resolveBlockedDamage(p_392511_, p_394545_, d0); + var ev = net.minecraftforge.event.ForgeEventFactory.onShieldBlock(this, p_392511_, f, itemstack); -+ if (ev.isCanceled()) return 0.0F; ++ if (ev == null) return 0.0F; + f = ev.getBlockedDamage(); + if (ev.shieldTakesDamage()) blocksattacks.hurtBlockingItem(this.level(), itemstack, this, this.getUsedItemHand(), f); if (!p_392511_.is(DamageTypeTags.IS_PROJECTILE) && p_392511_.getDirectEntity() instanceof LivingEntity livingentity) { this.blockUsingItem(p_396198_, livingentity); -@@ -1278,7 +_,7 @@ +@@ -1311,7 +_,7 @@ Entity entity = p_378258_.getEntity(); if (entity instanceof Player player) { this.setLastHurtByPlayer(player, 100); @@ -188,7 +187,7 @@ if (wolf.getOwnerReference() != null) { this.setLastHurtByPlayer(wolf.getOwnerReference().getUUID(), 100); } else { -@@ -1308,7 +_,7 @@ +@@ -1341,7 +_,7 @@ for (InteractionHand interactionhand : InteractionHand.values()) { ItemStack itemstack1 = this.getItemInHand(interactionhand); deathprotection = itemstack1.get(DataComponents.DEATH_PROTECTION); @@ -197,7 +196,7 @@ itemstack = itemstack1.copy(); itemstack1.shrink(1); break; -@@ -1372,6 +_,7 @@ +@@ -1405,6 +_,7 @@ } public void die(DamageSource p_21014_) { @@ -205,7 +204,7 @@ if (!this.isRemoved() && !this.dead) { Entity entity = p_21014_.getEntity(); LivingEntity livingentity = this.getKillCredit(); -@@ -1407,10 +_,10 @@ +@@ -1440,10 +_,10 @@ if (this.level() instanceof ServerLevel serverlevel) { boolean flag = false; if (p_21269_ instanceof WitherBoss) { @@ -218,7 +217,7 @@ this.level().setBlock(blockpos, blockstate, 3); flag = true; } -@@ -1425,6 +_,7 @@ +@@ -1458,6 +_,7 @@ } protected void dropAllDeathLoot(ServerLevel p_342160_, DamageSource p_21192_) { @@ -226,7 +225,7 @@ boolean flag = this.lastHurtByPlayerMemoryTime > 0; if (this.shouldDropLoot() && p_342160_.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { this.dropFromLootTable(p_342160_, p_21192_, flag); -@@ -1433,6 +_,11 @@ +@@ -1466,6 +_,11 @@ this.dropEquipment(p_342160_); this.dropExperience(p_342160_, p_21192_.getEntity()); @@ -238,7 +237,7 @@ } protected void dropEquipment(ServerLevel p_365823_) { -@@ -1440,7 +_,8 @@ +@@ -1473,7 +_,8 @@ protected void dropExperience(ServerLevel p_370040_, @Nullable Entity p_342525_) { if (!this.wasExperienceConsumed() && (this.isAlwaysExperienceDropper() || this.lastHurtByPlayerMemoryTime > 0 && this.shouldDropExperience() && p_370040_.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT))) { @@ -248,19 +247,19 @@ } } -@@ -1517,6 +_,11 @@ +@@ -1550,6 +_,11 @@ } public void knockback(double p_147241_, double p_147242_, double p_147243_) { + var event = net.minecraftforge.event.ForgeEventFactory.onLivingKnockBack(this, (float) p_147241_, p_147242_, p_147243_); -+ if (event.isCanceled()) return; ++ if (event == null) return; + p_147241_ = event.getStrength(); + p_147242_ = event.getRatioX(); + p_147243_ = event.getRatioZ(); p_147241_ *= 1.0 - this.getAttributeValue(Attributes.KNOCKBACK_RESISTANCE); if (!(p_147241_ <= 0.0)) { this.hasImpulse = true; -@@ -1594,6 +_,13 @@ +@@ -1627,6 +_,13 @@ } else { BlockPos blockpos = this.blockPosition(); BlockState blockstate = this.getInBlockState(); @@ -274,18 +273,18 @@ if (blockstate.is(BlockTags.CLIMBABLE)) { this.lastClimbablePos = Optional.of(blockpos); return true; -@@ -1648,6 +_,10 @@ +@@ -1681,6 +_,10 @@ @Override public boolean causeFallDamage(double p_393354_, float p_147187_, DamageSource p_147189_) { + var event = net.minecraftforge.event.ForgeEventFactory.onLivingFall(this, p_393354_, p_147187_); -+ if (event.isCanceled()) return false; ++ if (event == null) return false; + p_393354_ = event.getDistance(); + p_147187_ = event.getDamageMultiplier(); boolean flag = super.causeFallDamage(p_393354_, p_147187_, p_147189_); int i = this.calculateFallDamage(p_393354_, p_147187_); if (i > 0) { -@@ -1678,9 +_,10 @@ +@@ -1711,9 +_,10 @@ int i = Mth.floor(this.getX()); int j = Mth.floor(this.getY() - 0.2F); int k = Mth.floor(this.getZ()); @@ -298,7 +297,7 @@ this.playSound(soundtype.getFallSound(), soundtype.getVolume() * 0.5F, soundtype.getPitch() * 0.75F); } } -@@ -1738,9 +_,9 @@ +@@ -1771,9 +_,9 @@ float f2 = f1 - p_21194_; if (f2 > 0.0F && f2 < 3.4028235E37F) { if (this instanceof ServerPlayer) { @@ -310,7 +309,7 @@ } } } -@@ -1768,6 +_,8 @@ +@@ -1801,6 +_,8 @@ protected void actuallyHurt(ServerLevel p_365124_, DamageSource p_21240_, float p_21241_) { if (!this.isInvulnerableTo(p_365124_, p_21240_)) { @@ -319,7 +318,7 @@ p_21241_ = this.getDamageAfterArmorAbsorb(p_21240_, p_21241_); p_21241_ = this.getDamageAfterMagicAbsorb(p_21240_, p_21241_); float f1 = Math.max(p_21241_ - this.getAbsorptionAmount(), 0.0F); -@@ -1777,6 +_,7 @@ +@@ -1810,6 +_,7 @@ serverplayer.awardStat(Stats.DAMAGE_DEALT_ABSORBED, Math.round(f * 10.0F)); } @@ -327,7 +326,7 @@ if (f1 != 0.0F) { this.getCombatTracker().recordDamage(p_21240_, f1); this.setHealth(this.getHealth() - f1); -@@ -1836,6 +_,8 @@ +@@ -1869,6 +_,8 @@ } public void swing(InteractionHand p_21012_, boolean p_21013_) { @@ -336,7 +335,7 @@ if (!this.swinging || this.swingTime >= this.getCurrentSwingDuration() / 2 || this.swingTime < 0) { this.swingTime = -1; this.swinging = true; -@@ -1960,9 +_,10 @@ +@@ -1993,9 +_,10 @@ } private void swapHandItems() { @@ -344,13 +343,13 @@ - this.setItemSlot(EquipmentSlot.OFFHAND, this.getItemBySlot(EquipmentSlot.MAINHAND)); - this.setItemSlot(EquipmentSlot.MAINHAND, itemstack); + var event = net.minecraftforge.event.ForgeEventFactory.onLivingSwapHandItems(this); -+ if (event.isCanceled()) return; ++ if (event == null) return; + this.setItemSlot(EquipmentSlot.OFFHAND, event.getItemSwappedToOffHand()); + this.setItemSlot(EquipmentSlot.MAINHAND, event.getItemSwappedToMainHand()); } @Override -@@ -2168,15 +_,18 @@ +@@ -2201,15 +_,18 @@ } this.hasImpulse = true; @@ -371,7 +370,7 @@ } protected float getWaterSlowDown() { -@@ -2199,8 +_,8 @@ +@@ -2232,8 +_,8 @@ public void travel(Vec3 p_21280_) { FluidState fluidstate = this.level().getFluidState(this.blockPosition()); @@ -382,7 +381,7 @@ } else if (this.isFallFlying()) { this.travelFallFlying(p_21280_); } else { -@@ -2210,7 +_,7 @@ +@@ -2263,7 +_,7 @@ private void travelInAir(Vec3 p_362087_) { BlockPos blockpos = this.getBlockPosBelowThatAffectsMyMovement(); @@ -391,7 +390,7 @@ float f1 = f * 0.91F; Vec3 vec3 = this.handleRelativeFrictionAndCalculateMovement(p_362087_, f); double d0 = vec3.y; -@@ -2233,10 +_,18 @@ +@@ -2286,10 +_,18 @@ } } @@ -411,7 +410,7 @@ if (this.isInWater()) { float f = this.isSprinting() ? 0.9F : this.getWaterSlowDown(); float f1 = 0.02F; -@@ -2254,6 +_,7 @@ +@@ -2307,6 +_,7 @@ f = 0.96F; } @@ -419,7 +418,7 @@ this.moveRelative(f1, p_362114_); this.move(MoverType.SELF, this.getDeltaMovement()); Vec3 vec3 = this.getDeltaMovement(); -@@ -2412,7 +_,7 @@ +@@ -2465,7 +_,7 @@ double d0 = Mth.clamp(p_21298_.x, -0.15F, 0.15F); double d1 = Mth.clamp(p_21298_.z, -0.15F, 0.15F); double d2 = Math.max(p_21298_.y, -0.15F); @@ -428,7 +427,7 @@ d2 = 0.0; } -@@ -2445,6 +_,7 @@ +@@ -2498,6 +_,7 @@ @Override public void tick() { @@ -436,7 +435,7 @@ super.tick(); this.updatingUsingItem(); this.updateSwimAmount(); -@@ -2576,6 +_,7 @@ +@@ -2629,6 +_,7 @@ ItemStack itemstack = this.lastEquipmentItems.get(equipmentslot); ItemStack itemstack1 = this.getItemBySlot(equipmentslot); if (this.equipmentHasChanged(itemstack, itemstack1)) { @@ -444,7 +443,7 @@ if (map == null) { map = Maps.newEnumMap(EquipmentSlot.class); } -@@ -2711,6 +_,10 @@ +@@ -2764,6 +_,10 @@ profilerfiller.push("jump"); if (this.jumping && this.isAffectedByFluids()) { double d3; @@ -455,7 +454,7 @@ if (this.isInLava()) { d3 = this.getFluidHeight(FluidTags.LAVA); } else { -@@ -2721,15 +_,22 @@ +@@ -2774,15 +_,22 @@ double d4 = this.getFluidJumpThreshold(); if (!flag || this.onGround() && !(d3 > d4)) { if (!this.isInLava() || this.onGround() && !(d3 > d4)) { @@ -480,7 +479,7 @@ } } else { this.noJumpDelay = 0; -@@ -3041,8 +_,11 @@ +@@ -3098,8 +_,11 @@ private void updatingUsingItem() { if (this.isUsingItem()) { @@ -493,7 +492,7 @@ this.updateUsingItem(this.useItem); } else { this.stopUsingItem(); -@@ -3086,8 +_,12 @@ +@@ -3143,8 +_,12 @@ } protected void updateUsingItem(ItemStack p_147201_) { @@ -507,7 +506,7 @@ this.completeUsingItem(); } } -@@ -3115,8 +_,10 @@ +@@ -3172,8 +_,10 @@ public void startUsingItem(InteractionHand p_21159_) { ItemStack itemstack = this.getItemInHand(p_21159_); if (!itemstack.isEmpty() && !this.isUsingItem()) { @@ -519,7 +518,7 @@ if (!this.level().isClientSide) { this.setLivingEntityFlag(1, true); this.setLivingEntityFlag(2, p_21159_ == InteractionHand.OFF_HAND); -@@ -3168,6 +_,9 @@ +@@ -3225,6 +_,9 @@ vec31 = vec31.xRot(-this.getXRot() * (float) (Math.PI / 180.0)); vec31 = vec31.yRot(-this.getYRot() * (float) (Math.PI / 180.0)); vec31 = vec31.add(this.getX(), this.getEyeY(), this.getZ()); @@ -529,7 +528,7 @@ this.level() .addParticle( new ItemParticleOption(ParticleTypes.ITEM, p_21061_), -@@ -3188,7 +_,9 @@ +@@ -3245,7 +_,9 @@ this.releaseUsingItem(); } else { if (!this.useItem.isEmpty() && this.isUsingItem()) { @@ -539,7 +538,7 @@ if (itemstack != this.useItem) { this.setItemInHand(interactionhand, itemstack); } -@@ -3218,7 +_,13 @@ +@@ -3275,7 +_,13 @@ ItemStack itemstack = this.getItemInHand(this.getUsedItemHand()); if (!this.useItem.isEmpty() && ItemStack.isSameItem(itemstack, this.useItem)) { this.useItem = itemstack; @@ -553,7 +552,7 @@ if (this.useItem.useOnRelease()) { this.updatingUsingItem(); } -@@ -3228,6 +_,7 @@ +@@ -3285,6 +_,7 @@ } public void stopUsingItem() { @@ -561,7 +560,7 @@ if (!this.level().isClientSide) { boolean flag = this.isUsingItem(); this.setLivingEntityFlag(1, false); -@@ -3396,8 +_,8 @@ +@@ -3453,8 +_,8 @@ } BlockState blockstate = this.level().getBlockState(p_21141_); @@ -572,12 +571,12 @@ } this.setPose(Pose.SLEEPING); -@@ -3412,15 +_,15 @@ +@@ -3469,15 +_,15 @@ } private boolean checkBedExists() { -- return this.getSleepingPos().map(p_374931_ -> this.level().getBlockState(p_374931_).getBlock() instanceof BedBlock).orElse(false); -+ return this.getSleepingPos().map(p_341272_ -> net.minecraftforge.event.ForgeEventFactory.fireSleepingLocationCheck(this, p_341272_)).orElse(false); +- return this.getSleepingPos().map(p_405281_ -> this.level().getBlockState(p_405281_).getBlock() instanceof BedBlock).orElse(false); ++ return this.getSleepingPos().map(p_405281_ -> net.minecraftforge.event.ForgeEventFactory.fireSleepingLocationCheck(this, p_405281_)).orElse(false); } public void stopSleeping() { @@ -591,7 +590,7 @@ Vec3 vec31 = BedBlock.findStandUpPosition(this.getType(), this.level(), p_261435_, direction, this.getYRot()).orElseGet(() -> { BlockPos blockpos = p_261435_.above(); return new Vec3(blockpos.getX() + 0.5, blockpos.getY() + 0.1, blockpos.getZ() + 0.5); -@@ -3441,7 +_,9 @@ +@@ -3498,7 +_,9 @@ @Nullable public Direction getBedOrientation() { BlockPos blockpos = this.getSleepingPos().orElse(null); @@ -602,7 +601,7 @@ } @Override -@@ -3450,7 +_,7 @@ +@@ -3507,7 +_,7 @@ } public ItemStack getProjectile(ItemStack p_21272_) { @@ -611,7 +610,7 @@ } private static byte entityEventForEquipmentBreak(EquipmentSlot p_21267_) { -@@ -3506,6 +_,8 @@ +@@ -3563,6 +_,8 @@ } public final EquipmentSlot getEquipmentSlotForItem(ItemStack p_147234_) { @@ -620,7 +619,7 @@ Equippable equippable = p_147234_.get(DataComponents.EQUIPPABLE); return equippable != null && this.canUseSlot(equippable.slot()) ? equippable.slot() : EquipmentSlot.MAINHAND; } -@@ -3641,5 +_,42 @@ +@@ -3726,5 +_,42 @@ } public record Fallsounds(SoundEvent small, SoundEvent big) { diff --git a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch index 84723ddf57..dbb4a8cf79 100644 --- a/patches/minecraft/net/minecraft/world/entity/Mob.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/Mob.java.patch @@ -1,54 +1,53 @@ --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -124,6 +_,9 @@ +@@ -127,6 +_,9 @@ private Leashable.LeashData leashData; - private BlockPos restrictCenter = BlockPos.ZERO; - private float restrictRadius = -1.0F; + private BlockPos homePosition = BlockPos.ZERO; + private int homeRadius = -1; + @Nullable + private EntitySpawnReason spawnReason; + private boolean spawnCancelled = false; protected Mob(EntityType p_21368_, Level p_21369_) { super(p_21368_, p_21369_); -@@ -220,7 +_,10 @@ +@@ -223,7 +_,10 @@ } public void setTarget(@Nullable LivingEntity p_21544_) { - this.target = p_21544_; + var event = net.minecraftforge.event.ForgeEventFactory.onLivingChangeTargetMob(this, p_21544_); -+ if (!event.isCanceled()) { ++ if (event != null) { + this.target = event.getNewTarget(); + } } @Override -@@ -356,6 +_,10 @@ +@@ -363,6 +_,10 @@ if (this.isNoAi()) { - p_21484_.putBoolean("NoAI", this.isNoAi()); + p_409238_.putBoolean("NoAI", this.isNoAi()); } + + if (this.spawnReason != null) { -+ p_21484_.putString("forge:spawn_type", this.spawnReason.name()); ++ p_409238_.putString("forge:spawn_type", this.spawnReason.name()); + } } @Override -@@ -370,6 +_,14 @@ - this.lootTable = p_21450_.read("DeathLootTable", LootTable.KEY_CODEC); - this.lootTableSeed = p_21450_.getLongOr("DeathLootTableSeed", 0L); - this.setNoAi(p_21450_.getBooleanOr("NoAI", false)); +@@ -381,6 +_,13 @@ + this.lootTable = p_408489_.read("DeathLootTable", LootTable.KEY_CODEC); + this.lootTableSeed = p_408489_.getLongOr("DeathLootTableSeed", 0L); + this.setNoAi(p_408489_.getBooleanOr("NoAI", false)); + -+ p_21450_.getString("forge:spawn_type").ifPresent(type -> { ++ p_408489_.getString("forge:spawn_type").ifPresent(type -> { + try { + this.spawnReason = EntitySpawnReason.valueOf(type); + } catch (Exception ex) { -+ p_21450_.remove("forge:spawn_type"); + } + }); } @Override -@@ -422,7 +_,7 @@ +@@ -435,7 +_,7 @@ && this.canPickUpLoot() && this.isAlive() && !this.dead @@ -57,22 +56,22 @@ Vec3i vec3i = this.getPickupReach(); for (ItemEntity itementity : this.level() -@@ -583,6 +_,14 @@ +@@ -600,6 +_,14 @@ this.discard(); } else if (!this.isPersistenceRequired() && !this.requiresCustomPersistence()) { Entity entity = this.level().getNearestPlayer(this, -1.0); + var result = net.minecraftforge.event.ForgeEventFactory.canEntityDespawn(this, (ServerLevel)this.level()); -+ if (result == net.minecraftforge.eventbus.api.Event.Result.DENY) { ++ if (result.isDenied()) { + noActionTime = 0; + entity = null; -+ } else if (result == net.minecraftforge.eventbus.api.Event.Result.ALLOW) { ++ } else if (result.isAllowed()) { + this.discard(); + entity = null; + } if (entity != null) { double d0 = entity.distanceToSqr(this); int i = this.getType().getCategory().getDespawnDistance(); -@@ -973,6 +_,16 @@ +@@ -994,6 +_,16 @@ } } @@ -89,7 +88,7 @@ @Nullable public SpawnGroupData finalizeSpawn(ServerLevelAccessor p_21434_, DifficultyInstance p_21435_, EntitySpawnReason p_369316_, @Nullable SpawnGroupData p_21437_) { RandomSource randomsource = p_21434_.getRandom(); -@@ -984,6 +_,7 @@ +@@ -1005,6 +_,7 @@ } this.setLeftHanded(randomsource.nextFloat() < 0.05F); @@ -97,7 +96,7 @@ return p_21437_; } -@@ -1288,15 +_,25 @@ +@@ -1314,15 +_,25 @@ return false; } @@ -124,7 +123,7 @@ @VisibleForTesting public void removeFreeWill() { this.removeAllGoals(p_341273_ -> true); -@@ -1324,6 +_,41 @@ +@@ -1350,6 +_,41 @@ public ItemStack getPickResult() { SpawnEggItem spawneggitem = SpawnEggItem.byId(this.getType()); return spawneggitem == null ? null : new ItemStack(spawneggitem); diff --git a/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch b/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch index eb8ea6af80..10bdc850c3 100644 --- a/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/SpawnPlacements.java.patch @@ -18,7 +18,7 @@ } static { -@@ -165,5 +_,13 @@ +@@ -166,5 +_,13 @@ @FunctionalInterface public interface SpawnPredicate { boolean test(EntityType p_217081_, ServerLevelAccessor p_217082_, EntitySpawnReason p_365908_, BlockPos p_217084_, RandomSource p_217085_); diff --git a/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch b/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch index fc94098d8e..a1e829626e 100644 --- a/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/TamableAnimal.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/TamableAnimal.java +++ b/net/minecraft/world/entity/TamableAnimal.java -@@ -227,13 +_,16 @@ +@@ -212,13 +_,16 @@ @Override public void die(DamageSource p_21809_) { diff --git a/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch index 75fc966be3..26f9e10049 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -176,11 +_,12 @@ +@@ -178,11 +_,12 @@ .build(); public static AttributeSupplier getSupplier(EntityType p_22298_) { diff --git a/patches/minecraft/net/minecraft/world/entity/ai/behavior/StartAttacking.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/behavior/StartAttacking.java.patch index 73ea8dcde8..05a22cd977 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/behavior/StartAttacking.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/behavior/StartAttacking.java.patch @@ -6,7 +6,7 @@ } else { - p_258778_.set(livingentity); + var changeTargetEvent = net.minecraftforge.event.ForgeEventFactory.onLivingChangeTargetBehavior(p_359049_, livingentity); -+ if (changeTargetEvent.isCanceled()) ++ if (changeTargetEvent == null) + return false; + + p_258778_.set(changeTargetEvent.getNewTarget()); diff --git a/patches/minecraft/net/minecraft/world/entity/ai/village/VillageSiege.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/village/VillageSiege.java.patch index d2c88011d1..5220b57966 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/village/VillageSiege.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/village/VillageSiege.java.patch @@ -7,7 +7,7 @@ - if (this.findRandomSpawnPos(p_27008_, new BlockPos(this.spawnX, this.spawnY, this.spawnZ)) != null) { + Vec3 siegeLocation = this.findRandomSpawnPos(p_27008_, new BlockPos(this.spawnX, this.spawnY, this.spawnZ)); + if (siegeLocation != null) { -+ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.village.VillageSiegeEvent(this, p_27008_, player, siegeLocation))) ++ if (net.minecraftforge.event.village.VillageSiegeEvent.BUS.post(new net.minecraftforge.event.village.VillageSiegeEvent(this, p_27008_, player, siegeLocation))) + return false; this.nextSpawnTime = 0; this.zombiesToSpawn = 20; diff --git a/patches/minecraft/net/minecraft/world/entity/ai/village/poi/PoiTypes.java.patch b/patches/minecraft/net/minecraft/world/entity/ai/village/poi/PoiTypes.java.patch index 25c0bf3820..ffef283c38 100644 --- a/patches/minecraft/net/minecraft/world/entity/ai/village/poi/PoiTypes.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/ai/village/poi/PoiTypes.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ai/village/poi/PoiTypes.java +++ b/net/minecraft/world/entity/ai/village/poi/PoiTypes.java -@@ -66,7 +_,7 @@ +@@ -67,7 +_,7 @@ .stream() .flatMap(p_218093_ -> p_218093_.getStateDefinition().getPossibleStates().stream()) .collect(ImmutableSet.toImmutableSet()); @@ -9,7 +9,7 @@ private static Set getBlockStates(Block p_218074_) { return ImmutableSet.copyOf(p_218074_.getStateDefinition().getPossibleStates()); -@@ -79,7 +_,6 @@ +@@ -80,7 +_,6 @@ private static PoiType register(Registry p_218085_, ResourceKey p_218086_, Set p_218087_, int p_218088_, int p_218089_) { PoiType poitype = new PoiType(p_218087_, p_218088_, p_218089_); Registry.register(p_218085_, p_218086_, poitype); diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch index e785e21f17..fda0bf4551 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Animal.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/animal/Animal.java +++ b/net/minecraft/world/entity/animal/Animal.java -@@ -221,6 +_,17 @@ +@@ -216,6 +_,17 @@ public void spawnChildFromBreeding(ServerLevel p_27564_, Animal p_27565_) { AgeableMob ageablemob = this.getBreedOffspring(p_27564_, p_27565_); -+ final net.minecraftforge.event.entity.living.BabyEntitySpawnEvent event = new net.minecraftforge.event.entity.living.BabyEntitySpawnEvent(this, p_27565_, ageablemob); -+ final boolean cancelled = net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event); ++ final var event = new net.minecraftforge.event.entity.living.BabyEntitySpawnEvent(this, p_27565_, ageablemob); ++ final boolean cancelled = net.minecraftforge.event.entity.living.BabyEntitySpawnEvent.BUS.post(event); + ageablemob = event.getChild(); + if (cancelled) { + //Reset the "inLove" state for the animals diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch index 0bb8dbb57f..b495e96f03 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Bee.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -503,7 +_,9 @@ +@@ -504,7 +_,9 @@ if (this.hivePos == null) { return null; } else { @@ -11,7 +11,7 @@ } } -@@ -666,13 +_,22 @@ +@@ -667,13 +_,22 @@ } @Override diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch index b3f575cfc7..ab69f2c59d 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Cat.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Cat.java +++ b/net/minecraft/world/entity/animal/Cat.java -@@ -384,10 +_,10 @@ +@@ -385,10 +_,10 @@ } } else if (this.isFood(itemstack) && this.getHealth() < this.getMaxHealth()) { if (!this.level().isClientSide()) { @@ -12,7 +12,7 @@ } return InteractionResult.SUCCESS; -@@ -448,7 +_,7 @@ +@@ -449,7 +_,7 @@ } private void tryToTame(Player p_333297_) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Fox.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Fox.java.patch index bb0585ac94..892a02f540 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Fox.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Fox.java.patch @@ -1,12 +1,13 @@ --- a/net/minecraft/world/entity/animal/Fox.java +++ b/net/minecraft/world/entity/animal/Fox.java -@@ -858,6 +_,16 @@ +@@ -855,6 +_,17 @@ protected void breed() { ServerLevel serverlevel = this.level; Fox fox = (Fox)this.animal.getBreedOffspring(serverlevel, this.partner); -+ var event = net.minecraftforge.event.ForgeEventFactory.onBabySpawn(animal, partner, fox); ++ var event = new net.minecraftforge.event.entity.living.BabyEntitySpawnEvent(animal, partner, fox); ++ var eventWasCancelled = net.minecraftforge.event.entity.living.BabyEntitySpawnEvent.BUS.post(event); + fox = (Fox)event.getChild(); -+ if (event.isCanceled()) { ++ if (eventWasCancelled) { + //Reset the "inLove" state for the animals + this.animal.setAge(6000); + this.partner.setAge(6000); @@ -17,7 +18,7 @@ if (fox != null) { ServerPlayer serverplayer = this.animal.getLoveCause(); ServerPlayer serverplayer1 = this.partner.getLoveCause(); -@@ -941,7 +_,7 @@ +@@ -938,7 +_,7 @@ } protected void onReachedTarget() { @@ -26,7 +27,7 @@ BlockState blockstate = Fox.this.level().getBlockState(this.blockPos); if (blockstate.is(Blocks.SWEET_BERRY_BUSH)) { this.pickSweetBerries(blockstate); -@@ -1000,7 +_,7 @@ +@@ -997,7 +_,7 @@ @Override public boolean canUse() { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch index bec8568c74..9b0503a431 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/MushroomCow.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/MushroomCow.java +++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -114,7 +_,7 @@ +@@ -115,7 +_,7 @@ this.playSound(soundevent, 1.0F, 1.0F); return InteractionResult.SUCCESS; @@ -9,7 +9,7 @@ if (this.level() instanceof ServerLevel serverlevel) { this.shear(serverlevel, SoundSource.PLAYERS, itemstack); this.gameEvent(GameEvent.SHEAR, p_28941_); -@@ -169,15 +_,26 @@ +@@ -170,15 +_,26 @@ @Override public void shear(ServerLevel p_369641_, SoundSource p_28924_, ItemStack p_364876_) { @@ -25,21 +25,21 @@ + if (!net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.COW, time -> {})) + return ret; p_369641_.playSound(null, this, SoundEvents.MOOSHROOM_SHEAR, p_28924_, 1.0F, 1.0F); - this.convertTo(EntityType.COW, ConversionParams.single(this, false, false), p_375107_ -> { + this.convertTo(EntityType.COW, ConversionParams.single(this, false, false), p_405458_ -> { p_369641_.sendParticles(ParticleTypes.EXPLOSION, this.getX(), this.getY(0.5), this.getZ(), 1, 0.0, 0.0, 0.0, 0.0); - this.dropFromShearingLootTable(p_369641_, BuiltInLootTables.SHEAR_MOOSHROOM, p_364876_, (p_375108_, p_375109_) -> { -- for (int i = 0; i < p_375109_.getCount(); i++) { -- p_375108_.addFreshEntity(new ItemEntity(this.level(), this.getX(), this.getY(1.0), this.getZ(), p_375109_.copyWithCount(1))); + this.dropFromShearingLootTable(p_369641_, BuiltInLootTables.SHEAR_MOOSHROOM, p_364876_, (p_405454_, p_405455_) -> { +- for (int i = 0; i < p_405455_.getCount(); i++) { +- p_405454_.addFreshEntity(new ItemEntity(this.level(), this.getX(), this.getY(1.0), this.getZ(), p_405455_.copyWithCount(1))); - } -+ ret.add(p_375109_); ++ ret.add(p_405455_); }); -+ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_375107_); ++ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_405458_); }); + return ret; } @Override -@@ -255,6 +_,15 @@ +@@ -256,6 +_,15 @@ } return mushroomcow$variant2; diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Ocelot.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Ocelot.java.patch index 2c47fe2550..d3d80dfadf 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Ocelot.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Ocelot.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Ocelot.java +++ b/net/minecraft/world/entity/animal/Ocelot.java -@@ -160,7 +_,7 @@ +@@ -161,7 +_,7 @@ if ((this.temptGoal == null || this.temptGoal.isRunning()) && !this.isTrusting() && this.isFood(itemstack) && p_29021_.distanceToSqr(this) < 9.0) { this.usePlayerItem(p_29021_, p_29022_, itemstack); if (!this.level().isClientSide) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch index 4d7a14a886..f176d3624b 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Parrot.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Parrot.java +++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -262,7 +_,7 @@ +@@ -264,7 +_,7 @@ } if (!this.level().isClientSide) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch index 3c41645928..d25c06b49a 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Pig.java.patch @@ -1,18 +1,18 @@ --- a/net/minecraft/world/entity/animal/Pig.java +++ b/net/minecraft/world/entity/animal/Pig.java -@@ -205,13 +_,14 @@ +@@ -206,13 +_,14 @@ @Override public void thunderHit(ServerLevel p_29473_, LightningBolt p_29474_) { - if (p_29473_.getDifficulty() != Difficulty.PEACEFUL) { + if (p_29473_.getDifficulty() != Difficulty.PEACEFUL && net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.ZOMBIFIED_PIGLIN, (timer) -> {})) { - ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, ConversionParams.single(this, false, true), p_390653_ -> { + ZombifiedPiglin zombifiedpiglin = this.convertTo(EntityType.ZOMBIFIED_PIGLIN, ConversionParams.single(this, false, true), p_405460_ -> { if (this.getMainHandItem().isEmpty()) { - p_390653_.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_SWORD)); + p_405460_.setItemSlot(EquipmentSlot.MAINHAND, new ItemStack(Items.GOLDEN_SWORD)); } - p_390653_.setPersistenceRequired(); -+ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_390653_); + p_405460_.setPersistenceRequired(); ++ net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_405460_); }); if (zombifiedpiglin == null) { super.thunderHit(p_29473_, p_29474_); diff --git a/patches/minecraft/net/minecraft/world/entity/animal/Rabbit.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/Rabbit.java.patch index 841a8c98e3..2164bb6968 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/Rabbit.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/Rabbit.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/Rabbit.java +++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -554,7 +_,7 @@ +@@ -555,7 +_,7 @@ @Override public boolean canUse() { if (this.nextStartTick <= 0) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch index 3e24627d5b..e3caa5a0df 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/SnowGolem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/SnowGolem.java +++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -41,7 +_,7 @@ +@@ -42,7 +_,7 @@ import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.phys.Vec3; @@ -9,7 +9,7 @@ private static final EntityDataAccessor DATA_PUMPKIN_ID = SynchedEntityData.defineId(SnowGolem.class, EntityDataSerializers.BYTE); private static final byte PUMPKIN_FLAG = 16; private static final boolean DEFAULT_PUMPKIN = true; -@@ -94,7 +_,7 @@ +@@ -95,7 +_,7 @@ this.hurtServer(serverlevel, this.damageSources().onFire(), 1.0F); } @@ -18,7 +18,7 @@ return; } -@@ -105,7 +_,7 @@ +@@ -106,7 +_,7 @@ int k = Mth.floor(this.getY()); int l = Mth.floor(this.getZ() + (i / 2 % 2 * 2 - 1) * 0.25F); BlockPos blockpos = new BlockPos(j, k, l); @@ -27,7 +27,7 @@ this.level().setBlockAndUpdate(blockpos, blockstate); this.level().gameEvent(GameEvent.BLOCK_PLACE, blockpos, GameEvent.Context.of(this, blockstate)); } -@@ -135,7 +_,7 @@ +@@ -136,7 +_,7 @@ @Override protected InteractionResult mobInteract(Player p_29920_, InteractionHand p_29921_) { ItemStack itemstack = p_29920_.getItemInHand(p_29921_); @@ -36,7 +36,7 @@ if (this.level() instanceof ServerLevel serverlevel) { this.shear(serverlevel, SoundSource.PLAYERS, itemstack); this.gameEvent(GameEvent.SHEAR, p_29920_); -@@ -195,4 +_,18 @@ +@@ -196,4 +_,18 @@ public Vec3 getLeashOffset() { return new Vec3(0.0, 0.75F * this.getEyeHeight(), this.getBbWidth() * 0.4F); } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch index d5b36e6eb2..1fefd6266c 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/allay/Allay.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -369,7 +_,7 @@ +@@ -354,7 +_,7 @@ public boolean wantsToPickUp(ServerLevel p_363882_, ItemStack p_218387_) { ItemStack itemstack = this.getItemInHand(InteractionHand.MAIN_HAND); return !itemstack.isEmpty() diff --git a/patches/minecraft/net/minecraft/world/entity/animal/camel/Camel.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/camel/Camel.java.patch index abc90f7d9c..38e85ee168 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/camel/Camel.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/camel/Camel.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -342,7 +_,7 @@ +@@ -344,7 +_,7 @@ @Override protected void playStepSound(BlockPos p_252056_, BlockState p_251457_) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/horse/AbstractHorse.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/horse/AbstractHorse.java.patch index e6cd269686..e3ae570a2b 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/horse/AbstractHorse.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/horse/AbstractHorse.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/horse/AbstractHorse.java +++ b/net/minecraft/world/entity/animal/horse/AbstractHorse.java -@@ -139,6 +_,7 @@ +@@ -140,6 +_,7 @@ } this.addBehaviourGoals(); @@ -8,19 +8,19 @@ } protected void addBehaviourGoals() { -@@ -273,6 +_,11 @@ +@@ -275,6 +_,11 @@ @Override public boolean causeFallDamage(double p_391990_, float p_149499_, DamageSource p_149501_) { + var event = net.minecraftforge.event.ForgeEventFactory.onLivingFall(this, p_391990_, p_149499_); -+ if (event.isCanceled()) return false; ++ if (event == null) return false; + p_391990_ = event.getDistance(); + p_149499_ = event.getDamageMultiplier(); + if (p_391990_ > 1.0) { this.playSound(SoundEvents.HORSE_LAND, 0.4F, 1.0F); } -@@ -344,9 +_,9 @@ +@@ -346,9 +_,9 @@ protected void playStepSound(BlockPos p_30584_, BlockState p_30585_) { if (!p_30585_.liquid()) { BlockState blockstate = this.level().getBlockState(p_30584_.above()); @@ -32,7 +32,7 @@ } if (this.isVehicle() && this.canGallop) { -@@ -766,6 +_,7 @@ +@@ -771,6 +_,7 @@ float f1 = Mth.cos(this.getYRot() * (float) (Math.PI / 180.0)); this.setDeltaMovement(this.getDeltaMovement().add(-0.4F * f * p_248808_, 0.0, 0.4F * f1 * p_248808_)); } @@ -40,7 +40,7 @@ } protected void playJumpSound() { -@@ -1010,6 +_,26 @@ +@@ -1013,6 +_,26 @@ public boolean hasInventoryChanged(Container p_149512_) { return this.inventory != p_149512_; diff --git a/patches/minecraft/net/minecraft/world/entity/animal/horse/Llama.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/horse/Llama.java.patch index cc852cba7c..954890c9a4 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/horse/Llama.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/horse/Llama.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/animal/horse/Llama.java +++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -374,6 +_,10 @@ +@@ -375,6 +_,10 @@ @Override public boolean causeFallDamage(double p_396436_, float p_149538_, DamageSource p_149540_) { + var event = net.minecraftforge.event.ForgeEventFactory.onLivingFall(this, p_396436_, p_149538_); -+ if (event.isCanceled()) return false; ++ if (event == null) return false; + p_396436_ = event.getDistance(); + p_149538_ = event.getDamageMultiplier(); int i = this.calculateFallDamage(p_396436_, p_149538_); diff --git a/patches/minecraft/net/minecraft/world/entity/animal/sheep/Sheep.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/sheep/Sheep.java.patch index d78f4faae1..6b6472eea2 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/sheep/Sheep.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/sheep/Sheep.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java -@@ -156,7 +_,7 @@ +@@ -137,7 +_,7 @@ @Override public InteractionResult mobInteract(Player p_397056_, InteractionHand p_391211_) { ItemStack itemstack = p_397056_.getItemInHand(p_391211_); @@ -9,7 +9,7 @@ if (this.level() instanceof ServerLevel serverlevel && this.readyForShearing()) { this.shear(serverlevel, SoundSource.PLAYERS, itemstack); this.gameEvent(GameEvent.SHEAR, p_397056_); -@@ -172,12 +_,27 @@ +@@ -153,12 +_,27 @@ @Override public void shear(ServerLevel p_397708_, SoundSource p_395553_, ItemStack p_396000_) { @@ -37,7 +37,7 @@ for (int i = 0; i < p_393350_.getCount(); i++) { ItemEntity itementity = this.spawnAtLocation(p_397779_, p_393350_.copyWithCount(1), 1.0F); if (itementity != null) { -@@ -192,8 +_,14 @@ +@@ -173,8 +_,14 @@ } } } diff --git a/patches/minecraft/net/minecraft/world/entity/animal/sniffer/Sniffer.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/sniffer/Sniffer.java.patch index 21cfe988c7..08e79d02e9 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/sniffer/Sniffer.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/sniffer/Sniffer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -286,8 +_,7 @@ +@@ -297,8 +_,7 @@ } if (this.tickCount % 10 == 0) { diff --git a/patches/minecraft/net/minecraft/world/entity/animal/wolf/Wolf.java.patch b/patches/minecraft/net/minecraft/world/entity/animal/wolf/Wolf.java.patch index a0afa6f590..3d9b8106d1 100644 --- a/patches/minecraft/net/minecraft/world/entity/animal/wolf/Wolf.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/animal/wolf/Wolf.java.patch @@ -1,33 +1,6 @@ --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -88,7 +_,7 @@ - import net.minecraft.world.level.pathfinder.PathType; - import net.minecraft.world.phys.Vec3; - --public class Wolf extends TamableAnimal implements NeutralMob { -+public class Wolf extends TamableAnimal implements NeutralMob, net.minecraftforge.common.IForgeShearable { - private static final EntityDataAccessor DATA_INTERESTED_ID = SynchedEntityData.defineId(Wolf.class, EntityDataSerializers.BOOLEAN); - private static final EntityDataAccessor DATA_COLLAR_COLOR = SynchedEntityData.defineId(Wolf.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_REMAINING_ANGER_TIME = SynchedEntityData.defineId(Wolf.class, EntityDataSerializers.INT); -@@ -464,7 +_,7 @@ - return InteractionResult.SUCCESS; - } - -- if (!itemstack.is(Items.SHEARS) -+ if (!itemstack.canPerformAction(net.minecraftforge.common.ToolActions.SHEARS_HARVEST) - || !this.isOwnedBy(p_391202_) - || !this.isWearingBodyArmor() - || EnchantmentHelper.has(this.getBodyArmorItem(), EnchantmentEffectComponents.PREVENT_ARMOR_CHANGE) && !p_391202_.isCreative()) { -@@ -491,6 +_,8 @@ - return interactionresult; - } - -+ // Forge: moved to onSheared -+ if (true) return InteractionResult.PASS; - itemstack.hurtAndBreak(1, p_391202_, getSlotForHand(p_391687_)); - this.playSound(SoundEvents.ARMOR_UNEQUIP_WOLF); - ItemStack itemstack1 = this.getBodyArmorItem(); -@@ -518,7 +_,7 @@ +@@ -503,7 +_,7 @@ } private void tryToTame(Player p_397321_) { @@ -36,27 +9,3 @@ this.tame(p_397321_); this.navigation.stop(); this.setTarget(null); -@@ -713,5 +_,23 @@ - super(false); - this.type = p_391612_; - } -+ } -+ -+ @Override -+ public boolean isShearable(ItemStack item, Level world, BlockPos pos) { -+ return this.isWearingBodyArmor(); -+ } -+ -+ @Override -+ public java.util.List onSheared(@org.jetbrains.annotations.Nullable Player player, @org.jetbrains.annotations.NotNull ItemStack item, Level world, BlockPos pos, int fortune) { -+ if (!this.isWearingBodyArmor() || (player != null && !this.isOwnedBy(player)) || -+ (EnchantmentHelper.has(this.getBodyArmorItem(), EnchantmentEffectComponents.PREVENT_ARMOR_CHANGE) && (player == null || !player.isCreative())) -+ ) -+ return java.util.Collections.emptyList(); -+ -+ this.playSound(SoundEvents.ARMOR_UNEQUIP_WOLF); -+ var armor = this.getBodyArmorItem(); -+ this.setBodyArmorItem(ItemStack.EMPTY); -+ return java.util.List.of(armor); - } - } diff --git a/patches/minecraft/net/minecraft/world/entity/boss/EnderDragonPart.java.patch b/patches/minecraft/net/minecraft/world/entity/boss/EnderDragonPart.java.patch index 5ebfeea3f0..ca8cc470d8 100644 --- a/patches/minecraft/net/minecraft/world/entity/boss/EnderDragonPart.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/boss/EnderDragonPart.java.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/entity/boss/EnderDragonPart.java +++ b/net/minecraft/world/entity/boss/EnderDragonPart.java -@@ -14,13 +_,13 @@ - import net.minecraft.world.entity.boss.enderdragon.EnderDragon; - import net.minecraft.world.item.ItemStack; +@@ -15,13 +_,13 @@ + import net.minecraft.world.level.storage.ValueInput; + import net.minecraft.world.level.storage.ValueOutput; -public class EnderDragonPart extends Entity { +public class EnderDragonPart extends net.minecraftforge.entity.PartEntity { diff --git a/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch b/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch index 151143c593..905df29a26 100644 --- a/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -104,6 +_,15 @@ +@@ -105,6 +_,15 @@ this.setHealth(this.getMaxHealth()); this.noPhysics = true; this.phaseManager = new EnderDragonPhaseManager(this); @@ -16,7 +16,7 @@ } public void setDragonFight(EndDragonFight p_287736_) { -@@ -152,8 +_,26 @@ +@@ -153,8 +_,26 @@ p_330342_.define(DATA_PHASE, EnderDragonPhase.HOVERING.getId()); } @@ -43,7 +43,7 @@ this.processFlappingMovement(); if (this.level().isClientSide) { this.setHealth(this.getHealth()); -@@ -440,7 +_,7 @@ +@@ -441,7 +_,7 @@ BlockPos blockpos = new BlockPos(k1, l1, i2); BlockState blockstate = p_363273_.getBlockState(blockpos); if (!blockstate.isAir() && !blockstate.is(BlockTags.DRAGON_TRANSPARENT)) { @@ -52,7 +52,7 @@ flag1 = p_363273_.removeBlock(blockpos, false) || flag1; } else { flag = true; -@@ -534,7 +_,8 @@ +@@ -535,7 +_,8 @@ if (this.level() instanceof ServerLevel serverlevel) { if (this.dragonDeathTime > 150 && this.dragonDeathTime % 5 == 0 && serverlevel.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -62,7 +62,7 @@ } if (this.dragonDeathTime == 1 && !this.isSilent()) { -@@ -552,7 +_,8 @@ +@@ -553,7 +_,8 @@ if (this.dragonDeathTime == 200 && this.level() instanceof ServerLevel serverlevel1) { if (serverlevel1.getGameRules().getBoolean(GameRules.RULE_DOMOBLOOT)) { @@ -72,7 +72,7 @@ } if (this.dragonFight != null) { -@@ -860,6 +_,7 @@ +@@ -861,6 +_,7 @@ @Override public void recreateFromPacket(ClientboundAddEntityPacket p_218825_) { super.recreateFromPacket(p_218825_); @@ -80,7 +80,7 @@ EnderDragonPart[] aenderdragonpart = this.getSubEntities(); for (int i = 0; i < aenderdragonpart.length; i++) { -@@ -875,5 +_,15 @@ +@@ -876,5 +_,15 @@ @Override protected float sanitizeScale(float p_333905_) { return 1.0F; diff --git a/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch b/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch index 2728a9cee9..2e0a872977 100644 --- a/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -315,7 +_,7 @@ +@@ -316,7 +_,7 @@ if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; @@ -9,7 +9,7 @@ boolean flag = false; int l = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); int i1 = Mth.floor(this.getBbHeight()); -@@ -324,7 +_,7 @@ +@@ -325,7 +_,7 @@ this.getBlockX() - l, this.getBlockY(), this.getBlockZ() - l, this.getBlockX() + l, this.getBlockY() + i1, this.getBlockZ() + l )) { BlockState blockstate = p_363567_.getBlockState(blockpos); @@ -18,7 +18,7 @@ flag = p_363567_.destroyBlock(blockpos, true, this) || flag; } } -@@ -343,6 +_,10 @@ +@@ -344,6 +_,10 @@ } } diff --git a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch index c00ea7fb6f..abce3e8efc 100644 --- a/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/decoration/HangingEntity.java.patch @@ -1,10 +1,10 @@ --- a/net/minecraft/world/entity/decoration/HangingEntity.java +++ b/net/minecraft/world/entity/decoration/HangingEntity.java -@@ -60,6 +_,8 @@ +@@ -86,6 +_,8 @@ } else { - boolean flag = BlockPos.betweenClosedStream(this.calculateSupportBox()).allMatch(p_375130_ -> { - BlockState blockstate = this.level().getBlockState(p_375130_); -+ if (net.minecraft.world.level.block.Block.canSupportCenter(this.level(), p_375130_, this.direction)) + boolean flag = BlockPos.betweenClosedStream(this.calculateSupportBox()).allMatch(p_405497_ -> { + BlockState blockstate = this.level().getBlockState(p_405497_); ++ if (net.minecraft.world.level.block.Block.canSupportCenter(this.level(), p_405497_, this.getDirection())) + return true; return blockstate.isSolid() || DiodeBlock.isDiode(blockstate); }); diff --git a/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch index 2f377335a5..963fb1d315 100644 --- a/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/item/FallingBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/net/minecraft/world/entity/item/FallingBlockEntity.java -@@ -155,7 +_,7 @@ +@@ -159,7 +_,7 @@ if (this.level() instanceof ServerLevel serverlevel && (this.isAlive() || this.forceTickAfterTeleportToDuplicate)) { BlockPos blockpos = this.blockPosition(); boolean flag = this.blockState.getBlock() instanceof ConcretePowderBlock; @@ -9,7 +9,7 @@ double d0 = this.getDeltaMovement().lengthSqr(); if (flag && d0 > 1.0) { BlockHitResult blockhitresult = this.level() -@@ -168,7 +_,7 @@ +@@ -172,7 +_,7 @@ this ) ); diff --git a/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch index 56636824e5..bcc0f9d764 100644 --- a/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/item/ItemEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/item/ItemEntity.java +++ b/net/minecraft/world/entity/item/ItemEntity.java -@@ -56,6 +_,10 @@ +@@ -53,6 +_,10 @@ @Nullable private UUID target; public final float bobOffs; @@ -11,7 +11,7 @@ public ItemEntity(EntityType p_31991_, Level p_31992_) { super(p_31991_, p_31992_); -@@ -74,6 +_,7 @@ +@@ -71,6 +_,7 @@ this.setPos(p_149664_, p_149665_, p_149666_); this.setDeltaMovement(p_149668_, p_149669_, p_149670_); this.setItem(p_149667_); @@ -19,7 +19,7 @@ } private ItemEntity(ItemEntity p_31994_) { -@@ -82,6 +_,7 @@ +@@ -79,6 +_,7 @@ this.copyPosition(p_31994_); this.age = p_31994_.age; this.bobOffs = p_31994_.bobOffs; @@ -27,7 +27,7 @@ } @Override -@@ -127,6 +_,7 @@ +@@ -117,6 +_,7 @@ @Override public void tick() { @@ -35,7 +35,7 @@ if (this.getItem().isEmpty()) { this.discard(); } else { -@@ -139,6 +_,10 @@ +@@ -129,6 +_,10 @@ this.yo = this.getY(); this.zo = this.getZ(); Vec3 vec3 = this.getDeltaMovement(); @@ -46,7 +46,7 @@ if (this.isInWater() && this.getFluidHeight(FluidTags.WATER) > 0.1F) { this.setUnderwaterMovement(); } else if (this.isInLava() && this.getFluidHeight(FluidTags.LAVA) > 0.1F) { -@@ -161,7 +_,8 @@ +@@ -151,7 +_,8 @@ this.applyEffectsFromBlocks(); float f = 0.98F; if (this.onGround()) { @@ -56,7 +56,7 @@ } this.setDeltaMovement(this.getDeltaMovement().multiply(f, 0.98, f)); -@@ -193,7 +_,16 @@ +@@ -183,7 +_,16 @@ } } @@ -74,7 +74,7 @@ this.discard(); } } -@@ -301,7 +_,7 @@ +@@ -291,7 +_,7 @@ this.health = (int)(this.health - p_362683_); this.gameEvent(GameEvent.ENTITY_DAMAGE, p_364841_.getEntity()); if (this.health <= 0) { @@ -83,23 +83,23 @@ this.discard(); } -@@ -319,6 +_,7 @@ - p_32050_.putShort("Health", (short)this.health); - p_32050_.putShort("Age", (short)this.age); - p_32050_.putShort("PickupDelay", (short)this.pickupDelay); -+ p_32050_.putInt("Lifespan", this.lifespan); - p_32050_.storeNullable("Thrower", UUIDUtil.CODEC, this.thrower); - p_32050_.storeNullable("Owner", UUIDUtil.CODEC, this.target); +@@ -309,6 +_,7 @@ + p_408006_.putShort("Health", (short)this.health); + p_408006_.putShort("Age", (short)this.age); + p_408006_.putShort("PickupDelay", (short)this.pickupDelay); ++ p_408006_.putInt("Lifespan", this.lifespan); + EntityReference.store(this.thrower, p_408006_, "Thrower"); + p_408006_.storeNullable("Owner", UUIDUtil.CODEC, this.target); if (!this.getItem().isEmpty()) { -@@ -332,6 +_,7 @@ - this.health = p_32034_.getShortOr("Health", (short)5); - this.age = p_32034_.getShortOr("Age", (short)0); - this.pickupDelay = p_32034_.getShortOr("PickupDelay", (short)0); -+ p_32034_.getInt("Lifespan").ifPresent(lifespan -> this.lifespan = lifespan); - this.target = p_32034_.read("Owner", UUIDUtil.CODEC).orElse(null); - this.thrower = p_32034_.read("Thrower", UUIDUtil.CODEC).orElse(null); - this.cachedThrower = null; -@@ -345,10 +_,17 @@ +@@ -321,6 +_,7 @@ + this.health = p_408031_.getShortOr("Health", (short)5); + this.age = p_408031_.getShortOr("Age", (short)0); + this.pickupDelay = p_408031_.getShortOr("PickupDelay", (short)0); ++ this.lifespan = p_408031_.getIntOr("Lifespan", this.lifespan); + this.target = p_408031_.read("Owner", UUIDUtil.CODEC).orElse(null); + this.thrower = EntityReference.read(p_408031_, "Thrower"); + this.setItem(p_408031_.read("Item", ItemStack.CODEC).orElse(ItemStack.EMPTY)); +@@ -332,10 +_,17 @@ @Override public void playerTouch(Player p_32040_) { if (!this.level().isClientSide) { @@ -118,7 +118,7 @@ p_32040_.take(this, i); if (itemstack.isEmpty()) { this.discard(); -@@ -442,7 +_,7 @@ +@@ -428,7 +_,7 @@ public void makeFakeItem() { this.setNeverPickUp(); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch index 594a49ba7f..d66a368143 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Bogged.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Bogged.java +++ b/net/minecraft/world/entity/monster/Bogged.java -@@ -71,7 +_,7 @@ +@@ -72,7 +_,7 @@ @Override protected InteractionResult mobInteract(Player p_335303_, InteractionHand p_335145_) { ItemStack itemstack = p_335303_.getItemInHand(p_335145_); @@ -9,7 +9,7 @@ if (this.level() instanceof ServerLevel serverlevel) { this.shear(serverlevel, SoundSource.PLAYERS, itemstack); this.gameEvent(GameEvent.SHEAR, p_335303_); -@@ -138,5 +_,17 @@ +@@ -139,5 +_,17 @@ @Override public boolean readyForShearing() { return !this.isSheared() && this.isAlive(); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch index 4b35056700..b369f97b73 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/EnderMan.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -114,7 +_,6 @@ +@@ -112,7 +_,6 @@ @Override public void setTarget(@Nullable LivingEntity p_32537_) { @@ -8,7 +8,7 @@ AttributeInstance attributeinstance = this.getAttribute(Attributes.MOVEMENT_SPEED); if (p_32537_ == null) { this.targetChangeTime = 0; -@@ -128,6 +_,7 @@ +@@ -126,6 +_,7 @@ attributeinstance.addTransientModifier(SPEED_MODIFIER_ATTACKING); } } @@ -16,7 +16,7 @@ } @Override -@@ -203,7 +_,7 @@ +@@ -199,7 +_,7 @@ } boolean isBeingStaredBy(Player p_368759_) { @@ -25,19 +25,19 @@ } @Override -@@ -281,8 +_,10 @@ +@@ -277,8 +_,10 @@ boolean flag = blockstate.blocksMotion(); boolean flag1 = blockstate.getFluidState().is(FluidTags.WATER); if (flag && !flag1) { -+ net.minecraftforge.event.entity.EntityTeleportEvent.EnderEntity event = net.minecraftforge.event.ForgeEventFactory.onEnderTeleport(this, p_32544_, p_32545_, p_32546_); -+ if (event.isCanceled()) return false; ++ var event = net.minecraftforge.event.ForgeEventFactory.onEnderManTeleport(this, p_32544_, p_32545_, p_32546_); ++ if (event == null) return false; Vec3 vec3 = this.position(); - boolean flag2 = this.randomTeleport(p_32544_, p_32545_, p_32546_, true); + boolean flag2 = this.randomTeleport(event.getTargetX(), event.getTargetY(), event.getTargetZ(), true); if (flag2) { this.level().gameEvent(GameEvent.TELEPORT, vec3, GameEvent.Context.of(this)); if (!this.isSilent()) { -@@ -437,7 +_,7 @@ +@@ -433,7 +_,7 @@ if (this.enderman.getCarriedBlock() == null) { return false; } else { @@ -46,7 +46,7 @@ } } -@@ -455,7 +_,7 @@ +@@ -451,7 +_,7 @@ BlockState blockstate2 = this.enderman.getCarriedBlock(); if (blockstate2 != null) { blockstate2 = Block.updateFromNeighbourShapes(blockstate2, this.enderman.level(), blockpos); @@ -55,7 +55,7 @@ level.setBlock(blockpos, blockstate2, 3); level.gameEvent(GameEvent.BLOCK_PLACE, blockpos, GameEvent.Context.of(this.enderman, blockstate2)); this.enderman.setCarriedBlock(null); -@@ -467,6 +_,7 @@ +@@ -463,6 +_,7 @@ return p_32562_.isAir() && !p_32563_.isAir() && !p_32563_.is(Blocks.BEDROCK) @@ -63,7 +63,7 @@ && p_32563_.isCollisionShapeFullBlock(p_32559_, p_32564_) && p_32561_.canSurvive(p_32559_, p_32560_) && p_32559_.getEntities(this.enderman, AABB.unitCubeFromLowerCorner(Vec3.atLowerCornerOf(p_32560_))).isEmpty(); -@@ -576,7 +_,7 @@ +@@ -572,7 +_,7 @@ if (this.enderman.getCarriedBlock() != null) { return false; } else { diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Evoker.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Evoker.java.patch index ee04ffab5b..8687ea3a52 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Evoker.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Evoker.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Evoker.java +++ b/net/minecraft/world/entity/monster/Evoker.java -@@ -300,7 +_,7 @@ +@@ -283,7 +_,7 @@ return false; } else { ServerLevel serverlevel = getServerLevel(Evoker.this.level()); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch index 28cf44850e..24133b9380 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Pillager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Pillager.java +++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -127,7 +_,7 @@ +@@ -128,7 +_,7 @@ public AbstractIllager.IllagerArmPose getArmPose() { if (this.isChargingCrossbow()) { return AbstractIllager.IllagerArmPose.CROSSBOW_CHARGE; diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch index 6a7b9077cc..6655aabc1a 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Ravager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -139,7 +_,7 @@ +@@ -140,7 +_,7 @@ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1, d1, d0)); } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch index 57898694b6..a69bb29d87 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Shulker.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -381,6 +_,12 @@ +@@ -382,6 +_,12 @@ && this.level().noCollision(this, new AABB(blockpos1).deflate(1.0E-6))) { Direction direction = this.findAttachableSurface(blockpos1); if (direction != null) { -+ net.minecraftforge.event.entity.EntityTeleportEvent.EnderEntity event = net.minecraftforge.event.ForgeEventFactory.onEnderTeleport(this, blockpos1.getX(), blockpos1.getY(), blockpos1.getZ()); -+ if (event.isCanceled()) direction = null; ++ var event = new net.minecraftforge.event.entity.EntityTeleportEvent.EnderEntity(this, blockpos1.getX(), blockpos1.getY(), blockpos1.getZ()); ++ if (net.minecraftforge.event.entity.EntityTeleportEvent.EnderEntity.BUS.post(event)) direction = null; + blockpos1 = BlockPos.containing(event.getTargetX(), event.getTargetY(), event.getTargetZ()); + } + diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch index 64357fb2cc..b1211378cb 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Skeleton.java.patch @@ -1,10 +1,10 @@ --- a/net/minecraft/world/entity/monster/Skeleton.java +++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -93,6 +_,7 @@ +@@ -94,6 +_,7 @@ } protected void doFreezeConversion() { + if (!net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.STRAY, (timer) -> this.conversionTime = timer)) return; - this.convertTo(EntityType.STRAY, ConversionParams.single(this, true, true), p_390682_ -> { + this.convertTo(EntityType.STRAY, ConversionParams.single(this, true, true), p_405508_ -> { if (!this.isSilent()) { this.level().levelEvent(null, 1048, this.blockPosition(), 0); diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Slime.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Slime.java.patch index e1b8573425..306369e8b2 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Slime.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Slime.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -147,13 +_,15 @@ +@@ -148,13 +_,15 @@ float f = this.getDimensions(this.getPose()).width() * 2.0F; float f1 = f / 2.0F; @@ -23,7 +23,7 @@ this.playSound(this.getSquishSound(), this.getSoundVolume(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) / 0.8F); this.targetSquish = -0.5F; -@@ -164,6 +_,12 @@ +@@ -165,6 +_,12 @@ this.wasOnGround = this.onGround(); this.decreaseSquish(); } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch index 04b7a1252e..9f1c019ef1 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/Zombie.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -266,21 +_,28 @@ +@@ -265,21 +_,28 @@ } protected void convertToZombieType(EntityType p_34311_) { @@ -8,7 +8,7 @@ this.convertTo( p_34311_, ConversionParams.single(this, true, true), -- p_375145_ -> p_375145_.handleAttributes(p_375145_.level().getCurrentDifficultyAt(p_375145_.blockPosition()).getSpecialMultiplier()) +- p_405517_ -> p_405517_.handleAttributes(p_405517_.level().getCurrentDifficultyAt(p_405517_.blockPosition()).getSpecialMultiplier()) + p_375145_ -> { + p_375145_.handleAttributes(p_375145_.level().getCurrentDifficultyAt(p_375145_.blockPosition()).getSpecialMultiplier()); + net.minecraftforge.event.ForgeEventFactory.onLivingConvert(this, p_375145_); @@ -30,7 +30,7 @@ if (!this.isSilent()) { p_369430_.levelEvent(null, 1026, this.blockPosition(), 0); } -@@ -302,19 +_,26 @@ +@@ -301,19 +_,26 @@ livingentity = (LivingEntity)p_363403_.getEntity(); } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch index be8df9992a..fa3ee270d0 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/ZombieVillager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -114,7 +_,7 @@ +@@ -115,7 +_,7 @@ if (!this.level().isClientSide && this.isAlive() && this.isConverting()) { int i = this.getConversionProgress(); this.villagerConversionTime -= i; @@ -9,7 +9,7 @@ this.finishConversion((ServerLevel)this.level()); } } -@@ -221,6 +_,7 @@ +@@ -222,6 +_,7 @@ if (!this.isSilent()) { p_34399_.levelEvent(null, 1027, this.blockPosition(), 0); } diff --git a/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch index 9ef048f28f..510e1ccfae 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/creaking/Creaking.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -488,7 +_,7 @@ +@@ -489,7 +_,7 @@ for (Player player : list) { if (this.canAttack(player) && !this.isAlliedTo(player)) { flag1 = true; diff --git a/patches/minecraft/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch index 40c36b8855..38a639ebad 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/hoglin/Hoglin.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -169,7 +_,7 @@ +@@ -170,7 +_,7 @@ HoglinAi.updateActivity(this); if (this.isConverting()) { this.timeInOverworld++; @@ -9,7 +9,7 @@ this.makeSound(SoundEvents.HOGLIN_CONVERTED_TO_ZOMBIFIED); this.finishConversion(); } -@@ -267,7 +_,10 @@ +@@ -268,7 +_,10 @@ this.convertTo( EntityType.ZOGLIN, ConversionParams.single(this, true, false), diff --git a/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch index d8260c891a..643b30b02c 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java +++ b/net/minecraft/world/entity/monster/piglin/AbstractPiglin.java -@@ -85,7 +_,7 @@ +@@ -84,7 +_,7 @@ this.timeInOverworld = 0; } @@ -9,7 +9,7 @@ this.playConvertedSound(); this.finishConversion(p_360786_); } -@@ -104,7 +_,10 @@ +@@ -103,7 +_,10 @@ this.convertTo( EntityType.ZOMBIFIED_PIGLIN, ConversionParams.single(this, true, true), diff --git a/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch b/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch index d47c5dbe95..1802051606 100644 --- a/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/monster/piglin/Piglin.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -356,7 +_,7 @@ +@@ -357,7 +_,7 @@ } else if (this.isChargingCrossbow()) { return PiglinArmPose.CROSSBOW_CHARGE; } else { @@ -9,7 +9,7 @@ } } -@@ -393,7 +_,7 @@ +@@ -394,7 +_,7 @@ } protected void holdInOffHand(ItemStack p_34786_) { @@ -18,7 +18,7 @@ this.setItemSlot(EquipmentSlot.OFFHAND, p_34786_); this.setGuaranteedDrop(EquipmentSlot.OFFHAND); } else { -@@ -403,7 +_,7 @@ +@@ -404,7 +_,7 @@ @Override public boolean wantsToPickUp(ServerLevel p_369934_, ItemStack p_34777_) { diff --git a/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch b/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch index 6b46d9396f..03d80b9385 100644 --- a/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/npc/Villager.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -320,7 +_,7 @@ +@@ -321,7 +_,7 @@ @Override public InteractionResult mobInteract(Player p_35472_, InteractionHand p_35473_) { ItemStack itemstack = p_35472_.getItemInHand(p_35473_); @@ -9,12 +9,12 @@ return super.mobInteract(p_35472_, p_35473_); } else if (this.isBaby()) { this.setUnhappy(); -@@ -766,7 +_,7 @@ +@@ -767,7 +_,7 @@ @Override public void thunderHit(ServerLevel p_35409_, LightningBolt p_35410_) { - if (p_35409_.getDifficulty() != Difficulty.PEACEFUL) { + if (p_35409_.getDifficulty() != Difficulty.PEACEFUL && net.minecraftforge.event.ForgeEventFactory.canLivingConvert(this, EntityType.WITCH, (timer) -> {})) { LOGGER.info("Villager {} was struck by lightning {}.", this, p_35410_); - Witch witch = this.convertTo(EntityType.WITCH, ConversionParams.single(this, false, false), p_390723_ -> { - p_390723_.finalizeSpawn(p_35409_, p_35409_.getCurrentDifficultyAt(p_390723_.blockPosition()), EntitySpawnReason.CONVERSION, null); + Witch witch = this.convertTo(EntityType.WITCH, ConversionParams.single(this, false, false), p_405546_ -> { + p_405546_.finalizeSpawn(p_35409_, p_35409_.getCurrentDifficultyAt(p_405546_.blockPosition()), EntitySpawnReason.CONVERSION, null); diff --git a/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch b/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch index 370906ddf1..1690254d98 100644 --- a/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/player/Inventory.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/Inventory.java +++ b/net/minecraft/world/entity/player/Inventory.java -@@ -83,6 +_,10 @@ +@@ -90,6 +_,10 @@ return this.items; } @@ -11,7 +11,7 @@ private boolean hasRemainingSpaceForItem(ItemStack p_36015_, ItemStack p_36016_) { return !p_36015_.isEmpty() && ItemStack.isSameItemSameComponents(p_36015_, p_36016_) && p_36015_.isStackable() && p_36015_.getCount() < this.getMaxStackSize(p_36015_); } -@@ -158,7 +_,7 @@ +@@ -165,7 +_,7 @@ for (int k = 0; k < 9; k++) { int l = (this.selected + k) % 9; @@ -20,7 +20,7 @@ return l; } } -@@ -229,7 +_,7 @@ +@@ -236,7 +_,7 @@ for (int i = 0; i < this.items.size(); i++) { ItemStack itemstack = this.getItem(i); if (!itemstack.isEmpty()) { @@ -29,7 +29,7 @@ } } } -@@ -279,6 +_,8 @@ +@@ -286,6 +_,8 @@ } catch (Throwable throwable) { CrashReport crashreport = CrashReport.forThrowable(throwable, "Adding item to inventory"); CrashReportCategory crashreportcategory = crashreport.addCategory("Item being added"); diff --git a/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch b/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch index 76dc34bb00..25fa14e1d9 100644 --- a/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/player/Player.java.patch @@ -1,15 +1,15 @@ --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -118,7 +_,7 @@ - import net.minecraft.world.scores.Scoreboard; +@@ -126,7 +_,7 @@ import net.minecraft.world.scores.Team; + import org.slf4j.Logger; -public abstract class Player extends LivingEntity { +public abstract class Player extends LivingEntity implements net.minecraftforge.common.extensions.IForgePlayer { + private static final Logger LOGGER = LogUtils.getLogger(); public static final HumanoidArm DEFAULT_MAIN_HAND = HumanoidArm.RIGHT; public static final int DEFAULT_MODEL_CUSTOMIZATION = 0; - public static final int MAX_HEALTH = 20; -@@ -207,6 +_,9 @@ +@@ -216,6 +_,9 @@ public Entity currentExplosionCause; private boolean ignoreFallDamageFromCurrentImpulse = false; private int currentImpulseContextResetGraceTime = 0; @@ -17,12 +17,12 @@ + private final java.util.Collection suffixes = new java.util.LinkedList<>(); + @Nullable private Pose forcedPose; - public Player(Level p_250508_, BlockPos p_250289_, float p_251702_, GameProfile p_252153_) { + public Player(Level p_250508_, GameProfile p_252153_) { super(EntityType.PLAYER, p_250508_); -@@ -216,6 +_,17 @@ +@@ -224,6 +_,17 @@ + this.inventory = new Inventory(this, this.equipment); this.inventoryMenu = new InventoryMenu(this.inventory, !p_250508_.isClientSide, this); this.containerMenu = this.inventoryMenu; - this.snapTo(p_250289_.getX() + 0.5, p_250289_.getY() + 1, p_250289_.getZ() + 0.5, p_251702_, 0.0F); + + // Forge: wrapped inventories moved to constructor as the inventory init was moved in here too + this.playerMainHandler = net.minecraftforge.common.util.LazyOptional.of( @@ -37,22 +37,17 @@ } @Override -@@ -244,11 +_,12 @@ - .add(Attributes.LUCK) - .add(Attributes.BLOCK_INTERACTION_RANGE, 4.5) - .add(Attributes.ENTITY_INTERACTION_RANGE, 3.0) -- .add(Attributes.BLOCK_BREAK_SPEED) - .add(Attributes.SUBMERGED_MINING_SPEED) - .add(Attributes.SNEAKING_SPEED) +@@ -258,7 +_,8 @@ .add(Attributes.MINING_EFFICIENCY) -- .add(Attributes.SWEEPING_DAMAGE_RATIO); -+ .add(Attributes.SWEEPING_DAMAGE_RATIO) -+ .add(Attributes.BLOCK_BREAK_SPEED) + .add(Attributes.SWEEPING_DAMAGE_RATIO) + .add(Attributes.WAYPOINT_TRANSMIT_RANGE, 6.0E7) +- .add(Attributes.WAYPOINT_RECEIVE_RANGE, 6.0E7); ++ .add(Attributes.WAYPOINT_RECEIVE_RANGE, 6.0E7) + .add(Attributes.ATTACK_KNOCKBACK); } @Override -@@ -264,6 +_,7 @@ +@@ -274,6 +_,7 @@ @Override public void tick() { @@ -60,7 +55,7 @@ this.noPhysics = this.isSpectator(); if (this.isSpectator() || this.isPassenger()) { this.setOnGround(false); -@@ -279,7 +_,7 @@ +@@ -289,7 +_,7 @@ this.sleepCounter = 100; } @@ -69,7 +64,7 @@ this.stopSleepInBed(false, true); } } else if (this.sleepCounter > 0) { -@@ -340,6 +_,7 @@ +@@ -350,6 +_,7 @@ if (this.currentImpulseContextResetGraceTime > 0) { this.currentImpulseContextResetGraceTime--; } @@ -77,7 +72,7 @@ } @Override -@@ -442,6 +_,10 @@ +@@ -452,6 +_,10 @@ } protected void updatePlayerPose() { @@ -88,7 +83,7 @@ if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) { Pose pose = this.getDesiredPose(); Pose pose1; -@@ -660,6 +_,7 @@ +@@ -670,6 +_,7 @@ @Override public void die(DamageSource p_36152_) { @@ -96,7 +91,7 @@ super.die(p_36152_); this.reapplyPosition(); if (!this.isSpectator() && this.level() instanceof ServerLevel serverlevel) { -@@ -717,10 +_,15 @@ +@@ -727,10 +_,15 @@ @Nullable public ItemEntity drop(ItemStack p_36177_, boolean p_36178_) { @@ -113,7 +108,7 @@ float f = this.inventory.getSelectedItem().getDestroySpeed(p_36282_); if (f > 1.0F) { f += (float)this.getAttributeValue(Attributes.MINING_EFFICIENCY); -@@ -749,11 +_,14 @@ +@@ -759,11 +_,14 @@ f /= 5.0F; } @@ -129,7 +124,7 @@ } @Override -@@ -831,6 +_,7 @@ +@@ -840,6 +_,7 @@ @Override public boolean hurtServer(ServerLevel p_369360_, DamageSource p_364544_, float p_368576_) { @@ -137,7 +132,7 @@ if (this.isInvulnerableTo(p_369360_, p_364544_)) { return false; } else if (this.abilities.invulnerable && !p_364544_.is(DamageTypeTags.BYPASSES_INVULNERABILITY)) { -@@ -899,10 +_,13 @@ +@@ -908,10 +_,13 @@ @Override protected void actuallyHurt(ServerLevel p_365751_, DamageSource p_36312_, float p_36313_) { if (!this.isInvulnerableTo(p_365751_, p_36312_)) { @@ -151,18 +146,18 @@ float f = p_36313_ - f1; if (f > 0.0F && f < 3.4028235E37F) { this.awardStat(Stats.DAMAGE_ABSORBED, Math.round(f * 10.0F)); -@@ -967,6 +_,10 @@ +@@ -979,6 +_,10 @@ return InteractionResult.PASS; } else { -+ var event = net.minecraftforge.event.ForgeEventFactory.onEntityInteract(this, p_36158_, p_36159_); -+ if (event.isCanceled()) { ++ var event = new net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract(this, p_36159_, p_36158_); ++ if (net.minecraftforge.event.entity.player.PlayerInteractEvent.EntityInteract.BUS.post(event)) { + return event.getCancellationResult(); + } ItemStack itemstack = this.getItemInHand(p_36159_); ItemStack itemstack1 = itemstack.copy(); InteractionResult interactionresult = p_36158_.interact(this, p_36159_); -@@ -975,6 +_,10 @@ +@@ -987,6 +_,10 @@ itemstack.setCount(itemstack1.getCount()); } @@ -173,7 +168,7 @@ return interactionresult; } else { if (!itemstack.isEmpty() && p_36158_ instanceof LivingEntity) { -@@ -986,6 +_,7 @@ +@@ -998,6 +_,7 @@ if (interactionresult1.consumesAction()) { this.level().gameEvent(GameEvent.ENTITY_INTERACT, p_36158_.position(), GameEvent.Context.of(this)); if (itemstack.isEmpty() && !this.hasInfiniteMaterials()) { @@ -181,7 +176,7 @@ this.setItemInHand(p_36159_, ItemStack.EMPTY); } -@@ -1085,6 +_,7 @@ +@@ -1097,6 +_,7 @@ } public void attack(Entity p_36347_) { @@ -189,7 +184,7 @@ if (p_36347_.isAttackable()) { if (!p_36347_.skipAttackInteraction(this)) { float f = this.isAutoSpinAttack() ? this.autoSpinAttackDmg : (float)this.getAttributeValue(Attributes.ATTACK_DAMAGE); -@@ -1120,8 +_,10 @@ +@@ -1132,8 +_,10 @@ && !this.isPassenger() && p_36347_ instanceof LivingEntity && !this.isSprinting(); @@ -201,7 +196,7 @@ } float f3 = f + f1; -@@ -1129,7 +_,7 @@ +@@ -1141,7 +_,7 @@ if (flag3 && !flag1 && !flag && this.onGround()) { double d0 = this.getKnownMovement().horizontalDistanceSqr(); double d1 = this.getSpeed() * 2.5; @@ -210,7 +205,7 @@ flag2 = true; } } -@@ -1165,7 +_,7 @@ +@@ -1177,7 +_,7 @@ if (flag2) { float f6 = 1.0F + (float)this.getAttributeValue(Attributes.SWEEPING_DAMAGE_RATIO) * f; @@ -219,7 +214,7 @@ if (livingentity2 != this && livingentity2 != p_36347_ && !this.isAlliedTo(livingentity2) -@@ -1216,8 +_,8 @@ +@@ -1228,8 +_,8 @@ this.setLastHurtMob(p_36347_); Entity entity = p_36347_; @@ -230,7 +225,7 @@ } boolean flag5 = false; -@@ -1261,6 +_,7 @@ +@@ -1273,6 +_,7 @@ } } } @@ -238,7 +233,7 @@ } } } -@@ -1363,6 +_,7 @@ +@@ -1375,6 +_,7 @@ } public void stopSleepInBed(boolean p_36226_, boolean p_36227_) { @@ -246,7 +241,7 @@ super.stopSleeping(); if (this.level() instanceof ServerLevel && p_36227_) { ((ServerLevel)this.level()).updateSleepingPlayerList(); -@@ -1471,6 +_,7 @@ +@@ -1483,6 +_,7 @@ @Override public boolean causeFallDamage(double p_391627_, float p_150093_, DamageSource p_150095_) { if (this.abilities.mayfly) { @@ -254,7 +249,7 @@ return false; } else { if (p_391627_ >= 2.0) { -@@ -1525,13 +_,13 @@ +@@ -1537,13 +_,13 @@ protected void playStepSound(BlockPos p_282121_, BlockState p_282194_) { if (this.isInWater()) { this.waterSwimSound(); @@ -270,12 +265,12 @@ } else { super.playStepSound(blockpos, blockstate); } -@@ -1562,6 +_,12 @@ +@@ -1574,6 +_,12 @@ } public void giveExperiencePoints(int p_36291_) { + var event = net.minecraftforge.event.ForgeEventFactory.onPlayerXpChange(this, p_36291_); -+ if (event.isCanceled()) { ++ if (event == null) { + return; + } + p_36291_ = event.getAmount(); @@ -283,7 +278,7 @@ this.increaseScore(p_36291_); this.experienceProgress = this.experienceProgress + (float)p_36291_ / this.getXpNeededForNextLevel(); this.totalExperience = Mth.clamp(this.totalExperience + p_36291_, 0, Integer.MAX_VALUE); -@@ -1589,7 +_,7 @@ +@@ -1601,7 +_,7 @@ } public void onEnchantmentPerformed(ItemStack p_36172_, int p_36173_) { @@ -292,12 +287,12 @@ if (this.experienceLevel < 0) { this.experienceLevel = 0; this.experienceProgress = 0.0F; -@@ -1600,6 +_,12 @@ +@@ -1612,6 +_,12 @@ } public void giveExperienceLevels(int p_36276_) { + var event = net.minecraftforge.event.ForgeEventFactory.onPlayerLevelChange(this, p_36276_); -+ if (event.isCanceled()) { ++ if (event == null) { + return; + } + p_36276_ = event.getLevels(); @@ -305,7 +300,7 @@ this.experienceLevel = IntMath.saturatedAdd(this.experienceLevel, p_36276_); if (this.experienceLevel < 0) { this.experienceLevel = 0; -@@ -1772,7 +_,13 @@ +@@ -1791,7 +_,13 @@ @Override public Component getDisplayName() { @@ -320,7 +315,7 @@ return this.decorateDisplayNameComponent(mutablecomponent); } -@@ -1934,18 +_,19 @@ +@@ -1953,18 +_,19 @@ Predicate predicate = ((ProjectileWeaponItem)p_36349_.getItem()).getSupportedHeldProjectiles(); ItemStack itemstack = ProjectileWeaponItem.getHeldProjectile(this, predicate); if (!itemstack.isEmpty()) { @@ -343,7 +338,7 @@ } } } -@@ -2090,6 +_,54 @@ +@@ -2109,6 +_,54 @@ this.currentImpulseImpactPos = null; this.ignoreFallDamageFromCurrentImpulse = false; } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch index 88de33c31c..ddbd779e36 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractArrow.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/net/minecraft/world/entity/projectile/AbstractArrow.java -@@ -79,6 +_,7 @@ +@@ -76,6 +_,7 @@ private ItemStack pickupItemStack = this.getDefaultPickupItem(); @Nullable private ItemStack firedFromWeapon = null; @@ -8,16 +8,16 @@ protected AbstractArrow(EntityType p_332730_, Level p_335646_) { super(p_332730_, p_335646_); -@@ -192,7 +_,7 @@ +@@ -189,7 +_,7 @@ this.shakeTime--; } -- if (this.isInWaterOrRain() || blockstate.is(Blocks.POWDER_SNOW)) { -+ if (this.isInWaterOrRain() || blockstate.is(Blocks.POWDER_SNOW) || this.isInFluidType((fluidType, height) -> this.canFluidExtinguish(fluidType))) { +- if (this.isInWaterOrRain()) { ++ if (this.isInWaterOrRain() || this.isInFluidType((fluidType, height) -> this.canFluidExtinguish(fluidType))) { this.clearFire(); } -@@ -569,7 +_,7 @@ +@@ -566,7 +_,7 @@ protected boolean canHitEntity(Entity p_36743_) { return p_36743_ instanceof Player && this.getOwner() instanceof Player player && !player.canHarmPlayer((Player)p_36743_) ? false diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch index c8ce94f9eb..2829844829 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java +++ b/net/minecraft/world/entity/projectile/AbstractHurtingProjectile.java -@@ -86,7 +_,7 @@ +@@ -87,7 +_,7 @@ this.igniteForSeconds(1.0F); } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/FireworkRocketEntity.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/FireworkRocketEntity.java.patch index 8597d0ba1d..95c05189cd 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/FireworkRocketEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/FireworkRocketEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/FireworkRocketEntity.java +++ b/net/minecraft/world/entity/projectile/FireworkRocketEntity.java -@@ -311,6 +_,13 @@ +@@ -307,6 +_,13 @@ } @Override diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/FishingHook.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/FishingHook.java.patch index 40497d89ef..700a1200bb 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/FishingHook.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/FishingHook.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/FishingHook.java +++ b/net/minecraft/world/entity/projectile/FishingHook.java -@@ -240,8 +_,8 @@ +@@ -251,8 +_,8 @@ private boolean shouldStopFishing(Player p_37137_) { ItemStack itemstack = p_37137_.getMainHandItem(); ItemStack itemstack1 = p_37137_.getOffhandItem(); @@ -11,7 +11,7 @@ if (!p_37137_.isRemoved() && p_37137_.isAlive() && (flag || flag1) && !(this.distanceToSqr(p_37137_) > 1024.0)) { return false; } else { -@@ -252,6 +_,7 @@ +@@ -263,6 +_,7 @@ private void checkCollision() { HitResult hitresult = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity); @@ -19,7 +19,7 @@ this.hitTargetOrDeflectSelf(hitresult); } -@@ -441,6 +_,7 @@ +@@ -452,6 +_,7 @@ Player player = this.getPlayerOwner(); if (!this.level().isClientSide && player != null && !this.shouldStopFishing(player)) { int i = 0; @@ -27,7 +27,7 @@ if (this.hookedIn != null) { this.pullEntity(this.hookedIn); CriteriaTriggers.FISHING_ROD_HOOKED.trigger((ServerPlayer)player, p_37157_, this, Collections.emptyList()); -@@ -451,10 +_,16 @@ +@@ -462,10 +_,16 @@ .withParameter(LootContextParams.ORIGIN, this.position()) .withParameter(LootContextParams.TOOL, p_37157_) .withParameter(LootContextParams.THIS_ENTITY, this) @@ -36,15 +36,15 @@ .create(LootContextParamSets.FISHING); LootTable loottable = this.level().getServer().reloadableRegistries().getLootTable(BuiltInLootTables.FISHING); List list = loottable.getRandomItems(lootparams); -+ event = net.minecraftforge.event.ForgeEventFactory.onPlayerFishedItem(list, this.onGround() ? 2 : 1, this); -+ if (event.isCanceled()) { ++ event = new net.minecraftforge.event.entity.player.ItemFishedEvent(list, this.onGround() ? 2 : 1, this); ++ if (net.minecraftforge.event.entity.player.ItemFishedEvent.BUS.post(event)) { + this.discard(); + return event.getRodDamage(); + } CriteriaTriggers.FISHING_ROD_HOOKED.trigger((ServerPlayer)player, p_37157_, this, list); for (ItemStack itemstack : list) { -@@ -484,7 +_,7 @@ +@@ -495,7 +_,7 @@ } this.discard(); diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/LargeFireball.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/LargeFireball.java.patch index b8614a0aac..2751298908 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/LargeFireball.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/LargeFireball.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/net/minecraft/world/entity/projectile/LargeFireball.java -@@ -30,7 +_,7 @@ +@@ -31,7 +_,7 @@ protected void onHit(HitResult p_37218_) { super.onHit(p_37218_); if (this.level() instanceof ServerLevel serverlevel) { diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch index 72473625b2..5e7fff0f10 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/Projectile.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java -@@ -367,7 +_,7 @@ +@@ -345,7 +_,7 @@ @Override public boolean mayInteract(ServerLevel p_364907_, BlockPos p_150168_) { Entity entity = this.getOwner(); diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch index b902272e87..6f5f0791db 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/ProjectileUtil.java.patch @@ -9,7 +9,7 @@ if (d0 == 0.0) { entity = entity1; vec3 = vec31; -@@ -153,8 +_,13 @@ +@@ -157,8 +_,13 @@ } } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/ShulkerBullet.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/ShulkerBullet.java.patch index 30bf7b7e13..23d39d369c 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/ShulkerBullet.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/ShulkerBullet.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/ShulkerBullet.java +++ b/net/minecraft/world/entity/projectile/ShulkerBullet.java -@@ -223,7 +_,7 @@ +@@ -220,7 +_,7 @@ this.handlePortal(); } diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch index 46ce19cf0b..ac3ec46c50 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/ThrownEnderpearl.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/net/minecraft/world/entity/projectile/ThrownEnderpearl.java -@@ -122,6 +_,13 @@ +@@ -119,6 +_,13 @@ Vec3 vec3 = this.oldPosition(); if (entity instanceof ServerPlayer serverplayer) { if (serverplayer.connection.isAcceptingMessages()) { + var event = net.minecraftforge.event.ForgeEventFactory.onEnderPearlLand(serverplayer, this.getX(), this.getY(), this.getZ(), this, 5.0F, p_37504_); -+ if (event.isCanceled()) { ++ if (event == null) { + this.discard(); + return; + } @@ -14,12 +14,12 @@ if (this.random.nextFloat() < 0.05F && serverlevel.getGameRules().getBoolean(GameRules.RULE_DOMOBSPAWNING)) { Endermite endermite = EntityType.ENDERMITE.create(serverlevel, EntitySpawnReason.TRIGGERED); if (endermite != null) { -@@ -148,7 +_,7 @@ +@@ -145,7 +_,7 @@ if (serverplayer1 != null) { serverplayer1.resetFallDistance(); serverplayer1.resetCurrentImpulseContext(); -- serverplayer1.hurtServer(serverplayer.serverLevel(), this.damageSources().enderPearl(), 5.0F); -+ serverplayer1.hurtServer(serverplayer.serverLevel(), this.damageSources().enderPearl(), event.getAttackDamage()); +- serverplayer1.hurtServer(serverplayer.level(), this.damageSources().enderPearl(), 5.0F); ++ serverplayer1.hurtServer(serverplayer.level(), this.damageSources().enderPearl(), event.getAttackDamage()); } this.playSound(serverlevel, vec3); diff --git a/patches/minecraft/net/minecraft/world/entity/projectile/WitherSkull.java.patch b/patches/minecraft/net/minecraft/world/entity/projectile/WitherSkull.java.patch index 7cb895596a..1893e1c4e2 100644 --- a/patches/minecraft/net/minecraft/world/entity/projectile/WitherSkull.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/projectile/WitherSkull.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/WitherSkull.java +++ b/net/minecraft/world/entity/projectile/WitherSkull.java -@@ -48,7 +_,7 @@ +@@ -49,7 +_,7 @@ @Override public float getBlockExplosionResistance(Explosion p_37619_, BlockGetter p_37620_, BlockPos p_37621_, BlockState p_37622_, FluidState p_37623_, float p_37624_) { diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch index 9ced25eb96..2421658abc 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractBoat.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/AbstractBoat.java +++ b/net/minecraft/world/entity/vehicle/AbstractBoat.java -@@ -47,7 +_,7 @@ +@@ -48,7 +_,7 @@ import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; @@ -9,7 +9,7 @@ private static final EntityDataAccessor DATA_ID_PADDLE_LEFT = SynchedEntityData.defineId(AbstractBoat.class, EntityDataSerializers.BOOLEAN); private static final EntityDataAccessor DATA_ID_PADDLE_RIGHT = SynchedEntityData.defineId(AbstractBoat.class, EntityDataSerializers.BOOLEAN); private static final EntityDataAccessor DATA_ID_BUBBLE_TIME = SynchedEntityData.defineId(AbstractBoat.class, EntityDataSerializers.INT); -@@ -424,7 +_,7 @@ +@@ -427,7 +_,7 @@ for (int i2 = i1; i2 < j1; i2++) { blockpos$mutableblockpos.set(l1, k1, i2); FluidState fluidstate = this.level().getFluidState(blockpos$mutableblockpos); @@ -18,7 +18,7 @@ f = Math.max(f, fluidstate.getHeight(this.level(), blockpos$mutableblockpos)); } -@@ -470,7 +_,7 @@ +@@ -473,7 +_,7 @@ voxelshape, BooleanOp.AND )) { @@ -27,7 +27,7 @@ k1++; } } -@@ -499,7 +_,7 @@ +@@ -502,7 +_,7 @@ for (int i2 = i1; i2 < j1; i2++) { blockpos$mutableblockpos.set(k1, l1, i2); FluidState fluidstate = this.level().getFluidState(blockpos$mutableblockpos); @@ -36,7 +36,7 @@ float f = l1 + fluidstate.getHeight(this.level(), blockpos$mutableblockpos); this.waterLevel = Math.max((double)f, this.waterLevel); flag |= aabb.minY < f; -@@ -529,7 +_,7 @@ +@@ -532,7 +_,7 @@ for (int i2 = i1; i2 < j1; i2++) { blockpos$mutableblockpos.set(k1, l1, i2); FluidState fluidstate = this.level().getFluidState(blockpos$mutableblockpos); @@ -45,7 +45,7 @@ && d0 < blockpos$mutableblockpos.getY() + fluidstate.getHeight(this.level(), blockpos$mutableblockpos)) { if (!fluidstate.isSource()) { return AbstractBoat.Status.UNDER_FLOWING_WATER; -@@ -732,7 +_,7 @@ +@@ -735,7 +_,7 @@ if (!this.isPassenger()) { if (p_361999_) { this.resetFallDistance(); @@ -54,7 +54,7 @@ this.fallDistance -= (float)p_361830_; } } -@@ -756,7 +_,7 @@ +@@ -759,7 +_,7 @@ @Override protected boolean canAddPassenger(Entity p_366021_) { diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecart.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecart.java.patch index 705d6c807f..25e99e9b83 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecart.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecart.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/net/minecraft/world/entity/vehicle/AbstractMinecart.java -@@ -44,7 +_,7 @@ +@@ -43,7 +_,7 @@ import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; @@ -9,7 +9,7 @@ private static final Vec3 LOWERED_PASSENGER_ATTACHMENT = new Vec3(0.0, 0.0, 0.0); private static final EntityDataAccessor> DATA_ID_CUSTOM_DISPLAY_BLOCK = SynchedEntityData.defineId( AbstractMinecart.class, EntityDataSerializers.OPTIONAL_BLOCK_STATE -@@ -94,15 +_,12 @@ +@@ -93,15 +_,12 @@ } ) ); @@ -27,7 +27,7 @@ } protected AbstractMinecart(EntityType p_38090_, Level p_38091_, double p_38092_, double p_38093_, double p_38094_) { -@@ -165,7 +_,7 @@ +@@ -164,7 +_,7 @@ @Override public boolean isPushable() { @@ -36,7 +36,7 @@ } @Override -@@ -355,16 +_,24 @@ +@@ -361,16 +_,24 @@ } protected void comeOffTrack(ServerLevel p_365684_) { @@ -63,7 +63,7 @@ } } -@@ -420,7 +_,7 @@ +@@ -427,7 +_,7 @@ public Vec3 getRedstoneDirection(BlockPos p_369874_) { BlockState blockstate = this.level().getBlockState(p_369874_); if (blockstate.is(Blocks.POWERED_RAIL) && blockstate.getValue(PoweredRailBlock.POWERED)) { @@ -72,7 +72,7 @@ if (railshape == RailShape.EAST_WEST) { if (this.isRedstoneConductor(p_369874_.west())) { return new Vec3(1.0, 0.0, 0.0); -@@ -596,5 +_,42 @@ +@@ -599,5 +_,42 @@ public boolean isFurnace() { return false; diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch index f9f15bce97..54130e5438 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java +++ b/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java -@@ -93,6 +_,8 @@ +@@ -94,6 +_,8 @@ @Override public InteractionResult interact(Player p_38232_, InteractionHand p_38233_) { @@ -9,7 +9,7 @@ return this.interactWithContainerVehicle(p_38232_); } -@@ -163,5 +_,27 @@ +@@ -164,5 +_,27 @@ @Override public void clearItemStacks() { this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java.patch index febb3543af..b018066b44 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java +++ b/net/minecraft/world/entity/vehicle/MinecartCommandBlock.java -@@ -82,6 +_,8 @@ +@@ -83,6 +_,8 @@ @Override public InteractionResult interact(Player p_38522_, InteractionHand p_38523_) { diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartFurnace.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartFurnace.java.patch index 0ca2f907bf..e2a4bab32a 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartFurnace.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartFurnace.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/MinecartFurnace.java +++ b/net/minecraft/world/entity/vehicle/MinecartFurnace.java -@@ -148,4 +_,9 @@ +@@ -149,4 +_,9 @@ public BlockState getDefaultDisplayBlockState() { return Blocks.FURNACE.defaultBlockState().setValue(FurnaceBlock.FACING, Direction.NORTH).setValue(FurnaceBlock.LIT, this.hasFuel()); } diff --git a/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartSpawner.java.patch b/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartSpawner.java.patch index dbc06a596c..cb4e7cc7b3 100644 --- a/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartSpawner.java.patch +++ b/patches/minecraft/net/minecraft/world/entity/vehicle/MinecartSpawner.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/vehicle/MinecartSpawner.java +++ b/net/minecraft/world/entity/vehicle/MinecartSpawner.java -@@ -18,6 +_,12 @@ +@@ -19,6 +_,12 @@ public void broadcastEvent(Level p_150342_, BlockPos p_150343_, int p_150344_) { p_150342_.broadcastEntityEvent(MinecartSpawner.this, (byte)p_150344_); } diff --git a/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch b/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch index 21256f0080..dbbf1b001d 100644 --- a/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/AnvilMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/AnvilMenu.java +++ b/net/minecraft/world/inventory/AnvilMenu.java -@@ -79,6 +_,8 @@ +@@ -80,6 +_,8 @@ p_150474_.giveExperienceLevels(-this.cost.get()); } @@ -9,7 +9,7 @@ if (this.repairItemCountCost > 0) { ItemStack itemstack = this.inputSlots.getItem(1); if (!itemstack.isEmpty() && itemstack.getCount() > this.repairItemCountCost) { -@@ -95,7 +_,7 @@ +@@ -102,7 +_,7 @@ this.inputSlots.setItem(0, ItemStack.EMPTY); this.access.execute((p_150479_, p_150480_) -> { BlockState blockstate = p_150479_.getBlockState(p_150480_); @@ -18,7 +18,7 @@ BlockState blockstate1 = AnvilBlock.damage(blockstate); if (blockstate1 == null) { p_150479_.removeBlock(p_150480_, false); -@@ -124,8 +_,11 @@ +@@ -131,8 +_,11 @@ ItemEnchantments.Mutable itemenchantments$mutable = new ItemEnchantments.Mutable(EnchantmentHelper.getEnchantmentsForCrafting(itemstack1)); j += (long)itemstack.getOrDefault(DataComponents.REPAIR_COST, 0).intValue() + itemstack2.getOrDefault(DataComponents.REPAIR_COST, 0).intValue(); this.repairItemCountCost = 0; @@ -31,7 +31,7 @@ if (itemstack1.isDamageableItem() && itemstack.isValidRepairItem(itemstack2)) { int l2 = Math.min(itemstack1.getDamageValue(), itemstack1.getMaxDamage() / 4); if (l2 <= 0) { -@@ -229,6 +_,10 @@ +@@ -236,6 +_,10 @@ itemstack1.remove(DataComponents.CUSTOM_NAME); } @@ -42,7 +42,7 @@ int k2 = i <= 0 ? 0 : (int)Mth.clamp(j + i, 0L, 2147483647L); this.cost.set(k2); if (i <= 0) { -@@ -301,5 +_,9 @@ +@@ -308,5 +_,9 @@ public int getCost() { return this.cost.get(); diff --git a/patches/minecraft/net/minecraft/world/inventory/GrindstoneMenu.java.patch b/patches/minecraft/net/minecraft/world/inventory/GrindstoneMenu.java.patch index d713f62597..81d5ceda73 100644 --- a/patches/minecraft/net/minecraft/world/inventory/GrindstoneMenu.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/GrindstoneMenu.java.patch @@ -45,7 +45,7 @@ private ItemStack computeResult(ItemStack p_335167_, ItemStack p_329934_) { + var event = net.minecraftforge.event.ForgeEventFactory.onGrindstoneChange(p_335167_, p_329934_, this.resultSlots, -1); -+ if (event.isCanceled()) { ++ if (event == null) { + this.xp = -1; + return ItemStack.EMPTY; + } else if (!event.getOutput().isEmpty()) { diff --git a/patches/minecraft/net/minecraft/world/inventory/RecipeBookType.java.patch b/patches/minecraft/net/minecraft/world/inventory/RecipeBookType.java.patch index e8252a7de0..5e3e11b912 100644 --- a/patches/minecraft/net/minecraft/world/inventory/RecipeBookType.java.patch +++ b/patches/minecraft/net/minecraft/world/inventory/RecipeBookType.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/RecipeBookType.java +++ b/net/minecraft/world/inventory/RecipeBookType.java -@@ -1,8 +_,18 @@ +@@ -1,8 +_,17 @@ package net.minecraft.world.inventory; -public enum RecipeBookType { @@ -16,7 +16,6 @@ + + @Override + public void init() { -+ String name = this.name().toLowerCase(java.util.Locale.ROOT).replace("_",""); -+ net.minecraft.stats.RecipeBookSettings.addTagsForType(this, "is" + name + "GuiOpen", "is" + name + "FilteringCraftable"); ++ net.minecraft.stats.RecipeBookSettings.register(this); + } } diff --git a/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch b/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch index 4d25cd6a57..4461de134f 100644 --- a/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch +++ b/patches/minecraft/net/minecraft/world/item/DyeColor.java.patch @@ -10,7 +10,7 @@ private DyeColor(final int p_41046_, final String p_41047_, final int p_41048_, final MapColor p_285297_, final int p_41050_, final int p_41051_) { this.id = p_41046_; @@ -60,6 +_,8 @@ - this.textColor = p_41051_; + this.textColor = ARGB.opaque(p_41051_); this.textureDiffuseColor = ARGB.opaque(p_41048_); this.fireworkColor = p_41050_; + this.dyesTag = net.minecraft.tags.ItemTags.create("c", "dyes/" + p_41047_); diff --git a/patches/minecraft/net/minecraft/world/item/Item.java.patch b/patches/minecraft/net/minecraft/world/item/Item.java.patch index 03fb323212..49ee643be4 100644 --- a/patches/minecraft/net/minecraft/world/item/Item.java.patch +++ b/patches/minecraft/net/minecraft/world/item/Item.java.patch @@ -94,7 +94,7 @@ public static class Properties { private static final DependantName BLOCK_DESCRIPTION_ID = p_367498_ -> Util.makeDescriptionId("block", p_367498_.location()); private static final DependantName ITEM_DESCRIPTION_ID = p_367603_ -> Util.makeDescriptionId("item", p_367603_.location()); -@@ -584,6 +_,11 @@ +@@ -588,6 +_,11 @@ @Nullable MapItemSavedData mapData(MapId p_335695_); @@ -106,7 +106,7 @@ static Item.TooltipContext of(@Nullable final Level p_332083_) { return p_332083_ == null ? EMPTY : new Item.TooltipContext() { @Override -@@ -599,6 +_,11 @@ +@@ -603,6 +_,11 @@ @Override public MapItemSavedData mapData(MapId p_330171_) { return p_332083_.getMapData(p_330171_); diff --git a/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch b/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch index 71385af3c4..9fbb271d0a 100644 --- a/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch +++ b/patches/minecraft/net/minecraft/world/item/ItemStack.java.patch @@ -1,19 +1,19 @@ --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -99,7 +_,7 @@ +@@ -96,7 +_,7 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import org.slf4j.Logger; -public final class ItemStack implements DataComponentHolder { -+public final class ItemStack extends net.minecraftforge.common.capabilities.CapabilityProvider implements DataComponentHolder, net.minecraftforge.common.extensions.IForgeItemStack { ++public final class ItemStack extends net.minecraftforge.common.capabilities.CapabilityProvider.ItemStacks implements DataComponentHolder, net.minecraftforge.common.extensions.IForgeItemStack { private static final List OP_NBT_WARNING = List.of( Component.translatable("item.op_warning.line1").withStyle(ChatFormatting.RED, ChatFormatting.BOLD), Component.translatable("item.op_warning.line2").withStyle(ChatFormatting.RED), -@@ -269,13 +_,16 @@ +@@ -266,13 +_,16 @@ } private ItemStack(ItemLike p_331826_, int p_332766_, PatchedDataComponentMap p_333722_) { -+ super(ItemStack.class, true); ++ super(true); this.item = p_331826_.asItem(); this.count = p_332766_; this.components = p_333722_; @@ -22,11 +22,11 @@ } private ItemStack(@Nullable Void p_282703_) { -+ super(ItemStack.class, false); ++ super(false); this.item = null; this.components = new PatchedDataComponentMap(DataComponentMap.EMPTY); } -@@ -361,13 +_,22 @@ +@@ -353,13 +_,22 @@ } public InteractionResult useOn(UseOnContext p_41662_) { @@ -50,7 +50,7 @@ if (player != null && interactionresult instanceof InteractionResult.Success interactionresult$success && interactionresult$success.wasItemInteraction()) { player.awardStat(Stats.ITEM_USED.get(item)); } -@@ -468,18 +_,26 @@ +@@ -444,18 +_,26 @@ } public void hurtAndBreak(int p_220158_, ServerLevel p_342197_, @Nullable ServerPlayer p_220160_, Consumer p_343361_) { @@ -78,7 +78,7 @@ return p_362423_ > 0 ? EnchantmentHelper.processDurabilityChange(p_364910_, this, p_362423_) : p_362423_; } } -@@ -515,7 +_,13 @@ +@@ -495,7 +_,13 @@ p_41623_, serverlevel, p_41624_ instanceof ServerPlayer serverplayer ? serverplayer : null, @@ -93,7 +93,7 @@ ); } } -@@ -838,6 +_,7 @@ +@@ -818,6 +_,7 @@ List list = Lists.newArrayList(); list.add(this.getStyledHoverName()); this.addDetailsToTooltip(p_331329_, tooltipdisplay, p_41652_, p_41653_, list::add); @@ -101,7 +101,7 @@ return list; } } -@@ -1134,6 +_,7 @@ +@@ -1061,6 +_,7 @@ this.getItem().onUseTick(p_41732_, p_41733_, this, p_41734_); } diff --git a/patches/minecraft/net/minecraft/world/item/Items.java.patch b/patches/minecraft/net/minecraft/world/item/Items.java.patch index e8a170960c..01f1fada71 100644 --- a/patches/minecraft/net/minecraft/world/item/Items.java.patch +++ b/patches/minecraft/net/minecraft/world/item/Items.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/Items.java +++ b/net/minecraft/world/item/Items.java -@@ -2097,7 +_,25 @@ +@@ -2152,7 +_,25 @@ } public static Item registerBlock(Block p_252092_, Block... p_248886_) { @@ -27,7 +27,7 @@ for (Block block : p_248886_) { Item.BY_BLOCK.put(block, item); -@@ -2136,10 +_,6 @@ +@@ -2191,10 +_,6 @@ public static Item registerItem(ResourceKey p_364577_, Function p_366144_, Item.Properties p_369845_) { Item item = p_366144_.apply(p_369845_.setId(p_364577_)); diff --git a/patches/minecraft/net/minecraft/world/level/BaseSpawner.java.patch b/patches/minecraft/net/minecraft/world/level/BaseSpawner.java.patch index a31f6935dc..a422a833ff 100644 --- a/patches/minecraft/net/minecraft/world/level/BaseSpawner.java.patch +++ b/patches/minecraft/net/minecraft/world/level/BaseSpawner.java.patch @@ -1,25 +1,25 @@ --- a/net/minecraft/world/level/BaseSpawner.java +++ b/net/minecraft/world/level/BaseSpawner.java -@@ -148,13 +_,15 @@ +@@ -156,13 +_,15 @@ - entity.snapTo(entity.getX(), entity.getY(), entity.getZ(), randomsource.nextFloat() * 360.0F, 0.0F); - if (entity instanceof Mob mob) { -- if (spawndata.getCustomSpawnRules().isEmpty() && !mob.checkSpawnRules(p_151312_, EntitySpawnReason.SPAWNER) || !mob.checkSpawnObstruction(p_151312_)) { -+ if (!net.minecraftforge.event.ForgeEventFactory.checkSpawnPositionSpawner(mob, p_151312_, EntitySpawnReason.SPAWNER, spawndata, this)) { - continue; - } + entity.snapTo(entity.getX(), entity.getY(), entity.getZ(), randomsource.nextFloat() * 360.0F, 0.0F); + if (entity instanceof Mob mob) { +- if (spawndata.getCustomSpawnRules().isEmpty() && !mob.checkSpawnRules(p_151312_, EntitySpawnReason.SPAWNER) || !mob.checkSpawnObstruction(p_151312_)) { ++ if (!net.minecraftforge.event.ForgeEventFactory.checkSpawnPositionSpawner(mob, p_151312_, EntitySpawnReason.SPAWNER, spawndata, this)) { + continue; + } - boolean flag1 = spawndata.getEntityToSpawn().size() == 1 && spawndata.getEntityToSpawn().getString("id").isPresent(); -- if (flag1) { -- ((Mob)entity).finalizeSpawn(p_151312_, p_151312_.getCurrentDifficultyAt(entity.blockPosition()), EntitySpawnReason.SPAWNER, null); -+ // Forge: Patch in FinalizeSpawn for spawners so it may be fired unconditionally, instead of only when vanilla normally would trigger it. -+ var event = net.minecraftforge.event.ForgeEventFactory.onFinalizeSpawnSpawner(mob, p_151312_, p_151312_.getCurrentDifficultyAt(entity.blockPosition()), null, compoundtag, this); -+ if (!event.isCanceled() && flag1) { -+ ((Mob)entity).finalizeSpawn(p_151312_, event.getDifficulty(), EntitySpawnReason.SPAWNER, null); - } + boolean flag1 = spawndata.getEntityToSpawn().size() == 1 && spawndata.getEntityToSpawn().getString("id").isPresent(); +- if (flag1) { +- ((Mob)entity).finalizeSpawn(p_151312_, p_151312_.getCurrentDifficultyAt(entity.blockPosition()), EntitySpawnReason.SPAWNER, null); ++ // Forge: Patch in FinalizeSpawn for spawners so it may be fired unconditionally, instead of only when vanilla normally would trigger it. ++ var event = net.minecraftforge.event.ForgeEventFactory.onFinalizeSpawnSpawner(mob, p_151312_, p_151312_.getCurrentDifficultyAt(entity.blockPosition()), null, valueinput, this); ++ if (event != null && flag1) { ++ mob.finalizeSpawn(p_151312_, event.getDifficulty(), EntitySpawnReason.SPAWNER, null); + } - spawndata.getEquipment().ifPresent(mob::equip); -@@ -270,5 +_,15 @@ + spawndata.getEquipment().ifPresent(mob::equip); +@@ -280,5 +_,15 @@ public double getoSpin() { return this.oSpin; diff --git a/patches/minecraft/net/minecraft/world/level/Level.java.patch b/patches/minecraft/net/minecraft/world/level/Level.java.patch index 280629bb63..df7f8edc07 100644 --- a/patches/minecraft/net/minecraft/world/level/Level.java.patch +++ b/patches/minecraft/net/minecraft/world/level/Level.java.patch @@ -5,7 +5,7 @@ import net.minecraft.world.scores.Scoreboard; -public abstract class Level implements LevelAccessor, UUIDLookup, AutoCloseable { -+public abstract class Level extends net.minecraftforge.common.capabilities.CapabilityProvider implements LevelAccessor, UUIDLookup, AutoCloseable, net.minecraftforge.common.extensions.IForgeLevel { ++public abstract class Level extends net.minecraftforge.common.capabilities.CapabilityProvider.Levels implements LevelAccessor, UUIDLookup, AutoCloseable, net.minecraftforge.common.extensions.IForgeLevel { public static final Codec> RESOURCE_KEY_CODEC = ResourceKey.codec(Registries.DIMENSION); public static final ResourceKey OVERWORLD = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("overworld")); public static final ResourceKey NETHER = ResourceKey.create(Registries.DIMENSION, ResourceLocation.withDefaultNamespace("the_nether")); @@ -25,7 +25,7 @@ long p_270248_, int p_270466_ ) { -+ super(Level.class); ++ super(); this.levelData = p_270739_; this.dimensionTypeRegistration = p_270240_; final DimensionType dimensiontype = p_270240_.value(); @@ -158,7 +158,7 @@ T t = p_261885_.tryCast(enderdragonpart); if (t != null && p_261688_.test(t)) { p_262071_.add(t); -@@ -942,17 +_,16 @@ +@@ -946,17 +_,16 @@ public abstract Scoreboard getScoreboard(); public void updateNeighbourForOutputSignal(BlockPos p_46718_, Block p_46719_) { @@ -181,7 +181,7 @@ } } } -@@ -1054,6 +_,20 @@ +@@ -1058,6 +_,20 @@ } public abstract PotionBrewing potionBrewing(); diff --git a/patches/minecraft/net/minecraft/world/level/block/BaseRailBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/BaseRailBlock.java.patch index d564c60aeb..10cd0a7d5d 100644 --- a/patches/minecraft/net/minecraft/world/level/block/BaseRailBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/BaseRailBlock.java.patch @@ -38,8 +38,8 @@ + @Deprecated public abstract Property getShapeProperty(); - @Override -@@ -167,5 +_,15 @@ + protected RailShape rotate(RailShape p_409491_, Rotation p_408760_) { +@@ -299,5 +_,15 @@ @Override protected FluidState getFluidState(BlockState p_152158_) { return p_152158_.getValue(WATERLOGGED) ? Fluids.WATER.getSource(false) : super.getFluidState(p_152158_); diff --git a/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch b/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch index 8375fe4cbc..69cbf9b5ed 100644 --- a/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/Blocks.java.patch @@ -9,7 +9,7 @@ ); public static final Block DETECTOR_RAIL = register( "detector_rail", DetectorRailBlock::new, BlockBehaviour.Properties.of().noCollission().strength(0.7F).sound(SoundType.METAL) -@@ -6697,14 +_,5 @@ +@@ -6685,14 +_,5 @@ private static Block register(String p_50796_, BlockBehaviour.Properties p_362760_) { return register(p_50796_, Block::new, p_362760_); diff --git a/patches/minecraft/net/minecraft/world/level/block/DetectorRailBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/DetectorRailBlock.java.patch index 08d6f4352e..a416bf6616 100644 --- a/patches/minecraft/net/minecraft/world/level/block/DetectorRailBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/DetectorRailBlock.java.patch @@ -23,7 +23,7 @@ if (!list1.isEmpty()) { return AbstractContainerMenu.getRedstoneSignalFromContainer((Container)list1.get(0)); } -@@ -292,6 +_,6 @@ +@@ -188,6 +_,6 @@ @Override protected void createBlockStateDefinition(StateDefinition.Builder p_52469_) { diff --git a/patches/minecraft/net/minecraft/world/level/block/DryVegetationBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/DryVegetationBlock.java.patch index 183ed08069..026a05e152 100644 --- a/patches/minecraft/net/minecraft/world/level/block/DryVegetationBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/DryVegetationBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/DryVegetationBlock.java +++ b/net/minecraft/world/level/block/DryVegetationBlock.java -@@ -13,7 +_,7 @@ +@@ -12,7 +_,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -8,4 +8,4 @@ +public class DryVegetationBlock extends VegetationBlock implements net.minecraftforge.common.IForgeShearable { public static final MapCodec CODEC = simpleCodec(DryVegetationBlock::new); private static final VoxelShape SHAPE = Block.column(12.0, 0.0, 13.0); - private static final int IDLE_SOUND_CHANCE = 150; + diff --git a/patches/minecraft/net/minecraft/world/level/block/NoteBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/NoteBlock.java.patch index 8312ec4e73..e1513147aa 100644 --- a/patches/minecraft/net/minecraft/world/level/block/NoteBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/NoteBlock.java.patch @@ -16,7 +16,7 @@ @Override protected boolean triggerEvent(BlockState p_55023_, Level p_55024_, BlockPos p_55025_, int p_55026_, int p_55027_) { + var event = net.minecraftforge.event.ForgeEventFactory.onNotePlay(p_55024_, p_55025_, p_55023_, p_55023_.getValue(NOTE), p_55023_.getValue(INSTRUMENT)); -+ if (event.isCanceled()) return false; ++ if (event == null) return false; + p_55023_ = p_55023_.setValue(NOTE, event.getVanillaNoteId()).setValue(INSTRUMENT, event.getInstrument()); NoteBlockInstrument noteblockinstrument = p_55023_.getValue(INSTRUMENT); float f; diff --git a/patches/minecraft/net/minecraft/world/level/block/PoweredRailBlock.java.patch b/patches/minecraft/net/minecraft/world/level/block/PoweredRailBlock.java.patch index 9f081863ce..4c2087f4f2 100644 --- a/patches/minecraft/net/minecraft/world/level/block/PoweredRailBlock.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/PoweredRailBlock.java.patch @@ -65,17 +65,7 @@ p_55233_.updateNeighborsAt(p_55234_.above(), this); } } -@@ -167,6 +_,9 @@ - return p_55240_.setValue(SHAPE, RailShape.SOUTH_EAST); - case NORTH_EAST: - return p_55240_.setValue(SHAPE, RailShape.SOUTH_WEST); -+ case NORTH_SOUTH: //Forge fix: MC-196102 -+ case EAST_WEST: -+ return p_55240_; - } - case COUNTERCLOCKWISE_90: - switch ((RailShape)p_55240_.getValue(SHAPE)) { -@@ -266,6 +_,10 @@ +@@ -162,6 +_,10 @@ @Override protected void createBlockStateDefinition(StateDefinition.Builder p_55243_) { diff --git a/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch b/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch index 8d6f058d57..55528d8a6b 100644 --- a/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/SoundType.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/SoundType.java +++ b/net/minecraft/world/level/block/SoundType.java -@@ -372,6 +_,7 @@ +@@ -375,6 +_,7 @@ private final SoundEvent hitSound; private final SoundEvent fallSound; diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch index f9ba0c15b7..42110363ad 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch @@ -17,34 +17,34 @@ private boolean isLit() { @@ -121,10 +_,10 @@ - super.loadAdditional(p_335441_, p_330623_); + super.loadAdditional(p_405853_); this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); - ContainerHelper.loadAllItems(p_335441_, this.items, p_330623_); -- this.cookingTimer = p_335441_.getShortOr("cooking_time_spent", (short)0); -- this.cookingTotalTime = p_335441_.getShortOr("cooking_total_time", (short)0); -- this.litTimeRemaining = p_335441_.getShortOr("lit_time_remaining", (short)0); -- this.litTotalTime = p_335441_.getShortOr("lit_total_time", (short)0); -+ this.cookingTimer = p_335441_.getIntOr("cooking_time_spent", (short)0); -+ this.cookingTotalTime = p_335441_.getIntOr("cooking_total_time", (short)0); -+ this.litTimeRemaining = p_335441_.getIntOr("lit_time_remaining", (short)0); -+ this.litTotalTime = p_335441_.getIntOr("lit_total_time", (short)0); + ContainerHelper.loadAllItems(p_405853_, this.items); +- this.cookingTimer = p_405853_.getShortOr("cooking_time_spent", (short)0); +- this.cookingTotalTime = p_405853_.getShortOr("cooking_total_time", (short)0); +- this.litTimeRemaining = p_405853_.getShortOr("lit_time_remaining", (short)0); +- this.litTotalTime = p_405853_.getShortOr("lit_total_time", (short)0); ++ this.cookingTimer = p_405853_.getIntOr("cooking_time_spent", (short)0); ++ this.cookingTotalTime = p_405853_.getIntOr("cooking_total_time", (short)0); ++ this.litTimeRemaining = p_405853_.getIntOr("lit_time_remaining", (short)0); ++ this.litTotalTime = p_405853_.getIntOr("lit_total_time", (short)0); this.recipesUsed.clear(); - this.recipesUsed.putAll(p_335441_.read("RecipesUsed", RECIPES_USED_CODEC).orElse(Map.of())); + this.recipesUsed.putAll(p_405853_.read("RecipesUsed", RECIPES_USED_CODEC).orElse(Map.of())); } @@ -132,10 +_,10 @@ @Override - protected void saveAdditional(CompoundTag p_187452_, HolderLookup.Provider p_330192_) { - super.saveAdditional(p_187452_, p_330192_); -- p_187452_.putShort("cooking_time_spent", (short)this.cookingTimer); -- p_187452_.putShort("cooking_total_time", (short)this.cookingTotalTime); -- p_187452_.putShort("lit_time_remaining", (short)this.litTimeRemaining); -- p_187452_.putShort("lit_total_time", (short)this.litTotalTime); -+ p_187452_.putInt("cooking_time_spent", this.cookingTimer); -+ p_187452_.putInt("cooking_total_time", this.cookingTotalTime); -+ p_187452_.putInt("lit_time_remaining", this.litTimeRemaining); -+ p_187452_.putInt("lit_total_time", this.litTotalTime); - ContainerHelper.saveAllItems(p_187452_, this.items, p_330192_); - p_187452_.store("RecipesUsed", RECIPES_USED_CODEC, this.recipesUsed); + protected void saveAdditional(ValueOutput p_406502_) { + super.saveAdditional(p_406502_); +- p_406502_.putShort("cooking_time_spent", (short)this.cookingTimer); +- p_406502_.putShort("cooking_total_time", (short)this.cookingTotalTime); +- p_406502_.putShort("lit_time_remaining", (short)this.litTimeRemaining); +- p_406502_.putShort("lit_total_time", (short)this.litTotalTime); ++ p_406502_.putInt("cooking_time_spent", this.cookingTimer); ++ p_406502_.putInt("cooking_total_time", this.cookingTotalTime); ++ p_406502_.putInt("lit_time_remaining", this.litTimeRemaining); ++ p_406502_.putInt("lit_total_time", this.litTotalTime); + ContainerHelper.saveAllItems(p_406502_, this.items); + p_406502_.store("RecipesUsed", RECIPES_USED_CODEC, this.recipesUsed); } @@ -161,27 +_,31 @@ } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java.patch index d93c91dd80..376a42c06c 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BaseContainerBlockEntity.java -@@ -167,4 +_,27 @@ - p_329140_.remove("lock"); - p_329140_.remove("Items"); +@@ -164,4 +_,27 @@ + p_407613_.discard("lock"); + p_407613_.discard("Items"); } + + private net.minecraftforge.common.util.LazyOptional itemHandler = net.minecraftforge.common.util.LazyOptional.of(() -> createUnSidedHandler()); diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch index 29e6fb56b7..5b0a99fce3 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -@@ -138,8 +_,8 @@ +@@ -139,8 +_,8 @@ for (int i1 = 0; i1 < 10 && blockpos.getY() <= l; i1++) { BlockState blockstate = p_155108_.getBlockState(blockpos); diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch index 977f4949a2..9e629a5670 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -1,19 +1,19 @@ --- a/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -32,7 +_,7 @@ - import net.minecraft.world.level.block.state.BlockState; +@@ -34,7 +_,7 @@ + import net.minecraft.world.level.storage.ValueOutput; import org.slf4j.Logger; -public abstract class BlockEntity { -+public abstract class BlockEntity extends net.minecraftforge.common.capabilities.CapabilityProvider implements net.minecraftforge.common.extensions.IForgeBlockEntity { ++public abstract class BlockEntity extends net.minecraftforge.common.capabilities.CapabilityProvider.BlockEntities implements net.minecraftforge.common.extensions.IForgeBlockEntity { private static final Codec> TYPE_CODEC = BuiltInRegistries.BLOCK_ENTITY_TYPE.byNameCodec(); private static final Logger LOGGER = LogUtils.getLogger(); private final BlockEntityType type; -@@ -44,10 +_,12 @@ +@@ -46,10 +_,12 @@ private DataComponentMap components = DataComponentMap.EMPTY; public BlockEntity(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { -+ super(BlockEntity.class); ++ super(); this.type = p_155228_; this.worldPosition = p_155229_.immutable(); this.validateBlockState(p_155230_); @@ -22,7 +22,7 @@ } private void validateBlockState(BlockState p_345558_) { -@@ -57,7 +_,7 @@ +@@ -59,7 +_,7 @@ } public boolean isValidBlockState(BlockState p_345570_) { @@ -31,24 +31,23 @@ } public static BlockPos getPosFromTag(ChunkPos p_396083_, CompoundTag p_187473_) { -@@ -89,6 +_,8 @@ +@@ -91,6 +_,7 @@ } - protected void loadAdditional(CompoundTag p_331149_, HolderLookup.Provider p_333170_) { -+ var caps = p_331149_.getCompound("ForgeCaps"); -+ if (getCapabilities() != null && caps.isPresent()) deserializeCaps(p_333170_, caps.get()); + protected void loadAdditional(ValueInput p_409136_) { ++ if (getCapabilities() != null) p_409136_.read("ForgeCaps", CompoundTag.CODEC).ifPresent(caps -> deserializeCaps(p_409136_.lookup(), caps)); } - public final void loadWithComponents(CompoundTag p_331756_, HolderLookup.Provider p_335164_) { -@@ -101,6 +_,7 @@ + public final void loadWithComponents(ValueInput p_409893_) { +@@ -103,6 +_,7 @@ } - protected void saveAdditional(CompoundTag p_187471_, HolderLookup.Provider p_327783_) { -+ if (getCapabilities() != null) p_187471_.put("ForgeCaps", serializeCaps(p_327783_)); + protected void saveAdditional(ValueOutput p_407573_) { ++ if (getCapabilities() != null) p_407573_.storeNullable("ForgeCaps", CompoundTag.CODEC, serializeCaps(this.level.registryAccess())); } public final CompoundTag saveWithFullMetadata(HolderLookup.Provider p_331193_) { -@@ -210,6 +_,13 @@ +@@ -238,6 +_,13 @@ public void setRemoved() { this.remove = true; diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java.patch index 29033e2695..ba2c184fd6 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ChiseledBookShelfBlockEntity.java @@ -160,4 +_,28 @@ - public void removeComponentsFromTag(CompoundTag p_329882_) { - p_329882_.remove("Items"); + public void removeComponentsFromTag(ValueOutput p_405909_) { + p_405909_.discard("Items"); } + + private net.minecraftforge.common.util.LazyOptional itemHandler = net.minecraftforge.common.util.LazyOptional.of(this::createUnSidedHandler); diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch index c4dd1c3fdc..cc6abc4d65 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/SignBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SignBlockEntity.java -@@ -265,6 +_,11 @@ +@@ -274,6 +_,11 @@ } } diff --git a/patches/minecraft/net/minecraft/world/level/block/entity/SpawnerBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/entity/SpawnerBlockEntity.java.patch index 18ad8c252e..9f014a24a4 100644 --- a/patches/minecraft/net/minecraft/world/level/block/entity/SpawnerBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/entity/SpawnerBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/SpawnerBlockEntity.java +++ b/net/minecraft/world/level/block/entity/SpawnerBlockEntity.java -@@ -30,6 +_,13 @@ +@@ -32,6 +_,13 @@ p_155771_.sendBlockUpdated(p_155772_, blockstate, blockstate, 260); } } diff --git a/patches/minecraft/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java.patch b/patches/minecraft/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java.patch index 3b3c2619c4..7b571e917b 100644 --- a/patches/minecraft/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java.patch +++ b/patches/minecraft/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java +++ b/net/minecraft/world/level/block/piston/PistonMovingBlockEntity.java -@@ -120,7 +_,7 @@ +@@ -119,7 +_,7 @@ List list = p_155911_.getEntities(null, PistonMath.getMovementArea(aabb, direction, d0).minmax(aabb)); if (!list.isEmpty()) { List list1 = voxelshape.toAabbs(); diff --git a/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch index ed3911c5bb..e8708ab799 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/ChunkAccess.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/net/minecraft/world/level/chunk/ChunkAccess.java -@@ -332,23 +_,28 @@ +@@ -329,23 +_,28 @@ @Override public final void findBlockLightSources(BiConsumer p_285269_) { @@ -33,7 +33,7 @@ } } } -@@ -492,5 +_,10 @@ +@@ -504,5 +_,10 @@ } public record PackedTicks(List> blocks, List> fluids) { diff --git a/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch index f18d687f07..54e17e5a3f 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/LevelChunk.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/LevelChunk.java +++ b/net/minecraft/world/level/chunk/LevelChunk.java -@@ -53,7 +_,7 @@ +@@ -55,7 +_,7 @@ import net.minecraft.world.ticks.TickContainerAccess; import org.slf4j.Logger; @@ -9,7 +9,7 @@ static final Logger LOGGER = LogUtils.getLogger(); private static final TickingBlockEntity NULL_TICKER = new TickingBlockEntity() { @Override -@@ -115,6 +_,7 @@ +@@ -117,6 +_,7 @@ this.postLoad = p_196861_; this.blockTicks = p_196857_; this.fluidTicks = p_196858_; @@ -17,7 +17,7 @@ } public LevelChunk(ServerLevel p_196850_, ProtoChunk p_196851_, @Nullable LevelChunk.PostLoadProcessor p_196852_) { -@@ -312,7 +_,7 @@ +@@ -314,7 +_,7 @@ if (!levelchunksection.getBlockState(j, k, l).is(block)) { return null; } else { @@ -26,7 +26,7 @@ p_62866_.onPlace(this.level, p_62865_, blockstate, flag2); } -@@ -367,6 +_,12 @@ +@@ -369,6 +_,12 @@ @Nullable public BlockEntity getBlockEntity(BlockPos p_62868_, LevelChunk.EntityCreationType p_62869_) { BlockEntity blockentity = this.blockEntities.get(p_62868_); @@ -39,7 +39,7 @@ if (blockentity == null) { CompoundTag compoundtag = this.pendingBlockEntities.remove(p_62868_); if (compoundtag != null) { -@@ -384,9 +_,6 @@ +@@ -386,9 +_,6 @@ this.addAndRegisterBlockEntity(blockentity); } } @@ -49,15 +49,15 @@ } return blockentity; -@@ -400,6 +_,7 @@ - } +@@ -403,6 +_,7 @@ + this.level.onBlockEntityAdded(p_156391_); this.updateBlockEntityTicker(p_156391_); + p_156391_.onLoad(); } } -@@ -452,9 +_,14 @@ +@@ -455,9 +_,14 @@ public CompoundTag getBlockEntityNbtForSaving(BlockPos p_62932_, HolderLookup.Provider p_329605_) { BlockEntity blockentity = this.getBlockEntity(p_62932_); if (blockentity != null && !blockentity.isRemoved()) { @@ -72,16 +72,19 @@ } else { CompoundTag compoundtag = this.pendingBlockEntities.get(p_62932_); if (compoundtag != null) { -@@ -530,7 +_,7 @@ - p_187974_.accept((p_327409_, p_327410_, p_327411_) -> { - BlockEntity blockentity = this.getBlockEntity(p_327409_, LevelChunk.EntityCreationType.IMMEDIATE); - if (blockentity != null && p_327411_ != null && blockentity.getType() == p_327410_) { -- blockentity.loadWithComponents(p_327411_, this.level.registryAccess()); -+ blockentity.handleUpdateTag(p_327411_, this.level.registryAccess()); - } - }); - } -@@ -640,6 +_,7 @@ +@@ -536,9 +_,10 @@ + (p_405747_, p_405748_, p_405749_) -> { + BlockEntity blockentity = this.getBlockEntity(p_405747_, LevelChunk.EntityCreationType.IMMEDIATE); + if (blockentity != null && p_405749_ != null && blockentity.getType() == p_405748_) { +- blockentity.loadWithComponents( ++ var input = ( + TagValueInput.create(problemreporter$scopedcollector.forChild(blockentity.problemPath()), this.level.registryAccess(), p_405749_) + ); ++ blockentity.handleUpdateTag(input, this.level.registryAccess()); + } + } + ); +@@ -650,6 +_,7 @@ } public void clearAllBlockEntities() { @@ -89,19 +92,19 @@ this.blockEntities.values().forEach(BlockEntity::setRemoved); this.blockEntities.clear(); this.tickersInLevel.values().forEach(p_187966_ -> p_187966_.rebind(NULL_TICKER)); -@@ -647,6 +_,7 @@ +@@ -657,6 +_,7 @@ } public void registerAllBlockEntitiesAfterLevelLoad() { + this.level.addFreshBlockEntities(this.blockEntities.values()); - this.blockEntities.values().forEach(p_187988_ -> { + this.blockEntities.values().forEach(p_405750_ -> { if (this.level instanceof ServerLevel serverlevel) { - this.addGameEventListener(p_187988_, serverlevel); -@@ -698,6 +_,24 @@ + this.addGameEventListener(p_405750_, serverlevel); +@@ -709,6 +_,24 @@ return new LevelChunk.BoundTickingBlockEntity<>(p_156376_, p_156377_); } -+ private final net.minecraftforge.common.capabilities.CapabilityProvider.AsField capProvider = new net.minecraftforge.common.capabilities.CapabilityProvider.AsField<>(LevelChunk.class, this); ++ private final net.minecraftforge.common.capabilities.CapabilityProvider.AsField.LevelChunks capProvider = new net.minecraftforge.common.capabilities.CapabilityProvider.AsField.LevelChunks(this); + + @org.jetbrains.annotations.NotNull + @Override @@ -122,7 +125,7 @@ class BoundTickingBlockEntity implements TickingBlockEntity { private final T blockEntity; private final BlockEntityTicker ticker; -@@ -715,6 +_,7 @@ +@@ -726,6 +_,7 @@ if (LevelChunk.this.isTicking(blockpos)) { try { ProfilerFiller profilerfiller = Profiler.get(); @@ -130,7 +133,7 @@ profilerfiller.push(this::getType); BlockState blockstate = LevelChunk.this.getBlockState(blockpos); if (this.blockEntity.getType().isValid(blockstate)) { -@@ -736,6 +_,11 @@ +@@ -747,6 +_,11 @@ CrashReport crashreport = CrashReport.forThrowable(throwable, "Ticking block entity"); CrashReportCategory crashreportcategory = crashreport.addCategory("Block entity being ticked"); this.blockEntity.fillCrashReportCategory(crashreportcategory); @@ -142,7 +145,7 @@ throw new ReportedException(crashreport); } } -@@ -809,6 +_,33 @@ +@@ -820,6 +_,33 @@ public String toString() { return this.ticker + " "; } diff --git a/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch index ed841dffcd..6ef5a0eacc 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java.patch @@ -1,18 +1,18 @@ --- a/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java +++ b/net/minecraft/world/level/chunk/status/ChunkStatusTasks.java -@@ -183,9 +_,15 @@ - levelchunk.setFullStatus(generationchunkholder::getFullStatus); - levelchunk.runPostLoad(); - levelchunk.setLoaded(true); -+ try { -+ generationchunkholder.currentlyLoading = levelchunk; // Forge - bypass the future chain when getChunk is called, this prevents deadlocks. - levelchunk.registerAllBlockEntitiesAfterLevelLoad(); - levelchunk.registerTickContainerInLevel(serverlevel); - levelchunk.setUnsavedListener(p_342042_.unsavedListener()); -+ net.minecraftforge.event.ForgeEventFactory.onChunkLoad(levelchunk, !(protochunk instanceof ImposterProtoChunk)); -+ } finally { -+ generationchunkholder.currentlyLoading = null; // Forge - Stop bypassing the future chain. -+ } - return levelchunk; - }, p_342042_.mainThreadExecutor()); - } +@@ -199,9 +_,15 @@ + levelchunk.setFullStatus(generationchunkholder::getFullStatus); + levelchunk.runPostLoad(); + levelchunk.setLoaded(true); ++ try { ++ generationchunkholder.currentlyLoading = levelchunk; // Forge - bypass the future chain when getChunk is called, this prevents deadlocks. + levelchunk.registerAllBlockEntitiesAfterLevelLoad(); + levelchunk.registerTickContainerInLevel(serverlevel); + levelchunk.setUnsavedListener(p_342042_.unsavedListener()); ++ net.minecraftforge.event.ForgeEventFactory.onChunkLoad(levelchunk, !(protochunk instanceof ImposterProtoChunk)); ++ } finally { ++ generationchunkholder.currentlyLoading = null; // Forge - Stop bypassing the future chain. ++ } + return levelchunk; + }, + p_342042_.mainThreadExecutor() diff --git a/patches/minecraft/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch b/patches/minecraft/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch index 915c230d20..ee3e56961e 100644 --- a/patches/minecraft/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch +++ b/patches/minecraft/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch @@ -1,15 +1,16 @@ --- a/net/minecraft/world/level/chunk/storage/EntityStorage.java +++ b/net/minecraft/world/level/chunk/storage/EntityStorage.java -@@ -85,8 +_,12 @@ - ListTag listtag = new ListTag(); - p_156559_.getEntities().forEach(p_156567_ -> { - CompoundTag compoundtag1 = new CompoundTag(); -+ try { - if (p_156567_.save(compoundtag1)) { - listtag.add(compoundtag1); -+ } -+ } catch (Exception e) { -+ LOGGER.error("An Entity type {} has thrown an exception trying to write state. It will not persist. Report this to the mod author", p_156567_.getType(), e); - } - }); - CompoundTag compoundtag = NbtUtils.addCurrentDataVersion(new CompoundTag()); +@@ -108,9 +_,13 @@ + TagValueOutput tagvalueoutput = TagValueOutput.createWithContext( + problemreporter$scopedcollector.forChild(p_405760_.problemPath()), p_405760_.registryAccess() + ); ++ try { + if (p_405760_.save(tagvalueoutput)) { + CompoundTag compoundtag1 = tagvalueoutput.buildResult(); + listtag.add(compoundtag1); ++ } ++ } catch (Exception e) { ++ LOGGER.error("An Entity type {} has thrown an exception trying to write state. It will not persist. Report this to the mod author", p_405760_.getType(), e); + } + } + ); diff --git a/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch b/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch index 427a66b91d..dfc761c6c4 100644 --- a/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch +++ b/patches/minecraft/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java +++ b/net/minecraft/world/level/levelgen/structure/templatesystem/StructureTemplate.java -@@ -253,6 +_,10 @@ +@@ -261,6 +_,10 @@ return transform(p_74565_, p_74564_.getMirror(), p_74564_.getRotation(), p_74564_.getRotationPivot()); } @@ -11,25 +11,29 @@ public boolean placeInWorld( ServerLevelAccessor p_230329_, BlockPos p_230330_, BlockPos p_230331_, StructurePlaceSettings p_230332_, RandomSource p_230333_, int p_230334_ ) { -@@ -275,7 +_,7 @@ +@@ -282,7 +_,7 @@ + int l = Integer.MIN_VALUE; int i1 = Integer.MIN_VALUE; int j1 = Integer.MIN_VALUE; +- List list4 = processBlockInfos(p_230329_, p_230330_, p_230331_, p_230332_, list); ++ List list4 = processBlockInfos(p_230329_, p_230330_, p_230331_, p_230332_, list, this); -- for (StructureTemplate.StructureBlockInfo structuretemplate$structureblockinfo : processBlockInfos(p_230329_, p_230330_, p_230331_, p_230332_, list)) { -+ for (StructureTemplate.StructureBlockInfo structuretemplate$structureblockinfo : processBlockInfos(p_230329_, p_230330_, p_230331_, p_230332_, list, this)) { - BlockPos blockpos = structuretemplate$structureblockinfo.pos; - if (boundingbox == null || boundingbox.isInside(blockpos)) { - FluidState fluidstate = p_230332_.shouldApplyWaterlogging() ? p_230329_.getFluidState(blockpos) : null; -@@ -385,7 +_,7 @@ + try (ProblemReporter.ScopedCollector problemreporter$scopedcollector = new ProblemReporter.ScopedCollector(LOGGER)) { + for (StructureTemplate.StructureBlockInfo structuretemplate$structureblockinfo : list4) { +@@ -406,10 +_,10 @@ + p_230330_, + p_230332_.getMirror(), + p_230332_.getRotation(), +- p_230332_.getRotationPivot(), + boundingbox, + p_230332_.shouldFinalizeEntities(), +- problemreporter$scopedcollector ++ problemreporter$scopedcollector, ++ p_230332_ + ); + } } - - if (!p_230332_.isIgnoreEntities()) { -- this.placeEntities(p_230329_, p_230330_, p_230332_.getMirror(), p_230332_.getRotation(), p_230332_.getRotationPivot(), boundingbox, p_230332_.shouldFinalizeEntities()); -+ this.addEntitiesToWorld(p_230329_, p_230330_, p_230332_); - } - - return true; -@@ -425,12 +_,21 @@ +@@ -451,12 +_,21 @@ ); } @@ -52,7 +56,7 @@ ) { List list = new ArrayList<>(); List list1 = new ArrayList<>(); -@@ -446,7 +_,7 @@ +@@ -472,7 +_,7 @@ while (structuretemplate$structureblockinfo1 != null && iterator.hasNext()) { structuretemplate$structureblockinfo1 = iterator.next() @@ -61,23 +65,15 @@ } if (structuretemplate$structureblockinfo1 != null) { -@@ -462,21 +_,25 @@ - return list1; - } - -+ private void addEntitiesToWorld(ServerLevelAccessor p_74524_, BlockPos p_74525_, StructurePlaceSettings placementIn) { -+ placeEntities(p_74524_, p_74525_, placementIn.getMirror(), placementIn.getRotation(), placementIn.getBoundingBox(), placementIn.shouldFinalizeEntities(), placementIn); -+ } -+ - private void placeEntities( - ServerLevelAccessor p_74524_, +@@ -493,17 +_,17 @@ BlockPos p_74525_, Mirror p_74526_, Rotation p_74527_, - BlockPos p_74528_, @Nullable BoundingBox p_74529_, -- boolean p_74530_ -+ boolean p_74530_, + boolean p_74530_, +- ProblemReporter p_408312_ ++ ProblemReporter p_408312_, + StructurePlaceSettings placementIn ) { - for (StructureTemplate.StructureEntityInfo structuretemplate$structureentityinfo : this.entityInfoList) { @@ -93,7 +89,7 @@ ListTag listtag = new ListTag(); listtag.add(DoubleTag.valueOf(vec31.x)); listtag.add(DoubleTag.valueOf(vec31.y)); -@@ -496,6 +_,24 @@ +@@ -523,6 +_,24 @@ } } } @@ -116,5 +112,5 @@ + } + - private static Optional createEntityIgnoreException(ServerLevelAccessor p_74544_, CompoundTag p_74545_) { + private static Optional createEntityIgnoreException(ProblemReporter p_410558_, ServerLevelAccessor p_74544_, CompoundTag p_74545_) { try { diff --git a/patches/minecraft/net/minecraft/world/level/storage/PlayerDataStorage.java.patch b/patches/minecraft/net/minecraft/world/level/storage/PlayerDataStorage.java.patch index 1d7bdb317b..b2d9a5198d 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/PlayerDataStorage.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/PlayerDataStorage.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/PlayerDataStorage.java +++ b/net/minecraft/world/level/storage/PlayerDataStorage.java -@@ -39,6 +_,7 @@ +@@ -42,6 +_,7 @@ Path path2 = path.resolve(p_78434_.getStringUUID() + ".dat"); Path path3 = path.resolve(p_78434_.getStringUUID() + ".dat_old"); Util.safeReplaceFile(path2, path1, path3); @@ -8,7 +8,7 @@ } catch (Exception exception) { LOGGER.warn("Failed to save player data for {}", p_78434_.getName().getString()); } -@@ -61,7 +_,9 @@ +@@ -64,7 +_,9 @@ File file1 = new File(this.playerDir, p_329651_.getStringUUID() + p_330353_); if (file1.exists() && file1.isFile()) { try { @@ -19,9 +19,9 @@ } catch (Exception exception) { LOGGER.warn("Failed to load player data for {}", p_329651_.getName().getString()); } -@@ -82,5 +_,9 @@ - p_78436_.load(p_391129_); - return p_391129_; +@@ -86,5 +_,9 @@ + p_78436_.load(valueinput); + return valueinput; }); + } + diff --git a/patches/minecraft/net/minecraft/world/level/storage/loot/LootPool.java.patch b/patches/minecraft/net/minecraft/world/level/storage/loot/LootPool.java.patch index 05a7554a0c..9d73e9ffa0 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/loot/LootPool.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/loot/LootPool.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/LootPool.java +++ b/net/minecraft/world/level/storage/loot/LootPool.java -@@ -33,10 +_,13 @@ +@@ -34,10 +_,13 @@ LootItemCondition.DIRECT_CODEC.listOf().optionalFieldOf("conditions", List.of()).forGetter(p_297008_ -> p_297008_.conditions), LootItemFunctions.ROOT_CODEC.listOf().optionalFieldOf("functions", List.of()).forGetter(p_297009_ -> p_297009_.functions), NumberProviders.CODEC.fieldOf("rolls").forGetter(p_297004_ -> p_297004_.rolls), @@ -15,7 +15,7 @@ private final List entries; private final List conditions; private final Predicate compositeCondition; -@@ -44,13 +_,21 @@ +@@ -45,13 +_,21 @@ private final BiFunction compositeFunction; private NumberProvider rolls; private NumberProvider bonusRolls; @@ -38,7 +38,7 @@ ) { this.entries = p_298341_; this.conditions = p_297697_; -@@ -59,6 +_,8 @@ +@@ -60,6 +_,8 @@ this.compositeFunction = LootItemFunctions.compose(p_299722_); this.rolls = p_165131_; this.bonusRolls = p_165132_; @@ -47,7 +47,7 @@ } private void addRandomItem(Consumer p_79059_, LootContext p_79060_) { -@@ -126,12 +_,35 @@ +@@ -127,12 +_,35 @@ return new LootPool.Builder(); } @@ -83,7 +83,7 @@ public LootPool.Builder setRolls(NumberProvider p_165134_) { this.rolls = p_165134_; -@@ -162,8 +_,18 @@ +@@ -163,8 +_,18 @@ return this; } diff --git a/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch b/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch index 5ecda0590e..8646801a50 100644 --- a/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch +++ b/patches/minecraft/net/minecraft/world/level/storage/loot/LootTable.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/storage/loot/LootTable.java +++ b/net/minecraft/world/level/storage/loot/LootTable.java -@@ -40,7 +_,7 @@ +@@ -41,7 +_,7 @@ p_327557_ -> p_327557_.group( LootContextParamSets.CODEC.lenientOptionalFieldOf("type", DEFAULT_PARAM_SET).forGetter(p_297013_ -> p_297013_.paramSet), ResourceLocation.CODEC.optionalFieldOf("random_sequence").forGetter(p_297014_ -> p_297014_.randomSequence), @@ -9,7 +9,7 @@ LootItemFunctions.ROOT_CODEC.listOf().optionalFieldOf("functions", List.of()).forGetter(p_297010_ -> p_297010_.functions) ) .apply(p_327557_, LootTable::new) -@@ -57,7 +_,7 @@ +@@ -58,7 +_,7 @@ LootTable(ContextKeySet p_365565_, Optional p_298628_, List p_298771_, List p_301234_) { this.paramSet = p_365565_; this.randomSequence = p_298628_; @@ -18,7 +18,7 @@ this.functions = p_301234_; this.compositeFunction = LootItemFunctions.compose(p_301234_); } -@@ -80,10 +_,12 @@ +@@ -81,10 +_,12 @@ }; } @@ -31,7 +31,7 @@ public void getRandomItemsRaw(LootContext p_79132_, Consumer p_79133_) { LootContext.VisitedEntry visitedentry = LootContext.createVisitedEntry(this); if (p_79132_.pushVisitedElement(visitedentry)) { -@@ -100,15 +_,15 @@ +@@ -101,15 +_,15 @@ } public void getRandomItems(LootParams p_287748_, long p_287729_, Consumer p_287583_) { @@ -50,7 +50,7 @@ } public ObjectArrayList getRandomItems(LootParams p_345012_, RandomSource p_344559_) { -@@ -125,7 +_,8 @@ +@@ -126,7 +_,8 @@ private ObjectArrayList getRandomItems(LootContext p_230923_) { ObjectArrayList objectarraylist = new ObjectArrayList<>(); @@ -60,7 +60,7 @@ return objectarraylist; } -@@ -214,6 +_,68 @@ +@@ -215,6 +_,68 @@ public static LootTable.Builder lootTable() { return new LootTable.Builder(); diff --git a/settings.gradle b/settings.gradle index 0e8389b1e3..55cbdb5250 100644 --- a/settings.gradle +++ b/settings.gradle @@ -17,7 +17,7 @@ buildscript { } plugins { - id 'org.gradle.toolchains.foojay-resolver-convention' version '0.7.0' + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' } dependencyResolutionManagement { @@ -32,12 +32,13 @@ dependencyResolutionManagement { library('accesstransformers', 'net.minecraftforge:accesstransformers:8.2.2') library('coremods', 'net.minecraftforge:coremods:5.2.6') library('nashorn', 'org.openjdk.nashorn:nashorn-core:15.4') // Needed by coremods, because the JRE no longer ships JS - library('eventbus', 'net.minecraftforge:eventbus:6.2.27') - library('typetools', 'net.jodah:typetools:0.6.3') // Needed by EventBus because of lambdas + library('eventbus', 'net.minecraftforge:eventbus:7.0-beta.7') + library('eventbus-validator', 'net.minecraftforge:eventbus-validator:7.0-beta.7') library('mergetool-api', 'net.minecraftforge:mergetool-api:1.0') library('mixin', 'org.spongepowered:mixin:0.8.7') - library('nulls', 'org.jetbrains:annotations:24.1.0') // Got to have our null annotations! + library('jetbrains-annotations', 'org.jetbrains:annotations:24.1.0') // for ApiStatus annotations + library('jspecify', 'org.jspecify:jspecify:1.0.0') // for nullability annotations library('slf4j-api', 'org.slf4j:slf4j-api:2.0.7') library('maven-artifact', 'org.apache.maven:maven-artifact:3.8.8') diff --git a/src/main/generated/data/c/tags/block/flowers/tall.json b/src/main/generated/data/c/tags/block/flowers/tall.json index 1944a475be..156bf722ac 100644 --- a/src/main/generated/data/c/tags/block/flowers/tall.json +++ b/src/main/generated/data/c/tags/block/flowers/tall.json @@ -6,7 +6,7 @@ "minecraft:rose_bush", "minecraft:pitcher_plant", { - "id": "minecraft:tall_flowers", + "id": "#minecraft:tall_flowers", "required": false } ] diff --git a/src/main/generated/data/c/tags/item/flowers/tall.json b/src/main/generated/data/c/tags/item/flowers/tall.json index 1944a475be..156bf722ac 100644 --- a/src/main/generated/data/c/tags/item/flowers/tall.json +++ b/src/main/generated/data/c/tags/item/flowers/tall.json @@ -6,7 +6,7 @@ "minecraft:rose_bush", "minecraft:pitcher_plant", { - "id": "minecraft:tall_flowers", + "id": "#minecraft:tall_flowers", "required": false } ] diff --git a/src/main/generated/data/forge/tags/block/glass/silica.json b/src/main/generated/data/forge/tags/block/glass/silica.json index 74544c770d..3465b3884b 100644 --- a/src/main/generated/data/forge/tags/block/glass/silica.json +++ b/src/main/generated/data/forge/tags/block/glass/silica.json @@ -1,21 +1,21 @@ { "values": [ "minecraft:glass", - "minecraft:black_stained_glass", + "minecraft:white_stained_glass", + "minecraft:orange_stained_glass", + "minecraft:magenta_stained_glass", + "minecraft:light_blue_stained_glass", + "minecraft:yellow_stained_glass", + "minecraft:lime_stained_glass", + "minecraft:pink_stained_glass", + "minecraft:gray_stained_glass", + "minecraft:light_gray_stained_glass", + "minecraft:cyan_stained_glass", + "minecraft:purple_stained_glass", "minecraft:blue_stained_glass", "minecraft:brown_stained_glass", - "minecraft:cyan_stained_glass", - "minecraft:gray_stained_glass", "minecraft:green_stained_glass", - "minecraft:light_blue_stained_glass", - "minecraft:light_gray_stained_glass", - "minecraft:lime_stained_glass", - "minecraft:magenta_stained_glass", - "minecraft:orange_stained_glass", - "minecraft:pink_stained_glass", - "minecraft:purple_stained_glass", "minecraft:red_stained_glass", - "minecraft:white_stained_glass", - "minecraft:yellow_stained_glass" + "minecraft:black_stained_glass" ] } \ No newline at end of file diff --git a/src/main/generated/data/forge/tags/item/glass/silica.json b/src/main/generated/data/forge/tags/item/glass/silica.json index 74544c770d..3465b3884b 100644 --- a/src/main/generated/data/forge/tags/item/glass/silica.json +++ b/src/main/generated/data/forge/tags/item/glass/silica.json @@ -1,21 +1,21 @@ { "values": [ "minecraft:glass", - "minecraft:black_stained_glass", + "minecraft:white_stained_glass", + "minecraft:orange_stained_glass", + "minecraft:magenta_stained_glass", + "minecraft:light_blue_stained_glass", + "minecraft:yellow_stained_glass", + "minecraft:lime_stained_glass", + "minecraft:pink_stained_glass", + "minecraft:gray_stained_glass", + "minecraft:light_gray_stained_glass", + "minecraft:cyan_stained_glass", + "minecraft:purple_stained_glass", "minecraft:blue_stained_glass", "minecraft:brown_stained_glass", - "minecraft:cyan_stained_glass", - "minecraft:gray_stained_glass", "minecraft:green_stained_glass", - "minecraft:light_blue_stained_glass", - "minecraft:light_gray_stained_glass", - "minecraft:lime_stained_glass", - "minecraft:magenta_stained_glass", - "minecraft:orange_stained_glass", - "minecraft:pink_stained_glass", - "minecraft:purple_stained_glass", "minecraft:red_stained_glass", - "minecraft:white_stained_glass", - "minecraft:yellow_stained_glass" + "minecraft:black_stained_glass" ] } \ No newline at end of file diff --git a/src/main/generated/data/minecraft/recipe/lead.json b/src/main/generated/data/minecraft/recipe/lead.json index a48100d61a..7efd7cabc0 100644 --- a/src/main/generated/data/minecraft/recipe/lead.json +++ b/src/main/generated/data/minecraft/recipe/lead.json @@ -2,12 +2,11 @@ "type": "minecraft:crafting_shaped", "category": "equipment", "key": { - "O": "minecraft:slime_ball", "~": "#c:strings" }, "pattern": [ "~~ ", - "~O ", + "~~ ", " ~" ], "result": { diff --git a/src/main/generated/data/minecraft/recipe/saddle.json b/src/main/generated/data/minecraft/recipe/saddle.json new file mode 100644 index 0000000000..38171a6054 --- /dev/null +++ b/src/main/generated/data/minecraft/recipe/saddle.json @@ -0,0 +1,16 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "equipment", + "key": { + "#": "#c:ingots/iron", + "X": "minecraft:leather" + }, + "pattern": [ + " X ", + "X#X" + ], + "result": { + "count": 1, + "id": "minecraft:saddle" + } +} \ No newline at end of file diff --git a/src/main/generated/pack.mcmeta b/src/main/generated/pack.mcmeta index 0551aca70f..becb9004cb 100644 --- a/src/main/generated/pack.mcmeta +++ b/src/main/generated/pack.mcmeta @@ -3,6 +3,6 @@ "description": { "translate": "pack.forge.description" }, - "pack_format": 71 + "pack_format": 80 } } \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/client/ChunkRenderTypeSet.java b/src/main/java/net/minecraftforge/client/ChunkRenderTypeSet.java deleted file mode 100644 index c8359cdbe3..0000000000 --- a/src/main/java/net/minecraftforge/client/ChunkRenderTypeSet.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.minecraftforge.client; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import net.minecraft.Util; -import net.minecraft.client.renderer.RenderType; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.BitSet; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -/** - * An immutable ordered set (not implementing {@link java.util.Set}) of chunk {@linkplain RenderType render types}. - *

- * Considerably speeds up lookups and merges of sets of chunk {@linkplain RenderType render types}. - * Users should cache their instances of this class whenever possible, as instantiating it is cheap, but not free. - */ -public sealed class ChunkRenderTypeSet implements Iterable -{ - private static final List CHUNK_RENDER_TYPES_LIST = RenderType.chunkBufferLayers(); - private static final RenderType[] CHUNK_RENDER_TYPES = CHUNK_RENDER_TYPES_LIST.toArray(new RenderType[0]); - - private static final ChunkRenderTypeSet NONE = new None(); - private static final ChunkRenderTypeSet ALL = new All(); - - public static ChunkRenderTypeSet none() - { - return NONE; - } - - public static ChunkRenderTypeSet all() - { - return ALL; - } - - public static ChunkRenderTypeSet of(RenderType... renderTypes) - { - return of(Arrays.asList(renderTypes)); - } - - public static ChunkRenderTypeSet of(Collection renderTypes) - { - if (renderTypes.isEmpty()) - return none(); - return of((Iterable) renderTypes); - } - - private static ChunkRenderTypeSet of(Iterable renderTypes) - { - var bits = new BitSet(); - for (RenderType renderType : renderTypes) - { - int index = renderType.getChunkLayerId(); - Preconditions.checkArgument(index >= 0, "Attempted to create chunk render type set with a non-chunk render type: " + renderType); - bits.set(index); - } - return new ChunkRenderTypeSet(bits); - } - - public static ChunkRenderTypeSet union(ChunkRenderTypeSet... sets) - { - return union(Arrays.asList(sets)); - } - - public static ChunkRenderTypeSet union(Collection sets) - { - if (sets.isEmpty()) - return none(); - return union((Iterable) sets); - } - - public static ChunkRenderTypeSet union(Iterable sets) - { - var bits = new BitSet(); - for (var set : sets) - bits.or(set.bits); - return new ChunkRenderTypeSet(bits); - } - - public static ChunkRenderTypeSet intersection(ChunkRenderTypeSet... sets) - { - return intersection(Arrays.asList(sets)); - } - - public static ChunkRenderTypeSet intersection(Collection sets) - { - if (sets.isEmpty()) - return all(); - return intersection((Iterable) sets); - } - - public static ChunkRenderTypeSet intersection(Iterable sets) - { - var bits = new BitSet(); - bits.set(0, CHUNK_RENDER_TYPES.length); - for (var set : sets) - bits.and(set.bits); - return new ChunkRenderTypeSet(bits); - } - - private final BitSet bits; - - private ChunkRenderTypeSet(BitSet bits) - { - this.bits = bits; - } - - public boolean isEmpty() - { - return bits.isEmpty(); - } - - public boolean contains(RenderType renderType) - { - int id = renderType.getChunkLayerId(); - return id >= 0 && bits.get(id); - } - - @NotNull - @Override - public Iterator iterator() - { - return new IteratorImpl(); - } - - public List asList() - { - return ImmutableList.copyOf(this); - } - - private final class IteratorImpl implements Iterator - { - private int index = bits.nextSetBit(0); - - @Override - public boolean hasNext() - { - return index >= 0; - } - - @Override - public RenderType next() - { - var renderType = CHUNK_RENDER_TYPES[index]; - index = bits.nextSetBit(index + 1); - return renderType; - } - } - - private static final class None extends ChunkRenderTypeSet - { - private None() - { - super(new BitSet()); - } - - @Override - public boolean isEmpty() - { - return true; - } - - @Override - public boolean contains(RenderType renderType) - { - return false; - } - - @NotNull - @Override - public Iterator iterator() - { - return Collections.emptyIterator(); - } - - @Override - public List asList() - { - return List.of(); - } - } - - private static final class All extends ChunkRenderTypeSet - { - private All() - { - super(Util.make(new BitSet(), bits -> bits.set(0, CHUNK_RENDER_TYPES.length))); - } - - @Override - public boolean isEmpty(){ - return false; - } - - @Override - public boolean contains(RenderType renderType) - { - return renderType.getChunkLayerId() >= 0; // Could just return true for efficiency purposes, but checking is near-free - } - - @NotNull - @Override - public Iterator iterator() - { - return CHUNK_RENDER_TYPES_LIST.iterator(); - } - - @Override - public List asList() - { - return CHUNK_RENDER_TYPES_LIST; - } - } -} diff --git a/src/main/java/net/minecraftforge/client/ClientCommandHandler.java b/src/main/java/net/minecraftforge/client/ClientCommandHandler.java index 22b90090d8..c050557b77 100644 --- a/src/main/java/net/minecraftforge/client/ClientCommandHandler.java +++ b/src/main/java/net/minecraftforge/client/ClientCommandHandler.java @@ -16,6 +16,7 @@ import com.mojang.brigadier.tree.RootCommandNode; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.client.multiplayer.ClientSuggestionProvider; import net.minecraft.client.player.LocalPlayer; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSource; @@ -39,7 +40,7 @@ public class ClientCommandHandler { private static CommandDispatcher commands = null; public static void init() { - MinecraftForge.EVENT_BUS.addListener(ClientCommandHandler::handleClientPlayerLogin); + ClientPlayerNetworkEvent.LoggingIn.BUS.addListener(ClientCommandHandler::handleClientPlayerLogin); } private static void handleClientPlayerLogin(ClientPlayerNetworkEvent.LoggingIn event) { @@ -56,24 +57,24 @@ public class ClientCommandHandler { * with server commands in suggestions */ @ApiStatus.Internal - public static CommandDispatcher mergeServerCommands(CommandDispatcher serverCommands, CommandBuildContext buildContext) { + public static CommandDispatcher mergeServerCommands(CommandDispatcher serverCommands, CommandBuildContext buildContext) { CommandDispatcher commandsTemp = new CommandDispatcher<>(); - MinecraftForge.EVENT_BUS.post(new RegisterClientCommandsEvent(commandsTemp, buildContext)); + RegisterClientCommandsEvent.BUS.post(new RegisterClientCommandsEvent(commandsTemp, buildContext)); // Copies the client commands into another RootCommandNode so that redirects can't be used with server commands commands = new CommandDispatcher<>(); copy(commandsTemp.getRoot(), commands.getRoot()); // Copies the server commands into another RootCommandNode so that redirects can't be used with client commands - RootCommandNode serverCommandsRoot = serverCommands.getRoot(); - CommandDispatcher newServerCommands = new CommandDispatcher<>(); + RootCommandNode serverCommandsRoot = serverCommands.getRoot(); + CommandDispatcher newServerCommands = new CommandDispatcher<>(); copy(serverCommandsRoot, newServerCommands.getRoot()); // Copies the client side commands into the server side commands to be used for suggestions CommandHelper.mergeCommandNode(commands.getRoot(), newServerCommands.getRoot(), new IdentityHashMap<>(), getSource(), (context) -> 0, (suggestions) -> { @SuppressWarnings("unchecked") - var shared = (SuggestionProvider)(SuggestionProvider)suggestions; - var suggestionProvider = SuggestionProviders.safelySwap(shared); + var shared = (SuggestionProvider)(SuggestionProvider)suggestions; + var suggestionProvider = shared; //SuggestionProviders.safelySwap(shared); if (suggestionProvider == SuggestionProviders.ASK_SERVER) { suggestionProvider = (context, builder) -> { ClientCommandSourceStack source = getSource(); diff --git a/src/main/java/net/minecraftforge/client/ClientForgeMod.java b/src/main/java/net/minecraftforge/client/ClientForgeMod.java index 5d7d8a09f8..d5513d2233 100644 --- a/src/main/java/net/minecraftforge/client/ClientForgeMod.java +++ b/src/main/java/net/minecraftforge/client/ClientForgeMod.java @@ -5,7 +5,7 @@ package net.minecraftforge.client; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.resources.model.UnbakedGeometry; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ModelEvent; @@ -14,7 +14,7 @@ import net.minecraftforge.client.event.RegisterNamedRenderTypesEvent; import net.minecraftforge.client.model.DynamicFluidContainerModel; import net.minecraftforge.client.model.ItemLayerGeometry; import net.minecraftforge.client.model.obj.ObjLoader; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod.EventBusSubscriber(value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD, modid = "forge") @@ -34,6 +34,6 @@ public class ClientForgeMod { @SubscribeEvent public static void onRegisterNamedRenderTypes(RegisterNamedRenderTypesEvent event) { - event.register("item_unlit", RenderType.translucent(), ForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get()); + event.register("item_unlit", ChunkSectionLayer.TRANSLUCENT, ForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get()); } } diff --git a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java index a01eb48892..317523d375 100644 --- a/src/main/java/net/minecraftforge/client/ForgeHooksClient.java +++ b/src/main/java/net/minecraftforge/client/ForgeHooksClient.java @@ -18,6 +18,7 @@ import com.mojang.math.Transformation; import net.minecraft.FileUtil; import net.minecraft.client.Camera; +import net.minecraft.client.DeltaTracker; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; import net.minecraft.client.color.block.BlockColors; @@ -40,12 +41,12 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.client.particle.ParticleRenderType; import net.minecraft.client.player.ClientInput; -import net.minecraft.client.renderer.FogParameters; -import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.entity.state.HumanoidRenderState; +import net.minecraft.client.renderer.fog.FogData; import net.minecraft.client.renderer.texture.SpriteContents; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -126,7 +127,6 @@ import net.minecraftforge.client.textures.ForgeTextureMetadata; import net.minecraftforge.client.textures.TextureAtlasSpriteLoaderManager; import net.minecraftforge.common.ForgeI18n; import net.minecraftforge.common.ForgeMod; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.IExtensionPoint; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModLoader; @@ -144,6 +144,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; +import org.joml.Vector4f; import java.io.IOException; import java.util.ArrayList; @@ -196,7 +197,7 @@ public class ForgeHooksClient { guiLayers.push(minecraft.screen); minecraft.screen = Objects.requireNonNull(screen); screen.init(minecraft, minecraft.getWindow().getGuiScaledWidth(), minecraft.getWindow().getGuiScaledHeight()); - minecraft.getNarrator().sayNow(screen.getNarrationMessage()); + minecraft.getNarrator().saySystemNow(screen.getNarrationMessage()); } public static void popGuiLayer(Minecraft minecraft) { @@ -207,7 +208,7 @@ public class ForgeHooksClient { popGuiLayerInternal(minecraft); if (minecraft.screen != null) - minecraft.getNarrator().sayNow(minecraft.screen.getNarrationMessage()); + minecraft.getNarrator().saySystemNow(minecraft.screen.getNarrationMessage()); } public static float getGuiFarPlane() { @@ -218,11 +219,11 @@ public class ForgeHooksClient { } public static boolean onClientPauseChangePre(boolean pause) { - return MinecraftForge.EVENT_BUS.post(new ClientPauseChangeEvent.Pre(pause)); + return ClientPauseChangeEvent.Pre.BUS.post(new ClientPauseChangeEvent.Pre(pause)); } public static void onClientPauseChangePost(boolean pause) { - MinecraftForge.EVENT_BUS.post(new ClientPauseChangeEvent.Post(pause)); + ClientPauseChangeEvent.Post.BUS.post(new ClientPauseChangeEvent.Post(pause)); } /* @@ -236,17 +237,17 @@ public class ForgeHooksClient { switch (target.getType()) { case BLOCK: if (!(target instanceof BlockHitResult blockTarget)) return false; - return MinecraftForge.EVENT_BUS.post(new RenderHighlightEvent.Block(context, camera, blockTarget, partialTick, poseStack, bufferSource)); + return RenderHighlightEvent.Block.BUS.post(new RenderHighlightEvent.Block(context, camera, blockTarget, partialTick, poseStack, bufferSource)); case ENTITY: if (!(target instanceof EntityHitResult entityTarget)) return false; - return MinecraftForge.EVENT_BUS.post(new RenderHighlightEvent.Entity(context, camera, entityTarget, partialTick, poseStack, bufferSource)); + return RenderHighlightEvent.Entity.BUS.post(new RenderHighlightEvent.Entity(context, camera, entityTarget, partialTick, poseStack, bufferSource)); default: return false; // NO-OP - This doesn't even get called for anything other than blocks and entities } } public static boolean renderSpecificFirstPersonHand(InteractionHand hand, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, float partialTick, float interpPitch, float swingProgress, float equipProgress, ItemStack stack) { - return MinecraftForge.EVENT_BUS.post(new RenderHandEvent(hand, poseStack, bufferSource, packedLight, partialTick, interpPitch, swingProgress, equipProgress, stack)); + return RenderHandEvent.BUS.post(new RenderHandEvent(hand, poseStack, bufferSource, packedLight, partialTick, interpPitch, swingProgress, equipProgress, stack)); } public static void onTextureStitchedPost(TextureAtlas map) { @@ -294,24 +295,24 @@ public class ForgeHooksClient { @Nullable public static SoundInstance playSound(SoundEngine manager, SoundInstance sound) { - return MinecraftForge.EVENT_BUS.fire(new PlaySoundEvent(manager, sound)).getSound(); + return PlaySoundEvent.BUS.fire(new PlaySoundEvent(manager, sound)).getSound(); } public static void drawScreen(Screen screen, GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - guiGraphics.pose().pushPose(); + guiGraphics.pose().pushMatrix(); for (Screen layer : guiLayers) { // Prevent the background layers from thinking the mouse is over their controls and showing them as highlighted. drawScreenInternal(layer, guiGraphics, Integer.MAX_VALUE, Integer.MAX_VALUE, partialTick); - guiGraphics.pose().translate(0, 0, 10000); + //guiGraphics.pose().translate(0, 0, 10000); } drawScreenInternal(screen, guiGraphics, mouseX, mouseY, partialTick); - guiGraphics.pose().popPose(); + guiGraphics.pose().popMatrix(); } private static void drawScreenInternal(Screen screen, GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { - if (!MinecraftForge.EVENT_BUS.post(new ScreenEvent.Render.Pre(screen, guiGraphics, mouseX, mouseY, partialTick))) + if (!ScreenEvent.Render.Pre.BUS.post(new ScreenEvent.Render.Pre(screen, guiGraphics, mouseX, mouseY, partialTick))) screen.renderWithTooltip(guiGraphics, mouseX, mouseY, partialTick); - MinecraftForge.EVENT_BUS.post(new ScreenEvent.Render.Post(screen, guiGraphics, mouseX, mouseY, partialTick)); + ScreenEvent.Render.Post.BUS.post(new ScreenEvent.Render.Post(screen, guiGraphics, mouseX, mouseY, partialTick)); } public static Vector3f getFogColor(Camera camera, float partialTick, ClientLevel level, int renderDistance, float darkenWorldAmount, float fogRed, float fogGreen, float fogBlue) { @@ -321,29 +322,20 @@ public class ForgeHooksClient { if (camera.getPosition().y < (double)((float)camera.getBlockPosition().getY() + state.getHeight(level, camera.getBlockPosition()))) fluidFogColor = IClientFluidTypeExtensions.of(state).modifyFogColor(camera, partialTick, level, renderDistance, darkenWorldAmount, fluidFogColor); - ViewportEvent.ComputeFogColor event = new ViewportEvent.ComputeFogColor(camera, partialTick, fluidFogColor.x(), fluidFogColor.y(), fluidFogColor.z()); - MinecraftForge.EVENT_BUS.post(event); + var event = ViewportEvent.ComputeFogColor.BUS.fire(new ViewportEvent.ComputeFogColor(camera, partialTick, fluidFogColor.x(), fluidFogColor.y(), fluidFogColor.z())); fluidFogColor.set(event.getRed(), event.getGreen(), event.getBlue()); return fluidFogColor; } - public static FogParameters getFogParameters(FogRenderer.FogMode mode, FogType type, Camera camera, float partialTick, float renderDistance, FogParameters original) { - var ret = original; + public static Vector4f setupFog(FogType type, Camera camera, DeltaTracker delta, FogData data, Vector4f color) { // Modify fog rendering depending on the fluid FluidState state = camera.getEntity().level().getFluidState(camera.getBlockPosition()); if (camera.getPosition().y < (double)((float)camera.getBlockPosition().getY() + state.getHeight(camera.getEntity().level(), camera.getBlockPosition()))) - ret = IClientFluidTypeExtensions.of(state).modifyFogRender(camera, mode, renderDistance, partialTick, ret); + IClientFluidTypeExtensions.of(state).modifyFogRender(camera, type, delta.getRealtimeDeltaTicks(), data, color); - var event = new ViewportEvent.RenderFog(mode, type, camera, partialTick, ret.start(), ret.end(), ret.shape()); - if (MinecraftForge.EVENT_BUS.post(event)) { - return new FogParameters( - event.getNearPlaneDistance(), event.getFarPlaneDistance(), event.getFogShape(), - ret.red(), ret.green(), ret.blue(), ret.alpha() - ); - } - - return ret; + ViewportEvent.RenderFog.BUS.post(new ViewportEvent.RenderFog(type, camera, delta.getRealtimeDeltaTicks(), data, color)); + return color; } public static void onModifyBakingResult(ModelBakery modelBakery, ModelBakery.BakingResult results) { @@ -384,38 +376,37 @@ public class ForgeHooksClient { return from.getItem().shouldCauseReequipAnimation(from, to, changed); } - public static CustomizeGuiOverlayEvent.BossEventProgress onCustomizeBossEventProgress(GuiGraphics guiGraphics, Window window, LerpingBossEvent bossInfo, int x, int y, int increment) { + public static @Nullable CustomizeGuiOverlayEvent.BossEventProgress onCustomizeBossEventProgress(GuiGraphics guiGraphics, Window window, LerpingBossEvent bossInfo, int x, int y, int increment) { var evt = new CustomizeGuiOverlayEvent.BossEventProgress(window, guiGraphics, Minecraft.getInstance().getDeltaTracker().getGameTimeDeltaPartialTick(false), bossInfo, x, y, increment); - MinecraftForge.EVENT_BUS.post(evt); - return evt; + return CustomizeGuiOverlayEvent.BossEventProgress.BUS.post(evt) ? null : evt; } public static void onCustomizeChatEvent(GuiGraphics guiGraphics, ChatComponent chat, Window window, int mouseX, int mouseY, int tickCount) { var minecraft = Minecraft.getInstance(); var evt = new CustomizeGuiOverlayEvent.Chat(window, guiGraphics, minecraft.getDeltaTracker().getRealtimeDeltaTicks(), 0, chat.getHeight() - 40); - MinecraftForge.EVENT_BUS.post(evt); - guiGraphics.pose().pushPose(); + CustomizeGuiOverlayEvent.Chat.BUS.post(evt); + guiGraphics.pose().pushMatrix(); // We give the absolute Y position of the chat component in the event and account for the chat component's own offsetting here. - guiGraphics.pose().translate(evt.getPosX(), (evt.getPosY() - chat.getHeight() + 40) / chat.getScale(), 0.0D); + guiGraphics.pose().translate(evt.getPosX(), (float) ((evt.getPosY() - chat.getHeight() + 40) / chat.getScale())); chat.render(guiGraphics, tickCount, mouseX, mouseY, false); - guiGraphics.pose().popPose(); + guiGraphics.pose().popMatrix(); } public static void onCustomizeDebugEvent(GuiGraphics guiGraphics, Window window, float partialTick, List text, boolean isLeft) { var evt = new CustomizeGuiOverlayEvent.DebugText(window, guiGraphics, partialTick, text, isLeft ? CustomizeGuiOverlayEvent.DebugText.Side.Left : CustomizeGuiOverlayEvent.DebugText.Side.Right); - MinecraftForge.EVENT_BUS.post(evt); + CustomizeGuiOverlayEvent.DebugText.BUS.post(evt); } public static void onClientChangeGameType(PlayerInfo info, GameType currentGameMode, GameType newGameMode) { if (currentGameMode != newGameMode) { - MinecraftForge.EVENT_BUS.post(new ClientPlayerChangeGameTypeEvent(info, currentGameMode, newGameMode)); + ClientPlayerChangeGameTypeEvent.BUS.post(new ClientPlayerChangeGameTypeEvent(info, currentGameMode, newGameMode)); } } public static void onMovementInputUpdate(Player player, ClientInput movementInput) { - MinecraftForge.EVENT_BUS.post(new MovementInputUpdateEvent(player, movementInput)); + MovementInputUpdateEvent.BUS.post(new MovementInputUpdateEvent(player, movementInput)); } public static boolean onScreenKeyPressed(Screen screen, int keyCode, int scanCode, int modifiers) { @@ -437,7 +428,7 @@ public class ForgeHooksClient { } public static void onKeyInput(int key, int scanCode, int action, int modifiers) { - MinecraftForge.EVENT_BUS.post(new InputEvent.Key(key, scanCode, action, modifiers)); + InputEvent.Key.BUS.post(new InputEvent.Key(key, scanCode, action, modifiers)); } public static boolean isNameplateInRenderDistance(Entity entity, double squareDistance) { @@ -576,13 +567,13 @@ public class ForgeHooksClient { tooltip = ForgeI18n.parseMessage("fml.menu.multiplayer.unknown", target.forgeData.type()); } - guiGraphics.blit(RenderType::guiTextured, ICON_SHEET, x + width - 18, y + 10, 16, 16, 0, idx, 16, 16, 256, 256); + guiGraphics.blit(RenderPipelines.GUI_TEXTURED, ICON_SHEET, x + width - 18, y + 10, 16, 16, 0, idx, 16, 16, 256, 256); if(relativeMouseX > width - 15 && relativeMouseX < width && relativeMouseY > 10 && relativeMouseY < 26) { //this is not the most proper way to do it, //but works best here and has the least maintenance overhead var lines = Arrays.stream(tooltip.split("\n")).map(Component::literal).toList(); - gui.setTooltipForNextRenderPass(Lists.transform(lines, Component::getVisualOrderText)); + guiGraphics.setTooltipForNextFrame(Lists.transform(lines, Component::getVisualOrderText), relativeMouseX + x, relativeMouseY + y); } } @@ -608,26 +599,26 @@ public class ForgeHooksClient { @Nullable public static Component onClientChat(ChatType.Bound boundChatType, Component message, UUID sender) { ClientChatReceivedEvent event = new ClientChatReceivedEvent(boundChatType, message, sender); - return MinecraftForge.EVENT_BUS.post(event) ? null : event.getMessage(); + return ClientChatReceivedEvent.BUS.post(event) ? null : event.getMessage(); } @Nullable public static Component onClientPlayerChat(ChatType.Bound boundChatType, Component message, PlayerChatMessage playerChatMessage, UUID sender) { ClientChatReceivedEvent.Player event = new ClientChatReceivedEvent.Player(boundChatType, message, playerChatMessage, sender); - return MinecraftForge.EVENT_BUS.post(event) ? null : event.getMessage(); + return ClientChatReceivedEvent.Player.BUS.post(event) ? null : event.getMessage(); } @Nullable public static Component onClientSystemMessage(Component message, boolean overlay) { var event = new SystemMessageReceivedEvent(message, overlay); - return MinecraftForge.EVENT_BUS.post(event) ? null : event.getMessage(); + return SystemMessageReceivedEvent.BUS.post(event) ? null : event.getMessage(); } @NotNull public static String onClientSendMessage(String message) { ClientChatEvent event = new ClientChatEvent(message); - return MinecraftForge.EVENT_BUS.post(event) ? "" : event.getMessage(); + return ClientChatEvent.BUS.post(event) ? "" : event.getMessage(); } public static Font getTooltipFont(@NotNull ItemStack stack, Font fallbackFont) { @@ -635,10 +626,9 @@ public class ForgeHooksClient { return stackFont == null ? fallbackFont : stackFont; } - public static RenderTooltipEvent.Pre onRenderTooltipPre(@NotNull ItemStack stack, GuiGraphics graphics, int x, int y, int screenWidth, int screenHeight, @NotNull List components, @NotNull Font fallbackFont, @NotNull ClientTooltipPositioner positioner) { + public static @Nullable RenderTooltipEvent.Pre onRenderTooltipPre(@NotNull ItemStack stack, GuiGraphics graphics, int x, int y, int screenWidth, int screenHeight, @NotNull List components, @NotNull Font fallbackFont, @NotNull ClientTooltipPositioner positioner) { var preEvent = new RenderTooltipEvent.Pre(stack, graphics, x, y, screenWidth, screenHeight, getTooltipFont(stack, fallbackFont), components, positioner); - MinecraftForge.EVENT_BUS.post(preEvent); - return preEvent; + return RenderTooltipEvent.Pre.BUS.post(preEvent) ? null : preEvent; } public static List gatherTooltipComponents(ItemStack stack, List textElements, int mouseX, int screenWidth, int screenHeight, Font fallbackFont) { @@ -657,7 +647,7 @@ public class ForgeHooksClient { Font font = getTooltipFont(stack, fallbackFont); var event = new RenderTooltipEvent.GatherComponents(stack, screenWidth, screenHeight, elements, -1); - if (MinecraftForge.EVENT_BUS.post(event)) return List.of(); + if (RenderTooltipEvent.GatherComponents.BUS.post(event)) return List.of(); // text wrapping int tooltipTextWidth = event.getTooltipElements().stream() @@ -723,7 +713,7 @@ public class ForgeHooksClient { public static boolean isBlockInSolidLayer(BlockState state) { var model = Minecraft.getInstance().getBlockRenderer().getBlockModel(state); - return model.getRenderTypes(state, RandomSource.create(), ModelData.EMPTY).contains(RenderType.solid()); + return model.getRenderTypes(state, RandomSource.create(), ModelData.EMPTY).contains(ChunkSectionLayer.SOLID); } public static void createWorldConfirmationScreen(Runnable doConfirmedWorldLoad) { @@ -751,7 +741,7 @@ public class ForgeHooksClient { } public static boolean renderBlockOverlay(Player player, PoseStack mat, RenderBlockScreenEffectEvent.OverlayType type, BlockState block, BlockPos pos) { - return MinecraftForge.EVENT_BUS.post(new RenderBlockScreenEffectEvent(player, mat, type, block, pos)); + return RenderBlockScreenEffectEvent.BUS.post(new RenderBlockScreenEffectEvent(player, mat, type, block, pos)); } public static int getMaxMipmapLevel(int width, int height) { diff --git a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java index d3145c826f..cd4a85c793 100644 --- a/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java +++ b/src/main/java/net/minecraftforge/client/ForgeRenderTypes.java @@ -6,13 +6,15 @@ package net.minecraftforge.client; import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.DestFactor; import com.mojang.blaze3d.platform.SourceFactor; +import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.GpuTexture; +import com.mojang.blaze3d.textures.GpuTextureView; import com.mojang.blaze3d.textures.TextureFormat; import net.minecraft.Util; @@ -25,14 +27,11 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.TriState; import net.minecraftforge.common.util.NonNullLazy; import net.minecraftforge.common.util.NonNullSupplier; import net.minecraftforge.fml.earlydisplay.DisplayWindow; import java.util.function.Function; -import java.util.function.Supplier; - import org.jetbrains.annotations.ApiStatus; import org.lwjgl.opengl.GL30C; @@ -56,7 +55,7 @@ public enum ForgeRenderTypes { * @see ForgeRenderTypes#getTextSeeThrough * @see ForgeRenderTypes#getTextIntensitySeeThrough */ - public static TriState enableTextTextureLinearFiltering = TriState.FALSE; + public static boolean enableTextTextureLinearFiltering = false; @SuppressWarnings("deprecation") private static ResourceLocation blockAtlas() { @@ -230,7 +229,7 @@ public enum ForgeRenderTypes { false, RenderPipelines.ENTITY_TRANSLUCENT, CompositeState.builder() - .setTextureState(new TextureStateShard(textureLocation, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(textureLocation, false)) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true)); @@ -244,7 +243,7 @@ public enum ForgeRenderTypes { true, RenderPipelines.ENTITY_TRANSLUCENT, CompositeState.builder() - .setTextureState(new TextureStateShard(textureLocation, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(textureLocation, false)) .setLightmapState(NO_LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true)); @@ -258,7 +257,7 @@ public enum ForgeRenderTypes { false, RenderPipelines.ENTITY_TRANSLUCENT, CompositeState.builder() - .setTextureState(new TextureStateShard(textureLocation, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(textureLocation, false)) .setLightmapState(NO_LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true)); @@ -273,7 +272,7 @@ public enum ForgeRenderTypes { false, RenderPipelines.ENTITY_SOLID, CompositeState.builder() - .setTextureState(new TextureStateShard(locationIn, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(locationIn, false)) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true) @@ -289,7 +288,7 @@ public enum ForgeRenderTypes { false, RenderPipelines.ENTITY_CUTOUT, CompositeState.builder() - .setTextureState(new TextureStateShard(locationIn, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(locationIn, false)) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true) @@ -305,7 +304,7 @@ public enum ForgeRenderTypes { false, RenderPipelines.ENTITY_SMOOTH_CUTOUT, CompositeState.builder() - .setTextureState(new TextureStateShard(locationIn, TriState.FALSE, true)) + .setTextureState(new TextureStateShard(locationIn, true)) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true) @@ -321,7 +320,7 @@ public enum ForgeRenderTypes { true, RenderPipelines.ITEM_ENTITY_TRANSLUCENT_CULL, CompositeState.builder() - .setTextureState(new TextureStateShard(locationIn, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(locationIn, false)) .setLightmapState(LIGHTMAP) .setOverlayState(OVERLAY) .createCompositeState(true) @@ -367,7 +366,7 @@ public enum ForgeRenderTypes { true, RenderPipelines.TEXT_POLYGON_OFFSET, CompositeState.builder() - .setTextureState(new CustomizableTextureState(locationIn, () -> enableTextTextureLinearFiltering, () -> false)) + .setTextureState(new CustomizableTextureState(locationIn, false)) .setLightmapState(LIGHTMAP) .createCompositeState(false) ); @@ -438,7 +437,7 @@ public enum ForgeRenderTypes { true, RenderPipelines.TRANSLUCENT_PARTICLE, CompositeState.builder() - .setTextureState(new TextureStateShard(locationIn, TriState.FALSE, false)) + .setTextureState(new TextureStateShard(locationIn, false)) .setOutputState(PARTICLES_TARGET) .setLightmapState(LIGHTMAP) .createCompositeState(true) @@ -467,41 +466,35 @@ public enum ForgeRenderTypes { } private static class CustomizableTextureState extends TextureStateShard { - // [VEN] Here to make init shorter - private static final Supplier BLUR_STATE = () -> enableTextTextureLinearFiltering; - private static final Supplier MIP_ON_STATE = () -> true; - private static final Supplier MIP_OFF_STATE = () -> false; private CustomizableTextureState(ResourceLocation resLoc, boolean mipmap) { - this(resLoc, BLUR_STATE, mipmap ? MIP_ON_STATE : MIP_OFF_STATE); - } - - private CustomizableTextureState(ResourceLocation resLoc, Supplier blur, Supplier mipmap) { - super(resLoc, blur.get(), mipmap.get()); + super(resLoc, mipmap); this.setupState = () -> { - this.blur = blur.get(); - this.mipmap = mipmap.get(); TextureManager manager = Minecraft.getInstance().getTextureManager(); var texture = manager.getTexture(resLoc); - texture.setFilter(this.blur, this.mipmap); - RenderSystem.setShaderTexture(0, texture.getTexture()); + texture.setFilter(enableTextTextureLinearFiltering, this.mipmap); + RenderSystem.setShaderTexture(0, texture.getTextureView()); }; } } private static class LoadingOverlayTextureState extends TextureStateShard { private static final ResourceLocation LOADING_TEXTURE = ResourceLocation.fromNamespaceAndPath("forge", "loading_overlay"); - private final GlTexture texture; + private final GpuTexture texture; + private final GpuTextureView textureView; private LoadingOverlayTextureState(DisplayWindow window) { - super(LOADING_TEXTURE, TriState.DEFAULT, false); - this.texture = new GlTexture(LOADING_TEXTURE.toString(), TextureFormat.RGBA8, - window.context().width(), window.context().height(), 0, - window.getFramebufferTextureId()) {}; + super(LOADING_TEXTURE, false); + + GpuDevice gpu = RenderSystem.getDevice(); + this.texture = gpu.createTexture(LOADING_TEXTURE.toString(), 5, TextureFormat.RGBA8, + window.context().width(), window.context().height(), + 1, window.getFramebufferTextureId()); + this.textureView = gpu.createTextureView(this.texture); this.setupState = () -> { GL30C.glTexParameterIi(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_NEAREST); GL30C.glTexParameterIi(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_NEAREST); - RenderSystem.setShaderTexture(0, texture); + RenderSystem.setShaderTexture(0, this.textureView); }; } } diff --git a/src/main/java/net/minecraftforge/client/NamedRenderTypeManager.java b/src/main/java/net/minecraftforge/client/NamedRenderTypeManager.java index d67ccbc7e7..bf1b98e59d 100644 --- a/src/main/java/net/minecraftforge/client/NamedRenderTypeManager.java +++ b/src/main/java/net/minecraftforge/client/NamedRenderTypeManager.java @@ -7,6 +7,7 @@ package net.minecraftforge.client; import com.google.common.collect.ImmutableMap; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.event.RegisterNamedRenderTypesEvent; import net.minecraftforge.fml.ModLoader; @@ -43,13 +44,13 @@ public final class NamedRenderTypeManager { * Pre-registers vanilla render types. */ private static void preRegisterVanillaRenderTypes(Map blockRenderTypes) { - blockRenderTypes.put(rl("solid"), new RenderTypeGroup(RenderType.solid(), ForgeRenderTypes.ITEM_LAYERED_SOLID.get())); - blockRenderTypes.put(rl("cutout"), new RenderTypeGroup(RenderType.cutout(), ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get())); + blockRenderTypes.put(rl("solid"), new RenderTypeGroup(ChunkSectionLayer.SOLID, ForgeRenderTypes.ITEM_LAYERED_SOLID.get())); + blockRenderTypes.put(rl("cutout"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT, ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get())); // Generally entity/item rendering shouldn't use mipmaps, so cutout_mipped has them off by default. To enforce them, use cutout_mipped_all. - blockRenderTypes.put(rl("cutout_mipped"), new RenderTypeGroup(RenderType.cutoutMipped(), ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get())); - blockRenderTypes.put(rl("cutout_mipped_all"), new RenderTypeGroup(RenderType.cutoutMipped(), ForgeRenderTypes.ITEM_LAYERED_CUTOUT_MIPPED.get())); - blockRenderTypes.put(rl("translucent"), new RenderTypeGroup(RenderType.translucent(), ForgeRenderTypes.ITEM_LAYERED_TRANSLUCENT.get())); - blockRenderTypes.put(rl("tripwire"), new RenderTypeGroup(RenderType.tripwire(), ForgeRenderTypes.ITEM_LAYERED_TRANSLUCENT.get())); + blockRenderTypes.put(rl("cutout_mipped"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT_MIPPED, ForgeRenderTypes.ITEM_LAYERED_CUTOUT.get())); + blockRenderTypes.put(rl("cutout_mipped_all"), new RenderTypeGroup(ChunkSectionLayer.CUTOUT_MIPPED, ForgeRenderTypes.ITEM_LAYERED_CUTOUT_MIPPED.get())); + blockRenderTypes.put(rl("translucent_moving_block"), new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, ForgeRenderTypes.ITEM_LAYERED_TRANSLUCENT.get())); + blockRenderTypes.put(rl("tripwire"), new RenderTypeGroup(ChunkSectionLayer.TRIPWIRE, ForgeRenderTypes.ITEM_LAYERED_TRANSLUCENT.get())); } private static ResourceLocation rl(String paht) { diff --git a/src/main/java/net/minecraftforge/client/RenderTypeGroup.java b/src/main/java/net/minecraftforge/client/RenderTypeGroup.java index 2e5846bdd8..16f6009eff 100644 --- a/src/main/java/net/minecraftforge/client/RenderTypeGroup.java +++ b/src/main/java/net/minecraftforge/client/RenderTypeGroup.java @@ -6,6 +6,7 @@ package net.minecraftforge.client; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; /** * A set of functionally equivalent shaders. One using {@link com.mojang.blaze3d.vertex.DefaultVertexFormat#BLOCK}, @@ -13,7 +14,7 @@ import net.minecraft.client.renderer.RenderType; * {@code entityFabulous} may support custom render targets and other aspects of the fabulous pipeline, or can otherwise * be the same as {@code entity}. */ -public record RenderTypeGroup(RenderType block, RenderType entity, RenderType entityFabulous) { +public record RenderTypeGroup(ChunkSectionLayer block, RenderType entity, RenderType entityFabulous) { public static final RenderTypeGroup EMPTY = new RenderTypeGroup(null, null, null); public RenderTypeGroup { @@ -21,7 +22,7 @@ public record RenderTypeGroup(RenderType block, RenderType entity, RenderType en throw new IllegalArgumentException("The render types in a group must either be all null, or all non-null."); } - public RenderTypeGroup(RenderType block, RenderType entity) { + public RenderTypeGroup(ChunkSectionLayer block, RenderType entity) { this(block, entity, entity); } diff --git a/src/main/java/net/minecraftforge/client/RenderTypeHelper.java b/src/main/java/net/minecraftforge/client/RenderTypeHelper.java index 0f2ced165d..0f9ef4b2f6 100644 --- a/src/main/java/net/minecraftforge/client/RenderTypeHelper.java +++ b/src/main/java/net/minecraftforge/client/RenderTypeHelper.java @@ -10,6 +10,7 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.util.RandomSource; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; @@ -28,8 +29,8 @@ public final class RenderTypeHelper { * Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getRenderType(BlockState)}. */ @NotNull - public static RenderType getEntityRenderType(RenderType chunkRenderType) { - return chunkRenderType == RenderType.translucent() ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet(); + public static RenderType getEntityRenderType(ChunkSectionLayer layer) { + return layer == ChunkSectionLayer.TRANSLUCENT ? Sheets.translucentItemSheet() : Sheets.cutoutBlockSheet(); } /** @@ -39,10 +40,17 @@ public final class RenderTypeHelper { * Mimics the behavior of vanilla's {@link ItemBlockRenderTypes#getMovingBlockRenderType(BlockState)}. */ @NotNull - public static RenderType getMovingBlockRenderType(RenderType renderType) { - if (renderType == RenderType.translucent()) - return RenderType.translucentMovingBlock(); - return renderType; + public static RenderType getMovingBlockRenderType(ChunkSectionLayer layer) { + if (layer == null) + return RenderType.solid(); + + return switch (layer) { + case SOLID -> RenderType.solid(); + case CUTOUT_MIPPED -> RenderType.cutoutMipped(); + case CUTOUT -> RenderType.cutout(); + case TRANSLUCENT -> RenderType.translucentMovingBlock(); + case TRIPWIRE -> RenderType.tripwire(); + }; } /** @@ -55,8 +63,8 @@ public final class RenderTypeHelper { public static RenderType getFallbackItemRenderType(ItemStack stack, BlockStateModel model) { if (stack.getItem() instanceof BlockItem blockItem) { var renderTypes = model.getRenderTypes(blockItem.getBlock().defaultBlockState(), RandomSource.create(42), ModelData.EMPTY); - if (renderTypes.contains(RenderType.translucent())) - return getEntityRenderType(RenderType.translucent()); + if (renderTypes.contains(ChunkSectionLayer.TRANSLUCENT)) + return getEntityRenderType(ChunkSectionLayer.TRANSLUCENT); return Sheets.cutoutBlockSheet(); } return Sheets.translucentItemSheet(); diff --git a/src/main/java/net/minecraftforge/client/event/ClientChatEvent.java b/src/main/java/net/minecraftforge/client/event/ClientChatEvent.java index 6d293bf5ac..f50080d77a 100644 --- a/src/main/java/net/minecraftforge/client/event/ClientChatEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ClientChatEvent.java @@ -7,8 +7,9 @@ package net.minecraftforge.client.event; import com.google.common.base.Strings; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -21,15 +22,14 @@ import org.jetbrains.annotations.ApiStatus; *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

**/ -@Cancelable -public final class ClientChatEvent extends Event -{ +public final class ClientChatEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ClientChatEvent.class); + private String message; private final String originalMessage; @ApiStatus.Internal - public ClientChatEvent(String message) - { + public ClientChatEvent(String message) { this.setMessage(message); this.originalMessage = Strings.nullToEmpty(message); this.message = this.originalMessage; @@ -38,8 +38,7 @@ public final class ClientChatEvent extends Event /** * {@return the message that will be sent to the server, if the event is not cancelled. This can be changed by mods} */ - public String getMessage() - { + public String getMessage() { return this.message; } @@ -48,16 +47,14 @@ public final class ClientChatEvent extends Event * * @param message the new message to be sent */ - public void setMessage(String message) - { + public void setMessage(String message) { this.message = Strings.nullToEmpty(message); } /** * {@return the original message that was to be sent to the server. This cannot be changed by mods} */ - public String getOriginalMessage() - { + public String getOriginalMessage() { return this.originalMessage; } } diff --git a/src/main/java/net/minecraftforge/client/event/ClientChatReceivedEvent.java b/src/main/java/net/minecraftforge/client/event/ClientChatReceivedEvent.java index 545bd3c9f0..82202118ab 100644 --- a/src/main/java/net/minecraftforge/client/event/ClientChatReceivedEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ClientChatReceivedEvent.java @@ -10,8 +10,10 @@ import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.PlayerChatMessage; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import java.util.UUID; @@ -28,8 +30,9 @@ import java.util.UUID; * * @see ChatType */ -@Cancelable -public sealed class ClientChatReceivedEvent extends Event { +public sealed class ClientChatReceivedEvent extends MutableEvent implements Cancellable, InheritableEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(ClientChatReceivedEvent.class); + private Component message; private final ChatType.Bound boundChatType; private final UUID sender; @@ -75,7 +78,7 @@ public sealed class ClientChatReceivedEvent extends Event { /** * {@return {@code true} if the message was sent by the system, {@code false} otherwise} * - * @Deprecated Mojang made ChatType a registry, which isn't always accessible when the System messages are sent. + * @deprecated Mojang made ChatType a registry, which isn't always accessible when the System messages are sent. * So moved to it's own event. {@link SystemMessageReceivedEvent} */ @Deprecated(forRemoval = true, since = "1.21.1") @@ -95,6 +98,8 @@ public sealed class ClientChatReceivedEvent extends Event { * @see ChatType */ public static final class Player extends ClientChatReceivedEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(Player.class); + private final PlayerChatMessage playerChatMessage; @ApiStatus.Internal @@ -120,6 +125,8 @@ public sealed class ClientChatReceivedEvent extends Event { */ @Deprecated(forRemoval = true, since = "1.21.1") public static final class System extends ClientChatReceivedEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(System.class); + private final boolean overlay; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java b/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java index 15e716be02..bad108bf01 100644 --- a/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ClientPauseChangeEvent.java @@ -6,10 +6,13 @@ package net.minecraftforge.client.event; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; import net.minecraft.client.Minecraft; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; /** @@ -21,7 +24,9 @@ import net.minecraftforge.fml.LogicalSide; * @see ClientPauseChangeEvent.Pre * @see ClientPauseChangeEvent.Post */ -public abstract sealed class ClientPauseChangeEvent extends Event { +public abstract sealed class ClientPauseChangeEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(ClientPauseChangeEvent.class); + private final boolean pause; public ClientPauseChangeEvent(boolean pause) { @@ -37,8 +42,8 @@ public abstract sealed class ClientPauseChangeEvent extends Event { *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ - @Cancelable - public static final class Pre extends ClientPauseChangeEvent { + public static final class Pre extends ClientPauseChangeEvent implements Cancellable { + public static final CancellableEventBus
 BUS = CancellableEventBus.create(Pre.class);
 
         public Pre(boolean pause) {
             super(pause);
@@ -54,6 +59,7 @@ public abstract sealed class ClientPauseChangeEvent extends Event {
      * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class Post extends ClientPauseChangeEvent { + public static final EventBus BUS = EventBus.create(Post.class); public Post(boolean pause) { super(pause); diff --git a/src/main/java/net/minecraftforge/client/event/ClientPlayerChangeGameTypeEvent.java b/src/main/java/net/minecraftforge/client/event/ClientPlayerChangeGameTypeEvent.java index 8eed984bac..2371d1b16a 100644 --- a/src/main/java/net/minecraftforge/client/event/ClientPlayerChangeGameTypeEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ClientPlayerChangeGameTypeEvent.java @@ -7,55 +7,29 @@ package net.minecraftforge.client.event; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.world.level.GameType; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; /** * Fired when the client player is notified of a change of {@link GameType} from the server. * - *

This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

+ *

This event is not {@linkplain Cancellable cancellable}, and does not {@linkplain HasResult have a result}.

* - *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ *

This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

+ * + * @param getInfo the client player information + * @param getCurrentGameType the current game type of the player + * @param getNewGameType the new game type of the player */ -public final class ClientPlayerChangeGameTypeEvent extends Event -{ - private final PlayerInfo info; - private final GameType currentGameType; - private final GameType newGameType; +@NullMarked +public record ClientPlayerChangeGameTypeEvent(PlayerInfo getInfo, GameType getCurrentGameType, GameType getNewGameType) implements RecordEvent { + public static final EventBus BUS = EventBus.create(ClientPlayerChangeGameTypeEvent.class); @ApiStatus.Internal - public ClientPlayerChangeGameTypeEvent(PlayerInfo info, GameType currentGameType, GameType newGameType) - { - this.info = info; - this.currentGameType = currentGameType; - this.newGameType = newGameType; - } - - /** - * {@return the client player information} - */ - public PlayerInfo getInfo() - { - return info; - } - - /** - * {@return the current game type of the player} - */ - public GameType getCurrentGameType() - { - return currentGameType; - } - - /** - * {@return the new game type of the player} - */ - public GameType getNewGameType() - { - return newGameType; - } + public ClientPlayerChangeGameTypeEvent {} } diff --git a/src/main/java/net/minecraftforge/client/event/ClientPlayerNetworkEvent.java b/src/main/java/net/minecraftforge/client/event/ClientPlayerNetworkEvent.java index 326520d6c2..2b2857d5ad 100644 --- a/src/main/java/net/minecraftforge/client/event/ClientPlayerNetworkEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ClientPlayerNetworkEvent.java @@ -9,8 +9,9 @@ import net.minecraft.client.multiplayer.MultiPlayerGameMode; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.Connection; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -26,7 +27,9 @@ import org.jetbrains.annotations.Nullable; * @see LoggingOut * @see Clone **/ -public abstract sealed class ClientPlayerNetworkEvent extends Event { +public abstract sealed class ClientPlayerNetworkEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(ClientPlayerNetworkEvent.class); + private final MultiPlayerGameMode multiPlayerGameMode; private final LocalPlayer player; private final Connection connection; @@ -68,6 +71,8 @@ public abstract sealed class ClientPlayerNetworkEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class LoggingIn extends ClientPlayerNetworkEvent { + public static final EventBus BUS = EventBus.create(LoggingIn.class); + @ApiStatus.Internal public LoggingIn(final MultiPlayerGameMode controller, final LocalPlayer player, final Connection networkManager) { super(controller, player, networkManager); @@ -85,6 +90,8 @@ public abstract sealed class ClientPlayerNetworkEvent extends Event { @SuppressWarnings("NullableProblems") // Shush IntelliJ, we override non-nullables as nullables in this specific event; see later comment public static final class LoggingOut extends ClientPlayerNetworkEvent { + public static final EventBus BUS = EventBus.create(LoggingOut.class); + @ApiStatus.Internal public LoggingOut(@Nullable final MultiPlayerGameMode controller, @Nullable final LocalPlayer player, @Nullable final Connection networkManager) { //noinspection ConstantConditions we know these are nullable, but we don't want to annotate the super as nullable since this is the only event with nullables @@ -134,6 +141,8 @@ public abstract sealed class ClientPlayerNetworkEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class Clone extends ClientPlayerNetworkEvent { + public static final EventBus BUS = EventBus.create(Clone.class); + private final LocalPlayer oldPlayer; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/ComputeFovModifierEvent.java b/src/main/java/net/minecraftforge/client/event/ComputeFovModifierEvent.java index 7fd83d12eb..3311e5b973 100644 --- a/src/main/java/net/minecraftforge/client/event/ComputeFovModifierEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ComputeFovModifierEvent.java @@ -5,12 +5,11 @@ package net.minecraftforge.client.event; -import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -24,7 +23,9 @@ import org.jetbrains.annotations.ApiStatus; * * @see ViewportEvent.ComputeFov */ -public final class ComputeFovModifierEvent extends Event { +public final class ComputeFovModifierEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(ComputeFovModifierEvent.class); + private final Player player; private final float fovModifier; private final float scale; diff --git a/src/main/java/net/minecraftforge/client/event/ContainerScreenEvent.java b/src/main/java/net/minecraftforge/client/event/ContainerScreenEvent.java index 50c780f846..32518c2219 100644 --- a/src/main/java/net/minecraftforge/client/event/ContainerScreenEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ContainerScreenEvent.java @@ -8,8 +8,9 @@ package net.minecraftforge.client.event; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -23,7 +24,9 @@ import org.jetbrains.annotations.ApiStatus; * @see Render.Foreground * @see Render.Background */ -public abstract sealed class ContainerScreenEvent extends Event { +public abstract sealed class ContainerScreenEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(ContainerScreenEvent.class); + private final AbstractContainerScreen containerScreen; @ApiStatus.Internal @@ -49,6 +52,8 @@ public abstract sealed class ContainerScreenEvent extends Event { * @see Background */ public static abstract sealed class Render extends ContainerScreenEvent { + public static final EventBus BUS = EventBus.create(Render.class); + private final GuiGraphics guiGraphics; private final int mouseX; private final int mouseY; @@ -95,6 +100,8 @@ public abstract sealed class ContainerScreenEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class Foreground extends Render { + public static final EventBus BUS = EventBus.create(Foreground.class); + @ApiStatus.Internal public Foreground(AbstractContainerScreen guiContainer, GuiGraphics guiGraphics, int mouseX, int mouseY) { super(guiContainer, guiGraphics, mouseX, mouseY); @@ -111,6 +118,8 @@ public abstract sealed class ContainerScreenEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class Background extends Render { + public static final EventBus BUS = EventBus.create(Background.class); + @ApiStatus.Internal public Background(AbstractContainerScreen guiContainer, GuiGraphics guiGraphics, int mouseX, int mouseY) { super(guiContainer, guiGraphics, mouseX, mouseY); diff --git a/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java b/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java index fd4bce9605..1a7d32df25 100644 --- a/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java +++ b/src/main/java/net/minecraftforge/client/event/CreateSpecialBlockRendererEvent.java @@ -9,9 +9,12 @@ import java.util.Map; import net.minecraft.client.renderer.special.SpecialModelRenderer; import net.minecraft.world.level.block.Block; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; + +public final class CreateSpecialBlockRendererEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(CreateSpecialBlockRendererEvent.class); -public final class CreateSpecialBlockRendererEvent extends Event { private final Map map; public CreateSpecialBlockRendererEvent(Map map) { diff --git a/src/main/java/net/minecraftforge/client/event/CustomizeGuiOverlayEvent.java b/src/main/java/net/minecraftforge/client/event/CustomizeGuiOverlayEvent.java index 6c28980be0..e04d93ecda 100644 --- a/src/main/java/net/minecraftforge/client/event/CustomizeGuiOverlayEvent.java +++ b/src/main/java/net/minecraftforge/client/event/CustomizeGuiOverlayEvent.java @@ -9,8 +9,10 @@ import com.mojang.blaze3d.platform.Window; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.LerpingBossEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -23,7 +25,9 @@ import java.util.List; * @see DebugText * @see Chat */ -public abstract sealed class CustomizeGuiOverlayEvent extends Event { +public abstract sealed class CustomizeGuiOverlayEvent extends MutableEvent implements Cancellable, InheritableEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(CustomizeGuiOverlayEvent.class); + private final Window window; private final GuiGraphics guiGraphics; private final float partialTick; @@ -56,8 +60,9 @@ public abstract sealed class CustomizeGuiOverlayEvent extends Event { *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ - @Cancelable public static final class BossEventProgress extends CustomizeGuiOverlayEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(BossEventProgress.class); + private final LerpingBossEvent bossEvent; private final int x; private final int y; @@ -120,6 +125,8 @@ public abstract sealed class CustomizeGuiOverlayEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class DebugText extends CustomizeGuiOverlayEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(DebugText.class); + private final List text; private final Side side; @@ -160,6 +167,8 @@ public abstract sealed class CustomizeGuiOverlayEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class Chat extends CustomizeGuiOverlayEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(Chat.class); + private int posX; private int posY; diff --git a/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java b/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java index 2ab9e555f6..971a0e5eb1 100644 --- a/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java @@ -29,8 +29,8 @@ import net.minecraft.world.level.block.SkullBlock.Type; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.client.ForgeHooksClient; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -53,7 +53,7 @@ import java.util.function.Supplier; * @see EntityRenderersEvent.RegisterRenderers * @see EntityRenderersEvent.AddLayers */ -public abstract sealed class EntityRenderersEvent extends Event implements IModBusEvent { +public abstract sealed class EntityRenderersEvent implements IModBusEvent { @ApiStatus.Internal protected EntityRenderersEvent() {} @@ -66,6 +66,10 @@ public abstract sealed class EntityRenderersEvent extends Event implements IModB * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class RegisterLayerDefinitions extends EntityRenderersEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterLayerDefinitions.class); + } + @ApiStatus.Internal public RegisterLayerDefinitions() {} @@ -94,6 +98,10 @@ public abstract sealed class EntityRenderersEvent extends Event implements IModB * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class RegisterRenderers extends EntityRenderersEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterRenderers.class); + } + @ApiStatus.Internal public RegisterRenderers() {} @@ -128,6 +136,10 @@ public abstract sealed class EntityRenderersEvent extends Event implements IModB * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class AddLayers extends EntityRenderersEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, AddLayers.class); + } + private final Map, EntityRenderer> renderers; private final Map> skinMap; private final EntityRendererProvider.Context context; @@ -202,6 +214,10 @@ public abstract sealed class EntityRenderersEvent extends Event implements IModB * only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class CreateSkullModels extends EntityRenderersEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, CreateSkullModels.class); + } + private final ImmutableMap.Builder> builder; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java b/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java index 8bdd26e18a..70307eae6e 100644 --- a/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java +++ b/src/main/java/net/minecraftforge/client/event/ForgeEventFactoryClient.java @@ -11,8 +11,8 @@ import java.util.Map; import java.util.function.Function; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.Result; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.event.IModBusEvent; import org.jetbrains.annotations.ApiStatus; @@ -67,7 +67,6 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.SkullBlock.Type; import net.minecraftforge.client.event.sound.PlaySoundSourceEvent; import net.minecraftforge.client.event.sound.PlayStreamingSourceEvent; -import net.minecraftforge.eventbus.api.Event; @ApiStatus.Internal public final class ForgeEventFactoryClient { @@ -75,28 +74,11 @@ public final class ForgeEventFactoryClient { private ForgeEventFactoryClient() {} - /** - * Post an event to the {@link MinecraftForge#EVENT_BUS} - * @return true if the event is {@link Cancelable} and has been canceled - */ - private static boolean post(Event e) { - return MinecraftForge.EVENT_BUS.post(e); - } - - /** - * Post an event to the {@link MinecraftForge#EVENT_BUS}, then return the event object - * @return the event object passed in and possibly modified by listeners - */ - private static E fire(E e) { - return MinecraftForge.EVENT_BUS.fire(e); - } - /** * Post an event to the {@link ModLoader#get()} event bus */ - private static T fireModBus(T e) { - ML.postEvent(e); - return e; + private static T fireModBus(T e) { + return ML.postEventWithReturn(e); } public static void onGatherLayers(Map, EntityRenderer> renderers, Map> playerRenderers, Context context) { @@ -105,192 +87,190 @@ public final class ForgeEventFactoryClient { } public static boolean onScreenMouseReleased(Screen screen, double mouseX, double mouseY, int button) { - if (post(new ScreenEvent.MouseButtonReleased.Pre(screen, mouseX, mouseY, button))) + if (ScreenEvent.MouseButtonReleased.Pre.BUS.post(new ScreenEvent.MouseButtonReleased.Pre(screen, mouseX, mouseY, button))) return true; var ret = screen.mouseReleased(mouseX, mouseY, button); - var result = fire(new ScreenEvent.MouseButtonReleased.Post(screen, mouseX, mouseY, button, ret)).getResult(); - return result == Event.Result.DEFAULT ? ret : result == Event.Result.ALLOW; + var result = ScreenEvent.MouseButtonReleased.Post.BUS.fire(new ScreenEvent.MouseButtonReleased.Post(screen, mouseX, mouseY, button, ret)).getResult(); + return result == Result.DEFAULT ? ret : result == Result.ALLOW; } public static boolean onScreenMouseClicked(Screen screen, double mouseX, double mouseY, int button) { - var ret = post(new ScreenEvent.MouseButtonPressed.Pre(screen, mouseX, mouseY, button)); + var ret = ScreenEvent.MouseButtonPressed.Pre.BUS.post(new ScreenEvent.MouseButtonPressed.Pre(screen, mouseX, mouseY, button)); if (!ret) ret = screen.mouseClicked(mouseX, mouseY, button); - var result = fire(new ScreenEvent.MouseButtonPressed.Post(screen, mouseX, mouseY, button, ret)).getResult(); - return result == Event.Result.DEFAULT ? ret : result == Event.Result.ALLOW; + var result = ScreenEvent.MouseButtonPressed.Post.BUS.fire(new ScreenEvent.MouseButtonPressed.Post(screen, mouseX, mouseY, button, ret)).getResult(); + return result == Result.DEFAULT ? ret : result == Result.ALLOW; } public static boolean onMouseButtonPre(int button, int action, int mods) { - return post(new InputEvent.MouseButton.Pre(button, action, mods)); + return InputEvent.MouseButton.Pre.BUS.post(new InputEvent.MouseButton.Pre(button, action, mods)); } public static void onMouseButtonPost(int button, int action, int mods) { - post(new InputEvent.MouseButton.Post(button, action, mods)); + InputEvent.MouseButton.Post.BUS.post(new InputEvent.MouseButton.Post(button, action, mods)); } public static boolean onScreenMouseScrollPre(Screen guiScreen, double mouseX, double mouseY, double deltaX, double deltaY) { - return post(new ScreenEvent.MouseScrolled.Pre(guiScreen, mouseX, mouseY, deltaX, deltaY)); + return ScreenEvent.MouseScrolled.Pre.BUS.post(new ScreenEvent.MouseScrolled.Pre(guiScreen, mouseX, mouseY, deltaX, deltaY)); } public static void onScreenMouseScrollPost(Screen guiScreen, double mouseX, double mouseY, double deltaX, double deltaY) { - post(new ScreenEvent.MouseScrolled.Post(guiScreen, mouseX, mouseY, deltaX, deltaY)); + ScreenEvent.MouseScrolled.Post.BUS.post(new ScreenEvent.MouseScrolled.Post(guiScreen, mouseX, mouseY, deltaX, deltaY)); } public static boolean onMouseScroll(MouseHandler mouseHelper, double deltaX, double deltaY) { - return post(new InputEvent.MouseScrollingEvent(deltaX, deltaY, mouseHelper.isLeftPressed(), mouseHelper.isMiddlePressed(), mouseHelper.isRightPressed(), mouseHelper.xpos(), mouseHelper.ypos())); + return InputEvent.MouseScrollingEvent.BUS.post(new InputEvent.MouseScrollingEvent(deltaX, deltaY, mouseHelper.isLeftPressed(), mouseHelper.isMiddlePressed(), mouseHelper.isRightPressed(), mouseHelper.xpos(), mouseHelper.ypos())); } public static boolean onScreenMouseDragPre(Screen guiScreen, double mouseX, double mouseY, int mouseButton, double dragX, double dragY) { - return post(new ScreenEvent.MouseDragged.Pre(guiScreen, mouseX, mouseY, mouseButton, dragX, dragY)); + return ScreenEvent.MouseDragged.Pre.BUS.post(new ScreenEvent.MouseDragged.Pre(guiScreen, mouseX, mouseY, mouseButton, dragX, dragY)); } public static boolean onScreenMouseDragPost(Screen guiScreen, double mouseX, double mouseY, int mouseButton, double dragX, double dragY) { - return post(new ScreenEvent.MouseDragged.Post(guiScreen, mouseX, mouseY, mouseButton, dragX, dragY)); + return ScreenEvent.MouseDragged.Post.BUS.post(new ScreenEvent.MouseDragged.Post(guiScreen, mouseX, mouseY, mouseButton, dragX, dragY)); } public static @Nullable Screen onScreenOpening(Screen old, Screen screen) { var event = new ScreenEvent.Opening(old, screen); - if (post(event)) + if (ScreenEvent.Opening.BUS.post(event)) return null; return event.getNewScreen(); } public static void onScreenClose(Screen screen) { - post(new ScreenEvent.Closing(screen)); + ScreenEvent.Closing.BUS.post(new ScreenEvent.Closing(screen)); } public static void onPlaySoundSource(SoundEngine engine, SoundInstance sound, Channel channel) { - post(new PlaySoundSourceEvent(engine, sound, channel)); + PlaySoundSourceEvent.BUS.post(new PlaySoundSourceEvent(engine, sound, channel)); } public static void onPlayStreamingSource(SoundEngine engine, SoundInstance sound, Channel channel) { - post(new PlayStreamingSourceEvent(engine, sound, channel)); - } - - public static ScreenshotEvent onScreenshot(NativeImage image, File screenshotFile) { - return fire(new ScreenshotEvent(image, screenshotFile)); + PlayStreamingSourceEvent.BUS.post(new PlayStreamingSourceEvent(engine, sound, channel)); } public static boolean onScreenKeyPressedPre(Screen screen, int keyCode, int scanCode, int modifiers) { - return post(new ScreenEvent.KeyPressed.Pre(screen, keyCode, scanCode, modifiers)); + return ScreenEvent.KeyPressed.Pre.BUS.post(new ScreenEvent.KeyPressed.Pre(screen, keyCode, scanCode, modifiers)); } public static boolean onScreenKeyPressedPost(Screen screen, int keyCode, int scanCode, int modifiers) { - return post(new ScreenEvent.KeyPressed.Post(screen, keyCode, scanCode, modifiers)); + return ScreenEvent.KeyPressed.Post.BUS.post(new ScreenEvent.KeyPressed.Post(screen, keyCode, scanCode, modifiers)); } public static boolean onScreenKeyReleasedPre(Screen screen, int keyCode, int scanCode, int modifiers) { - return post(new ScreenEvent.KeyReleased.Pre(screen, keyCode, scanCode, modifiers)); + return ScreenEvent.KeyReleased.Pre.BUS.post(new ScreenEvent.KeyReleased.Pre(screen, keyCode, scanCode, modifiers)); } public static boolean onScreenKeyReleasedPost(Screen screen, int keyCode, int scanCode, int modifiers) { - return post(new ScreenEvent.KeyReleased.Post(screen, keyCode, scanCode, modifiers)); + return ScreenEvent.KeyReleased.Post.BUS.post(new ScreenEvent.KeyReleased.Post(screen, keyCode, scanCode, modifiers)); } public static boolean onScreenCharTypedPre(Screen screen, char codePoint, int modifiers) { - return post(new ScreenEvent.CharacterTyped.Pre(screen, codePoint, modifiers)); + return ScreenEvent.CharacterTyped.Pre.BUS.post(new ScreenEvent.CharacterTyped.Pre(screen, codePoint, modifiers)); } public static boolean onScreenCharTypedPost(Screen screen, char codePoint, int modifiers) { - return post(new ScreenEvent.CharacterTyped.Post(screen, codePoint, modifiers)); + return ScreenEvent.CharacterTyped.Post.BUS.post(new ScreenEvent.CharacterTyped.Post(screen, codePoint, modifiers)); } - public static InputEvent.InteractionKeyMappingTriggered onClickInput(int button, KeyMapping keyBinding, InteractionHand hand) { - return fire(new InputEvent.InteractionKeyMappingTriggered(button, keyBinding, hand)); + public static boolean onClickInputPickBlock(KeyMapping keyBinding) { + var event = new InputEvent.InteractionKeyMappingTriggered(2, keyBinding, InteractionHand.MAIN_HAND); + return InputEvent.InteractionKeyMappingTriggered.BUS.post(event); } public static void onContainerRenderBackground(AbstractContainerScreen screen, GuiGraphics graphics, int mouseX, int mouseY) { - post(new ContainerScreenEvent.Render.Background(screen, graphics, mouseX, mouseY)); + ContainerScreenEvent.Render.Background.BUS.post(new ContainerScreenEvent.Render.Background(screen, graphics, mouseX, mouseY)); } public static void onContainerRenderForeground(AbstractContainerScreen screen, GuiGraphics graphics, int mouseX, int mouseY) { - post(new ContainerScreenEvent.Render.Foreground(screen, graphics, mouseX, mouseY)); + ContainerScreenEvent.Render.Foreground.BUS.post(new ContainerScreenEvent.Render.Foreground(screen, graphics, mouseX, mouseY)); } public static void firePlayerLogin(MultiPlayerGameMode pc, LocalPlayer player, Connection networkManager) { - post(new ClientPlayerNetworkEvent.LoggingIn(pc, player, networkManager)); + ClientPlayerNetworkEvent.LoggingIn.BUS.post(new ClientPlayerNetworkEvent.LoggingIn(pc, player, networkManager)); } public static void firePlayerLogout(@Nullable MultiPlayerGameMode pc, @Nullable LocalPlayer player) { - post(new ClientPlayerNetworkEvent.LoggingOut(pc, player, player != null ? player.connection != null ? player.connection.getConnection() : null : null)); + ClientPlayerNetworkEvent.LoggingOut.BUS.post(new ClientPlayerNetworkEvent.LoggingOut(pc, player, player != null ? player.connection != null ? player.connection.getConnection() : null : null)); } public static void firePlayerRespawn(MultiPlayerGameMode pc, LocalPlayer oldPlayer, LocalPlayer newPlayer, Connection networkManager) { - post(new ClientPlayerNetworkEvent.Clone(pc, oldPlayer, newPlayer, networkManager)); + ClientPlayerNetworkEvent.Clone.BUS.post(new ClientPlayerNetworkEvent.Clone(pc, oldPlayer, newPlayer, networkManager)); } public static ViewportEvent.ComputeFov fireComputeFov(GameRenderer renderer, Camera camera, double partialTick, float fov, boolean usedConfiguredFov) { - return fire(new ViewportEvent.ComputeFov(renderer, camera, partialTick, fov, usedConfiguredFov)); + return ViewportEvent.ComputeFov.BUS.fire(new ViewportEvent.ComputeFov(renderer, camera, partialTick, fov, usedConfiguredFov)); } public static ViewportEvent.ComputeCameraAngles fireComputeCameraAngles(GameRenderer renderer, Camera camera, float partial) { - return fire(new ViewportEvent.ComputeCameraAngles(renderer, camera, partial, camera.getYRot(), camera.getXRot(), 0)); + return ViewportEvent.ComputeCameraAngles.BUS.fire(new ViewportEvent.ComputeCameraAngles(renderer, camera, partial, camera.getYRot(), camera.getXRot(), 0)); } public static > boolean onRenderLivingPre(S state, LivingEntityRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { - return post(new RenderLivingEvent.Pre(state, renderer, poseStack, multiBufferSource, packedLight)); + return RenderLivingEvent.Pre.BUS.post(new RenderLivingEvent.Pre(state, renderer, poseStack, multiBufferSource, packedLight)); } public static > boolean onRenderLivingPost(S state, LivingEntityRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { - return post(new RenderLivingEvent.Post(state, renderer, poseStack, multiBufferSource, packedLight)); + return RenderLivingEvent.Post.BUS.post(new RenderLivingEvent.Post(state, renderer, poseStack, multiBufferSource, packedLight)); } public static boolean onRenderPlayerPre(PlayerRenderState player, PlayerRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { - return post(new RenderPlayerEvent.Pre(player, renderer, poseStack, multiBufferSource, packedLight)); + return RenderPlayerEvent.Pre.BUS.post(new RenderPlayerEvent.Pre(player, renderer, poseStack, multiBufferSource, packedLight)); } public static boolean onRenderPlayerPost(PlayerRenderState player, PlayerRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { - return post(new RenderPlayerEvent.Post(player, renderer, poseStack, multiBufferSource, packedLight)); + return RenderPlayerEvent.Post.BUS.post(new RenderPlayerEvent.Post(player, renderer, poseStack, multiBufferSource, packedLight)); } public static boolean onRenderArm(PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight, HumanoidArm arm) { - return post(new RenderArmEvent(poseStack, multiBufferSource, packedLight, arm)); + return RenderArmEvent.BUS.post(new RenderArmEvent(poseStack, multiBufferSource, packedLight, arm)); } public static boolean onRenderItemInFrame(ItemFrameRenderState state, ItemFrameRenderer renderItemFrame, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { - return post(new RenderItemInFrameEvent(state, renderItemFrame, poseStack, multiBufferSource, packedLight)); + return RenderItemInFrameEvent.BUS.post(new RenderItemInFrameEvent(state, renderItemFrame, poseStack, multiBufferSource, packedLight)); } public static RenderNameTagEvent fireRenderNameTagEvent(EntityRenderState state, Component content, EntityRenderer entityRenderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { - return fire(new RenderNameTagEvent(state, content, entityRenderer, poseStack, multiBufferSource, packedLight)); + return RenderNameTagEvent.BUS.fire(new RenderNameTagEvent(state, content, entityRenderer, poseStack, multiBufferSource, packedLight)); } public static void onRenderScreenBackground(Screen screen, GuiGraphics guiGraphics) { - fire(new ScreenEvent.BackgroundRendered(screen, guiGraphics)); + ScreenEvent.BackgroundRendered.BUS.post(new ScreenEvent.BackgroundRendered(screen, guiGraphics)); } public static void onRenderTickStart(DeltaTracker timer) { - post(new TickEvent.RenderTickEvent.Pre(timer)); + TickEvent.RenderTickEvent.Pre.BUS.post(new TickEvent.RenderTickEvent.Pre(timer)); } public static void onRenderTickEnd(DeltaTracker timer) { - post(new TickEvent.RenderTickEvent.Post(timer)); + TickEvent.RenderTickEvent.Post.BUS.post(new TickEvent.RenderTickEvent.Post(timer)); } public static RenderTooltipEvent.Background onRenderTooltipBackground(@NotNull ItemStack stack, GuiGraphics graphics, int x, int y, @NotNull Font font, @NotNull List components, @Nullable ResourceLocation backgroundPrefix) { - return fire(new RenderTooltipEvent.Background(stack, graphics, x, y, font, components, backgroundPrefix)); + return RenderTooltipEvent.Background.BUS.fire(new RenderTooltipEvent.Background(stack, graphics, x, y, font, components, backgroundPrefix)); } public static boolean onToastAdd(Toast toast) { - return post(new ToastAddEvent(toast)); + return ToastAddEvent.BUS.post(new ToastAddEvent(toast)); } - public static ScreenEvent.RenderInventoryMobEffects onScreenEffectSize(Screen screen, int availableSpace, boolean compact, int horizontalOffset) { - return fire(new ScreenEvent.RenderInventoryMobEffects(screen, availableSpace, compact, horizontalOffset)); + public static @Nullable ScreenEvent.RenderInventoryMobEffects onScreenEffectSize(Screen screen, int availableSpace, boolean compact, int horizontalOffset) { + var event = new ScreenEvent.RenderInventoryMobEffects(screen, availableSpace, compact, horizontalOffset); + return ScreenEvent.RenderInventoryMobEffects.BUS.post(event) ? null : event; } public static void onRecipesUpdated(ClientRecipeBook book) { - post(new RecipesUpdatedEvent(book)); + RecipesUpdatedEvent.BUS.post(new RecipesUpdatedEvent(book)); } public static ComputeFovModifierEvent fireFovModifierEvent(Player entity, float modifier, float scale) { - return fire(new ComputeFovModifierEvent(entity, modifier, scale)); + return ComputeFovModifierEvent.BUS.fire(new ComputeFovModifierEvent(entity, modifier, scale)); } public static void onCreateSpecialBlockRenderers(Map map) { - post(new CreateSpecialBlockRendererEvent(map)); + CreateSpecialBlockRendererEvent.BUS.post(new CreateSpecialBlockRendererEvent(map)); } public static Map> onCreateSkullModels() { diff --git a/src/main/java/net/minecraftforge/client/event/InputEvent.java b/src/main/java/net/minecraftforge/client/event/InputEvent.java index 4275bcce78..d1200dad0a 100644 --- a/src/main/java/net/minecraftforge/client/event/InputEvent.java +++ b/src/main/java/net/minecraftforge/client/event/InputEvent.java @@ -8,9 +8,11 @@ package net.minecraftforge.client.event; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.KeyMapping; import net.minecraft.world.InteractionHand; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import org.lwjgl.glfw.GLFW; @@ -24,21 +26,24 @@ import org.lwjgl.glfw.GLFW; * @see Key * @see InteractionKeyMappingTriggered */ -public abstract sealed class InputEvent extends Event { +public abstract sealed class InputEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(InputEvent.class); + @ApiStatus.Internal protected InputEvent() {} /** * Fired when a mouse button is pressed/released. Sub-events get fired {@link Pre before} and {@link Post after} this happens. * - *

These events are fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ *

These events are fired only on the {@linkplain LogicalSide#CLIENT logical client}.

* * @see the online GLFW documentation * @see Pre * @see Post */ public static abstract sealed class MouseButton extends InputEvent { + public static final EventBus BUS = EventBus.create(MouseButton.class); + private final int button; private final int action; private final int modifiers; @@ -88,16 +93,15 @@ public abstract sealed class InputEvent extends Event { /** * Fired when a mouse button is pressed/released, before being processed by vanilla. * - *

This event is {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}. - * If the event is cancelled, then the mouse event will not be processed by vanilla (e.g. keymappings and screens)

+ *

If the event is cancelled, then the mouse event will not be processed by vanilla (e.g. keymappings and screens)

* - *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ *

This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

* * @see the online GLFW documentation */ - @Cancelable - public static final class Pre extends MouseButton { + public static final class Pre extends MouseButton implements Cancellable { + public static final CancellableEventBus
 BUS = CancellableEventBus.create(Pre.class);
+
             @ApiStatus.Internal
             public Pre(int button, int action, int modifiers) {
                 super(button, action, modifiers);
@@ -107,14 +111,13 @@ public abstract sealed class InputEvent extends Event {
         /**
          * Fired when a mouse button is pressed/released, after processing.
          *
-         * 

This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

- * - *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ *

This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

* * @see the online GLFW documentation */ public static final class Post extends MouseButton { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(int button, int action, int modifiers) { super(button, action, modifiers); @@ -126,16 +129,15 @@ public abstract sealed class InputEvent extends Event { * Fired when a mouse scroll wheel is used outside of a screen and a player is loaded, before being * processed by vanilla. * - *

This event is {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}. - * If the event is cancelled, then the mouse scroll event will not be processed further.

+ *

If the event is cancelled, then the mouse scroll event will not be processed further.

* - *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ *

This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

* * @see the online GLFW documentation */ - @Cancelable - public static final class MouseScrollingEvent extends InputEvent { + public static final class MouseScrollingEvent extends InputEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(MouseScrollingEvent.class); + private final double deltaX; private final double deltaY; private final double mouseX; @@ -208,12 +210,11 @@ public abstract sealed class InputEvent extends Event { /** * Fired when a keyboard key input occurs, such as pressing, releasing, or repeating a key. * - *

This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

- * - *

This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

+ *

This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

*/ public static final class Key extends InputEvent { + public static final EventBus BUS = EventBus.create(Key.class); + private final int key; private final int scanCode; private final int action; @@ -288,16 +289,15 @@ public abstract sealed class InputEvent extends Event { *
  • Attack - defaults to right mouse click
  • * * - *

    This event is {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}. - * If this event is cancelled, then the keymapping's action is not processed further, and the hand will be swung + *

    If this event is cancelled, then the keymapping's action is not processed further, and the hand will be swung * according to {@link #shouldSwingHand()}.

    * - *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

    + *

    This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ // TODO: Change the 'button' to sub events. - Lex 0422202 - @Cancelable - public static final class InteractionKeyMappingTriggered extends InputEvent { + public static final class InteractionKeyMappingTriggered extends InputEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(InteractionKeyMappingTriggered.class); + private final int button; private final KeyMapping keyMapping; private final InteractionHand hand; diff --git a/src/main/java/net/minecraftforge/client/event/ModelEvent.java b/src/main/java/net/minecraftforge/client/event/ModelEvent.java index ba1f853573..c4e4f75995 100644 --- a/src/main/java/net/minecraftforge/client/event/ModelEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ModelEvent.java @@ -13,8 +13,8 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import net.minecraftforge.client.model.geometry.IGeometryLoader; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.IModBusEvent; @@ -28,9 +28,9 @@ import java.util.Map; /** * Houses events related to models. */ -public abstract sealed class ModelEvent extends Event { +public abstract sealed class ModelEvent { @ApiStatus.Internal - protected ModelEvent() { } + protected ModelEvent() {} /** * Fired while the {@link ModelManager} is reloading models, after the model registry is set up, but before it's @@ -49,6 +49,10 @@ public abstract sealed class ModelEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class ModifyBakingResult extends ModelEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, ModifyBakingResult.class); + } + private final ModelBakery modelBakery; private final ModelBakery.BakingResult results; @@ -85,6 +89,10 @@ public abstract sealed class ModelEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class BakingCompleted extends ModelEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, BakingCompleted.class); + } + private final ModelManager modelManager; private final ModelBakery modelBakery; @@ -119,6 +127,10 @@ public abstract sealed class ModelEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class RegisterModelStateDefinitions extends ModelEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterModelStateDefinitions.class); + } + private final Map> states = new HashMap<>(); private final Map> view = Collections.unmodifiableMap(states); @@ -149,6 +161,10 @@ public abstract sealed class ModelEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class RegisterGeometryLoaders extends ModelEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterGeometryLoaders.class); + } + private final Map loaders; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/MovementInputUpdateEvent.java b/src/main/java/net/minecraftforge/client/event/MovementInputUpdateEvent.java index 2e0ff05d59..d8e9efb129 100644 --- a/src/main/java/net/minecraftforge/client/event/MovementInputUpdateEvent.java +++ b/src/main/java/net/minecraftforge/client/event/MovementInputUpdateEvent.java @@ -9,7 +9,7 @@ import net.minecraft.client.player.ClientInput; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -22,6 +22,8 @@ import org.jetbrains.annotations.ApiStatus; * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public final class MovementInputUpdateEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(MovementInputUpdateEvent.class); + private final ClientInput input; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java b/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java index 663c462c5f..5ea735b9e2 100644 --- a/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RecipesUpdatedEvent.java @@ -7,8 +7,8 @@ package net.minecraftforge.client.event; import net.minecraft.client.ClientRecipeBook; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -19,19 +19,12 @@ import org.jetbrains.annotations.ApiStatus; * *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    + * + * @param getRecipeBook the recipe manager */ -public final class RecipesUpdatedEvent extends Event { - private final ClientRecipeBook recipeBook; +public record RecipesUpdatedEvent(ClientRecipeBook getRecipeBook) implements RecordEvent { + public static final EventBus BUS = EventBus.create(RecipesUpdatedEvent.class); @ApiStatus.Internal - public RecipesUpdatedEvent(ClientRecipeBook recipeBook) { - this.recipeBook = recipeBook; - } - - /** - * {@return the recipe manager} - */ - public ClientRecipeBook getRecipeBook() { - return recipeBook; - } + public RecipesUpdatedEvent {} } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterClientCommandsEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterClientCommandsEvent.java index 7247d5f3f5..8a7fa95a13 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterClientCommandsEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterClientCommandsEvent.java @@ -10,11 +10,13 @@ import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.ObjectiveArgument; import net.minecraft.commands.arguments.ResourceLocationArgument; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; /** * Fired to allow mods to register client commands. @@ -27,38 +29,22 @@ import org.jetbrains.annotations.ApiStatus; * objectives that are displayed to the player. * * - *

    This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

    + *

    This event is not {@linkplain Cancellable cancellable}, and does not {@linkplain HasResult have a result}.

    * - *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

    + *

    This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

    + * + * @param getDispatcher the command dispatcher for registering commands to be executed on the client + * @param getBuildContext the context to build the commands for * * @see net.minecraftforge.event.RegisterCommandsEvent */ -public final class RegisterClientCommandsEvent extends Event -{ - private final CommandDispatcher dispatcher; - private final CommandBuildContext context; +@NullMarked +public record RegisterClientCommandsEvent( + CommandDispatcher getDispatcher, + CommandBuildContext getBuildContext +) implements RecordEvent { + public static final EventBus BUS = EventBus.create(RegisterClientCommandsEvent.class); @ApiStatus.Internal - public RegisterClientCommandsEvent(CommandDispatcher dispatcher, CommandBuildContext context) - { - this.dispatcher = dispatcher; - this.context = context; - } - - /** - * {@return the command dispatcher for registering commands to be executed on the client} - */ - public CommandDispatcher getDispatcher() - { - return dispatcher; - } - - /** - * {@return the context to build the commands for} - */ - public CommandBuildContext getBuildContext() - { - return context; - } + public RegisterClientCommandsEvent {} } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterClientReloadListenersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterClientReloadListenersEvent.java index 339215f6b0..c3d82f37db 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterClientReloadListenersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterClientReloadListenersEvent.java @@ -9,8 +9,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.ReloadableResourceManager; import net.minecraftforge.event.AddReloadListenerEvent; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -27,13 +27,15 @@ import org.jetbrains.annotations.ApiStatus; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterClientReloadListenersEvent extends Event implements IModBusEvent -{ +public final class RegisterClientReloadListenersEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterClientReloadListenersEvent.class); + } + private final ReloadableResourceManager resourceManager; @ApiStatus.Internal - public RegisterClientReloadListenersEvent(ReloadableResourceManager resourceManager) - { + public RegisterClientReloadListenersEvent(ReloadableResourceManager resourceManager) { this.resourceManager = resourceManager; } @@ -42,8 +44,7 @@ public final class RegisterClientReloadListenersEvent extends Event implements I * * @param reloadListener the reload listener */ - public void registerReloadListener(PreparableReloadListener reloadListener) - { + public void registerReloadListener(PreparableReloadListener reloadListener) { resourceManager.registerReloadListener(reloadListener); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterClientTooltipComponentFactoriesEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterClientTooltipComponentFactoriesEvent.java index 045de9e5fb..194b00952d 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterClientTooltipComponentFactoriesEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterClientTooltipComponentFactoriesEvent.java @@ -7,8 +7,8 @@ package net.minecraftforge.client.event; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.world.inventory.tooltip.TooltipComponent; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -26,13 +26,15 @@ import java.util.function.Function; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterClientTooltipComponentFactoriesEvent extends Event implements IModBusEvent -{ +public final class RegisterClientTooltipComponentFactoriesEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterClientTooltipComponentFactoriesEvent.class); + } + private final Map, Function> factories; @ApiStatus.Internal - public RegisterClientTooltipComponentFactoriesEvent(Map, Function> factories) - { + public RegisterClientTooltipComponentFactoriesEvent(Map, Function> factories) { this.factories = factories; } @@ -40,8 +42,7 @@ public final class RegisterClientTooltipComponentFactoriesEvent extends Event im * Registers a {@link ClientTooltipComponent} factory for a {@link TooltipComponent}. */ @SuppressWarnings("unchecked") - public void register(Class type, Function factory) - { + public void register(Class type, Function factory) { factories.put(type, (Function) factory); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java index 8e351ce1ca..812516d65a 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterColorHandlersEvent.java @@ -10,8 +10,8 @@ import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.block.BlockColors; import net.minecraft.core.BlockPos; import net.minecraft.world.level.ColorResolver; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -25,9 +25,9 @@ import org.jetbrains.annotations.ApiStatus; * only on the {@linkplain LogicalSide#CLIENT logical client}.

    * * @see RegisterColorHandlersEvent.Block - * @see RegisterColorHandlersEvent.Item + * @see RegisterColorHandlersEvent.ColorResolvers */ -public abstract sealed class RegisterColorHandlersEvent extends Event implements IModBusEvent { +public abstract sealed class RegisterColorHandlersEvent implements IModBusEvent { @ApiStatus.Internal protected RegisterColorHandlersEvent() {} @@ -40,6 +40,10 @@ public abstract sealed class RegisterColorHandlersEvent extends Event implements * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Block extends RegisterColorHandlersEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, Block.class); + } + private final BlockColors blockColors; @ApiStatus.Internal @@ -73,6 +77,10 @@ public abstract sealed class RegisterColorHandlersEvent extends Event implements * {@link net.minecraft.world.level.BlockAndTintGetter#getBlockTint(BlockPos, ColorResolver)}. */ public static final class ColorResolvers extends RegisterColorHandlersEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, ColorResolvers.class); + } + private final ImmutableList.Builder builder; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/RegisterDimensionSpecialEffectsEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterDimensionSpecialEffectsEvent.java index b01af80078..2ad59ca7f9 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterDimensionSpecialEffectsEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterDimensionSpecialEffectsEvent.java @@ -7,8 +7,8 @@ package net.minecraftforge.client.event; import net.minecraft.client.renderer.DimensionSpecialEffects; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -24,21 +24,22 @@ import java.util.Map; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterDimensionSpecialEffectsEvent extends Event implements IModBusEvent -{ +public final class RegisterDimensionSpecialEffectsEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterDimensionSpecialEffectsEvent.class); + } + private final Map effects; @ApiStatus.Internal - public RegisterDimensionSpecialEffectsEvent(Map effects) - { + public RegisterDimensionSpecialEffectsEvent(Map effects) { this.effects = effects; } /** * Registers the effects for a given dimension type. */ - public void register(ResourceLocation dimensionType, DimensionSpecialEffects effects) - { + public void register(ResourceLocation dimensionType, DimensionSpecialEffects effects) { this.effects.put(dimensionType, effects); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterEntitySpectatorShadersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterEntitySpectatorShadersEvent.java index ced04261b7..90e2be1086 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterEntitySpectatorShadersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterEntitySpectatorShadersEvent.java @@ -7,8 +7,8 @@ package net.minecraftforge.client.event; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -25,21 +25,22 @@ import java.util.Map; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterEntitySpectatorShadersEvent extends Event implements IModBusEvent -{ +public final class RegisterEntitySpectatorShadersEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterEntitySpectatorShadersEvent.class); + } + private final Map, ResourceLocation> shaders; @ApiStatus.Internal - public RegisterEntitySpectatorShadersEvent(Map, ResourceLocation> shaders) - { + public RegisterEntitySpectatorShadersEvent(Map, ResourceLocation> shaders) { this.shaders = shaders; } /** * Registers a spectator shader for a given entity type. */ - public void register(EntityType entityType, ResourceLocation shader) - { + public void register(EntityType entityType, ResourceLocation shader) { shaders.put(entityType, shader); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterItemDecorationsEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterItemDecorationsEvent.java index 5d90794dcb..d05c20aeea 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterItemDecorationsEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterItemDecorationsEvent.java @@ -9,8 +9,8 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; import net.minecraftforge.client.IItemDecorator; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -28,22 +28,22 @@ import java.util.Map; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterItemDecorationsEvent extends Event implements IModBusEvent -{ +public final class RegisterItemDecorationsEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterItemDecorationsEvent.class); + } private final Map> decorators; @ApiStatus.Internal - public RegisterItemDecorationsEvent(Map> decorators) - { + public RegisterItemDecorationsEvent(Map> decorators) { this.decorators = decorators; } /** * Register an ItemDecorator to an Item */ - public void register(ItemLike itemLike, IItemDecorator decorator) - { + public void register(ItemLike itemLike, IItemDecorator decorator) { List itemDecoratorList = decorators.computeIfAbsent(itemLike.asItem(), item -> new ArrayList<>()); itemDecoratorList.add(decorator); } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterKeyMappingsEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterKeyMappingsEvent.java index 0e77eb6bd3..c87689d60f 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterKeyMappingsEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterKeyMappingsEvent.java @@ -7,8 +7,8 @@ package net.minecraftforge.client.event; import net.minecraft.client.KeyMapping; import net.minecraft.client.Options; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -23,21 +23,22 @@ import org.jetbrains.annotations.ApiStatus; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterKeyMappingsEvent extends Event implements IModBusEvent -{ +public final class RegisterKeyMappingsEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterKeyMappingsEvent.class); + } + private final Options options; @ApiStatus.Internal - public RegisterKeyMappingsEvent(Options options) - { + public RegisterKeyMappingsEvent(Options options) { this.options = options; } /** * Registers a new key mapping. */ - public void register(KeyMapping key) - { + public void register(KeyMapping key) { options.keyMappings = ArrayUtils.add(options.keyMappings, key); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java index c36a879852..abf0e1e377 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterNamedRenderTypesEvent.java @@ -8,14 +8,14 @@ package net.minecraftforge.client.event; import com.google.common.base.Preconditions; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.RenderTypeGroup; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.IModBusEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.jetbrains.annotations.ApiStatus; import java.util.Map; @@ -23,18 +23,17 @@ import java.util.Map; /** * Allows users to register custom named {@link RenderType render types}. * - *

    This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}. - * - *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, - * only on the {@linkplain LogicalSide#CLIENT logical client}.

    + *

    This event is fired only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterNamedRenderTypesEvent extends Event implements IModBusEvent -{ +public final class RegisterNamedRenderTypesEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterNamedRenderTypesEvent.class); + } + private final Map renderTypes; @ApiStatus.Internal - public RegisterNamedRenderTypesEvent(Map renderTypes) - { + public RegisterNamedRenderTypesEvent(Map renderTypes) { this.renderTypes = renderTypes; } @@ -42,11 +41,10 @@ public final class RegisterNamedRenderTypesEvent extends Event implements IModBu * Registers a named {@link RenderTypeGroup}. * * @param name The name - * @param blockRenderType One of the values returned by {@link RenderType#chunkBufferLayers()} + * @param blockRenderType What ChunkSectionLayer to render in * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} */ - public void register(String name, RenderType blockRenderType, RenderType entityRenderType) - { + public void register(String name, ChunkSectionLayer blockRenderType, RenderType entityRenderType) { register(name, blockRenderType, entityRenderType, entityRenderType); } @@ -54,17 +52,15 @@ public final class RegisterNamedRenderTypesEvent extends Event implements IModBu * Registers a named {@link RenderTypeGroup}. * * @param name The name - * @param blockRenderType One of the values returned by {@link RenderType#chunkBufferLayers()} + * @param blockRenderType What ChunkSectionLayer to render in * @param entityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} * @param fabulousEntityRenderType A {@link RenderType} using {@link DefaultVertexFormat#NEW_ENTITY} for use when * "fabulous" rendering is enabled */ - public void register(String name, RenderType blockRenderType, RenderType entityRenderType, RenderType fabulousEntityRenderType) - { + public void register(String name, ChunkSectionLayer blockRenderType, RenderType entityRenderType, RenderType fabulousEntityRenderType) { + @SuppressWarnings("removal") var key = ResourceLocation.fromNamespaceAndPath(ModLoadingContext.get().getActiveNamespace(), name); Preconditions.checkArgument(!renderTypes.containsKey(key), "Render type already registered: " + key); - Preconditions.checkArgument(blockRenderType.format() == DefaultVertexFormat.BLOCK, "The block render type must use the BLOCK vertex format."); - Preconditions.checkArgument(blockRenderType.getChunkLayerId() >= 0, "Only chunk render types can be used for block rendering. Query RenderType#chunkBufferLayers() for a list."); Preconditions.checkArgument(entityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The entity render type must use the NEW_ENTITY vertex format."); Preconditions.checkArgument(fabulousEntityRenderType.format() == DefaultVertexFormat.NEW_ENTITY, "The fabulous entity render type must use the NEW_ENTITY vertex format."); renderTypes.put(key, new RenderTypeGroup(blockRenderType, entityRenderType, fabulousEntityRenderType)); diff --git a/src/main/java/net/minecraftforge/client/event/RegisterParticleProvidersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterParticleProvidersEvent.java index 43ba57c8ee..99d095c5bf 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterParticleProvidersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterParticleProvidersEvent.java @@ -10,8 +10,8 @@ import net.minecraft.client.particle.ParticleProvider; import net.minecraft.client.particle.TextureSheetParticle; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleType; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -29,13 +29,15 @@ import org.jetbrains.annotations.ApiStatus; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterParticleProvidersEvent extends Event implements IModBusEvent -{ +public final class RegisterParticleProvidersEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterParticleProvidersEvent.class); + } + private final ParticleEngine particleEngine; @ApiStatus.Internal - public RegisterParticleProvidersEvent(ParticleEngine particleEngine) - { + public RegisterParticleProvidersEvent(ParticleEngine particleEngine) { this.particleEngine = particleEngine; } @@ -67,8 +69,7 @@ public final class RegisterParticleProvidersEvent extends Event implements IModB * @param sprite Sprite function responsible for providing that ParticleType's particles. */ @SuppressWarnings("deprecation") - public void registerSprite(ParticleType type, ParticleProvider.Sprite sprite) - { + public void registerSprite(ParticleType type, ParticleProvider.Sprite sprite) { particleEngine.register(type, sprite); } @@ -84,9 +85,7 @@ public final class RegisterParticleProvidersEvent extends Event implements IModB * @param registration SpriteParticleRegistration function responsible for providing that ParticleType's particles. */ @SuppressWarnings("deprecation") - public void registerSpriteSet(ParticleType type, ParticleEngine.SpriteParticleRegistration registration) - { + public void registerSpriteSet(ParticleType type, ParticleEngine.SpriteParticleRegistration registration) { particleEngine.register(type, registration); } - } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterPresetEditorsEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterPresetEditorsEvent.java index f3e3773673..5570d7d06d 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterPresetEditorsEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterPresetEditorsEvent.java @@ -7,6 +7,8 @@ package net.minecraftforge.client.event; import java.util.Map; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.ApiStatus; @@ -14,8 +16,6 @@ import org.jetbrains.annotations.ApiStatus; import net.minecraft.client.gui.screens.worldselection.PresetEditor; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.levelgen.presets.WorldPreset; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.IModBusEvent; @@ -29,26 +29,26 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterPresetEditorsEvent extends Event implements IModBusEvent -{ +public final class RegisterPresetEditorsEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterPresetEditorsEvent.class); + } + private static final Logger LOGGER = LogManager.getLogger(); private final Map, PresetEditor> editors; @ApiStatus.Internal - public RegisterPresetEditorsEvent(Map, PresetEditor> editors) - { + public RegisterPresetEditorsEvent(Map, PresetEditor> editors) { this.editors = editors; } /** * Registers a PresetEditor for a given world preset key. */ - public void register(ResourceKey key, PresetEditor editor) - { + public void register(ResourceKey key, PresetEditor editor) { PresetEditor old = this.editors.put(key, editor); - if (old != null) - { + if (old != null) { LOGGER.debug("PresetEditor {} overridden by mod {}", key.location(), ModLoadingContext.get().getActiveNamespace()); } } diff --git a/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java b/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java index 88f5123172..78891f6b07 100644 --- a/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RegisterTextureAtlasSpriteLoadersEvent.java @@ -10,8 +10,8 @@ import com.google.common.collect.BiMap; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.client.textures.ITextureAtlasSpriteLoader; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.IModBusEvent; @@ -26,7 +26,11 @@ import org.jetbrains.annotations.ApiStatus; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class RegisterTextureAtlasSpriteLoadersEvent extends Event implements IModBusEvent { +public final class RegisterTextureAtlasSpriteLoadersEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterTextureAtlasSpriteLoadersEvent.class); + } + private final BiMap loaders; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java b/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java index 0c326e68b7..b97e74cba8 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderArmEvent.java @@ -10,8 +10,9 @@ import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.entity.HumanoidArm; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -26,8 +27,9 @@ import org.jetbrains.annotations.ApiStatus; *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -@Cancelable -public final class RenderArmEvent extends Event { +public final class RenderArmEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderArmEvent.class); + private final PoseStack poseStack; private final MultiBufferSource multiBufferSource; private final int packedLight; diff --git a/src/main/java/net/minecraftforge/client/event/RenderBlockScreenEffectEvent.java b/src/main/java/net/minecraftforge/client/event/RenderBlockScreenEffectEvent.java index 0000ffaa24..6df656a0fc 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderBlockScreenEffectEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderBlockScreenEffectEvent.java @@ -10,8 +10,9 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -24,16 +25,15 @@ import org.jetbrains.annotations.ApiStatus; *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -@Cancelable -public final class RenderBlockScreenEffectEvent extends Event -{ +public final class RenderBlockScreenEffectEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderBlockScreenEffectEvent.class); + /** * The type of the block overlay to be rendered. * * @see RenderBlockScreenEffectEvent */ - public enum OverlayType - { + public enum OverlayType { /** * The type of the overlay when the player is burning / on fire. */ @@ -55,8 +55,7 @@ public final class RenderBlockScreenEffectEvent extends Event private final BlockPos blockPos; @ApiStatus.Internal - public RenderBlockScreenEffectEvent(Player player, PoseStack poseStack, OverlayType type, BlockState block, BlockPos blockPos) - { + public RenderBlockScreenEffectEvent(Player player, PoseStack poseStack, OverlayType type, BlockState block, BlockPos blockPos) { this.player = player; this.poseStack = poseStack; this.overlayType = type; @@ -67,40 +66,35 @@ public final class RenderBlockScreenEffectEvent extends Event /** * {@return the player which the overlay will apply to} */ - public Player getPlayer() - { + public Player getPlayer() { return player; } /** * {@return the pose stack used for rendering} */ - public PoseStack getPoseStack() - { + public PoseStack getPoseStack() { return poseStack; } /** * {@return the type of the overlay} */ - public OverlayType getOverlayType() - { + public OverlayType getOverlayType() { return overlayType; } /** * {@return the block which the overlay is gotten from} */ - public BlockState getBlockState() - { + public BlockState getBlockState() { return blockState; } /** * {@return the position of the block which the overlay is gotten from} */ - public BlockPos getBlockPos() - { + public BlockPos getBlockPos() { return blockPos; } } diff --git a/src/main/java/net/minecraftforge/client/event/RenderHandEvent.java b/src/main/java/net/minecraftforge/client/event/RenderHandEvent.java index 085a6e3d31..0fa52b94d7 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderHandEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderHandEvent.java @@ -11,8 +11,9 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -27,9 +28,9 @@ import org.jetbrains.annotations.ApiStatus; * * @see RenderArmEvent */ -@Cancelable -public final class RenderHandEvent extends Event -{ +public final class RenderHandEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderHandEvent.class); + private final InteractionHand hand; private final PoseStack poseStack; private final MultiBufferSource multiBufferSource; @@ -59,24 +60,21 @@ public final class RenderHandEvent extends Event /** * {@return the hand being rendered} */ - public InteractionHand getHand() - { + public InteractionHand getHand() { return hand; } /** * {@return the pose stack used for rendering} */ - public PoseStack getPoseStack() - { + public PoseStack getPoseStack() { return poseStack; } /** * {@return the source of rendering buffers} */ - public MultiBufferSource getMultiBufferSource() - { + public MultiBufferSource getMultiBufferSource() { return multiBufferSource; } @@ -85,48 +83,42 @@ public final class RenderHandEvent extends Event * * @see LightTexture */ - public int getPackedLight() - { + public int getPackedLight() { return packedLight; } /** * {@return the partial tick} */ - public float getPartialTick() - { + public float getPartialTick() { return partialTick; } /** * {@return the interpolated pitch of the player entity} */ - public float getInterpolatedPitch() - { + public float getInterpolatedPitch() { return interpolatedPitch; } /** * {@return the swing progress of the hand being rendered} */ - public float getSwingProgress() - { + public float getSwingProgress() { return swingProgress; } /** * {@return the progress of the equip animation, from {@code 0.0} to {@code 1.0}} */ - public float getEquipProgress() - { + public float getEquipProgress() { return equipProgress; } /** * {@return the item stack to be rendered} */ - public ItemStack getItemStack() - { + public ItemStack getItemStack() { return stack; } } diff --git a/src/main/java/net/minecraftforge/client/event/RenderHighlightEvent.java b/src/main/java/net/minecraftforge/client/event/RenderHighlightEvent.java index cc4b29ddb7..a5b47d4789 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderHighlightEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderHighlightEvent.java @@ -13,8 +13,10 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.HitResult; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -25,9 +27,9 @@ import org.jetbrains.annotations.ApiStatus; * @see Block * @see Entity */ -@Cancelable -public abstract sealed class RenderHighlightEvent extends Event -{ +public abstract sealed class RenderHighlightEvent extends MutableEvent implements Cancellable, InheritableEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderHighlightEvent.class); + private final LevelRenderer levelRenderer; private final Camera camera; private final HitResult target; @@ -36,8 +38,7 @@ public abstract sealed class RenderHighlightEvent extends Event private final MultiBufferSource multiBufferSource; @ApiStatus.Internal - protected RenderHighlightEvent(LevelRenderer levelRenderer, Camera camera, HitResult target, float partialTick, PoseStack poseStack, MultiBufferSource multiBufferSource) - { + protected RenderHighlightEvent(LevelRenderer levelRenderer, Camera camera, HitResult target, float partialTick, PoseStack poseStack, MultiBufferSource multiBufferSource) { this.levelRenderer = levelRenderer; this.camera = camera; this.target = target; @@ -49,48 +50,42 @@ public abstract sealed class RenderHighlightEvent extends Event /** * {@return the level renderer} */ - public LevelRenderer getLevelRenderer() - { + public LevelRenderer getLevelRenderer() { return levelRenderer; } /** * {@return the camera information} */ - public Camera getCamera() - { + public Camera getCamera() { return camera; } /** * {@return the hit result which triggered the selection highlight} */ - public HitResult getTarget() - { + public HitResult getTarget() { return target; } /** * {@return the partial tick} */ - public float getPartialTick() - { + public float getPartialTick() { return partialTick; } /** * {@return the pose stack used for rendering} */ - public PoseStack getPoseStack() - { + public PoseStack getPoseStack() { return poseStack; } /** * {@return the source of rendering buffers} */ - public MultiBufferSource getMultiBufferSource() - { + public MultiBufferSource getMultiBufferSource() { return multiBufferSource; } @@ -103,12 +98,11 @@ public abstract sealed class RenderHighlightEvent extends Event *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Block extends RenderHighlightEvent - { + public static final class Block extends RenderHighlightEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(Block.class); + @ApiStatus.Internal - public Block(LevelRenderer levelRenderer, Camera camera, BlockHitResult target, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource) - { + public Block(LevelRenderer levelRenderer, Camera camera, BlockHitResult target, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource) { super(levelRenderer, camera, target, partialTick, poseStack, bufferSource); } @@ -116,8 +110,7 @@ public abstract sealed class RenderHighlightEvent extends Event * {@return the block hit result} */ @Override - public BlockHitResult getTarget() - { + public BlockHitResult getTarget() { return (BlockHitResult) super.target; } } @@ -130,11 +123,11 @@ public abstract sealed class RenderHighlightEvent extends Event *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - public static final class Entity extends RenderHighlightEvent - { + public static final class Entity extends RenderHighlightEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(Entity.class); + @ApiStatus.Internal - public Entity(LevelRenderer levelRenderer, Camera camera, EntityHitResult target, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource) - { + public Entity(LevelRenderer levelRenderer, Camera camera, EntityHitResult target, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource) { super(levelRenderer, camera, target, partialTick, poseStack, bufferSource); } @@ -142,8 +135,7 @@ public abstract sealed class RenderHighlightEvent extends Event * {@return the entity hit result} */ @Override - public EntityHitResult getTarget() - { + public EntityHitResult getTarget() { return (EntityHitResult) super.target; } } diff --git a/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java b/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java index 2b0a0b4112..168bc080df 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderItemInFrameEvent.java @@ -11,8 +11,9 @@ import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.ItemFrameRenderer; import net.minecraft.client.renderer.entity.state.ItemFrameRenderState; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -28,8 +29,9 @@ import org.jetbrains.annotations.ApiStatus; * * @see ItemFrameRenderer */ -@Cancelable -public final class RenderItemInFrameEvent extends Event { +public final class RenderItemInFrameEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderItemInFrameEvent.class); + private final ItemFrameRenderState state; private final ItemFrameRenderer renderer; private final PoseStack poseStack; diff --git a/src/main/java/net/minecraftforge/client/event/RenderLivingEvent.java b/src/main/java/net/minecraftforge/client/event/RenderLivingEvent.java index c6dae9fbc8..71449c43e0 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderLivingEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderLivingEvent.java @@ -13,8 +13,11 @@ import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -32,7 +35,9 @@ import org.jetbrains.annotations.ApiStatus; * @see RenderPlayerEvent * @see LivingEntityRenderer */ -public abstract sealed class RenderLivingEvent> extends Event { +public abstract sealed class RenderLivingEvent> extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(RenderLivingEvent.class); + private final S state; private final LivingEntityRenderer renderer; private final PoseStack poseStack; @@ -99,8 +104,9 @@ public abstract sealed class RenderLivingEvent the living entity that is being rendered * @param the model for the living entity */ - @Cancelable - public static final class Pre> extends RenderLivingEvent { + public static final class Pre> extends RenderLivingEvent implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
             @ApiStatus.Internal
             public Pre(S state, LivingEntityRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) {
                 super(state, renderer, poseStack, multiBufferSource, packedLight);
    @@ -119,6 +125,8 @@ public abstract sealed class RenderLivingEvent the model for the living entity
          */
         public static final class Post> extends RenderLivingEvent {
    +        public static final EventBus BUS = EventBus.create(Post.class);
    +
             @ApiStatus.Internal
             public Post(S state, LivingEntityRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) {
                 super(state, renderer, poseStack, multiBufferSource, packedLight);
    diff --git a/src/main/java/net/minecraftforge/client/event/RenderNameTagEvent.java b/src/main/java/net/minecraftforge/client/event/RenderNameTagEvent.java
    index 2bdd46ae00..46b65acc45 100644
    --- a/src/main/java/net/minecraftforge/client/event/RenderNameTagEvent.java
    +++ b/src/main/java/net/minecraftforge/client/event/RenderNameTagEvent.java
    @@ -11,8 +11,10 @@ import net.minecraft.client.renderer.entity.EntityRenderer;
     import net.minecraft.client.renderer.entity.state.EntityRenderState;
     import net.minecraft.network.chat.Component;
     import net.minecraftforge.common.MinecraftForge;
    -import net.minecraftforge.eventbus.api.Cancelable;
    -import net.minecraftforge.eventbus.api.Event;
    +import net.minecraftforge.common.util.HasResult;
    +import net.minecraftforge.common.util.Result;
    +import net.minecraftforge.eventbus.api.bus.EventBus;
    +import net.minecraftforge.eventbus.api.event.MutableEvent;
     import net.minecraftforge.fml.LogicalSide;
     import org.jetbrains.annotations.ApiStatus;
     
    @@ -31,8 +33,9 @@ import org.jetbrains.annotations.ApiStatus;
      *
      * @see EntityRenderer
      */
    -@Event.HasResult
    -public final class RenderNameTagEvent extends Event {
    +public final class RenderNameTagEvent extends MutableEvent implements HasResult {
    +    public static final EventBus BUS = EventBus.create(RenderNameTagEvent.class);
    +
         private Component nameplateContent;
         private final EntityRenderState state;
         private final Component originalContent;
    @@ -40,6 +43,7 @@ public final class RenderNameTagEvent extends Event {
         private final PoseStack poseStack;
         private final MultiBufferSource multiBufferSource;
         private final int packedLight;
    +    private Result result = Result.DEFAULT;
     
         @ApiStatus.Internal
         public RenderNameTagEvent(EntityRenderState state, Component content, EntityRenderer entityRenderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) {
    @@ -109,4 +113,14 @@ public final class RenderNameTagEvent extends Event {
         public int getPackedLight() {
             return this.packedLight;
         }
    +
    +    @Override
    +    public Result getResult() {
    +        return this.result;
    +    }
    +
    +    @Override
    +    public void setResult(Result result) {
    +        this.result = result;
    +    }
     }
    diff --git a/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java b/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java
    index fa1505f1e7..a3d0dc5981 100644
    --- a/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java
    +++ b/src/main/java/net/minecraftforge/client/event/RenderPlayerEvent.java
    @@ -11,8 +11,11 @@ import net.minecraft.client.renderer.MultiBufferSource;
     import net.minecraft.client.renderer.entity.player.PlayerRenderer;
     import net.minecraft.client.renderer.entity.state.PlayerRenderState;
     import net.minecraftforge.common.MinecraftForge;
    -import net.minecraftforge.eventbus.api.Cancelable;
    -import net.minecraftforge.eventbus.api.Event;
    +import net.minecraftforge.eventbus.api.bus.CancellableEventBus;
    +import net.minecraftforge.eventbus.api.bus.EventBus;
    +import net.minecraftforge.eventbus.api.event.InheritableEvent;
    +import net.minecraftforge.eventbus.api.event.MutableEvent;
    +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable;
     import net.minecraftforge.fml.LogicalSide;
     import org.jetbrains.annotations.ApiStatus;
     
    @@ -24,7 +27,9 @@ import org.jetbrains.annotations.ApiStatus;
      * @see RenderPlayerEvent.Post
      * @see PlayerRenderer
      */
    -public abstract sealed class RenderPlayerEvent extends Event {
    +public abstract sealed class RenderPlayerEvent extends MutableEvent implements InheritableEvent {
    +    public static final EventBus BUS = EventBus.create(RenderPlayerEvent.class);
    +
         private final PlayerRenderState state;
         private final PlayerRenderer renderer;
         private final PoseStack poseStack;
    @@ -85,8 +90,9 @@ public abstract sealed class RenderPlayerEvent extends Event {
          * 

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends RenderPlayerEvent { + public static final class Pre extends RenderPlayerEvent implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
             @ApiStatus.Internal
             public Pre(PlayerRenderState state, PlayerRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) {
                 super(state, renderer, poseStack, multiBufferSource, packedLight);
    @@ -102,6 +108,8 @@ public abstract sealed class RenderPlayerEvent extends Event {
          * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Post extends RenderPlayerEvent { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(PlayerRenderState state, PlayerRenderer renderer, PoseStack poseStack, MultiBufferSource multiBufferSource, int packedLight) { super(state, renderer, poseStack, multiBufferSource, packedLight); diff --git a/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java b/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java index 52eded33fd..b7ccbc3366 100644 --- a/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java +++ b/src/main/java/net/minecraftforge/client/event/RenderTooltipEvent.java @@ -16,8 +16,11 @@ import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -34,8 +37,9 @@ import java.util.List; * @see RenderTooltipEvent.Pre * @see RenderTooltipEvent.Background */ -public abstract sealed class RenderTooltipEvent extends Event -{ +public abstract sealed class RenderTooltipEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(RenderTooltipEvent.class); + @NotNull protected final ItemStack itemStack; protected final GuiGraphics graphics; @@ -120,9 +124,9 @@ public abstract sealed class RenderTooltipEvent extends Event *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class GatherComponents extends Event - { + public static final class GatherComponents extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(GatherComponents.class); + private final ItemStack itemStack; private final int screenWidth; private final int screenHeight; @@ -209,9 +213,9 @@ public abstract sealed class RenderTooltipEvent extends Event *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends RenderTooltipEvent - { + public static final class Pre extends RenderTooltipEvent implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
             private final int screenWidth;
             private final int screenHeight;
             private final ClientTooltipPositioner positioner;
    @@ -290,6 +294,8 @@ public abstract sealed class RenderTooltipEvent extends Event
          * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Background extends RenderTooltipEvent { + public static final EventBus BUS = EventBus.create(Background.class); + private final ResourceLocation originalBackground; private ResourceLocation background; diff --git a/src/main/java/net/minecraftforge/client/event/ScreenEvent.java b/src/main/java/net/minecraftforge/client/event/ScreenEvent.java index f292efa718..98347c2f39 100644 --- a/src/main/java/net/minecraftforge/client/event/ScreenEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ScreenEvent.java @@ -10,8 +10,12 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -35,7 +39,9 @@ import java.util.function.Consumer; * @see MouseInput * @see KeyInput */ -public abstract sealed class ScreenEvent extends Event { +public abstract sealed class ScreenEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(ScreenEvent.class); + private final Screen screen; @ApiStatus.Internal @@ -110,8 +116,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends Init { + public static final class Pre extends Init implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, List list, Consumer add, Consumer remove) {
                     super(screen, list, add, remove);
    @@ -127,6 +134,8 @@ public abstract sealed class ScreenEvent extends Event {
              * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Post extends Init { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, List list, Consumer add, Consumer remove) { super(screen, list, add, remove); @@ -193,8 +202,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends Render { + public static final class Pre extends Render implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) {
                     super(screen, guiGraphics, mouseX, mouseY, partialTick);
    @@ -210,6 +220,8 @@ public abstract sealed class ScreenEvent extends Event {
              * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Post extends Render { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { super(screen, guiGraphics, mouseX, mouseY, partialTick); @@ -227,6 +239,8 @@ public abstract sealed class ScreenEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class BackgroundRendered extends ScreenEvent { + public static final EventBus BUS = EventBus.create(BackgroundRendered.class); + private final GuiGraphics guiGraphics; @ApiStatus.Internal @@ -254,8 +268,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class RenderInventoryMobEffects extends ScreenEvent { + public static final class RenderInventoryMobEffects extends ScreenEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderInventoryMobEffects.class); + private final int availableSpace; private boolean compact; private int horizontalOffset; @@ -382,8 +397,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends MouseButtonPressed { + public static final class Pre extends MouseButtonPressed implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, double mouseX, double mouseY, int button) {
                     super(screen, mouseX, mouseY, button);
    @@ -405,9 +421,11 @@ public abstract sealed class ScreenEvent extends Event {
              * 

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @HasResult - public static final class Post extends MouseButtonPressed { + public static final class Post extends MouseButtonPressed implements HasResult { + public static final EventBus BUS = EventBus.create(Post.class); + private final boolean handled; + private Result result = Result.DEFAULT; @ApiStatus.Internal public Post(Screen screen, double mouseX, double mouseY, int button, boolean handled) { @@ -421,6 +439,16 @@ public abstract sealed class ScreenEvent extends Event { public boolean wasHandled() { return handled; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } } @@ -460,8 +488,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends MouseButtonReleased { + public static final class Pre extends MouseButtonReleased implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, double mouseX, double mouseY, int button) {
                     super(screen, mouseX, mouseY, button);
    @@ -483,9 +512,11 @@ public abstract sealed class ScreenEvent extends Event {
              * 

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @HasResult - public static final class Post extends MouseButtonReleased { + public static final class Post extends MouseButtonReleased implements HasResult { + public static final EventBus BUS = EventBus.create(Post.class); + private final boolean handled; + private Result result = Result.DEFAULT; @ApiStatus.Internal public Post(Screen screen, double mouseX, double mouseY, int button, boolean handled) { @@ -499,6 +530,16 @@ public abstract sealed class ScreenEvent extends Event { public boolean wasHandled() { return handled; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } } @@ -556,8 +597,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends MouseDragged { + public static final class Pre extends MouseDragged implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, double mouseX, double mouseY, int mouseButton, double dragX, double dragY) {
                     super(screen, mouseX, mouseY, mouseButton, dragX, dragY);
    @@ -575,6 +617,8 @@ public abstract sealed class ScreenEvent extends Event {
              * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Post extends MouseDragged { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, double mouseX, double mouseY, int mouseButton, double dragX, double dragY) { super(screen, mouseX, mouseY, mouseButton, dragX, dragY); @@ -624,8 +668,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends MouseScrolled { + public static final class Pre extends MouseScrolled implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, double mouseX, double mouseY, double deltaX, double deltaY) {
                     super(screen, mouseX, mouseY, deltaX, deltaY);
    @@ -643,6 +688,8 @@ public abstract sealed class ScreenEvent extends Event {
              * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Post extends MouseScrolled { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, double mouseX, double mouseY, double deltaX, double deltaY) { super(screen, mouseX, mouseY, deltaX, deltaY); @@ -735,8 +782,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends KeyPressed { + public static final class Pre extends KeyPressed implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, int keyCode, int scanCode, int modifiers) {
                     super(screen, keyCode, scanCode, modifiers);
    @@ -753,8 +801,9 @@ public abstract sealed class ScreenEvent extends Event {
              * 

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Post extends KeyPressed { + public static final class Post extends KeyPressed implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, int keyCode, int scanCode, int modifiers) { super(screen, keyCode, scanCode, modifiers); @@ -785,8 +834,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends KeyReleased { + public static final class Pre extends KeyReleased implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, int keyCode, int scanCode, int modifiers) {
                     super(screen, keyCode, scanCode, modifiers);
    @@ -803,8 +853,9 @@ public abstract sealed class ScreenEvent extends Event {
              * 

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Post extends KeyReleased { + public static final class Post extends KeyReleased implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, int keyCode, int scanCode, int modifiers) { super(screen, keyCode, scanCode, modifiers); @@ -863,8 +914,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Pre extends CharacterTyped { + public static final class Pre extends CharacterTyped implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
                 @ApiStatus.Internal
                 public Pre(Screen screen, char codePoint, int modifiers) {
                     super(screen, codePoint, modifiers);
    @@ -882,6 +934,8 @@ public abstract sealed class ScreenEvent extends Event {
              * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Post extends CharacterTyped { + public static final EventBus BUS = EventBus.create(Post.class); + @ApiStatus.Internal public Post(Screen screen, char codePoint, int modifiers) { super(screen, codePoint, modifiers); @@ -901,8 +955,9 @@ public abstract sealed class ScreenEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class Opening extends ScreenEvent { + public static final class Opening extends ScreenEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Opening.class); + @Nullable private final Screen currentScreen; private Screen newScreen; @@ -950,6 +1005,8 @@ public abstract sealed class ScreenEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class Closing extends ScreenEvent { + public static final EventBus BUS = EventBus.create(Closing.class); + @ApiStatus.Internal public Closing(Screen screen) { super(screen); diff --git a/src/main/java/net/minecraftforge/client/event/ScreenshotEvent.java b/src/main/java/net/minecraftforge/client/event/ScreenshotEvent.java index 39bc8ed585..17c2b0823a 100644 --- a/src/main/java/net/minecraftforge/client/event/ScreenshotEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ScreenshotEvent.java @@ -9,8 +9,9 @@ import com.mojang.blaze3d.platform.NativeImage; import net.minecraft.client.Screenshot; import net.minecraft.network.chat.Component; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -30,8 +31,8 @@ import java.io.IOException; * * @see Screenshot */ -@Cancelable -public final class ScreenshotEvent extends Event { +public final class ScreenshotEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ScreenshotEvent.class); public static final Component DEFAULT_CANCEL_REASON = Component.literal("Screenshot canceled"); private final NativeImage image; diff --git a/src/main/java/net/minecraftforge/client/event/SystemMessageReceivedEvent.java b/src/main/java/net/minecraftforge/client/event/SystemMessageReceivedEvent.java index 56869c6719..2ca72d37de 100644 --- a/src/main/java/net/minecraftforge/client/event/SystemMessageReceivedEvent.java +++ b/src/main/java/net/minecraftforge/client/event/SystemMessageReceivedEvent.java @@ -6,8 +6,9 @@ package net.minecraftforge.client.event; import net.minecraft.network.chat.Component; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.ApiStatus; /** @@ -17,8 +18,9 @@ import org.jetbrains.annotations.ApiStatus; *

    If the event is cancelled, the message is not displayed in the chat message window.

    * */ -@Cancelable -public final class SystemMessageReceivedEvent extends Event { +public final class SystemMessageReceivedEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(SystemMessageReceivedEvent.class); + private Component message; private final boolean overlay; diff --git a/src/main/java/net/minecraftforge/client/event/TextureStitchEvent.java b/src/main/java/net/minecraftforge/client/event/TextureStitchEvent.java index 2a4cb146f5..5b0ab189e0 100644 --- a/src/main/java/net/minecraftforge/client/event/TextureStitchEvent.java +++ b/src/main/java/net/minecraftforge/client/event/TextureStitchEvent.java @@ -6,8 +6,8 @@ package net.minecraftforge.client.event; import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -19,21 +19,18 @@ import org.jetbrains.annotations.ApiStatus; * @see TextureStitchEvent.Post * @see TextureAtlas */ -public sealed class TextureStitchEvent extends Event implements IModBusEvent -{ +public sealed class TextureStitchEvent extends MutableEvent implements IModBusEvent, InheritableEvent { private final TextureAtlas atlas; @ApiStatus.Internal - public TextureStitchEvent(TextureAtlas atlas) - { + public TextureStitchEvent(TextureAtlas atlas) { this.atlas = atlas; } /** * {@return the texture atlas} */ - public TextureAtlas getAtlas() - { + public TextureAtlas getAtlas() { return atlas; } @@ -80,11 +77,9 @@ public sealed class TextureStitchEvent extends Event implements IModBusEvent *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus()} mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - public static final class Post extends TextureStitchEvent - { + public static final class Post extends TextureStitchEvent { @ApiStatus.Internal - public Post(TextureAtlas map) - { + public Post(TextureAtlas map) { super(map); } } diff --git a/src/main/java/net/minecraftforge/client/event/ToastAddEvent.java b/src/main/java/net/minecraftforge/client/event/ToastAddEvent.java index 9181f767e3..59952ff0d4 100644 --- a/src/main/java/net/minecraftforge/client/event/ToastAddEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ToastAddEvent.java @@ -7,8 +7,9 @@ package net.minecraftforge.client.event; import net.minecraft.client.gui.components.toasts.Toast; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; /** @@ -21,15 +22,6 @@ import net.minecraftforge.fml.LogicalSide; *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -@Cancelable -public final class ToastAddEvent extends Event { - private final Toast toast; - - public ToastAddEvent(Toast toast) { - this.toast = toast; - } - - public Toast getToast() { - return toast; - } +public record ToastAddEvent(Toast getToast) implements Cancellable, RecordEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(ToastAddEvent.class); } diff --git a/src/main/java/net/minecraftforge/client/event/ViewportEvent.java b/src/main/java/net/minecraftforge/client/event/ViewportEvent.java index 4e003d67d3..142f35a788 100644 --- a/src/main/java/net/minecraftforge/client/event/ViewportEvent.java +++ b/src/main/java/net/minecraftforge/client/event/ViewportEvent.java @@ -5,17 +5,20 @@ package net.minecraftforge.client.event; -import com.mojang.blaze3d.shaders.FogShape; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.FogRenderer.FogMode; import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.fog.FogData; import net.minecraft.world.level.material.FogType; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; +import org.joml.Vector4f; /** * Fired for hooking into the entity view rendering in {@link GameRenderer}. @@ -30,7 +33,9 @@ import org.jetbrains.annotations.ApiStatus; * @see ComputeCameraAngles * @see ComputeFov */ -public abstract sealed class ViewportEvent extends Event { +public abstract sealed class ViewportEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(ViewportEvent.class); + private final GameRenderer renderer; private final Camera camera; private final double partialTick; @@ -72,30 +77,28 @@ public abstract sealed class ViewportEvent extends Event { *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ - @Cancelable - public static final class RenderFog extends ViewportEvent { - private final FogMode mode; + public static final class RenderFog extends ViewportEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RenderFog.class); + private final FogType type; - private float farPlaneDistance; - private float nearPlaneDistance; - private FogShape fogShape; + private final FogData data; + private final Vector4f color; @SuppressWarnings("resource") @ApiStatus.Internal - public RenderFog(FogMode mode, FogType type, Camera camera, float partialTicks, float nearPlaneDistance, float farPlaneDistance, FogShape fogShape) { + public RenderFog(FogType type, Camera camera, float partialTicks, FogData data, Vector4f color) { super(Minecraft.getInstance().gameRenderer, camera, partialTicks); - this.mode = mode; this.type = type; - setFarPlaneDistance(farPlaneDistance); - setNearPlaneDistance(nearPlaneDistance); - setFogShape(fogShape); + this.data = data; + this.color = color; } - /** - * {@return the mode of fog being rendered} - */ - public FogMode getMode() { - return mode; + public FogData getData() { + return data; + } + + public Vector4f getColor() { + return color; } /** @@ -109,21 +112,14 @@ public abstract sealed class ViewportEvent extends Event { * {@return the distance to the far plane where the fog ends} */ public float getFarPlaneDistance() { - return farPlaneDistance; + return this.getData().renderDistanceEnd; } /** * {@return the distance to the near plane where the fog starts} */ public float getNearPlaneDistance() { - return nearPlaneDistance; - } - - /** - * {@return the shape of the fog being rendered} - */ - public FogShape getFogShape() { - return fogShape; + return this.getData().renderDistanceStart; } /** @@ -133,7 +129,7 @@ public abstract sealed class ViewportEvent extends Event { * @see #scaleFarPlaneDistance(float) */ public void setFarPlaneDistance(float distance) { - farPlaneDistance = distance; + getData().renderDistanceEnd = distance; } /** @@ -143,16 +139,7 @@ public abstract sealed class ViewportEvent extends Event { * @see #scaleNearPlaneDistance(float) */ public void setNearPlaneDistance(float distance) { - nearPlaneDistance = distance; - } - - /** - * Sets the new shape of the fog being rendered. The new shape will only take effect if the event is cancelled. - * - * @param shape the new shape of the fog - */ - public void setFogShape(FogShape shape) { - fogShape = shape; + getData().renderDistanceStart = distance; } /** @@ -161,7 +148,7 @@ public abstract sealed class ViewportEvent extends Event { * @param factor the factor to scale the far plane distance by */ public void scaleFarPlaneDistance(float factor) { - farPlaneDistance *= factor; + getData().renderDistanceEnd *= factor; } /** @@ -170,7 +157,7 @@ public abstract sealed class ViewportEvent extends Event { * @param factor the factor to scale the near plane distance by */ public void scaleNearPlaneDistance(float factor) { - nearPlaneDistance *= factor; + getData().renderDistanceStart *= factor; } } @@ -183,6 +170,8 @@ public abstract sealed class ViewportEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class ComputeFogColor extends ViewportEvent { + public static final EventBus BUS = EventBus.create(ComputeFogColor.class); + private float red; private float green; private float blue; @@ -255,6 +244,8 @@ public abstract sealed class ViewportEvent extends Event { * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ public static final class ComputeCameraAngles extends ViewportEvent { + public static final EventBus BUS = EventBus.create(ComputeCameraAngles.class); + private float yaw; private float pitch; private float roll; @@ -328,6 +319,8 @@ public abstract sealed class ViewportEvent extends Event { * @see ComputeFovModifierEvent */ public static final class ComputeFov extends ViewportEvent { + public static final EventBus BUS = EventBus.create(ComputeFov.class); + private final boolean usedConfiguredFov; private float fov; diff --git a/src/main/java/net/minecraftforge/client/event/sound/PlaySoundEvent.java b/src/main/java/net/minecraftforge/client/event/sound/PlaySoundEvent.java index e285340bce..c85f76aae4 100644 --- a/src/main/java/net/minecraftforge/client/event/sound/PlaySoundEvent.java +++ b/src/main/java/net/minecraftforge/client/event/sound/PlaySoundEvent.java @@ -7,11 +7,11 @@ package net.minecraftforge.client.event.sound; import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.client.sounds.SoundEngine; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * Fired when a sound is about to be played by the sound engine. This fires before the sound is played and before any @@ -19,7 +19,7 @@ import org.jetbrains.annotations.Nullable; * others). This can be used to change or prevent (by passing {@code null)} a sound from being played through * {@link #setSound(SoundInstance)}). * - *

    This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

    + *

    This event is not {@linkplain Cancellable cancellable}, and does not {@linkplain HasResult have a result}.

    * *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    @@ -27,16 +27,15 @@ import org.jetbrains.annotations.Nullable; * @see PlaySoundSourceEvent * @see PlayStreamingSourceEvent */ -public final class PlaySoundEvent extends SoundEvent -{ +public final class PlaySoundEvent extends SoundEvent { + public static final EventBus BUS = EventBus.create(PlaySoundEvent.class); + private final String name; private final SoundInstance originalSound; - @Nullable - private SoundInstance sound; + private @Nullable SoundInstance sound; @ApiStatus.Internal - public PlaySoundEvent(SoundEngine manager, SoundInstance sound) - { + public PlaySoundEvent(SoundEngine manager, SoundInstance sound) { super(manager); this.originalSound = sound; this.name = sound.getLocation().getPath(); @@ -46,16 +45,14 @@ public final class PlaySoundEvent extends SoundEvent /** * {@return the name of the original sound} This is equivalent to the path of the location of the original sound. */ - public String getName() - { + public String getName() { return name; } /** * {@return the original sound that was to be played} */ - public SoundInstance getOriginalSound() - { + public SoundInstance getOriginalSound() { return originalSound; } @@ -63,8 +60,7 @@ public final class PlaySoundEvent extends SoundEvent * {@return the sound to be played, or {@code null} if no sound will be played} */ @Nullable - public SoundInstance getSound() - { + public SoundInstance getSound() { return sound; } @@ -73,8 +69,7 @@ public final class PlaySoundEvent extends SoundEvent * * @param newSound the new sound to be played, or {@code null} for no sound */ - public void setSound(@Nullable SoundInstance newSound) - { + public void setSound(@Nullable SoundInstance newSound) { this.sound = newSound; } } diff --git a/src/main/java/net/minecraftforge/client/event/sound/PlaySoundSourceEvent.java b/src/main/java/net/minecraftforge/client/event/sound/PlaySoundSourceEvent.java index 00d512e929..34ca42c212 100644 --- a/src/main/java/net/minecraftforge/client/event/sound/PlaySoundSourceEvent.java +++ b/src/main/java/net/minecraftforge/client/event/sound/PlaySoundSourceEvent.java @@ -10,7 +10,7 @@ import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.client.sounds.SoundEngine; import net.minecraftforge.client.event.sound.SoundEvent.SoundSourceEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -26,11 +26,11 @@ import org.jetbrains.annotations.ApiStatus; * * @see PlayStreamingSourceEvent */ -public final class PlaySoundSourceEvent extends SoundSourceEvent -{ +public final class PlaySoundSourceEvent extends SoundSourceEvent { + public static final EventBus BUS = EventBus.create(PlaySoundSourceEvent.class); + @ApiStatus.Internal - public PlaySoundSourceEvent(SoundEngine engine, SoundInstance sound, Channel channel) - { + public PlaySoundSourceEvent(SoundEngine engine, SoundInstance sound, Channel channel) { super(engine, sound, channel); } } diff --git a/src/main/java/net/minecraftforge/client/event/sound/PlayStreamingSourceEvent.java b/src/main/java/net/minecraftforge/client/event/sound/PlayStreamingSourceEvent.java index 79f4f9f7f7..c671f628fa 100644 --- a/src/main/java/net/minecraftforge/client/event/sound/PlayStreamingSourceEvent.java +++ b/src/main/java/net/minecraftforge/client/event/sound/PlayStreamingSourceEvent.java @@ -10,7 +10,7 @@ import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.client.sounds.SoundEngine; import net.minecraftforge.client.event.sound.SoundEvent.SoundSourceEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -26,11 +26,11 @@ import org.jetbrains.annotations.ApiStatus; * * @see PlayStreamingSourceEvent */ -public final class PlayStreamingSourceEvent extends SoundSourceEvent -{ +public final class PlayStreamingSourceEvent extends SoundSourceEvent { + public static final EventBus BUS = EventBus.create(PlayStreamingSourceEvent.class); + @ApiStatus.Internal - public PlayStreamingSourceEvent(SoundEngine engine, SoundInstance sound, Channel channel) - { + public PlayStreamingSourceEvent(SoundEngine engine, SoundInstance sound, Channel channel) { super(engine, sound, channel); } } diff --git a/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java b/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java index bacf5ba33d..e2135344ad 100644 --- a/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java +++ b/src/main/java/net/minecraftforge/client/event/sound/SoundEngineLoadEvent.java @@ -6,7 +6,10 @@ package net.minecraftforge.client.event.sound; import net.minecraft.client.sounds.SoundEngine; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -16,16 +19,18 @@ import org.jetbrains.annotations.ApiStatus; * Fired when the {@link SoundEngine} is constructed or (re)loaded, such as during game initialization or when the sound * output device is changed. * - *

    This event is not {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}.

    + *

    This event is not {@linkplain Cancellable cancellable}, and does not {@linkplain HasResult have a result}.

    * *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}.

    */ -public final class SoundEngineLoadEvent extends SoundEvent implements IModBusEvent -{ +public final class SoundEngineLoadEvent extends SoundEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, SoundEngineLoadEvent.class); + } + @ApiStatus.Internal - public SoundEngineLoadEvent(SoundEngine manager) - { + public SoundEngineLoadEvent(SoundEngine manager) { super(manager); } } diff --git a/src/main/java/net/minecraftforge/client/event/sound/SoundEvent.java b/src/main/java/net/minecraftforge/client/event/sound/SoundEvent.java index e05ca365ef..98b46ad0f4 100644 --- a/src/main/java/net/minecraftforge/client/event/sound/SoundEvent.java +++ b/src/main/java/net/minecraftforge/client/event/sound/SoundEvent.java @@ -9,7 +9,9 @@ import net.minecraft.client.resources.sounds.SoundInstance; import net.minecraft.client.sounds.SoundEngine; import com.mojang.blaze3d.audio.Channel; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -23,21 +25,20 @@ import org.jetbrains.annotations.ApiStatus; * @see PlaySoundEvent * @see SoundEngineLoadEvent */ -public abstract class SoundEvent extends Event -{ +public abstract class SoundEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(SoundEvent.class); + private final SoundEngine engine; @ApiStatus.Internal - protected SoundEvent(SoundEngine engine) - { + protected SoundEvent(SoundEngine engine) { this.engine = engine; } /** * {@return the sound engine} */ - public SoundEngine getEngine() - { + public SoundEngine getEngine() { return engine; } @@ -50,15 +51,15 @@ public abstract class SoundEvent extends Event * @see PlaySoundSourceEvent * @see PlayStreamingSourceEvent */ - public static abstract class SoundSourceEvent extends SoundEvent - { + public static abstract class SoundSourceEvent extends SoundEvent { + public static final EventBus BUS = EventBus.create(SoundSourceEvent.class); + private final SoundInstance sound; private final Channel channel; private final String name; @ApiStatus.Internal - protected SoundSourceEvent(SoundEngine engine, SoundInstance sound, Channel channel) - { + protected SoundSourceEvent(SoundEngine engine, SoundInstance sound, Channel channel) { super(engine); this.name = sound.getLocation().getPath(); this.sound = sound; @@ -68,24 +69,21 @@ public abstract class SoundEvent extends Event /** * {@return the sound being played} */ - public SoundInstance getSound() - { + public SoundInstance getSound() { return sound; } /** * {@return the audio channel on which the sound is playing on} */ - public Channel getChannel() - { + public Channel getChannel() { return channel; } /** * {@return the name of the sound being played} This is equivalent to the path of the location of the original sound. */ - public String getName() - { + public String getName() { return name; } } diff --git a/src/main/java/net/minecraftforge/client/extensions/IForgeBlockModelPart.java b/src/main/java/net/minecraftforge/client/extensions/IForgeBlockModelPart.java new file mode 100644 index 0000000000..9752010def --- /dev/null +++ b/src/main/java/net/minecraftforge/client/extensions/IForgeBlockModelPart.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.client.extensions; + +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; + +public interface IForgeBlockModelPart { + /* + private BlockModelPart self() { + return (BlockModelPart)this; + } + */ + + default ChunkSectionLayer layer() { + return null; + } + + default ChunkSectionLayer layerFast() { + return null; + } +} diff --git a/src/main/java/net/minecraftforge/client/extensions/IForgeBlockStateModel.java b/src/main/java/net/minecraftforge/client/extensions/IForgeBlockStateModel.java index 63d13ec76d..2bf2670548 100644 --- a/src/main/java/net/minecraftforge/client/extensions/IForgeBlockStateModel.java +++ b/src/main/java/net/minecraftforge/client/extensions/IForgeBlockStateModel.java @@ -9,18 +9,19 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BlockModelPart; import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.ChunkRenderTypeSet; import net.minecraftforge.client.model.data.ModelData; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import java.util.Collection; import java.util.List; @SuppressWarnings("deprecation") @@ -29,7 +30,6 @@ public interface IForgeBlockStateModel { return (BlockStateModel)this; } - default @NotNull ModelData getModelData(@NotNull BlockAndTintGetter level, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull ModelData modelData) { return modelData; } @@ -44,8 +44,7 @@ public interface IForgeBlockStateModel { *

    * By default, defers query to {@link ItemBlockRenderTypes}. */ - @SuppressWarnings("removal") - default ChunkRenderTypeSet getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { + default Collection getRenderTypes(@NotNull BlockState state, @NotNull RandomSource rand, @NotNull ModelData data) { return ItemBlockRenderTypes.getRenderLayers(state); } @@ -54,7 +53,7 @@ public interface IForgeBlockStateModel { * Not all paths call this, or use a valid render type. So it is recommended to also implement a sane default in * the normal {@link BlockStateModel#collectParts(RandomSource, List)} method. */ - default List collectParts(RandomSource random, ModelData data, @Nullable RenderType renderType) { + default List collectParts(RandomSource random, ModelData data, @Nullable ChunkSectionLayer renderType) { List list = new ObjectArrayList<>(); this.collectParts(random, list, data, renderType); return list; @@ -65,7 +64,7 @@ public interface IForgeBlockStateModel { * Not all paths call this, or use a valid render type. So it is recommended to also implement a sane default in * the normal {@link BlockStateModel#collectParts(RandomSource, List)} method. */ - default void collectParts(RandomSource random, List dest, ModelData data, @Nullable RenderType renderType) { + default void collectParts(RandomSource random, List dest, ModelData data, @Nullable ChunkSectionLayer renderType) { self().collectParts(random, dest); } } diff --git a/src/main/java/net/minecraftforge/client/extensions/IForgeGuiGraphics.java b/src/main/java/net/minecraftforge/client/extensions/IForgeGuiGraphics.java index 846bffe623..111ce664dd 100644 --- a/src/main/java/net/minecraftforge/client/extensions/IForgeGuiGraphics.java +++ b/src/main/java/net/minecraftforge/client/extensions/IForgeGuiGraphics.java @@ -6,7 +6,7 @@ package net.minecraftforge.client.extensions; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.ResourceLocation; /** @@ -80,31 +80,31 @@ public interface IForgeGuiGraphics { // Draw Border // Top Left - self().blit(RenderType::guiTextured, texture, x, y, 0, u, v, leftBorder, topBorder, 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x, y, 0, u, v, leftBorder, topBorder, 256, 256); // Top Right - self().blit(RenderType::guiTextured, texture, x + leftBorder + canvasWidth, y, 0, u + leftBorder + fillerWidth, v, rightBorder, topBorder, 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x + leftBorder + canvasWidth, y, 0, u + leftBorder + fillerWidth, v, rightBorder, topBorder, 256, 256); // Bottom Left - self().blit(RenderType::guiTextured, texture, x, y + topBorder + canvasHeight, 0, u, v + topBorder + fillerHeight, leftBorder, bottomBorder, 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x, y + topBorder + canvasHeight, 0, u, v + topBorder + fillerHeight, leftBorder, bottomBorder, 256, 256); // Bottom Right - self().blit(RenderType::guiTextured, texture, x + leftBorder + canvasWidth, y + topBorder + canvasHeight, 0, u + leftBorder + fillerWidth, v + topBorder + fillerHeight, rightBorder, bottomBorder, 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x + leftBorder + canvasWidth, y + topBorder + canvasHeight, 0, u + leftBorder + fillerWidth, v + topBorder + fillerHeight, rightBorder, bottomBorder, 256, 256); for (int i = 0; i < xPasses + (remainderWidth > 0 ? 1 : 0); i++) { // Top Border - self().blit(RenderType::guiTextured, texture, x + leftBorder + (i * fillerWidth), y, 0, u + leftBorder, v, (i == xPasses ? remainderWidth : fillerWidth), topBorder, 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x + leftBorder + (i * fillerWidth), y, 0, u + leftBorder, v, (i == xPasses ? remainderWidth : fillerWidth), topBorder, 256, 256); // Bottom Border - self().blit(RenderType::guiTextured, texture, x + leftBorder + (i * fillerWidth), y + topBorder + canvasHeight, 0, u + leftBorder, v + topBorder + fillerHeight, (i == xPasses ? remainderWidth : fillerWidth), bottomBorder, 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x + leftBorder + (i * fillerWidth), y + topBorder + canvasHeight, 0, u + leftBorder, v + topBorder + fillerHeight, (i == xPasses ? remainderWidth : fillerWidth), bottomBorder, 256, 256); // Throw in some filler for good measure for (int j = 0; j < yPasses + (remainderHeight > 0 ? 1 : 0); j++) - self().blit(RenderType::guiTextured, texture, x + leftBorder + (i * fillerWidth), y + topBorder + (j * fillerHeight), 0, u + leftBorder, v + topBorder, (i == xPasses ? remainderWidth : fillerWidth), (j == yPasses ? remainderHeight : fillerHeight), 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x + leftBorder + (i * fillerWidth), y + topBorder + (j * fillerHeight), 0, u + leftBorder, v + topBorder, (i == xPasses ? remainderWidth : fillerWidth), (j == yPasses ? remainderHeight : fillerHeight), 256, 256); } // Side Borders for (int j = 0; j < yPasses + (remainderHeight > 0 ? 1 : 0); j++) { // Left Border - self().blit(RenderType::guiTextured, texture, x, y + topBorder + (j * fillerHeight), 0, u, v + topBorder, leftBorder, (j == yPasses ? remainderHeight : fillerHeight), 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x, y + topBorder + (j * fillerHeight), 0, u, v + topBorder, leftBorder, (j == yPasses ? remainderHeight : fillerHeight), 256, 256); // Right Border - self().blit(RenderType::guiTextured, texture, x + leftBorder + canvasWidth, y + topBorder + (j * fillerHeight), 0, u + leftBorder + fillerWidth, v + topBorder, rightBorder, (j == yPasses ? remainderHeight : fillerHeight), 256, 256); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x + leftBorder + canvasWidth, y + topBorder + (j * fillerHeight), 0, u + leftBorder + fillerWidth, v + topBorder, rightBorder, (j == yPasses ? remainderHeight : fillerHeight), 256, 256); } } @@ -123,7 +123,7 @@ public interface IForgeGuiGraphics { if (centerX) x += (w - boundsWidth) / 2; } - //self().blit(RenderType::guiTextured, texture, x, y, boundsWidth, boundsHeight, 0.0f,0.0f, rectWidth, rectHeight, rectWidth, rectHeight); - self().blit(RenderType::guiTextured, texture, x, y, 0.0f, 0.0f, boundsWidth, boundsHeight, boundsWidth, boundsHeight); + //self().blit(RenderPipelines.GUI_TEXTURED, texture, x, y, boundsWidth, boundsHeight, 0.0f,0.0f, rectWidth, rectHeight, rectWidth, rectHeight); + self().blit(RenderPipelines.GUI_TEXTURED, texture, x, y, 0.0f, 0.0f, boundsWidth, boundsHeight, boundsWidth, boundsHeight); } } diff --git a/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java b/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java index cd2f5dfa0e..3b521701c6 100644 --- a/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java +++ b/src/main/java/net/minecraftforge/client/extensions/common/IClientFluidTypeExtensions.java @@ -10,22 +10,23 @@ import java.util.function.Consumer; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.FogParameters; -import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.ScreenEffectRenderer; +import net.minecraft.client.renderer.fog.FogData; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.material.FogType; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; +import org.joml.Vector4f; /** * {@linkplain LogicalSide#CLIENT Client-only} extensions to {@link FluidType}. @@ -163,14 +164,8 @@ public interface IClientFluidTypeExtensions { /** * Modifies how the fog is currently being rendered when the camera is * within a fluid. - * - * @param camera the camera instance - * @param mode the type of fog being rendered - * @param renderDistance the render distance of the client - * @param partialTick the delta time of where the current frame is within a tick */ - default FogParameters modifyFogRender(Camera camera, FogRenderer.FogMode mode, float renderDistance, float partialTick, FogParameters original) { - return original; + default void modifyFogRender(Camera camera, FogType type, float partialTick, FogData data, Vector4f color) { } /* Level-Based Accessors */ diff --git a/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java b/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java index ee37fe8464..c47f22193d 100644 --- a/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java +++ b/src/main/java/net/minecraftforge/client/gui/LoadingErrorScreen.java @@ -78,8 +78,8 @@ public class LoadingErrorScreen extends ErrorScreen { private void drawMultiLineCenteredString(GuiGraphics guiGraphics, Font fr, Component str, int x, int y) { for (FormattedCharSequence s : fr.split(str, this.width)) { - guiGraphics.drawString(fr, s, (float) (x - fr.width(s) / 2.0), (float) y, 0xFFFFFF, true); - y+=fr.lineHeight; + guiGraphics.drawString(fr, s, x - fr.width(s) / 2, y, 0xFFFFFF); + y += fr.lineHeight; } } @@ -134,7 +134,7 @@ public class LoadingErrorScreen extends ErrorScreen { int y = top + 2; for (var string : strings) { if (center) - guiGraphics.drawString(font, string, left + (width / 2F) - (font.width(string) / 2F), y, 0xFFFFFF, false); + guiGraphics.drawString(font, string, left + (width / 2) - (font.width(string) / 2), y, 0xFFFFFF, false); else guiGraphics.drawString(font, string, left + 5, y, 0xFFFFFF, false); y += font.lineHeight; diff --git a/src/main/java/net/minecraftforge/client/gui/ModListScreen.java b/src/main/java/net/minecraftforge/client/gui/ModListScreen.java index 5abbe9e39f..be0a3828d7 100644 --- a/src/main/java/net/minecraftforge/client/gui/ModListScreen.java +++ b/src/main/java/net/minecraftforge/client/gui/ModListScreen.java @@ -24,8 +24,6 @@ import net.minecraftforge.client.gui.widget.ScrollPanel; import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; import org.apache.maven.artifact.versioning.ComparableVersion; -import com.mojang.blaze3d.systems.RenderSystem; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; @@ -38,6 +36,7 @@ import net.minecraft.client.gui.components.StringWidget; import net.minecraft.client.renderer.texture.DynamicTexture; import com.mojang.blaze3d.platform.NativeImage; import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.util.ARGB; import net.minecraft.util.FormattedCharSequence; import net.minecraft.resources.ResourceLocation; import net.minecraft.Util; @@ -164,7 +163,7 @@ public class ModListScreen extends Screen { @Override protected void drawPanel(GuiGraphics guiGraphics, int entryRight, int relativeY, int mouseX, int mouseY) { if (logoPath != null) { - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + //RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); // Draw the logo image inscribed in a rectangle with width entryWidth (minus some padding) and height 50 int headerHeight = 50; guiGraphics.blitInscribed(logoPath, left + PADDING, relativeY, width - (PADDING * 2), headerHeight, logoDims.width(), logoDims.height(), false, true); @@ -173,7 +172,7 @@ public class ModListScreen extends Screen { for (FormattedCharSequence line : lines) { if (line != null) - guiGraphics.drawString(ModListScreen.this.font, line, left + PADDING, relativeY, 0xFFFFFF); + guiGraphics.drawString(ModListScreen.this.font, line, left + PADDING, relativeY, ARGB.white(1)); relativeY += font.lineHeight; } diff --git a/src/main/java/net/minecraftforge/client/gui/TitleScreenModUpdateIndicator.java b/src/main/java/net/minecraftforge/client/gui/TitleScreenModUpdateIndicator.java index 2a8b3d2167..688df71537 100644 --- a/src/main/java/net/minecraftforge/client/gui/TitleScreenModUpdateIndicator.java +++ b/src/main/java/net/minecraftforge/client/gui/TitleScreenModUpdateIndicator.java @@ -8,7 +8,7 @@ package net.minecraftforge.client.gui; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -49,7 +49,7 @@ public class TitleScreenModUpdateIndicator extends Screen { int w = modButton.getWidth(); int h = modButton.getHeight(); - guiGraphics.blit(RenderType::guiTextured, VERSION_CHECK_ICONS, x + w - (h / 2 + 4), y + (h / 2 - 4), showNotification.getSheetOffset() * 8, (showNotification.isAnimated() && ((System.currentTimeMillis() / 800 & 1) == 1)) ? 8 : 0, 8, 8, 64, 16); + guiGraphics.blit(RenderPipelines.GUI_TEXTURED, VERSION_CHECK_ICONS, x + w - (h / 2 + 4), y + (h / 2 - 4), showNotification.getSheetOffset() * 8, (showNotification.isAnimated() && ((System.currentTimeMillis() / 800 & 1) == 1)) ? 8 : 0, 8, 8, 64, 16); } public static TitleScreenModUpdateIndicator init(TitleScreen guiMainMenu, Button modButton) { diff --git a/src/main/java/net/minecraftforge/client/gui/widget/ExtendedButton.java b/src/main/java/net/minecraftforge/client/gui/widget/ExtendedButton.java index 93cea39850..1ecc4fd5be 100644 --- a/src/main/java/net/minecraftforge/client/gui/widget/ExtendedButton.java +++ b/src/main/java/net/minecraftforge/client/gui/widget/ExtendedButton.java @@ -8,7 +8,7 @@ package net.minecraftforge.client.gui.widget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; @@ -40,7 +40,7 @@ public class ExtendedButton extends Button { @Override public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { Minecraft mc = Minecraft.getInstance(); - guiGraphics.blitSprite(RenderType::guiTextured, SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight()); + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight()); final FormattedText buttonText = mc.font.ellipsize(this.getMessage(), this.width - 6); // Remove 6 pixels so that the text is always contained within the button's borders guiGraphics.drawCenteredString(mc.font, Language.getInstance().getVisualOrder(buttonText), this.getX() + this.width / 2, this.getY() + (this.height - 8) / 2, getFGColor()); diff --git a/src/main/java/net/minecraftforge/client/gui/widget/ForgeSlider.java b/src/main/java/net/minecraftforge/client/gui/widget/ForgeSlider.java index feb90d75c2..14f3e4d821 100644 --- a/src/main/java/net/minecraftforge/client/gui/widget/ForgeSlider.java +++ b/src/main/java/net/minecraftforge/client/gui/widget/ForgeSlider.java @@ -8,7 +8,7 @@ package net.minecraftforge.client.gui.widget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractSliderButton; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.network.chat.Component; import net.minecraft.util.Mth; import org.lwjgl.glfw.GLFW; @@ -197,8 +197,8 @@ public class ForgeSlider extends AbstractSliderButton { @Override public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick) { final Minecraft mc = Minecraft.getInstance(); - guiGraphics.blitSprite(RenderType::guiTextured, this.getSprite(), this.getX(), this.getY(), this.getWidth(), this.getHeight()); - guiGraphics.blitSprite(RenderType::guiTextured, this.getHandleSprite(), this.getX() + (int)(this.value * (double)(this.width - 8)), this.getY(), 8, this.getHeight()); + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, this.getSprite(), this.getX(), this.getY(), this.getWidth(), this.getHeight()); + guiGraphics.blitSprite(RenderPipelines.GUI_TEXTURED, this.getHandleSprite(), this.getX() + (int)(this.value * (double)(this.width - 8)), this.getY(), 8, this.getHeight()); renderScrollingString(guiGraphics, mc.font, 2, getFGColor() | Mth.ceil(this.alpha * 255.0F) << 24); } diff --git a/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java b/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java index a1c7694866..581153ebbc 100644 --- a/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java +++ b/src/main/java/net/minecraftforge/client/gui/widget/ModListWidget.java @@ -8,7 +8,7 @@ package net.minecraftforge.client.gui.widget; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; @@ -19,8 +19,6 @@ import net.minecraftforge.common.util.MavenVersionStringHelper; import net.minecraftforge.fml.VersionChecker; import net.minecraftforge.forgespi.language.IModInfo; -import com.mojang.blaze3d.systems.RenderSystem; - public class ModListWidget extends ObjectSelectionList { private static String stripControlCodes(String value) { return net.minecraft.util.StringUtil.stripColor(value); } private static final ResourceLocation VERSION_CHECK_ICONS = ResourceLocation.fromNamespaceAndPath(ForgeVersion.MOD_ID, "textures/gui/version_check_icons.png"); @@ -80,14 +78,13 @@ public class ModListWidget extends ObjectSelectionList { VersionChecker.CheckResult vercheck = VersionChecker.getResult(modInfo); Font font = this.parent.getFontRenderer(); var barOffset = ModListWidget.this.scrollbarVisible() ? 6 : 0; - guiGraphics.drawString(font, Language.getInstance().getVisualOrder(FormattedText.composite(font.substrByWidth(name, listWidth - 6 - barOffset))), left + 3, top + 2, 0xFFFFFF, false); - guiGraphics.drawString(font, Language.getInstance().getVisualOrder(FormattedText.composite(font.substrByWidth(version, listWidth - 6 - barOffset))), left + 3, top + 2 + font.lineHeight, 0xCCCCCC, false); + guiGraphics.drawString(font, Language.getInstance().getVisualOrder(FormattedText.composite(font.substrByWidth(name, listWidth - 6 - barOffset))), left + 3, top + 2, 0xFFFFFFFF, false); + guiGraphics.drawString(font, Language.getInstance().getVisualOrder(FormattedText.composite(font.substrByWidth(version, listWidth - 6 - barOffset))), left + 3, top + 2 + font.lineHeight, 0xFFCCCCCC, false); if (vercheck.status().shouldDraw()) { //TODO: [Forge][ModList] Consider adding more icons for visualization - RenderSystem.setShaderColor(1, 1, 1, 1); - guiGraphics.pose().pushPose(); - guiGraphics.blit(RenderType::guiTextured, VERSION_CHECK_ICONS, getX() + width - 12 - barOffset, top + entryHeight / 4, vercheck.status().getSheetOffset() * 8, (vercheck.status().isAnimated() && ((System.currentTimeMillis() / 800 & 1)) == 1) ? 8 : 0, 8, 8, 64, 16); - guiGraphics.pose().popPose(); + guiGraphics.pose().pushMatrix(); + guiGraphics.blit(RenderPipelines.GUI_TEXTURED, VERSION_CHECK_ICONS, getX() + width - 12 - barOffset, top + entryHeight / 4, vercheck.status().getSheetOffset() * 8, (vercheck.status().isAnimated() && ((System.currentTimeMillis() / 800 & 1)) == 1) ? 8 : 0, 8, 8, 64, 16); + guiGraphics.pose().popMatrix(); } } diff --git a/src/main/java/net/minecraftforge/client/gui/widget/ScrollPanel.java b/src/main/java/net/minecraftforge/client/gui/widget/ScrollPanel.java index fb7d9da457..96bcd8ddeb 100644 --- a/src/main/java/net/minecraftforge/client/gui/widget/ScrollPanel.java +++ b/src/main/java/net/minecraftforge/client/gui/widget/ScrollPanel.java @@ -11,8 +11,6 @@ import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; -import net.minecraft.client.renderer.RenderType; - import java.util.Collections; import java.util.List; @@ -264,24 +262,29 @@ public abstract class ScrollPanel extends AbstractContainerEventHandler implemen if (barTop < this.top) barTop = this.top; + guiGraphics.fill(barLeft, this.top, barLeft + barWidth, this.bottom, barBgColor); + guiGraphics.fill(barLeft, barTop, barLeft + barWidth, barTop + barHeight, barColor); + guiGraphics.fill(barLeft, barTop + barHeight - 1, barLeft + barWidth - 1, barTop, barBorderColor); + /* var source = guiGraphics.getBufferSource(); - var buf = source.getBuffer(RenderType.gui()); + var buf = source.getBuffer(RenderPipelines.GUI); buf.addVertex(barLeft, this.bottom, 0.0F).setColor(barBgColor); buf.addVertex(barLeft + barWidth, this.bottom, 0.0F).setColor(barBgColor); buf.addVertex(barLeft + barWidth, this.top, 0.0F).setColor(barBgColor); buf.addVertex(barLeft, this.top, 0.0F).setColor(barBgColor); - buf = source.getBuffer(RenderType.gui()); + buf = source.getBuffer(RenderPipelines.GUI); buf.addVertex(barLeft, barTop + barHeight, 0.0F).setColor(barColor); buf.addVertex(barLeft + barWidth, barTop + barHeight, 0.0F).setColor(barColor); buf.addVertex(barLeft + barWidth, barTop, 0.0F).setColor(barColor); buf.addVertex(barLeft, barTop, 0.0F).setColor(barColor); - buf = source.getBuffer(RenderType.gui()); + buf = source.getBuffer(RenderPipelines.GUI); buf.addVertex(barLeft, barTop + barHeight - 1, 0.0F).setColor(barBorderColor); buf.addVertex(barLeft + barWidth - 1, barTop + barHeight - 1, 0.0F).setColor(barBorderColor); buf.addVertex(barLeft + barWidth - 1, barTop, 0.0F).setColor(barBorderColor); buf.addVertex(barLeft, barTop, 0.0F).setColor(barBorderColor); + */ } } diff --git a/src/main/java/net/minecraftforge/client/loading/ClientModLoader.java b/src/main/java/net/minecraftforge/client/loading/ClientModLoader.java index 55c32f70b4..5a743db64d 100644 --- a/src/main/java/net/minecraftforge/client/loading/ClientModLoader.java +++ b/src/main/java/net/minecraftforge/client/loading/ClientModLoader.java @@ -14,6 +14,7 @@ import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.world.level.DataPackConfig; import net.minecraftforge.event.AddPackFindersEvent; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.*; import net.minecraftforge.fml.loading.ImmediateWindowHandler; import net.minecraftforge.internal.BrandingControl; @@ -106,16 +107,14 @@ public class ClientModLoader { } File dumpedLocation = null; - if (error == null) { - // We can finally start the forge eventbus up - MinecraftForge.EVENT_BUS.start(); - } else { + if (error != null) { // Double check we have the langs loaded for forge LanguageHook.loadForgeAndMCLangs(); dumpedLocation = CrashReportExtender.dumpModLoadingCrashReport(LOGGER, error, mc.gameDirectory); } if (error != null || !warnings.isEmpty()) { + BusGroup.DEFAULT.shutdown(); mc.setScreen(new LoadingErrorScreen(error, warnings, dumpedLocation)); return true; } diff --git a/src/main/java/net/minecraftforge/client/loading/ForgeLoadingOverlay.java b/src/main/java/net/minecraftforge/client/loading/ForgeLoadingOverlay.java index 07bf48c033..3471617faa 100644 --- a/src/main/java/net/minecraftforge/client/loading/ForgeLoadingOverlay.java +++ b/src/main/java/net/minecraftforge/client/loading/ForgeLoadingOverlay.java @@ -12,6 +12,7 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.LoadingOverlay; import net.minecraft.client.renderer.RenderType; import net.minecraft.server.packs.resources.ReloadInstance; +import net.minecraft.util.ARGB; import net.minecraft.util.Mth; import net.minecraftforge.client.ForgeRenderTypes; import net.minecraftforge.fml.StartupMessageManager; @@ -33,7 +34,7 @@ import java.util.function.Supplier; * It is somewhat a copy of the superclass render method. */ public class ForgeLoadingOverlay extends LoadingOverlay { - private static final boolean ENABLE = Boolean.parseBoolean("forge.enableForgeLoadingOverlay"); + private static final boolean ENABLE = false; //Boolean.parseBoolean("forge.enableForgeLoadingOverlay"); private final Minecraft minecraft; private final ReloadInstance reload; private final DisplayWindow displayWindow; @@ -60,6 +61,10 @@ public class ForgeLoadingOverlay extends LoadingOverlay { protected boolean renderContents(GuiGraphics gui, float fade) { if (!ENABLE) return true; + /* This should render the framebuffer but it doesnt work in 1.21.6's rendering changes. + * The proper way to fix this is to just kill off the display window when Vanilla gets to this phase, and render our extra elements normally. + * TODO: [Forge][Rendering] Render only out elements from the loading screen + * progress.setAbsolute(Mth.clamp((int)(this.reload.getActualProgress() * 100f), 0, 100)); int alpha = (int)(fade * 255); @@ -72,39 +77,12 @@ public class ForgeLoadingOverlay extends LoadingOverlay { var fbHeight = this.minecraft.getWindow().getHeight(); GL30C.glViewport(0, 0, fbWidth, fbHeight); - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, fade); - Matrix4f pos = gui.pose().last().pose(); - /* - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA); - RenderSystem.setShader(CoreShaders.POSITION_TEX_COLOR); - RenderSystem.setShaderTexture(0, displayWindow.getFramebufferTextureId()); - GL30C.glTexParameterIi(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_NEAREST); - GL30C.glTexParameterIi(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_NEAREST); - */ - var buf = gui.getBufferSource().getBuffer(earlyBuffer); buf.addVertex(pos, 0, 0, 0f).setUv(0, 0).setColor(1f, 1f, 1f, fade); buf.addVertex(pos, 0, height, 0f).setUv(0, 1).setColor(1f, 1f, 1f, fade); buf.addVertex(pos, width, height, 0f).setUv(1, 1).setColor(1f, 1f, 1f, fade); buf.addVertex(pos, width, 0, 0f).setUv(1, 0).setColor(1f, 1f, 1f, fade); - /* - BufferUploader.drawWithShader(buf.buildOrThrow()); - - // I dont know what exactly this does, but without it the screen flickers black. - // So as a hack we just render the mojang logo as a 0x0 cube - // TODO: Remove this when early screen is re-written to not be a texture based renderer - var logo = gui.getBufferSource().getBuffer(RenderType.mojangLogo()); - logo.addVertex(pos, 0, 0, 0f).setUv(0, 0).setColor(1f, 1f, 1f, fade); - logo.addVertex(pos, 0, 0, 0f).setUv(0, 1).setColor(1f, 1f, 1f, fade); - logo.addVertex(pos, 0, 0, 0f).setUv(1, 1).setColor(1f, 1f, 1f, fade); - logo.addVertex(pos, 0, 0, 0f).setUv(1, 0).setColor(1f, 1f, 1f, fade); - - - RenderSystem.defaultBlendFunc(); - RenderSystem.disableBlend(); */ - RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1f); return false; } diff --git a/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java b/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java index 1e7c35eb41..ce057c7273 100644 --- a/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java +++ b/src/main/java/net/minecraftforge/client/model/DynamicFluidContainerModel.java @@ -8,8 +8,8 @@ package net.minecraftforge.client.model; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; import com.mojang.math.Transformation; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.TextureSlots; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.Material; @@ -61,7 +61,7 @@ public class DynamicFluidContainerModel implements UnbakedGeometry { } public static RenderTypeGroup getLayerRenderTypes(boolean unlit) { - return new RenderTypeGroup(RenderType.translucent(), unlit ? ForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get() : ForgeRenderTypes.ITEM_UNSORTED_TRANSLUCENT.get()); + return new RenderTypeGroup(ChunkSectionLayer.TRANSLUCENT, unlit ? ForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get() : ForgeRenderTypes.ITEM_UNSORTED_TRANSLUCENT.get()); } @SuppressWarnings("deprecation") diff --git a/src/main/java/net/minecraftforge/client/model/data/ModelDataManager.java b/src/main/java/net/minecraftforge/client/model/data/ModelDataManager.java index 2598ef35a6..ab0473e887 100644 --- a/src/main/java/net/minecraftforge/client/model/data/ModelDataManager.java +++ b/src/main/java/net/minecraftforge/client/model/data/ModelDataManager.java @@ -13,7 +13,7 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.level.ChunkEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import org.jetbrains.annotations.ApiStatus; diff --git a/src/main/java/net/minecraftforge/client/model/obj/ObjLoader.java b/src/main/java/net/minecraftforge/client/model/obj/ObjLoader.java index f772990695..0f804f2142 100644 --- a/src/main/java/net/minecraftforge/client/model/obj/ObjLoader.java +++ b/src/main/java/net/minecraftforge/client/model/obj/ObjLoader.java @@ -8,7 +8,6 @@ package net.minecraftforge.client.model.obj; import com.google.common.collect.Maps; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.TextureSlots; import net.minecraft.client.resources.model.ModelBaker; @@ -21,12 +20,10 @@ import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraft.util.GsonHelper; -import net.minecraftforge.client.model.IModelBuilder; import net.minecraftforge.client.model.geometry.IGeometryBakingContext; import net.minecraftforge.client.model.geometry.IGeometryLoader; import net.minecraftforge.client.model.geometry.StandaloneGeometryBakingContext; -import java.io.FileNotFoundException; import java.util.Map; /** diff --git a/src/main/java/net/minecraftforge/common/EventBusMigrationHelper.java b/src/main/java/net/minecraftforge/common/EventBusMigrationHelper.java new file mode 100644 index 0000000000..b188baef58 --- /dev/null +++ b/src/main/java/net/minecraftforge/common/EventBusMigrationHelper.java @@ -0,0 +1,127 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.common; + +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.listener.EventListener; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; +import net.minecraftforge.unsafe.UnsafeHacks; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandles.Lookup; +import java.util.Collection; + +/** + * A small helper class to aid Forge modders in migrating from EventBus 6 to the new EventBus 7. + *
    + * Refer to the migration guide mentioned in the Forge 1.21.6 announcement or ask in the Forge Discord for help with + * migrating your mod to the new system. + */ +public final class EventBusMigrationHelper { + public static final EventBusMigrationHelper INSTANCE = new EventBusMigrationHelper(BusGroup.DEFAULT); + + private final BusGroup group; + + public EventBusMigrationHelper(BusGroup group) { + this.group = group; + } + + /** + * A version of {@link BusGroup#register(Lookup, Class)} that doesn't require a lookup. It is strongly recommended + * to use the BusGroup method directly with {@code MethodHandles.lookup()} as the first argument, as this migration + * helper method relies on JDK internals that may break without notice. + * @param clazz the class containing static event listener methods that you want to register. + * @return a collection of {@link EventListener} instances that were registered, can be passed to + * {@link BusGroup#unregister(Collection)} to unregister them later. + * @see BusGroup#register(Lookup, Class) + */ + public Collection register(Class clazz) { + return registerListeners(group, clazz); + } + + /** + * A version of {@link BusGroup#register(Lookup, Object)} that doesn't require a lookup. It is strongly recommended + * to use the BusGroup method directly with {@code MethodHandles.lookup()} as the first argument, as this migration + * helper method relies on JDK internals that may break without notice. + * @param instance the instance of a class containing instance and static event listener methods that you want to register. + * @return a collection of {@link EventListener} instances that were registered, can be passed to + * {@link BusGroup#unregister(Collection)} to unregister them later. + * @see BusGroup#register(Lookup, Object) + */ + public Collection register(Object instance) { + return registerListeners(group, instance); + } + + private static Collection registerListeners(BusGroup group, Object instance) { + final class DodgyLookup { + private DodgyLookup() {} + private static final Lookup INSTANCE; + static { + try { + var lookupField = Lookup.class.getDeclaredField("IMPL_LOOKUP"); + UnsafeHacks.setAccessible(lookupField); + INSTANCE = (Lookup) lookupField.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + + if (instance.getClass() == Class.class) { + Class clazz = (Class) instance; + return group.register(DodgyLookup.INSTANCE.in(clazz), clazz); + } else { + return group.register(DodgyLookup.INSTANCE.in(instance.getClass()), instance); + } + } + + + /** + * The unique name of this BusGroup. + */ + public String name() { + return group.name(); + } + + /** + * Registers all static methods annotated with {@link SubscribeEvent} in the given class. + * + * @param callerLookup {@code MethodHandles.lookup()} from the class containing listeners + * @param utilityClassWithStaticListeners the class containing the static listeners + * @return A collection of the registered listeners, which can be used to optionally unregister them later + * + * @apiNote This method only registers static listeners. + *

    If you want to register both instance and static methods, use + * {@link BusGroup#register(MethodHandles.Lookup, Object)} instead.

    + */ + public Collection register(MethodHandles.Lookup callerLookup, Class utilityClassWithStaticListeners) { + return group.register(callerLookup, utilityClassWithStaticListeners); + } + + /** + * Registers all methods annotated with {@link SubscribeEvent} in the given object. + * + * @param callerLookup {@code MethodHandles.lookup()} from the class containing the listeners + * @param listener the object containing the static and/or instance listeners + * @return A collection of the registered listeners, which can be used to optionally unregister them later + * + * @apiNote If you know all the listeners are static methods, use + * {@link BusGroup#register(MethodHandles.Lookup, Class)} instead for better registration performance. + */ + public Collection register(MethodHandles.Lookup callerLookup, Object listener) { + return group.register(callerLookup, listener); + } + + /** + * Unregisters the given listeners from this BusGroup. + * @param listeners A collection of listeners to unregister, obtained from + * {@link #register(Class)} or {@link #register(Object)} + * {@link #register(MethodHandles.Lookup, Class)} or {@link #register(MethodHandles.Lookup, Object)} + */ + public void unregister(Collection listeners) { + group.unregister(listeners); + } +} diff --git a/src/main/java/net/minecraftforge/common/ForgeConfig.java b/src/main/java/net/minecraftforge/common/ForgeConfig.java index 42bbbcaf1b..d1f19b544c 100644 --- a/src/main/java/net/minecraftforge/common/ForgeConfig.java +++ b/src/main/java/net/minecraftforge/common/ForgeConfig.java @@ -5,7 +5,6 @@ package net.minecraftforge.common; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.Logging; import net.minecraftforge.fml.event.config.ModConfigEvent; import org.apache.commons.lang3.tuple.Pair; @@ -16,7 +15,7 @@ import net.minecraftforge.common.ForgeConfigSpec.ConfigValue; import org.apache.logging.log4j.Logger; public class ForgeConfig { - private static final Logger LOGGER = LogManager.getLogger(); + static final Logger LOGGER = LogManager.getLogger(); public static class Server { public final BooleanValue removeErroringBlockEntities; @@ -152,13 +151,11 @@ public class ForgeConfig { SERVER = specPair.getLeft(); } - @SubscribeEvent - public static void onLoad(final ModConfigEvent.Loading configEvent) { + static void onLoad(final ModConfigEvent.Loading configEvent) { LOGGER.debug(Logging.FORGEMOD, "Loaded forge config file {}", configEvent.getConfig().getFileName()); } - @SubscribeEvent - public static void onFileChange(final ModConfigEvent.Reloading configEvent) { + static void onFileChange(final ModConfigEvent.Reloading configEvent) { LOGGER.debug(Logging.FORGEMOD, "Forge config just got changed on the file system!"); } diff --git a/src/main/java/net/minecraftforge/common/ForgeHooks.java b/src/main/java/net/minecraftforge/common/ForgeHooks.java index 2e7509ed2b..ccb89c46ca 100644 --- a/src/main/java/net/minecraftforge/common/ForgeHooks.java +++ b/src/main/java/net/minecraftforge/common/ForgeHooks.java @@ -127,11 +127,7 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraftforge.common.crafting.conditions.ConditionCodec; import net.minecraftforge.common.crafting.conditions.ICondition; import net.minecraftforge.common.crafting.ingredients.IIngredientSerializer; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.common.util.BrainBuilder; -import net.minecraftforge.common.util.Lazy; -import net.minecraftforge.common.util.MavenVersionStringHelper; -import net.minecraftforge.common.util.MutableHashedLinkedMap; +import net.minecraftforge.common.util.*; import net.minecraftforge.entity.IEntityAdditionalSpawnData; import net.minecraftforge.event.AnvilUpdateEvent; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; @@ -157,11 +153,11 @@ import net.minecraftforge.event.entity.player.AttackEntityEvent; import net.minecraftforge.event.entity.player.CriticalHitEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.living.LivingGetProjectileEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.NoteBlockEvent; import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.network.CustomPayloadEvent; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModList; @@ -215,7 +211,7 @@ public final class ForgeHooks { private ForgeHooks() {} public static void fireLightingCalculatedEvent(ChunkAccess chunk) { - MinecraftForge.EVENT_BUS.post(new ChunkEvent.LightingCalculated(chunk)); + ChunkEvent.LightingCalculated.BUS.post(new ChunkEvent.LightingCalculated(chunk)); } public static boolean canContinueUsing(@NotNull ItemStack from, @NotNull ItemStack to) { @@ -233,37 +229,39 @@ public final class ForgeHooks { } public static Brain onLivingMakeBrain(LivingEntity entity, Brain originalBrain, Dynamic dynamic) { + if (!LivingMakeBrainEvent.BUS.hasListeners()) + return originalBrain; + BrainBuilder brainBuilder = originalBrain.createBuilder(); - LivingMakeBrainEvent event = new LivingMakeBrainEvent(entity, brainBuilder); - MinecraftForge.EVENT_BUS.post(event); + LivingMakeBrainEvent.BUS.post(new LivingMakeBrainEvent(entity, brainBuilder)); return brainBuilder.makeBrain(dynamic); } public static boolean onLivingAttack(LivingEntity entity, DamageSource src, float amount) { - return entity instanceof Player || !MinecraftForge.EVENT_BUS.post(new LivingAttackEvent(entity, src, amount)); + return entity instanceof Player || !LivingAttackEvent.BUS.post(new LivingAttackEvent(entity, src, amount)); } public static boolean onPlayerAttack(LivingEntity entity, DamageSource src, float amount) { - return !MinecraftForge.EVENT_BUS.post(new LivingAttackEvent(entity, src, amount)); + return !LivingAttackEvent.BUS.post(new LivingAttackEvent(entity, src, amount)); } public static boolean onLivingUseTotem(LivingEntity entity, DamageSource damageSource, ItemStack totem, InteractionHand hand) { - return !MinecraftForge.EVENT_BUS.post(new LivingUseTotemEvent(entity, damageSource, totem, hand)); + return !LivingUseTotemEvent.BUS.post(new LivingUseTotemEvent(entity, damageSource, totem, hand)); } public static float onLivingHurt(LivingEntity entity, DamageSource src, float amount) { LivingHurtEvent event = new LivingHurtEvent(entity, src, amount); - return (MinecraftForge.EVENT_BUS.post(event) ? 0 : event.getAmount()); + return LivingHurtEvent.BUS.post(event) ? 0 : event.getAmount(); } public static float onLivingDamage(LivingEntity entity, DamageSource src, float amount) { LivingDamageEvent event = new LivingDamageEvent(entity, src, amount); - return (MinecraftForge.EVENT_BUS.post(event) ? 0 : event.getAmount()); + return LivingDamageEvent.BUS.post(event) ? 0 : event.getAmount(); } public static InteractionResult onInteractEntityAt(Entity entity, Player player, Vec3 vec3d, InteractionHand hand) { - var ret = ForgeEventFactory.onEntityInteractSpecific(player, entity, hand, vec3d); - if (ret.isCanceled()) + var ret = new PlayerInteractEvent.EntityInteractSpecific(player, hand, entity, vec3d); + if (PlayerInteractEvent.EntityInteractSpecific.BUS.post(ret)) return ret.getCancellationResult(); return entity.interactAt(player, vec3d, hand); } @@ -281,7 +279,7 @@ public final class ForgeHooks { public static double getEntityVisibilityMultiplier(LivingEntity entity, Entity lookingEntity, double originalMultiplier){ LivingEvent.LivingVisibilityEvent event = new LivingEvent.LivingVisibilityEvent(entity, lookingEntity, originalMultiplier); - MinecraftForge.EVENT_BUS.post(event); + LivingEvent.LivingVisibilityEvent.BUS.post(event); return Math.max(0,event.getVisibilityModifier()); } @@ -310,33 +308,33 @@ public final class ForgeHooks { } public static void onLivingJump(LivingEntity entity) { - MinecraftForge.EVENT_BUS.post(new LivingJumpEvent(entity)); + LivingJumpEvent.BUS.post(new LivingJumpEvent(entity)); } @SuppressWarnings("resource") @Nullable public static ItemEntity onPlayerTossEvent(@NotNull Player player, @NotNull ItemStack item, boolean includeName) { - player.captureDrops(Lists.newArrayList()); + player.captureDrops(new ArrayList<>()); ItemEntity ret = player.drop(item, false, includeName); player.captureDrops(null); if (ret == null) return null; - ItemTossEvent event = new ItemTossEvent(ret, player); - if (MinecraftForge.EVENT_BUS.post(event)) + var event = new ItemTossEvent(ret, player); + if (ItemTossEvent.BUS.post(event)) return null; if (!player.level().isClientSide) - player.getCommandSenderWorld().addFreshEntity(event.getEntity()); + player.level().addFreshEntity(event.getEntity()); return event.getEntity(); } @Nullable public static Component onServerChatSubmittedEvent(ServerPlayer player, Component message) { var plain = message.getContents() instanceof LiteralContents literalContents ? literalContents.text() : ""; - ServerChatEvent event = new ServerChatEvent(player, plain, message); - return MinecraftForge.EVENT_BUS.post(event) ? null : event.getMessage(); + var event = new ServerChatEvent(player, plain, message); + return ServerChatEvent.BUS.post(event) ? null : event.getMessage(); } static final Pattern URL_PATTERN = Pattern.compile( @@ -439,12 +437,11 @@ public final class ForgeHooks { level.sendBlockUpdated(pos, state, state, 3); } - var event = new BlockEvent.BreakEvent(level, pos, state, entityPlayer); - event.setCanceled(preCancelEvent); - MinecraftForge.EVENT_BUS.post(event); + var event = new BlockEvent.BreakEvent(level, pos, state, entityPlayer, preCancelEvent ? Result.DENY : Result.DEFAULT); + var eventIsDenied = BlockEvent.BreakEvent.BUS.fire(event).getResult().isDenied(); - // Handle if the event is canceled - if (event.isCanceled()) { + // Handle if the event is cancelled + if (eventIsDenied) { // Let the client know the block still exists entityPlayer.connection.send(new ClientboundBlockUpdatePacket(level, pos)); @@ -456,7 +453,7 @@ public final class ForgeHooks { entityPlayer.connection.send(pkt); } } - return event.isCanceled() ? -1 : event.getExpToDrop(); + return eventIsDenied ? -1 : event.getExpToDrop(); } public static InteractionResult onPlaceItemIntoWorld(@NotNull UseOnContext context) { @@ -494,12 +491,12 @@ public final class ForgeHooks { if (blockSnapshots.size() > 1) eventResult = ForgeEventFactory.onMultiBlockPlace(player, blockSnapshots, side); else if (blockSnapshots.size() == 1) - eventResult = ForgeEventFactory.onBlockPlace(player, blockSnapshots.get(0), side); + eventResult = ForgeEventFactory.onBlockPlace(player, blockSnapshots.getFirst(), side); if (eventResult) { ret = InteractionResult.FAIL; // cancel placement // revert back all captured blocks - for (BlockSnapshot blocksnapshot : Lists.reverse(blockSnapshots)) { + for (BlockSnapshot blocksnapshot : blockSnapshots.reversed()) { level.restoringBlockSnapshots = true; blocksnapshot.restore(true, false); level.restoringBlockSnapshots = false; @@ -527,7 +524,7 @@ public final class ForgeHooks { public static boolean onAnvilChange(AnvilMenu container, @NotNull ItemStack left, @NotNull ItemStack right, Container outputSlot, String name, long baseCost, Player player) { AnvilUpdateEvent e = new AnvilUpdateEvent(left, right, name, baseCost, player); - if (MinecraftForge.EVENT_BUS.post(e)) return false; + if (AnvilUpdateEvent.BUS.post(e)) return false; if (e.getOutput().isEmpty()) return true; outputSlot.setItem(0, e.getOutput()); @@ -539,8 +536,8 @@ public final class ForgeHooks { public static boolean onGrindstoneTake(Container inputSlots, ContainerLevelAccess access, Function xpFunction) { access.execute((l,p) -> { int xp = xpFunction.apply(l); - GrindstoneEvent.OnTakeItem e = new GrindstoneEvent.OnTakeItem(inputSlots.getItem(0), inputSlots.getItem(1), xp); - if (MinecraftForge.EVENT_BUS.post(e)) + var e = new GrindstoneEvent.OnTakeItem(inputSlots.getItem(0), inputSlots.getItem(1), xp); + if (GrindstoneEvent.OnTakeItem.BUS.post(e)) return; if (l instanceof ServerLevel server) @@ -578,14 +575,14 @@ public final class ForgeHooks { } public static boolean onPlayerAttackTarget(Player player, Entity target) { - if (MinecraftForge.EVENT_BUS.post(new AttackEntityEvent(player, target))) return false; + if (AttackEntityEvent.BUS.post(new AttackEntityEvent(player, target))) return false; ItemStack stack = player.getMainHandItem(); return stack.isEmpty() || !stack.getItem().onLeftClickEntity(stack, player, target); } public static InteractionResult onItemRightClick(Player player, InteractionHand hand) { - var evt = ForgeEventFactory.onRightClickItem(player, hand); - return evt.isCanceled() ? evt.getCancellationResult() : null; + var evt = new PlayerInteractEvent.RightClickItem(player, hand); + return PlayerInteractEvent.RightClickItem.BUS.post(evt) ? evt.getCancellationResult() : null; } public static GameType onChangeGameType(Player player, GameType currentGameType, GameType newGameType) { @@ -593,7 +590,7 @@ public final class ForgeHooks { return currentGameType; var evt = new PlayerEvent.PlayerChangeGameModeEvent(player, currentGameType, newGameType); - if (MinecraftForge.EVENT_BUS.post(evt)) + if (PlayerEvent.PlayerChangeGameModeEvent.BUS.post(evt)) return currentGameType; return evt.getNewGameMode(); @@ -654,19 +651,19 @@ public final class ForgeHooks { } public static boolean onCropsGrowPre(Level level, BlockPos pos, BlockState state, boolean def) { - var result = MinecraftForge.EVENT_BUS.fire(new BlockEvent.CropGrowEvent.Pre(level,pos,state)).getResult(); + var result = BlockEvent.CropGrowEvent.Pre.BUS.fire(new BlockEvent.CropGrowEvent.Pre(level, pos, state)).getResult(); return (result.isAllowed() || (def && result.isDefault())); } public static void onCropsGrowPost(Level level, BlockPos pos, BlockState state) { - MinecraftForge.EVENT_BUS.post(new BlockEvent.CropGrowEvent.Post(level, pos, state, level.getBlockState(pos))); + BlockEvent.CropGrowEvent.Post.BUS.post(new BlockEvent.CropGrowEvent.Post(level, pos, state, level.getBlockState(pos))); } @Nullable public static CriticalHitEvent getCriticalHit(Player player, Entity target, boolean vanillaCritical, float damageModifier) { CriticalHitEvent hitResult = new CriticalHitEvent(player, target, damageModifier, vanillaCritical); - MinecraftForge.EVENT_BUS.post(hitResult); - if (hitResult.getResult() == Event.Result.ALLOW || (vanillaCritical && hitResult.getResult() == Event.Result.DEFAULT)) + CriticalHitEvent.BUS.post(hitResult); + if (hitResult.getResult().isAllowed() || (vanillaCritical && hitResult.getResult().isDefault())) return hitResult; return null; } @@ -675,9 +672,8 @@ public final class ForgeHooks { * Hook to fire {@link LivingGetProjectileEvent}. Returns the ammo to be used. */ public static ItemStack getProjectile(LivingEntity entity, ItemStack projectileWeaponItem, ItemStack projectile) { - LivingGetProjectileEvent event = new LivingGetProjectileEvent(entity, projectileWeaponItem, projectile); - MinecraftForge.EVENT_BUS.post(event); - return event.getProjectileItemStack(); + var event = new LivingGetProjectileEvent(entity, projectileWeaponItem, projectile); + return LivingGetProjectileEvent.BUS.fire(event).getProjectileItemStack(); } /** @@ -717,8 +713,8 @@ public final class ForgeHooks { } public static int onNoteChange(Level level, BlockPos pos, BlockState state, int old, int _new) { - NoteBlockEvent.Change event = new NoteBlockEvent.Change(level, pos, state, old, _new); - if (MinecraftForge.EVENT_BUS.post(event)) + var event = new NoteBlockEvent.Change(level, pos, state, old, _new); + if (NoteBlockEvent.Change.BUS.post(event)) return -1; return event.getVanillaNoteId(); } @@ -962,14 +958,14 @@ public final class ForgeHooks { return true; var mask = player.getItemBySlot(EquipmentSlot.HEAD); - return !mask.isMonsterDisguise(player, monster) || MinecraftForge.EVENT_BUS.post(new MonsterDisguiseEvent(monster, player)); + return !mask.isMonsterDisguise(player, monster) || MonsterDisguiseEvent.BUS.post(new MonsterDisguiseEvent(monster, player)); }; } private static final Lazy> FORGE_CONVERSION_MAP = Lazy.concurrentOf(() -> { Map map = new HashMap<>(); - MinecraftForge.EVENT_BUS.post(new RegisterStructureConversionsEvent(map)); - return ImmutableMap.copyOf(map); + RegisterStructureConversionsEvent.BUS.post(new RegisterStructureConversionsEvent(map)); + return Map.copyOf(map); }); // DO NOT CALL from within RegisterStructureConversionsEvent, otherwise you'll get a deadlock @@ -1032,8 +1028,8 @@ public final class ForgeHooks { entity.setAirSupply(entity.getAirSupply() - breatheEvent.getConsumeAirAmount()); if (entity.getAirSupply() <= -20) { - var drownEvent = ForgeEventFactory.onLivingDrown(entity, entity.getAirSupply() <= -20, 2.0F, 8); - if (!drownEvent.isCanceled() && drownEvent.isDrowning()) { + var drownEvent = new LivingDrownEvent(entity, entity.getAirSupply() <= -20, 2.0F, 8); + if (!LivingDrownEvent.BUS.post(drownEvent) && drownEvent.isDrowning()) { entity.setAirSupply(0); Vec3 vec3 = entity.getDeltaMovement(); @@ -1129,7 +1125,7 @@ public final class ForgeHooks { // Should we always fire this, even if the channel consumed the packet? if (!event.getSource().getPacketHandled()) { - MinecraftForge.EVENT_BUS.post(event); + CustomPayloadEvent.BUS.fire(event); return event.getSource().getPacketHandled(); } diff --git a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java index d1f61cf717..abce563187 100644 --- a/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java +++ b/src/main/java/net/minecraftforge/common/ForgeInternalHandler.java @@ -19,73 +19,83 @@ import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.network.ConnectionStartEvent; import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.event.TickEvent.ServerTickEvent; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.listener.Priority; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.network.filters.NetworkFilters; import net.minecraftforge.common.util.LogicalSidedProvider; import net.minecraftforge.server.command.ForgeCommand; import net.minecraftforge.server.permission.events.PermissionGatherEvent; import net.minecraftforge.server.command.ConfigCommand; +import org.jetbrains.annotations.ApiStatus; -public class ForgeInternalHandler { - @SubscribeEvent(priority = EventPriority.HIGH) - public void onEntityJoinWorld(EntityJoinLevelEvent event) { +import java.lang.invoke.MethodHandles; + +@ApiStatus.Internal +public final class ForgeInternalHandler { + static void register() { + BusGroup.DEFAULT.register(MethodHandles.lookup(), ForgeInternalHandler.class); + } + + @SubscribeEvent(priority = Priority.HIGH) + static boolean onEntityJoinWorld(EntityJoinLevelEvent event) { Entity entity = event.getEntity(); - if (entity.getClass().equals(ItemEntity.class)) { + if (entity.getClass() == ItemEntity.class) { ItemStack stack = ((ItemEntity)entity).getItem(); Item item = stack.getItem(); if (item.hasCustomEntity(stack)) { Entity newEntity = item.createEntity(event.getLevel(), entity, stack); if (newEntity != null) { entity.discard(); - event.setCanceled(true); @SuppressWarnings("resource") var executor = LogicalSidedProvider.WORKQUEUE.get(event.getLevel().isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER); executor.schedule(new TickTask(0, () -> event.getLevel().addFreshEntity(newEntity))); + return true; } } } + return false; } @SubscribeEvent - public void onServerTick(ServerTickEvent.Pre event) { + static void onServerTick(ServerTickEvent.Pre event) { WorldWorkerManager.tick(true); } @SubscribeEvent - public void onServerTick(ServerTickEvent.Post event) { + static void onServerTick(ServerTickEvent.Post event) { WorldWorkerManager.tick(false); } // @SubscribeEvent -// public void checkSettings(ClientTickEvent event) { +// static void checkSettings(ClientTickEvent event) { // if (event.phase == Phase.END) // CloudRenderer.updateCloudSettings(); // } @SubscribeEvent - public void onChunkUnload(ChunkEvent.Unload event) { + static void onChunkUnload(ChunkEvent.Unload event) { if (!event.getLevel().isClientSide()) FarmlandWaterManager.removeTickets(event.getChunk()); } /* @SubscribeEvent - public void playerChangeDimension(PlayerEvent.PlayerChangedDimensionEvent event) { + static void playerChangeDimension(PlayerEvent.PlayerChangedDimensionEvent event) { if (event.getPlayer() instanceof ServerPlayerEntity) DimensionManager.rebuildPlayerMap(((ServerPlayerEntity)event.getPlayer()).server.getPlayerList(), true); } */ @SubscribeEvent - public void playerLogin(PlayerEvent.PlayerLoggedInEvent event) { + static void playerLogin(PlayerEvent.PlayerLoggedInEvent event) { UsernameCache.setUsername(event.getEntity().getUUID(), event.getEntity().getGameProfile().getName()); } @SubscribeEvent - public void onCommandsRegister(RegisterCommandsEvent event) { + static void onCommandsRegister(RegisterCommandsEvent event) { new ForgeCommand(event.getDispatcher()); ConfigCommand.register(event.getDispatcher()); } @@ -93,7 +103,7 @@ public class ForgeInternalHandler { private static LootModifierManager INSTANCE; @SubscribeEvent - public void onResourceReload(AddReloadListenerEvent event) { + static void onResourceReload(AddReloadListenerEvent event) { INSTANCE = new LootModifierManager(event.getRegistries()); event.addListener(INSTANCE); } @@ -105,30 +115,27 @@ public class ForgeInternalHandler { } @SubscribeEvent - public void resourceReloadListeners(AddReloadListenerEvent event) { + static void resourceReloadListeners(AddReloadListenerEvent event) { event.addListener(CreativeModeTabRegistry.getReloadListener()); } - @SubscribeEvent(priority = EventPriority.HIGHEST) - public void builtinMobSpawnBlocker(EntityJoinLevelEvent event) { - if(event.getEntity() instanceof Mob mob && mob.isSpawnCancelled()) - event.setCanceled(true); + @SubscribeEvent(priority = Priority.HIGHEST) + static boolean builtinMobSpawnBlocker(EntityJoinLevelEvent event) { + return event.getEntity() instanceof Mob mob && mob.isSpawnCancelled(); } @SubscribeEvent - public void onConnectionStart(ConnectionStartEvent event) { + static void onConnectionStart(ConnectionStartEvent event) { NetworkFilters.injectIfNecessary(event.getConnection()); } @SubscribeEvent - public void serverStopping(ServerStoppingEvent evt) { + static void serverStopping(ServerStoppingEvent evt) { WorldWorkerManager.clear(); } @SubscribeEvent - public void registerPermissionNodes(PermissionGatherEvent.Nodes event) { + static void registerPermissionNodes(PermissionGatherEvent.Nodes event) { event.addNodes(ForgeMod.USE_SELECTORS_PERMISSION); } - } - diff --git a/src/main/java/net/minecraftforge/common/ForgeMod.java b/src/main/java/net/minecraftforge/common/ForgeMod.java index 77e91c74b1..eea85b3080 100644 --- a/src/main/java/net/minecraftforge/common/ForgeMod.java +++ b/src/main/java/net/minecraftforge/common/ForgeMod.java @@ -5,7 +5,7 @@ package net.minecraftforge.common; -import net.minecraft.DetectedVersion; +import net.minecraft.SharedConstants; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BiomeColors; import net.minecraft.commands.synchronization.ArgumentTypeInfo; @@ -61,12 +61,14 @@ import net.minecraftforge.common.world.ForgeBiomeModifiers.RemoveSpawnsBiomeModi import net.minecraftforge.common.world.NoneBiomeModifier; import net.minecraftforge.common.world.NoneStructureModifier; import net.minecraftforge.common.world.StructureModifier; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.event.network.GatherLoginConfigurationTasksEvent; +import net.minecraftforge.event.server.ServerAboutToStartEvent; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fluids.FluidType; import net.minecraftforge.fluids.ForgeFlowingFluid; import net.minecraftforge.fml.*; import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.config.ModConfigEvent; import net.minecraftforge.fml.event.lifecycle.*; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.*; @@ -381,33 +383,37 @@ public class ForgeMod { CrashReportCallables.registerCrashCallable("FML", ForgeVersion::getSpec); CrashReportCallables.registerCrashCallable("Forge", ()->ForgeVersion.getGroup()+":"+ForgeVersion.getVersion()); - final IEventBus modEventBus = context.getModEventBus(); + BusGroup modBusGroup = context.getModBusGroup(); // Forge-provided datapack registries - modEventBus.addListener((DataPackRegistryEvent.NewRegistry event) -> { + DataPackRegistryEvent.NewRegistry.getBus(modBusGroup).addListener(event -> { event.dataPackRegistry(ForgeRegistries.Keys.BIOME_MODIFIERS, BiomeModifier.DIRECT_CODEC); event.dataPackRegistry(ForgeRegistries.Keys.STRUCTURE_MODIFIERS, StructureModifier.DIRECT_CODEC); }); - modEventBus.addListener(this::preInit); - modEventBus.addListener(this::gatherData); - modEventBus.addListener(this::registerFluids); - modEventBus.addListener(this::registerVanillaDisplayContexts); - modEventBus.addListener(this::onRegisterAttributes); - ForgeDeferredRegistriesSetup.setup(modEventBus); + FMLCommonSetupEvent.getBus(modBusGroup).addListener(ForgeMod::preInit); + GatherDataEvent.getBus(modBusGroup).addListener(ForgeMod::gatherData); + var registerEventBus = RegisterEvent.getBus(modBusGroup); + registerEventBus.addListener(ForgeMod::registerFluids); + registerEventBus.addListener(ForgeMod::registerVanillaDisplayContexts); + EntityAttributeModificationEvent.getBus(modBusGroup).addListener(ForgeMod::onRegisterAttributes); + ForgeDeferredRegistriesSetup.setup(modBusGroup); for (var reg : registries) - reg.register(modEventBus); + reg.register(modBusGroup); context.registerConfig(ModConfig.Type.CLIENT, ForgeConfig.clientSpec); context.registerConfig(ModConfig.Type.SERVER, ForgeConfig.serverSpec); context.registerConfig(ModConfig.Type.COMMON, ForgeConfig.commonSpec); - modEventBus.register(ForgeConfig.class); + if (ForgeConfig.LOGGER.isDebugEnabled()) { + ModConfigEvent.Loading.getBus(modBusGroup).addListener(ForgeConfig::onLoad); + ModConfigEvent.Reloading.getBus(modBusGroup).addListener(ForgeConfig::onFileChange); + } // Forge does not display problems when the remote is not matching. context.registerDisplayTest(IExtensionPoint.DisplayTest.IGNORE_ALL_VERSION); StartupMessageManager.addModMessage("Forge version "+ForgeVersion.getVersion()); - MinecraftForge.EVENT_BUS.addListener(VillagerTradingManager::loadTrades); - MinecraftForge.EVENT_BUS.register(MinecraftForge.INTERNAL_HANDLER); - MinecraftForge.EVENT_BUS.register(new ForgeNetworkConfigurationHandler()); + ServerAboutToStartEvent.BUS.addListener(VillagerTradingManager::loadTrades); + ForgeInternalHandler.register(); + GatherLoginConfigurationTasksEvent.BUS.addListener(ForgeNetworkConfigurationHandler::gatherInit); ForgeRegistries.ITEMS.tags().addOptionalTagDefaults(Tags.Items.ENCHANTING_FUELS, Set.of(ForgeRegistries.ITEMS.getDelegateOrThrow(Items.LAPIS_LAZULI))); @@ -416,21 +422,19 @@ public class ForgeMod { addAlias(ForgeRegistries.ATTRIBUTES, ResourceLocation.fromNamespaceAndPath("forge", "attack_range"), ResourceLocation.fromNamespaceAndPath("forge", "entity_reach")); } - public void preInit(FMLCommonSetupEvent evt) { + private static void preInit(FMLCommonSetupEvent evt) { VersionChecker.startVersionCheck(); //VanillaPacketSplitter.register(); } - - @SubscribeEvent - public void onRegisterAttributes(EntityAttributeModificationEvent event) { + private static void onRegisterAttributes(EntityAttributeModificationEvent event) { for (var type : event.getTypes()) { event.add(type, ForgeMod.SWIM_SPEED.getHolder().get()); event.add(type, ForgeMod.NAMETAG_DISTANCE.getHolder().get()); } } - public void gatherData(GatherDataEvent event) { + private static void gatherData(GatherDataEvent event) { DataGenerator gen = event.getGenerator(); PackOutput packOutput = gen.getPackOutput(); CompletableFuture lookupProvider = event.getLookupProvider(); @@ -439,13 +443,13 @@ public class ForgeMod { gen.addProvider(true, new PackMetadataGenerator(packOutput) .add(PackMetadataSection.TYPE, new PackMetadataSection( Component.translatable("pack.forge.description"), - DetectedVersion.BUILT_IN.getPackVersion(PackType.SERVER_DATA), + SharedConstants.getCurrentVersion().packVersion(PackType.SERVER_DATA), Optional.empty() //Arrays.stream(PackType.values()).collect(Collectors.toMap(Function.identity(), DetectedVersion.BUILT_IN::getPackVersion)) )) ); ForgeBlockTagsProvider blockTags = new ForgeBlockTagsProvider(packOutput, lookupProvider, existingFileHelper); gen.addProvider(event.includeServer(), blockTags); - gen.addProvider(event.includeServer(), new ForgeItemTagsProvider(packOutput, lookupProvider, blockTags.contentsGetter(), existingFileHelper)); + gen.addProvider(event.includeServer(), new ForgeItemTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(event.includeServer(), new ForgeEntityTypeTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(event.includeServer(), new ForgeFluidTagsProvider(packOutput, lookupProvider, existingFileHelper)); gen.addProvider(event.includeServer(), new ForgeEnchantmentTagsProvider(packOutput, lookupProvider, existingFileHelper)); @@ -459,7 +463,7 @@ public class ForgeMod { } // done in an event instead of deferred to only enable if a mod requests it - public void registerFluids(RegisterEvent event) { + private static void registerFluids(RegisterEvent event) { if (enableMilkFluid) { // register milk fill, empty sounds (delegates to water fill, empty sounds) event.register(ForgeRegistries.Keys.SOUND_EVENTS, helper -> { @@ -503,7 +507,7 @@ public class ForgeMod { } } - public void registerVanillaDisplayContexts(RegisterEvent event) { + private static void registerVanillaDisplayContexts(RegisterEvent event) { if (event.getRegistryKey().equals(ForgeRegistries.Keys.DISPLAY_CONTEXTS)) { IForgeRegistryInternal forgeRegistry = (IForgeRegistryInternal) event.getForgeRegistry(); if (forgeRegistry == null) diff --git a/src/main/java/net/minecraftforge/common/MinecraftForge.java b/src/main/java/net/minecraftforge/common/MinecraftForge.java index fd957c6f36..6ac68af0c6 100644 --- a/src/main/java/net/minecraftforge/common/MinecraftForge.java +++ b/src/main/java/net/minecraftforge/common/MinecraftForge.java @@ -10,8 +10,6 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.client.ConfigScreenHandler; -import net.minecraftforge.eventbus.api.BusBuilder; -import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.config.IConfigSpec; import net.minecraftforge.fml.config.ModConfig; @@ -34,9 +32,8 @@ public class MinecraftForge { * Events marked with {@link net.minecraftforge.fml.event.IModBusEvent} * belong on the ModBus and not this bus */ - public static final IEventBus EVENT_BUS = BusBuilder.builder().startShutdown().useModLauncher().build(); + public static final EventBusMigrationHelper EVENT_BUS = EventBusMigrationHelper.INSTANCE; - static final ForgeInternalHandler INTERNAL_HANDLER = new ForgeInternalHandler(); private static final Logger LOGGER = LogManager.getLogger(); private static final Marker FORGE = MarkerManager.getMarker("FORGE"); diff --git a/src/main/java/net/minecraftforge/common/TagConventionMigrationHelper.java b/src/main/java/net/minecraftforge/common/TagConventionMigrationHelper.java index a771c73348..f404396d25 100644 --- a/src/main/java/net/minecraftforge/common/TagConventionMigrationHelper.java +++ b/src/main/java/net/minecraftforge/common/TagConventionMigrationHelper.java @@ -28,7 +28,7 @@ public final class TagConventionMigrationHelper { private static final ArrayList> FOUND_LEGACY_TAGS = new ArrayList<>(); static void init() { - MinecraftForge.EVENT_BUS.addListener(TagConventionMigrationHelper::onServerStarting); + ServerStartingEvent.BUS.addListener(TagConventionMigrationHelper::onServerStarting); } public static void onServerStarting(ServerStartingEvent event) { diff --git a/src/main/java/net/minecraftforge/common/VillagerTradingManager.java b/src/main/java/net/minecraftforge/common/VillagerTradingManager.java index c6f538f8d2..413e76f295 100644 --- a/src/main/java/net/minecraftforge/common/VillagerTradingManager.java +++ b/src/main/java/net/minecraftforge/common/VillagerTradingManager.java @@ -46,7 +46,7 @@ public class VillagerTradingManager { /** Posts the WandererTradesEvent. */ private static void postWandererEvent() { - var event = MinecraftForge.EVENT_BUS.fire(new WandererTradesEvent(WANDERER_TRADES)); + var event = WandererTradesEvent.BUS.fire(new WandererTradesEvent(WANDERER_TRADES)); VillagerTrades.WANDERING_TRADER_TRADES.clear(); for (var pool : event.getPools()) VillagerTrades.WANDERING_TRADER_TRADES.add(Pair.of(pool.getEntries().toArray(ItemListing[]::new), pool.getRolls())); @@ -65,7 +65,7 @@ public class VillagerTradingManager { for (var entry : trades.int2ObjectEntrySet()) Arrays.stream(entry.getValue()).forEach(mutableTrades.get(entry.getIntKey())::add); - MinecraftForge.EVENT_BUS.post(new VillagerTradesEvent(mutableTrades, prof)); + VillagerTradesEvent.BUS.post(new VillagerTradesEvent(mutableTrades, prof)); Int2ObjectMap newTrades = new Int2ObjectOpenHashMap<>(); for (var entry : mutableTrades.int2ObjectEntrySet()) newTrades.put(entry.getIntKey(), entry.getValue().toArray(new ItemListing[0])); diff --git a/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java b/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java index ed516a4a8a..cb64b06578 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java +++ b/src/main/java/net/minecraftforge/common/capabilities/CapabilityProvider.java @@ -11,8 +11,13 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.ForgeEventFactory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -26,22 +31,100 @@ public abstract class CapabilityProvider> i @VisibleForTesting static boolean SUPPORTS_LAZY_CAPABILITIES = true; - private final @NotNull Class baseClass; private @Nullable CapabilityDispatcher capabilities; private boolean valid = true; - private boolean isLazy = false; + private final boolean isLazy; private Supplier lazyParentSupplier = null; private CompoundTag lazyData = null; private HolderLookup.Provider registryAccess = null; private boolean initialized = false; - protected CapabilityProvider(Class baseClass) { - this(baseClass, false); + public static class Entities extends CapabilityProvider { + protected Entities() { + super(false); + } + + protected Entities(boolean isLazy) { + super(isLazy); + } + + @Override + protected AttachCapabilitiesEvent fireAttachCapabilitiesEvent(Entity provider) { + return AttachCapabilitiesEvent.Entities.BUS.fire(new AttachCapabilitiesEvent.Entities(provider)); + } + + @Override + protected boolean shouldFireAttachCapabilitiesEvent() { + return AttachCapabilitiesEvent.Entities.BUS.hasListeners(); + } } - protected CapabilityProvider(final Class baseClass, final boolean isLazy) { - this.baseClass = baseClass; + public static class BlockEntities extends CapabilityProvider { + protected BlockEntities() { + super(false); + } + + protected BlockEntities(boolean isLazy) { + super(isLazy); + } + + @Override + protected AttachCapabilitiesEvent fireAttachCapabilitiesEvent(BlockEntity provider) { + return AttachCapabilitiesEvent.BlockEntities.BUS.fire(new AttachCapabilitiesEvent.BlockEntities(provider)); + } + + @Override + protected boolean shouldFireAttachCapabilitiesEvent() { + return AttachCapabilitiesEvent.BlockEntities.BUS.hasListeners(); + } + } + + public static class ItemStacks extends CapabilityProvider { + protected ItemStacks() { + super(false); + } + + protected ItemStacks(boolean isLazy) { + super(isLazy); + } + + @Override + protected AttachCapabilitiesEvent fireAttachCapabilitiesEvent(ItemStack provider) { + return AttachCapabilitiesEvent.ItemStacks.BUS.fire(new AttachCapabilitiesEvent.ItemStacks(provider)); + } + + @Override + protected boolean shouldFireAttachCapabilitiesEvent() { + return AttachCapabilitiesEvent.ItemStacks.BUS.hasListeners(); + } + } + + public static class Levels extends CapabilityProvider { + protected Levels() { + super(false); + } + + protected Levels(boolean isLazy) { + super(isLazy); + } + + @Override + protected AttachCapabilitiesEvent fireAttachCapabilitiesEvent(Level provider) { + return AttachCapabilitiesEvent.Levels.BUS.fire(new AttachCapabilitiesEvent.Levels(provider)); + } + + @Override + protected boolean shouldFireAttachCapabilitiesEvent() { + return AttachCapabilitiesEvent.Levels.BUS.hasListeners(); + } + } + + protected CapabilityProvider() { + this.isLazy = false; + } + + protected CapabilityProvider(boolean isLazy) { this.isLazy = SUPPORTS_LAZY_CAPABILITIES && isLazy; } @@ -50,10 +133,20 @@ public abstract class CapabilityProvider> i } protected final void gatherCapabilities(@Nullable ICapabilityProvider parent) { + if (!shouldFireAttachCapabilitiesEvent()) { + this.initialized = true; + return; + } + gatherCapabilities(() -> parent); } protected final void gatherCapabilities(@Nullable Supplier parent) { + if (!shouldFireAttachCapabilitiesEvent()) { + this.initialized = true; + return; + } + if (isLazy && !initialized) { lazyParentSupplier = parent == null ? () -> null : parent; return; @@ -62,8 +155,11 @@ public abstract class CapabilityProvider> i doGatherCapabilities(parent == null ? null : parent.get()); } + protected abstract AttachCapabilitiesEvent fireAttachCapabilitiesEvent(B provider); + protected abstract boolean shouldFireAttachCapabilitiesEvent(); + private void doGatherCapabilities(@Nullable ICapabilityProvider parent) { - this.capabilities = ForgeEventFactory.gatherCapabilities(baseClass, getProvider(), parent); + this.capabilities = ForgeEventFactory.gatherCapabilities(fireAttachCapabilitiesEvent(getProvider()), parent); this.initialized = true; } @@ -144,16 +240,16 @@ public abstract class CapabilityProvider> i * Special implementation for cases which have a superclass and can't extend CapabilityProvider directly. * See {@link LevelChunk} */ - public static class AsField> extends CapabilityProvider { + public static abstract class AsField> extends CapabilityProvider { private final B owner; - public AsField(Class baseClass, B owner) { - super(baseClass); + public AsField(B owner) { + super(); this.owner = owner; } - public AsField(Class baseClass, B owner, boolean isLazy) { - super(baseClass, isLazy); + public AsField(B owner, boolean isLazy) { + super(isLazy); this.owner = owner; } @@ -175,6 +271,26 @@ public abstract class CapabilityProvider> i B getProvider() { return owner; } - }; + + public static class LevelChunks extends AsField { + public LevelChunks(LevelChunk owner) { + super(owner); + } + + public LevelChunks(LevelChunk owner, boolean isLazy) { + super(owner, isLazy); + } + + @Override + protected AttachCapabilitiesEvent fireAttachCapabilitiesEvent(LevelChunk provider) { + return AttachCapabilitiesEvent.LevelChunks.BUS.fire(new AttachCapabilitiesEvent.LevelChunks(provider)); + } + + @Override + protected boolean shouldFireAttachCapabilitiesEvent() { + return AttachCapabilitiesEvent.LevelChunks.BUS.hasListeners(); + } + } + } } diff --git a/src/main/java/net/minecraftforge/common/capabilities/ICapabilityProvider.java b/src/main/java/net/minecraftforge/common/capabilities/ICapabilityProvider.java index f1e4499c18..bef1ffad59 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/ICapabilityProvider.java +++ b/src/main/java/net/minecraftforge/common/capabilities/ICapabilityProvider.java @@ -10,8 +10,7 @@ import net.minecraftforge.common.util.LazyOptional; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public interface ICapabilityProvider -{ +public interface ICapabilityProvider { /** * Retrieves the Optional handler for the capability requested on the specific side. * The return value CAN be the same for multiple faces. diff --git a/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java b/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java index 7ad3c395cb..13b6a5b43c 100644 --- a/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java +++ b/src/main/java/net/minecraftforge/common/capabilities/RegisterCapabilitiesEvent.java @@ -7,9 +7,10 @@ package net.minecraftforge.common.capabilities; import java.util.Objects; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.objectweb.asm.Type; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.event.IModBusEvent; /** @@ -19,7 +20,11 @@ import net.minecraftforge.fml.event.IModBusEvent; * @deprecated Use {@link AutoRegisterCapability} annotation on your class. */ @Deprecated(forRemoval = true, since = "1.21") -public final class RegisterCapabilitiesEvent extends Event implements IModBusEvent { +public final class RegisterCapabilitiesEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterCapabilitiesEvent.class); + } + /** * Registers a capability to be consumed by others. * APIs who define the capability should call this. @@ -32,4 +37,4 @@ public final class RegisterCapabilitiesEvent extends Event implements IModBusEve Objects.requireNonNull(type, "Attempted to register a capability with invalid type"); CapabilityManager.get(Type.getInternalName(type), null, true); } -} \ No newline at end of file +} diff --git a/src/main/java/net/minecraftforge/common/data/BlockTagsProvider.java b/src/main/java/net/minecraftforge/common/data/BlockTagsProvider.java index d6c7afbc8b..e5800223ec 100644 --- a/src/main/java/net/minecraftforge/common/data/BlockTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/BlockTagsProvider.java @@ -13,11 +13,9 @@ import net.minecraft.data.tags.IntrinsicHolderTagsProvider; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.Nullable; -public abstract class BlockTagsProvider extends IntrinsicHolderTagsProvider -{ +public abstract class BlockTagsProvider extends IntrinsicHolderTagsProvider { @SuppressWarnings("deprecation") - public BlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) - { + public BlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) { super(output, Registries.BLOCK, lookupProvider, block -> block.builtInRegistryHolder().key(), modId, existingFileHelper); } } diff --git a/src/main/java/net/minecraftforge/common/data/EnchantmentTagsProvider.java b/src/main/java/net/minecraftforge/common/data/EnchantmentTagsProvider.java index 5889b61c9c..b08333159a 100644 --- a/src/main/java/net/minecraftforge/common/data/EnchantmentTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/EnchantmentTagsProvider.java @@ -6,16 +6,15 @@ package net.minecraftforge.common.data; import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.TagsProvider; -import net.minecraft.world.item.enchantment.Enchantment; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; -public abstract class EnchantmentTagsProvider extends TagsProvider { +/** Use {@link net.minecraft.data.tags.EnchantmentTagsProvider Vanilla's EnchantmentTagsProvider} */ +@Deprecated(forRemoval = true, since = "1.21.6") +public abstract class EnchantmentTagsProvider extends net.minecraft.data.tags.EnchantmentTagsProvider { public EnchantmentTagsProvider(PackOutput output, CompletableFuture lookupProvider, String modId, @Nullable ExistingFileHelper existingFileHelper) { - super(output, Registries.ENCHANTMENT, lookupProvider, modId, existingFileHelper); + super(output, lookupProvider, modId, existingFileHelper); } } diff --git a/src/main/java/net/minecraftforge/common/data/ForgeBiomeTagsProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeBiomeTagsProvider.java index 3eb5c4d6ce..5d89ce33b7 100644 --- a/src/main/java/net/minecraftforge/common/data/ForgeBiomeTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/ForgeBiomeTagsProvider.java @@ -62,7 +62,7 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { .add(Biomes.BASALT_DELTAS) .addOptionalTag(forgeTagKey("is_hot/nether")); tag(IS_HOT_END); // forge:is_hot/end - tag(IS_HOT).addTag(IS_HOT_OVERWORLD).addTag(IS_HOT_NETHER).addOptionalTag(IS_HOT_END.location()); + tag(IS_HOT).addTag(IS_HOT_OVERWORLD).addTag(IS_HOT_NETHER).addOptionalTag(IS_HOT_END); tag(IS_COLD_OVERWORLD) .add(Biomes.TAIGA) @@ -94,7 +94,7 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { .add(Biomes.END_HIGHLANDS) .add(Biomes.END_BARRENS) .addOptionalTag(forgeTagKey("is_cold/end")); - tag(IS_COLD).addTag(IS_COLD_OVERWORLD).addOptionalTag(IS_COLD_NETHER.location()).addTag(IS_COLD_END); + tag(IS_COLD).addTag(IS_COLD_OVERWORLD).addOptionalTag(IS_COLD_NETHER).addTag(IS_COLD_END); tag(IS_DEAD) .addOptionalTag(forgeTagKey("is_dead")); @@ -114,7 +114,7 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { //.addOptionalTag(forgeTagKey("is_sparse/overworld")); // can't because forge:is_sparse/overworld contains dripstone caves and eroded badlands, while c:is_sparse_vegetation/overworld does not tag(IS_SPARSE_NETHER); // forge:is_sparse/nether tag(IS_SPARSE_END); // forge:is_sparse/end - tag(IS_SPARSE_VEGETATION).addTag(IS_SPARSE_VEGETATION_OVERWORLD).addOptionalTag(IS_SPARSE_NETHER.location()).addOptionalTag(IS_SPARSE_END.location()); + tag(IS_SPARSE_VEGETATION).addTag(IS_SPARSE_VEGETATION_OVERWORLD).addOptionalTag(IS_SPARSE_NETHER).addOptionalTag(IS_SPARSE_END); tag(IS_DENSE_VEGETATION_OVERWORLD) .add(Biomes.DARK_FOREST) @@ -126,7 +126,7 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { .addOptionalTag(forgeTagKey("is_dense/overworld")); tag(IS_DENSE_NETHER); tag(IS_DENSE_END); - tag(IS_DENSE_VEGETATION).addTag(IS_DENSE_VEGETATION_OVERWORLD).addOptionalTag(IS_DENSE_NETHER.location()).addOptionalTag(IS_DENSE_END.location()); + tag(IS_DENSE_VEGETATION).addTag(IS_DENSE_VEGETATION_OVERWORLD).addOptionalTag(IS_DENSE_NETHER).addOptionalTag(IS_DENSE_END); tag(IS_WET_OVERWORLD) .add(Biomes.SWAMP) @@ -140,7 +140,7 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { .addOptionalTag(forgeTagKey("is_wet/overworld")); tag(IS_WET_NETHER); tag(IS_WET_END); - tag(IS_WET).addTag(IS_WET_OVERWORLD).addOptionalTag(IS_WET_NETHER.location()).addOptionalTag(IS_WET_END.location()); + tag(IS_WET).addTag(IS_WET_OVERWORLD).addOptionalTag(IS_WET_NETHER).addOptionalTag(IS_WET_END); tag(IS_DRY_OVERWORLD) .add(Biomes.DESERT) @@ -201,7 +201,14 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { tag(IS_SAVANNA).addTag(BiomeTags.IS_SAVANNA); tag(IS_JUNGLE).addTag(BiomeTags.IS_JUNGLE); tag(IS_SNOWY) - .add(Biomes.SNOWY_BEACH, Biomes.SNOWY_PLAINS, Biomes.ICE_SPIKES, Biomes.SNOWY_TAIGA, Biomes.GROVE, Biomes.SNOWY_SLOPES, Biomes.JAGGED_PEAKS, Biomes.FROZEN_PEAKS); + .add(Biomes.SNOWY_BEACH) + .add(Biomes.SNOWY_PLAINS) + .add(Biomes.ICE_SPIKES) + .add(Biomes.SNOWY_TAIGA) + .add(Biomes.GROVE) + .add(Biomes.SNOWY_SLOPES) + .add(Biomes.JAGGED_PEAKS) + .add(Biomes.FROZEN_PEAKS); //.addOptionalTag(forgeTagKey("is_snowy")); // can't add forge:is_snowy because it contains frozen ocean and frozen river, while c:is_snowy does not tag(IS_ICY).add(Biomes.ICE_SPIKES).add(Biomes.FROZEN_PEAKS); tag(IS_SWAMP).add(Biomes.SWAMP).add(Biomes.MANGROVE_SWAMP); @@ -288,11 +295,11 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { tag(Biomes.MANGROVE_SWAMP, forgeTagKey("is_wet/overworld"), forgeTagKey("is_hot/overworld"), forgeTagKey("is_swamp")); tag(Biomes.DEEP_DARK, forgeTagKey("is_cave"), forgeTagKey("is_rare"), forgeTagKey("is_spooky")); - tag(forgeTagKey("is_hot")).addTag(forgeTagKey("is_hot/overworld")).addTag(forgeTagKey("is_hot/nether")).addOptionalTag(Tags.Biomes.IS_HOT_END.location()); - tag(forgeTagKey("is_cold")).addTag(forgeTagKey("is_cold/overworld")).addOptionalTag(Tags.Biomes.IS_COLD_NETHER.location()).addTag(forgeTagKey("is_cold/end")); - tag(forgeTagKey("is_sparse")).addTag(forgeTagKey("is_sparse/overworld")).addOptionalTag(Tags.Biomes.IS_SPARSE_NETHER.location()).addOptionalTag(Tags.Biomes.IS_SPARSE_END.location()); - tag(forgeTagKey("is_dense")).addTag(forgeTagKey("is_dense/overworld")).addOptionalTag(Tags.Biomes.IS_DENSE_NETHER.location()).addOptionalTag(Tags.Biomes.IS_DENSE_END.location()); - tag(forgeTagKey("is_wet")).addTag(forgeTagKey("is_wet/overworld")).addOptionalTag(Tags.Biomes.IS_WET_NETHER.location()).addOptionalTag(Tags.Biomes.IS_WET_END.location()); + tag(forgeTagKey("is_hot")).addTag(forgeTagKey("is_hot/overworld")).addTag(forgeTagKey("is_hot/nether")).addOptionalTag(Tags.Biomes.IS_HOT_END); + tag(forgeTagKey("is_cold")).addTag(forgeTagKey("is_cold/overworld")).addOptionalTag(Tags.Biomes.IS_COLD_NETHER).addTag(forgeTagKey("is_cold/end")); + tag(forgeTagKey("is_sparse")).addTag(forgeTagKey("is_sparse/overworld")).addOptionalTag(Tags.Biomes.IS_SPARSE_NETHER).addOptionalTag(Tags.Biomes.IS_SPARSE_END); + tag(forgeTagKey("is_dense")).addTag(forgeTagKey("is_dense/overworld")).addOptionalTag(Tags.Biomes.IS_DENSE_NETHER).addOptionalTag(Tags.Biomes.IS_DENSE_END); + tag(forgeTagKey("is_wet")).addTag(forgeTagKey("is_wet/overworld")).addOptionalTag(Tags.Biomes.IS_WET_NETHER).addOptionalTag(Tags.Biomes.IS_WET_END); tag(forgeTagKey("is_dry")).addTag(forgeTagKey("is_dry/overworld")).addTag(forgeTagKey("is_dry/nether")).addTag(forgeTagKey("is_dry/end")); tag(forgeTagKey("is_dead")); @@ -308,14 +315,6 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { } } - private TagAppender tagWithOptionalLegacy(TagKey tag) { - return tag(tag).addOptionalTag(ResourceLocation.fromNamespaceAndPath("forge", tag.location().getPath())); - } - - private static ResourceLocation forgeRl(String path) { - return ResourceLocation.fromNamespaceAndPath("forge", path); - } - private static TagKey forgeTagKey(String path) { return BiomeTags.create(ResourceLocation.fromNamespaceAndPath("forge", path)); } @@ -324,4 +323,5 @@ public final class ForgeBiomeTagsProvider extends BiomeTagsProvider { public String getName() { return "Forge Biome Tags"; } + } diff --git a/src/main/java/net/minecraftforge/common/data/ForgeBlockItemTagsProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeBlockItemTagsProvider.java new file mode 100644 index 0000000000..eb506ac194 --- /dev/null +++ b/src/main/java/net/minecraftforge/common/data/ForgeBlockItemTagsProvider.java @@ -0,0 +1,842 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.common.data; + +import java.util.Locale; +import java.util.function.Consumer; + +import net.minecraft.data.tags.BlockItemTagsProvider; +import net.minecraft.data.tags.TagAppender; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.ForgeRegistries; + +public abstract class ForgeBlockItemTagsProvider extends BlockItemTagsProvider { + @Override + @SuppressWarnings({ "unchecked", "removal" }) + protected void run() { + tag(Tags.Blocks.BARRELS, Tags.Items.BARRELS) + .addTag(Tags.Blocks.BARRELS_WOODEN) + .addOptionalTag(Legacy.Blocks.BARRELS); + tag(Tags.Blocks.BARRELS_WOODEN, Tags.Items.BARRELS_WOODEN, Legacy.Blocks.BARRELS_WOODEN, Legacy.Items.BARRELS_WOODEN) + .add(Blocks.BARREL) + .addOptionalTag(Legacy.Blocks.BARRELS_WOODEN); + tag(Tags.Blocks.BOOKSHELVES, Tags.Items.BOOKSHELVES, Legacy.Blocks.BOOKSHELVES, Legacy.Items.BOOKSHELVES) + .add(Blocks.BOOKSHELF) + .addOptionalTag(Legacy.Blocks.BOOKSHELVES); + tag(Tags.Blocks.BUDDING_BLOCKS, Tags.Items.BUDDING_BLOCKS) + .add(Blocks.BUDDING_AMETHYST); + tag(Tags.Blocks.BUDS, Tags.Items.BUDS) + .add(Blocks.SMALL_AMETHYST_BUD) + .add(Blocks.MEDIUM_AMETHYST_BUD) + .add(Blocks.LARGE_AMETHYST_BUD); + tag(Tags.Blocks.CHAINS, Tags.Items.CHAINS) + .add(Blocks.CHAIN); + tag(Tags.Blocks.CHESTS, Tags.Items.CHESTS) + .addTags( + Tags.Blocks.CHESTS_ENDER, + Tags.Blocks.CHESTS_TRAPPED, + Tags.Blocks.CHESTS_WOODEN + ) + .addOptionalTag(Legacy.Blocks.CHESTS); + //copy(forgeBlockTagKey("chests/ender"), forgeItemTagKey("chests/ender")); + tag(Tags.Blocks.CHESTS_ENDER, Tags.Items.CHESTS_ENDER) + .add(Blocks.ENDER_CHEST); // forge:chests/ender + //copy(forgeBlockTagKey("chests/trapped"), forgeItemTagKey("chests/trapped"))); + tag(Tags.Blocks.CHESTS_TRAPPED, Tags.Items.CHESTS_TRAPPED) + .add(Blocks.TRAPPED_CHEST); // forge:chests/trapped + tag(Tags.Blocks.CHESTS_WOODEN, Tags.Items.CHESTS_WOODEN, Legacy.Blocks.CHESTS_WOODEN, Legacy.Items.CHESTS_WOODEN) + .add( + Blocks.CHEST, + Blocks.TRAPPED_CHEST + ) + .addOptionalTag(Legacy.Blocks.CHESTS_WOODEN); + tag(Tags.Blocks.CLUSTERS, Tags.Items.CLUSTERS) + .add(Blocks.AMETHYST_CLUSTER); + tag(Tags.Blocks.COBBLESTONES, Tags.Items.COBBLESTONES, Legacy.Blocks.COBBLESTONE, Legacy.Items.COBBLESTONE) + .addTags( + Tags.Blocks.COBBLESTONE_NORMAL, + Tags.Blocks.COBBLESTONE_INFESTED, + Tags.Blocks.COBBLESTONE_MOSSY, + Tags.Blocks.COBBLESTONE_DEEPSLATE + ) + .addOptionalTag(Legacy.Blocks.COBBLESTONE); + //copy(forgeBlockTagKey("cobblestone/normal"), forgeItemTagKey("cobblestone/normal")); + tag(Tags.Blocks.COBBLESTONE_NORMAL, Tags.Items.COBBLESTONE_NORMAL) + .add(Blocks.COBBLESTONE); // forge:cobblestone/normal + //copy(forgeBlockTagKey("cobblestone/infested"), forgeItemTagKey("cobblestone/infested")); + tag(Tags.Blocks.COBBLESTONE_INFESTED, Tags.Items.COBBLESTONE_INFESTED) + .add(Blocks.INFESTED_COBBLESTONE); // forge:cobblestone/infested + //copy(forgeBlockTagKey("cobblestone/mossy"), forgeItemTagKey("cobblestone/mossy")); + tag(Tags.Blocks.COBBLESTONE_MOSSY, Tags.Items.COBBLESTONE_MOSSY) + .add(Blocks.MOSSY_COBBLESTONE); // forge:cobblestone/mossy + //copy(forgeBlockTagKey("cobblestone/deepslate"), forgeItemTagKey("cobblestone/deepslate")); + tag(Tags.Blocks.COBBLESTONE_DEEPSLATE, Tags.Items.COBBLESTONE_DEEPSLATE) + .add(Blocks.COBBLED_DEEPSLATE); // forge:cobblestone/deepslate + tag(Tags.Blocks.CONCRETES, Tags.Items.CONCRETES) + .add( + Blocks.WHITE_CONCRETE, + Blocks.ORANGE_CONCRETE, + Blocks.MAGENTA_CONCRETE, + Blocks.LIGHT_BLUE_CONCRETE, + Blocks.YELLOW_CONCRETE, + Blocks.LIME_CONCRETE, + Blocks.PINK_CONCRETE, + Blocks.GRAY_CONCRETE, + Blocks.LIGHT_GRAY_CONCRETE, + Blocks.CYAN_CONCRETE, + Blocks.PURPLE_CONCRETE, + Blocks.BLUE_CONCRETE, + Blocks.BROWN_CONCRETE, + Blocks.GREEN_CONCRETE, + Blocks.RED_CONCRETE, + Blocks.BLACK_CONCRETE + ); + //copy(forgeBlockTagKey("end_stones"), forgeItemTagKey("end_stones")); + tag(Tags.Blocks.END_STONES, Tags.Items.END_STONES) + .add(Blocks.END_STONE); // forge:end_stones + //copy(forgeBlockTagKey("fence_gates"), forgeItemTagKey("fence_gates")); + tag(Tags.Blocks.FENCE_GATES, Tags.Items.FENCE_GATES) + .addTags(Tags.Blocks.FENCE_GATES_WOODEN); // forge:fence_gates + //copy(forgeBlockTagKey("fence_gates/wooden"), forgeItemTagKey("fence_gates/wooden")); + tag(Tags.Blocks.FENCE_GATES_WOODEN, Tags.Items.FENCE_GATES_WOODEN) + .add( + Blocks.OAK_FENCE_GATE, + Blocks.SPRUCE_FENCE_GATE, + Blocks.BIRCH_FENCE_GATE, + Blocks.JUNGLE_FENCE_GATE, + Blocks.ACACIA_FENCE_GATE, + Blocks.DARK_OAK_FENCE_GATE, + Blocks.CRIMSON_FENCE_GATE, + Blocks.WARPED_FENCE_GATE, + Blocks.MANGROVE_FENCE_GATE, + Blocks.BAMBOO_FENCE_GATE, + Blocks.CHERRY_FENCE_GATE + ); + //copy(forgeBlockTagKey("fences"), forgeItemTagKey("fences")); + tag(Tags.Blocks.FENCES, Tags.Items.FENCES) + .addTags( + Tags.Blocks.FENCES_NETHER_BRICK, + Tags.Blocks.FENCES_WOODEN + ); // forge:fences + //copy(forgeBlockTagKey("fences/nether_brick"), forgeItemTagKey("fences/nether_brick")); + tag(Tags.Blocks.FENCES_NETHER_BRICK, Tags.Items.FENCES_NETHER_BRICK) + .add(Blocks.NETHER_BRICK_FENCE); // forge:fences/nether_brick + //copy(forgeBlockTagKey("fences/wooden"), forgeItemTagKey("fences/wooden")); + tag(Tags.Blocks.FENCES_WOODEN, Tags.Items.FENCES_WOODEN) + .addTag(BlockTags.WOODEN_FENCES); // forge:fences/wooden + tag(Tags.Blocks.FLOWERS_SMALL, Tags.Items.FLOWERS_SMALL) + .add( + Blocks.DANDELION, + Blocks.POPPY, + Blocks.BLUE_ORCHID, + Blocks.ALLIUM, + Blocks.AZURE_BLUET, + Blocks.RED_TULIP, + Blocks.ORANGE_TULIP, + Blocks.WHITE_TULIP, + Blocks.PINK_TULIP, + Blocks.OXEYE_DAISY, + Blocks.CORNFLOWER, + Blocks.LILY_OF_THE_VALLEY, + Blocks.WITHER_ROSE, + Blocks.TORCHFLOWER, + Blocks.OPEN_EYEBLOSSOM, + Blocks.CLOSED_EYEBLOSSOM + ) + .addOptionalTag(BlockTags.SMALL_FLOWERS); + tag(Tags.Blocks.FLOWERS_TALL, Tags.Items.FLOWERS_TALL) + .add( + Blocks.SUNFLOWER, + Blocks.LILAC, + Blocks.PEONY, + Blocks.ROSE_BUSH, + Blocks.PITCHER_PLANT + ) + .addOptionalTag(tagKey("tall_flowers")); //This is old vanilla tag, should it be removed? + tag(Tags.Blocks.FLOWERS, Tags.Items.FLOWERS) + .add( + Blocks.FLOWERING_AZALEA_LEAVES, + Blocks.FLOWERING_AZALEA, + Blocks.MANGROVE_PROPAGULE, + Blocks.PINK_PETALS, + Blocks.CHORUS_FLOWER, + Blocks.SPORE_BLOSSOM + ) + .addTags( + Tags.Blocks.FLOWERS_SMALL, + Tags.Blocks.FLOWERS_TALL + ) + .addOptionalTag(BlockTags.FLOWERS); + tag(Tags.Blocks.GLASS_BLOCKS, Tags.Items.GLASS_BLOCKS) + .addTags( + Tags.Blocks.GLASS_BLOCKS_COLORLESS, + Tags.Blocks.GLASS_BLOCKS_CHEAP, + Tags.Blocks.GLASS_BLOCKS_TINTED + ) + .addOptionalTag(Tags.Blocks.GLASS); + tag(Tags.Blocks.GLASS_BLOCKS_COLORLESS, Tags.Items.GLASS_BLOCKS_COLORLESS) + .add(Blocks.GLASS) + .addOptionalTag(Tags.Blocks.GLASS_COLORLESS); + tag(Tags.Blocks.GLASS_BLOCKS_TINTED, Tags.Items.GLASS_BLOCKS_TINTED) + .add(Blocks.TINTED_GLASS) + .addOptionalTag(Legacy.Blocks.GLASS_TINTED); + + tag(Tags.Blocks.GLASS_BLOCKS_CHEAP, Tags.Items.GLASS_BLOCKS_CHEAP, Legacy.Blocks.GLASS_SILICA, Legacy.Items.GLASS_SILICA) + .add( + Blocks.GLASS, + Blocks.WHITE_STAINED_GLASS, + Blocks.ORANGE_STAINED_GLASS, + Blocks.MAGENTA_STAINED_GLASS, + Blocks.LIGHT_BLUE_STAINED_GLASS, + Blocks.YELLOW_STAINED_GLASS, + Blocks.LIME_STAINED_GLASS, + Blocks.PINK_STAINED_GLASS, + Blocks.GRAY_STAINED_GLASS, + Blocks.LIGHT_GRAY_STAINED_GLASS, + Blocks.CYAN_STAINED_GLASS, + Blocks.PURPLE_STAINED_GLASS, + Blocks.BLUE_STAINED_GLASS, + Blocks.BROWN_STAINED_GLASS, + Blocks.GREEN_STAINED_GLASS, + Blocks.RED_STAINED_GLASS, + Blocks.BLACK_STAINED_GLASS + ) + .addOptionalTag(Legacy.Blocks.GLASS_SILICA); + tag(Tags.Blocks.GLASS_PANES, Tags.Items.GLASS_PANES) + .addTags(Tags.Blocks.GLASS_PANES_COLORLESS) + .add( + Blocks.WHITE_STAINED_GLASS_PANE, + Blocks.ORANGE_STAINED_GLASS_PANE, + Blocks.MAGENTA_STAINED_GLASS_PANE, + Blocks.LIGHT_BLUE_STAINED_GLASS_PANE, + Blocks.YELLOW_STAINED_GLASS_PANE, + Blocks.LIME_STAINED_GLASS_PANE, + Blocks.PINK_STAINED_GLASS_PANE, + Blocks.GRAY_STAINED_GLASS_PANE, + Blocks.LIGHT_GRAY_STAINED_GLASS_PANE, + Blocks.CYAN_STAINED_GLASS_PANE, + Blocks.PURPLE_STAINED_GLASS_PANE, + Blocks.BLUE_STAINED_GLASS_PANE, + Blocks.BROWN_STAINED_GLASS_PANE, + Blocks.GREEN_STAINED_GLASS_PANE, + Blocks.RED_STAINED_GLASS_PANE, + Blocks.BLACK_STAINED_GLASS_PANE + ) + .addOptionalTag(Legacy.Blocks.GLASS_PANES); + tag(Tags.Blocks.GLASS_PANES_COLORLESS, Tags.Items.GLASS_PANES_COLORLESS) + .add(Blocks.GLASS_PANE) + .addOptionalTag(forgeTagKey("glass_panes/colorless")); + tag(Tags.Blocks.GLAZED_TERRACOTTAS, Tags.Items.GLAZED_TERRACOTTAS) + .add( + Blocks.WHITE_GLAZED_TERRACOTTA, + Blocks.ORANGE_GLAZED_TERRACOTTA, + Blocks.MAGENTA_GLAZED_TERRACOTTA, + Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA, + Blocks.YELLOW_GLAZED_TERRACOTTA, + Blocks.LIME_GLAZED_TERRACOTTA, + Blocks.PINK_GLAZED_TERRACOTTA, + Blocks.GRAY_GLAZED_TERRACOTTA, + Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA, + Blocks.CYAN_GLAZED_TERRACOTTA, + Blocks.PURPLE_GLAZED_TERRACOTTA, + Blocks.BLUE_GLAZED_TERRACOTTA, + Blocks.BROWN_GLAZED_TERRACOTTA, + Blocks.GREEN_GLAZED_TERRACOTTA, + Blocks.RED_GLAZED_TERRACOTTA, + Blocks.BLACK_GLAZED_TERRACOTTA + ); + //copy(forgeBlockTagKey("gravel"), forgeItemTagKey("gravel")); + tag(Tags.Blocks.GRAVEL, Tags.Items.GRAVEL) + .add(Blocks.GRAVEL); // forge:gravel + //copy(forgeBlockTagKey("netherrack"), forgeItemTagKey("netherrack")); + tag(Tags.Blocks.NETHERRACK, Tags.Items.NETHERRACK) + .add(Blocks.NETHERRACK); // forge:netherrack + tag(Tags.Blocks.OBSIDIANS, Tags.Items.OBSIDIANS) + .addTags( + Tags.Blocks.OBSIDIANS_NORMAL, + Tags.Blocks.OBSIDIANS_CRYING + ) + .addOptionalTag(Legacy.Blocks.OBSIDIAN); + tag(Tags.Blocks.OBSIDIANS_NORMAL, Tags.Items.OBSIDIANS_NORMAL) + .add(Blocks.OBSIDIAN); + tag(Tags.Blocks.OBSIDIANS_CRYING, Tags.Items.OBSIDIANS_CRYING) + .add(Blocks.CRYING_OBSIDIAN); + tag(Tags.Blocks.ORE_BEARING_GROUND_DEEPSLATE, Tags.Items.ORE_BEARING_GROUND_DEEPSLATE) + .add(Blocks.DEEPSLATE); // forge:ore_bearing_ground/deepslate + tag(Tags.Blocks.ORE_BEARING_GROUND_NETHERRACK, Tags.Items.ORE_BEARING_GROUND_NETHERRACK) + .add(Blocks.NETHERRACK); // forge:ore_bearing_ground/netherrack + tag(Tags.Blocks.ORE_BEARING_GROUND_STONE, Tags.Items.ORE_BEARING_GROUND_STONE) + .add(Blocks.STONE); // forge:ore_bearing_ground/stone + tag(Tags.Blocks.ORE_RATES_DENSE, Tags.Items.ORE_RATES_DENSE) + .add( + Blocks.COPPER_ORE, + Blocks.DEEPSLATE_COPPER_ORE, + Blocks.DEEPSLATE_LAPIS_ORE, + Blocks.DEEPSLATE_REDSTONE_ORE, + Blocks.LAPIS_ORE, + Blocks.REDSTONE_ORE + ); + tag(Tags.Blocks.ORE_RATES_SINGULAR, Tags.Items.ORE_RATES_SINGULAR) + .add( + Blocks.ANCIENT_DEBRIS, + Blocks.COAL_ORE, + Blocks.DEEPSLATE_COAL_ORE, + Blocks.DEEPSLATE_DIAMOND_ORE, + Blocks.DEEPSLATE_EMERALD_ORE, + Blocks.DEEPSLATE_GOLD_ORE, + Blocks.DEEPSLATE_IRON_ORE, + Blocks.DIAMOND_ORE, + Blocks.EMERALD_ORE, + Blocks.GOLD_ORE, + Blocks.IRON_ORE, + Blocks.NETHER_QUARTZ_ORE + ); + tag(Tags.Blocks.ORE_RATES_SPARSE, Tags.Items.ORE_RATES_SPARSE) + .add(Blocks.NETHER_GOLD_ORE); + tag(Tags.Blocks.ORES, Tags.Items.ORES) + .addTags( + Tags.Blocks.ORES_COAL, + Tags.Blocks.ORES_COPPER, + Tags.Blocks.ORES_DIAMOND, + Tags.Blocks.ORES_EMERALD, + Tags.Blocks.ORES_GOLD, + Tags.Blocks.ORES_IRON, + Tags.Blocks.ORES_LAPIS, + Tags.Blocks.ORES_NETHERITE_SCRAP, + Tags.Blocks.ORES_REDSTONE, + Tags.Blocks.ORES_QUARTZ + ) + .addOptionalTag(Legacy.Blocks.ORES); + tag(Tags.Blocks.ORES_COAL, Tags.Items.ORES_COAL) + .addTag(BlockTags.COAL_ORES); // forge:ores/coal + tag(Tags.Blocks.ORES_COPPER, Tags.Items.ORES_COPPER) + .addTag(BlockTags.COPPER_ORES); // forge:ores/copper + tag(Tags.Blocks.ORES_DIAMOND, Tags.Items.ORES_DIAMOND) + .addTag(BlockTags.DIAMOND_ORES); // forge:ores/diamond + tag(Tags.Blocks.ORES_EMERALD, Tags.Items.ORES_EMERALD) + .addTag(BlockTags.EMERALD_ORES); // forge:ores/emerald + tag(Tags.Blocks.ORES_GOLD, Tags.Items.ORES_GOLD) + .addTag(BlockTags.GOLD_ORES); // forge:ores/gold + tag(Tags.Blocks.ORES_IRON, Tags.Items.ORES_IRON) + .addTag(BlockTags.IRON_ORES); // forge:ores/iron + tag(Tags.Blocks.ORES_LAPIS, Tags.Items.ORES_LAPIS) + .addTag(BlockTags.LAPIS_ORES); // forge:ores/lapis + tag(Tags.Blocks.ORES_QUARTZ, Tags.Items.ORES_QUARTZ, Legacy.Blocks.ORES_QUARTZ, Legacy.Items.QUARTZ_ORES) + .add(Blocks.NETHER_QUARTZ_ORE) + .addOptionalTag(Legacy.Blocks.ORES_QUARTZ); + tag(Tags.Blocks.ORES_REDSTONE, Tags.Items.ORES_REDSTONE) + .addTag(BlockTags.REDSTONE_ORES); // forge:ores/redstone + tag(Tags.Blocks.ORES_NETHERITE_SCRAP, Tags.Items.ORES_NETHERITE_SCRAP, Legacy.Blocks.ORES_NETHERITE_SCRAP, Legacy.Items.ORES_NEHTERITE_SCRAP) + .add(Blocks.ANCIENT_DEBRIS) + .addOptionalTag(Legacy.Blocks.ORES_NETHERITE_SCRAP); + tag(Tags.Blocks.ORES_IN_GROUND_DEEPSLATE, Tags.Items.ORES_IN_GROUND_DEEPSLATE) + .add( + Blocks.DEEPSLATE_COAL_ORE, + Blocks.DEEPSLATE_COPPER_ORE, + Blocks.DEEPSLATE_DIAMOND_ORE, + Blocks.DEEPSLATE_EMERALD_ORE, + Blocks.DEEPSLATE_GOLD_ORE, + Blocks.DEEPSLATE_IRON_ORE, + Blocks.DEEPSLATE_LAPIS_ORE, + Blocks.DEEPSLATE_REDSTONE_ORE + ); + tag(Tags.Blocks.ORES_IN_GROUND_NETHERRACK, Tags.Items.ORES_IN_GROUND_NETHERRACK) + .add( + Blocks.NETHER_GOLD_ORE, + Blocks.NETHER_QUARTZ_ORE + ); + tag(Tags.Blocks.ORES_IN_GROUND_STONE, Tags.Items.ORES_IN_GROUND_STONE) + .add( + Blocks.COAL_ORE, + Blocks.COPPER_ORE, + Blocks.DIAMOND_ORE, + Blocks.EMERALD_ORE, + Blocks.GOLD_ORE, + Blocks.IRON_ORE, + Blocks.LAPIS_ORE, + Blocks.REDSTONE_ORE + ); + tag(Tags.Blocks.PLAYER_WORKSTATIONS_CRAFTING_TABLES, Tags.Items.PLAYER_WORKSTATIONS_CRAFTING_TABLES) + .add(Blocks.CRAFTING_TABLE); + tag(Tags.Blocks.PLAYER_WORKSTATIONS_FURNACES, Tags.Items.PLAYER_WORKSTATIONS_FURNACES) + .add(Blocks.FURNACE); + tag(Tags.Blocks.PUMPKINS, Tags.Items.PUMPKINS) + .addTags( + Tags.Blocks.PUMPKINS_NORMAL, + Tags.Blocks.PUMPKINS_CARVED, + Tags.Blocks.PUMPKINS_JACK_O_LANTERNS + ); + tag(Tags.Blocks.PUMPKINS_NORMAL, Tags.Items.PUMPKINS_NORMAL) + .add(Blocks.PUMPKIN); + tag(Tags.Blocks.PUMPKINS_CARVED, Tags.Items.PUMPKINS_CARVED) + .add(Blocks.CARVED_PUMPKIN); + tag(Tags.Blocks.PUMPKINS_JACK_O_LANTERNS, Tags.Items.PUMPKINS_JACK_O_LANTERNS) + .add(Blocks.JACK_O_LANTERN); + tag(Tags.Blocks.ROPES, Tags.Items.ROPES); + tag(Tags.Blocks.SAND, Tags.Items.SAND) // forge:sand + .addTags( + Tags.Blocks.SAND_COLORLESS, + Tags.Blocks.SAND_RED + ); + tag(Tags.Blocks.SAND_COLORLESS, Tags.Items.SAND_COLORLESS) // forge:sand/colorless + .add(Blocks.SAND); + tag(Tags.Blocks.SAND_RED, Tags.Items.SAND_RED) // forge:sand/red + .add(Blocks.RED_SAND); + tag(Tags.Blocks.SANDSTONE_BLOCKS, Tags.Items.SANDSTONE_BLOCKS) + .addTags( + Tags.Blocks.SANDSTONE_RED_BLOCKS, + Tags.Blocks.SANDSTONE_UNCOLORED_BLOCKS + ) + .addOptionalTag(Legacy.Blocks.SANDSTONE); + tag(Tags.Blocks.SANDSTONE_SLABS, Tags.Items.SANDSTONE_SLABS) + .addTags( + Tags.Blocks.SANDSTONE_RED_SLABS, + Tags.Blocks.SANDSTONE_UNCOLORED_SLABS + ); + tag(Tags.Blocks.SANDSTONE_STAIRS, Tags.Items.SANDSTONE_STAIRS) + .addTags( + Tags.Blocks.SANDSTONE_RED_STAIRS, + Tags.Blocks.SANDSTONE_UNCOLORED_STAIRS + ); + tag(Tags.Blocks.SANDSTONE_RED_BLOCKS, Tags.Items.SANDSTONE_RED_BLOCKS) + .add( + Blocks.RED_SANDSTONE, + Blocks.CUT_RED_SANDSTONE, + Blocks.CHISELED_RED_SANDSTONE, + Blocks.SMOOTH_RED_SANDSTONE + ); + tag(Tags.Blocks.SANDSTONE_RED_SLABS, Tags.Items.SANDSTONE_RED_SLABS) + .add( + Blocks.RED_SANDSTONE_SLAB, + Blocks.CUT_RED_SANDSTONE_SLAB, + Blocks.SMOOTH_RED_SANDSTONE_SLAB + ); + tag(Tags.Blocks.SANDSTONE_RED_STAIRS, Tags.Items.SANDSTONE_RED_STAIRS) + .add( + Blocks.RED_SANDSTONE_STAIRS, + Blocks.SMOOTH_RED_SANDSTONE_STAIRS + ); + tag(Tags.Blocks.SANDSTONE_UNCOLORED_BLOCKS, Tags.Items.SANDSTONE_UNCOLORED_BLOCKS) + .add( + Blocks.SANDSTONE, + Blocks.CUT_SANDSTONE, + Blocks.CHISELED_SANDSTONE, + Blocks.SMOOTH_SANDSTONE + ); + tag(Tags.Blocks.SANDSTONE_UNCOLORED_SLABS, Tags.Items.SANDSTONE_UNCOLORED_SLABS) + .add( + Blocks.SANDSTONE_SLAB, + Blocks.CUT_SANDSTONE_SLAB, + Blocks.SMOOTH_SANDSTONE_SLAB + ); + tag(Tags.Blocks.SANDSTONE_UNCOLORED_STAIRS, Tags.Items.SANDSTONE_UNCOLORED_STAIRS) + .add( + Blocks.SANDSTONE_STAIRS, + Blocks.SMOOTH_SANDSTONE_STAIRS + ); + tag(Tags.Blocks.STONES, Tags.Items.STONES) + .add( + Blocks.ANDESITE, + Blocks.DIORITE, + Blocks.GRANITE, + Blocks.STONE, + Blocks.DEEPSLATE, + Blocks.TUFF + ); + //.addOptionalTag(forgeTagKey("stone")); // can't add this because it would include infested/polished variants which aren't contained in Fabric's `c:stones` + tag(Tags.Blocks.STORAGE_BLOCKS, Tags.Items.STORAGE_BLOCKS) + .addTags( + Tags.Blocks.STORAGE_BLOCKS_BONE_MEAL, + Tags.Blocks.STORAGE_BLOCKS_COAL, + Tags.Blocks.STORAGE_BLOCKS_COPPER, + Tags.Blocks.STORAGE_BLOCKS_DIAMOND, + Tags.Blocks.STORAGE_BLOCKS_DRIED_KELP, + Tags.Blocks.STORAGE_BLOCKS_EMERALD, + Tags.Blocks.STORAGE_BLOCKS_GOLD, + Tags.Blocks.STORAGE_BLOCKS_IRON, + Tags.Blocks.STORAGE_BLOCKS_LAPIS, + Tags.Blocks.STORAGE_BLOCKS_NETHERITE, + Tags.Blocks.STORAGE_BLOCKS_RAW_COPPER, + Tags.Blocks.STORAGE_BLOCKS_RAW_GOLD, + Tags.Blocks.STORAGE_BLOCKS_RAW_IRON, + Tags.Blocks.STORAGE_BLOCKS_REDSTONE, + Tags.Blocks.STORAGE_BLOCKS_SLIME, + Tags.Blocks.STORAGE_BLOCKS_WHEAT + ) + //.addOptionalTag(forgeTagKey("storage_blocks")); // can't add this because it would include contents from the non-common forge:storage_blocks/amethyst and forge:storage_blocks/quartz, which are not in the c namespace + .addOptionalTags( + Legacy.Blocks.STORAGE_BLOCKS_COAL, + Legacy.Blocks.STORAGE_BLOCKS_COPPER, + Legacy.Blocks.STORAGE_BLOCKS_DIAMOND, + Legacy.Blocks.STORAGE_BLOCKS_EMERALD, + Legacy.Blocks.STORAGE_BLOCKS_GOLD, + Legacy.Blocks.STORAGE_BLOCKS_IRON, + Legacy.Blocks.STORAGE_BLOCKS_LAPIS, + Legacy.Blocks.STORAGE_BLOCKS_NETHERITE, + Legacy.Blocks.STORAGE_BLOCKS_RAW_COPPER, + Legacy.Blocks.STORAGE_BLOCKS_RAW_GOLD, + Legacy.Blocks.STORAGE_BLOCKS_RAW_IRON, + Legacy.Blocks.STORAGE_BLOCKS_REDSTONE + ); + tag(Tags.Blocks.STORAGE_BLOCKS_AMETHYST, Tags.Items.STORAGE_BLOCKS_AMETHYST) + .add(Blocks.AMETHYST_BLOCK); + tag(Tags.Blocks.STORAGE_BLOCKS_BONE_MEAL, Tags.Items.STORAGE_BLOCKS_BONE_MEAL) + .add(Blocks.BONE_BLOCK); + tag(Tags.Blocks.STORAGE_BLOCKS_COAL, Tags.Items.STORAGE_BLOCKS_COAL, Legacy.Blocks.STORAGE_BLOCKS_COAL, Legacy.Items.STORAGE_BLOCKS_COAL) + .add(Blocks.COAL_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_COAL); + tag(Tags.Blocks.STORAGE_BLOCKS_COPPER, Tags.Items.STORAGE_BLOCKS_COPPER, Legacy.Blocks.STORAGE_BLOCKS_COPPER, Legacy.Items.STORAGE_BLOCKS_COPPER) + .add(Blocks.COPPER_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_COPPER); + tag(Tags.Blocks.STORAGE_BLOCKS_DIAMOND, Tags.Items.STORAGE_BLOCKS_DIAMOND, Legacy.Blocks.STORAGE_BLOCKS_DIAMOND, Legacy.Items.STORAGE_BLOCKS_DIAMOND) + .add(Blocks.DIAMOND_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_DIAMOND); + tag(Tags.Blocks.STORAGE_BLOCKS_DRIED_KELP, Tags.Items.STORAGE_BLOCKS_DRIED_KELP) + .add(Blocks.DRIED_KELP_BLOCK); + tag(Tags.Blocks.STORAGE_BLOCKS_EMERALD, Tags.Items.STORAGE_BLOCKS_EMERALD, Legacy.Blocks.STORAGE_BLOCKS_EMERALD, Legacy.Items.STORAGE_BLOCKS_EMERALD) + .add(Blocks.EMERALD_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_EMERALD); + tag(Tags.Blocks.STORAGE_BLOCKS_GOLD, Tags.Items.STORAGE_BLOCKS_GOLD, Legacy.Blocks.STORAGE_BLOCKS_GOLD, Legacy.Items.STORAGE_BLOCKS_GOLD) + .add(Blocks.GOLD_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_GOLD); + tag(Tags.Blocks.STORAGE_BLOCKS_IRON, Tags.Items.STORAGE_BLOCKS_IRON, Legacy.Blocks.STORAGE_BLOCKS_IRON, Legacy.Items.STORAGE_BLOCKS_IRON) + .add(Blocks.IRON_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_IRON); + tag(Tags.Blocks.STORAGE_BLOCKS_LAPIS, Tags.Items.STORAGE_BLOCKS_LAPIS, Legacy.Blocks.STORAGE_BLOCKS_LAPIS, Legacy.Items.STORAGE_BLOCKS_LAPIS) + .add(Blocks.LAPIS_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_LAPIS); + tag(Tags.Blocks.STORAGE_BLOCKS_NETHERITE, Tags.Items.STORAGE_BLOCKS_NETHERITE, Legacy.Blocks.STORAGE_BLOCKS_NETHERITE, Legacy.Items.STORAGE_BLOCKS_NETHERITE) + .add(Blocks.NETHERITE_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_NETHERITE); + tag(Tags.Blocks.STORAGE_BLOCKS_QUARTZ, Tags.Items.STORAGE_BLOCKS_QUARTZ) + .add(Blocks.QUARTZ_BLOCK); + tag(Tags.Blocks.STORAGE_BLOCKS_RAW_COPPER, Tags.Items.STORAGE_BLOCKS_RAW_COPPER, Legacy.Blocks.STORAGE_BLOCKS_RAW_COPPER, Legacy.Items.STORAGE_BLOCKS_RAW_COPPER) + .add(Blocks.RAW_COPPER_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_RAW_COPPER); + tag(Tags.Blocks.STORAGE_BLOCKS_RAW_GOLD, Tags.Items.STORAGE_BLOCKS_RAW_GOLD, Legacy.Blocks.STORAGE_BLOCKS_RAW_GOLD, Legacy.Items.STORAGE_BLOCKS_RAW_GOLD) + .add(Blocks.RAW_GOLD_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_RAW_GOLD); + tag(Tags.Blocks.STORAGE_BLOCKS_RAW_IRON, Tags.Items.STORAGE_BLOCKS_RAW_IRON, Legacy.Blocks.STORAGE_BLOCKS_RAW_IRON, Legacy.Items.STORAGE_BLOCKS_RAW_IRON) + .add(Blocks.RAW_IRON_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_RAW_IRON); + tag(Tags.Blocks.STORAGE_BLOCKS_REDSTONE, Tags.Items.STORAGE_BLOCKS_REDSTONE, Legacy.Blocks.STORAGE_BLOCKS_REDSTONE, Legacy.Items.STORAGE_BLOCKS_REDSTONE) + .add(Blocks.REDSTONE_BLOCK) + .addOptionalTag(Legacy.Blocks.STORAGE_BLOCKS_REDSTONE); + tag(Tags.Blocks.STORAGE_BLOCKS_SLIME, Tags.Items.STORAGE_BLOCKS_SLIME) + .add(Blocks.SLIME_BLOCK); + tag(Tags.Blocks.STORAGE_BLOCKS_WHEAT, Tags.Items.STORAGE_BLOCKS_WHEAT) + .add(Blocks.HAY_BLOCK); + tag(Tags.Blocks.STRIPPED_LOGS, Tags.Items.STRIPPED_LOGS) + .add( + Blocks.STRIPPED_ACACIA_LOG, + Blocks.STRIPPED_BAMBOO_BLOCK, + Blocks.STRIPPED_BIRCH_LOG, + Blocks.STRIPPED_CHERRY_LOG, + Blocks.STRIPPED_DARK_OAK_LOG, + Blocks.STRIPPED_JUNGLE_LOG, + Blocks.STRIPPED_MANGROVE_LOG, + Blocks.STRIPPED_OAK_LOG, + Blocks.STRIPPED_SPRUCE_LOG + ); + tag(Tags.Blocks.STRIPPED_WOODS, Tags.Items.STRIPPED_WOODS) + .add( + Blocks.STRIPPED_ACACIA_WOOD, + Blocks.STRIPPED_BIRCH_WOOD, + Blocks.STRIPPED_CHERRY_WOOD, + Blocks.STRIPPED_DARK_OAK_WOOD, + Blocks.STRIPPED_JUNGLE_WOOD, + Blocks.STRIPPED_MANGROVE_WOOD, + Blocks.STRIPPED_OAK_WOOD, + Blocks.STRIPPED_SPRUCE_WOOD + ); + + // Backwards compat definitions for pre-1.21 legacy `forge:` tags. + // TODO: [Forge][Tags][Old] Remove backwards compat tag entries in 1.22 + tag(Legacy.Blocks.BARRELS, Legacy.Items.BARRELS) + .addTag(Legacy.Blocks.BARRELS_WOODEN); + + tag(Legacy.Blocks.CHESTS, Legacy.Items.CHESTS) + .addTags( + Tags.Blocks.CHESTS_ENDER, + Tags.Blocks.CHESTS_TRAPPED, + Legacy.Blocks.CHESTS_WOODEN + ); + + //copy(forgeBlockTagKey("glass/tinted"), forgeItemTagKey("glass/tinted")); + addColored(tag(Tags.Blocks.STAINED_GLASS, Tags.Items.STAINED_GLASS)::add, Tags.Blocks.GLASS, "{color}_stained_glass"); + addColored(tag(Tags.Blocks.STAINED_GLASS_PANES, Tags.Items.STAINED_GLASS_PANES)::add, Tags.Blocks.GLASS_PANES, "{color}_stained_glass_pane"); + + // tag(Tags.Blocks.GLASS, Tags.Items.GLASS, forgeBlockTagKey("glass"), forgeItemTagKey("glass")) // these are the same thing + tag(Tags.Blocks.GLASS, Tags.Items.GLASS) + .addTags( + Tags.Blocks.GLASS_COLORLESS, + Tags.Blocks.STAINED_GLASS, + Legacy.Blocks.GLASS_TINTED + ); + tag(Tags.Blocks.GLASS_COLORLESS, Tags.Items.GLASS_COLORLESS) + .add(Blocks.GLASS); + tag(Legacy.Blocks.GLASS_PANES, Legacy.Items.GLASS_PANES) + .addTags( + Legacy.Blocks.GLASS_PANES_COLORLESS, + Tags.Blocks.STAINED_GLASS_PANES + ); + tag(Legacy.Blocks.GLASS_PANES_COLORLESS, Legacy.Items.GLASS_PANES_COLORLESS) + .add(Blocks.GLASS_PANE); + tag(Legacy.Blocks.GLASS_TINTED, Legacy.Items.GLASS_TINTED) + .add(Blocks.TINTED_GLASS); + tag(Legacy.Blocks.OBSIDIAN, Legacy.Items.OBSIDIAN) + .add(Blocks.OBSIDIAN); + tag(Legacy.Blocks.ORES, Legacy.Items.ORES) + .addTags( + Tags.Blocks.ORES_COAL, + Tags.Blocks.ORES_COPPER, + Tags.Blocks.ORES_DIAMOND, + Tags.Blocks.ORES_EMERALD, + Tags.Blocks.ORES_GOLD, + Tags.Blocks.ORES_IRON, + Tags.Blocks.ORES_LAPIS, + Tags.Blocks.ORES_REDSTONE, + Legacy.Blocks.ORES_QUARTZ, + Legacy.Blocks.ORES_NETHERITE_SCRAP + ); + tag(Legacy.Blocks.SANDSTONE, Legacy.Items.SANDSTONE) + .add( + Blocks.SANDSTONE, + Blocks.CUT_SANDSTONE, + Blocks.CHISELED_SANDSTONE, + Blocks.SMOOTH_SANDSTONE, + Blocks.RED_SANDSTONE, + Blocks.CUT_RED_SANDSTONE, + Blocks.CHISELED_RED_SANDSTONE, + Blocks.SMOOTH_RED_SANDSTONE + ); + tag(Legacy.Blocks.STONE, Legacy.Items.STONE) + .add( + Blocks.ANDESITE, + Blocks.DIORITE, + Blocks.GRANITE, + Blocks.INFESTED_STONE, + Blocks.STONE, + Blocks.POLISHED_ANDESITE, + Blocks.POLISHED_DIORITE, + Blocks.POLISHED_GRANITE, + Blocks.DEEPSLATE, + Blocks.POLISHED_DEEPSLATE, + Blocks.INFESTED_DEEPSLATE, + Blocks.TUFF + ); + + tag(Legacy.Blocks.STORAGE_BLOCKS, Legacy.Items.STORAGE_BLOCKS) + .addTags( + Tags.Blocks.STORAGE_BLOCKS_AMETHYST, + Legacy.Blocks.STORAGE_BLOCKS_COAL, + Legacy.Blocks.STORAGE_BLOCKS_COPPER, + Legacy.Blocks.STORAGE_BLOCKS_DIAMOND, + Legacy.Blocks.STORAGE_BLOCKS_EMERALD, + Legacy.Blocks.STORAGE_BLOCKS_GOLD, + Legacy.Blocks.STORAGE_BLOCKS_IRON, + Legacy.Blocks.STORAGE_BLOCKS_LAPIS, + Tags.Blocks.STORAGE_BLOCKS_QUARTZ, + Legacy.Blocks.STORAGE_BLOCKS_RAW_COPPER, + Legacy.Blocks.STORAGE_BLOCKS_RAW_GOLD, + Legacy.Blocks.STORAGE_BLOCKS_RAW_IRON, + Legacy.Blocks.STORAGE_BLOCKS_REDSTONE, + Legacy.Blocks.STORAGE_BLOCKS_NETHERITE + ); + } + + private static TagKey forgeTagKey(String path) { + return BlockTags.create(ResourceLocation.fromNamespaceAndPath("forge", path)); + } + + private static TagKey tagKey(String name) { + return BlockTags.create(ResourceLocation.withDefaultNamespace(name)); + } + + private void addColored(Consumer consumer, TagKey group, String pattern) { + String prefix = group.location().getPath().toUpperCase(Locale.ENGLISH) + '_'; + for (DyeColor color : DyeColor.values()) { + ResourceLocation key = ResourceLocation.fromNamespaceAndPath("minecraft", pattern.replace("{color}", color.getName())); + TagKey blockTag = getForgeTag(Tags.Blocks.class, prefix + color.getName()); + TagKey itemTag = getForgeTag(Tags.Items.class, prefix + color.getName()); + Block block = ForgeRegistries.BLOCKS.getValue(key); + if (block == null || block == Blocks.AIR) + throw new IllegalStateException("Unknown vanilla block: " + key.toString()); + tag(blockTag, itemTag).add(block); + consumer.accept(block); + } + } + + @SuppressWarnings("unchecked") + private static TagKey getForgeTag(Class cls, String name) { + try { + name = name.toUpperCase(Locale.ENGLISH); + return (TagKey)cls.getDeclaredField(name).get(null); + } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { + throw new IllegalStateException(cls.getName() + " is missing tag name: " + name); + } + } + + private static ResourceLocation forgeRl(String path) { + return ResourceLocation.fromNamespaceAndPath("forge", path); + } + + private TagAppender tag(TagKey block, TagKey item, TagKey oldBlock, TagKey oldItem) { + var tag = tag(block, item); + var old = tag(oldBlock, oldItem); + return wrap(tag, old, oldBlock); + } + + private static TagAppender wrap(TagAppender tag, TagAppender old, TagKey oldBlock) { + return new TagAppender() { + @Override + public TagAppender add(Block value) { + tag.add(value); + old.add(value); + return this; + } + + @Override + public TagAppender addOptional(Block value) { + tag.addOptional(value); + old.addOptional(value); + return this; + } + + @Override + public TagAppender addTag(TagKey value) { + tag.addTag(value); + old.addTag(value); + return this; + } + + @Override + public TagAppender addOptionalTag(TagKey value) { + tag.addOptionalTag(value); + if (value != oldBlock) + old.addOptionalTag(value); + return this; + } + + @Override + public TagAppender replace(boolean value) { + tag.replace(value); + old.replace(value); + return this; + } + + @Override + public TagAppender remove(ResourceLocation value) { + tag.remove(value); + old.remove(value); + return this; + } + + @Override + public TagAppender remove(TagKey value) { + tag.remove(value); + old.remove(value); + return this; + } + + @Override + public TagAppender remove(Block value) { + tag.remove(value); + old.remove(value); + return this; + } + + @Override + public String getSourceName() { + return tag.getSourceName(); + } + }; + } + + private static class Legacy { + @Deprecated + private static class Blocks { + private static TagKey tag(String path) { + return BlockTags.create(forgeRl(path)); + } + + public static final TagKey BARRELS = tag("barrels"); + public static final TagKey BARRELS_WOODEN = tag("barrels/wooden"); + public static final TagKey BOOKSHELVES = tag("bookshelves"); + public static final TagKey CHESTS = tag("chests"); + public static final TagKey CHESTS_WOODEN = tag("chests/wooden"); + public static final TagKey COBBLESTONE = tag("cobblestone"); + public static final TagKey GLASS_PANES = tag("glass_panes"); + public static final TagKey GLASS_PANES_COLORLESS = tag("glass_panes/colorless"); + public static final TagKey GLASS_SILICA = tag("glass/silica"); + public static final TagKey GLASS_TINTED = tag("glass/tinted"); + public static final TagKey OBSIDIAN = tag("obsidian"); + public static final TagKey ORES = tag("ores"); + public static final TagKey ORES_QUARTZ = tag("ores/quartz"); + public static final TagKey ORES_NETHERITE_SCRAP = tag("ores/netherite_scrap"); + public static final TagKey SANDSTONE = tag("sandstone"); + public static final TagKey STONE = tag("stone"); + public static final TagKey STORAGE_BLOCKS = tag("storage_blocks"); + public static final TagKey STORAGE_BLOCKS_COAL = tag("storage_blocks/coal"); + public static final TagKey STORAGE_BLOCKS_COPPER = tag("storage_blocks/copper"); + public static final TagKey STORAGE_BLOCKS_DIAMOND = tag("storage_blocks/diamond"); + public static final TagKey STORAGE_BLOCKS_EMERALD = tag("storage_blocks/emerald"); + public static final TagKey STORAGE_BLOCKS_GOLD = tag("storage_blocks/gold"); + public static final TagKey STORAGE_BLOCKS_IRON = tag("storage_blocks/iron"); + public static final TagKey STORAGE_BLOCKS_LAPIS = tag("storage_blocks/lapis"); + public static final TagKey STORAGE_BLOCKS_NETHERITE = tag("storage_blocks/netherite"); + public static final TagKey STORAGE_BLOCKS_RAW_COPPER = tag("storage_blocks/raw_copper"); + public static final TagKey STORAGE_BLOCKS_RAW_GOLD = tag("storage_blocks/raw_gold"); + public static final TagKey STORAGE_BLOCKS_RAW_IRON = tag("storage_blocks/raw_iron"); + public static final TagKey STORAGE_BLOCKS_REDSTONE = tag("storage_blocks/redstone"); + } + + @Deprecated + private static class Items { + private static TagKey tag(String path) { + return ItemTags.create(forgeRl(path)); + } + + public static final TagKey BARRELS = tag("barrels"); + public static final TagKey BARRELS_WOODEN = tag("barrels/wooden"); + public static final TagKey BOOKSHELVES = tag("bookshelves"); + public static final TagKey CHESTS = tag("chests"); + public static final TagKey CHESTS_WOODEN = tag("chests/wooden"); + public static final TagKey COBBLESTONE = tag("cobblestone"); + public static final TagKey GLASS_PANES = tag("glass_panes"); + public static final TagKey GLASS_PANES_COLORLESS = tag("glass_panes/colorless"); + public static final TagKey GLASS_SILICA = tag("glass/silica"); + public static final TagKey GLASS_TINTED = tag("glass/tinted"); + public static final TagKey OBSIDIAN = tag("obsidian"); + public static final TagKey ORES = tag("ores"); + public static final TagKey QUARTZ_ORES = tag("ores/quartz"); + public static final TagKey ORES_NEHTERITE_SCRAP = tag("ores/netherite_scrap"); + public static final TagKey SANDSTONE = tag("sandstone"); + public static final TagKey STONE = tag("stone"); + public static final TagKey STORAGE_BLOCKS = tag("storage_blocks"); + public static final TagKey STORAGE_BLOCKS_COAL = tag("storage_blocks/coal"); + public static final TagKey STORAGE_BLOCKS_COPPER = tag("storage_blocks/copper"); + public static final TagKey STORAGE_BLOCKS_DIAMOND = tag("storage_blocks/diamond"); + public static final TagKey STORAGE_BLOCKS_EMERALD = tag("storage_blocks/emerald"); + public static final TagKey STORAGE_BLOCKS_GOLD = tag("storage_blocks/gold"); + public static final TagKey STORAGE_BLOCKS_IRON = tag("storage_blocks/iron"); + public static final TagKey STORAGE_BLOCKS_LAPIS = tag("storage_blocks/lapis"); + public static final TagKey STORAGE_BLOCKS_NETHERITE = tag("storage_blocks/netherite"); + public static final TagKey STORAGE_BLOCKS_RAW_COPPER = tag("storage_blocks/raw_copper"); + public static final TagKey STORAGE_BLOCKS_RAW_GOLD = tag("storage_blocks/raw_gold"); + public static final TagKey STORAGE_BLOCKS_RAW_IRON = tag("storage_blocks/raw_iron"); + public static final TagKey STORAGE_BLOCKS_REDSTONE = tag("storage_blocks/redstone"); + } + } +} diff --git a/src/main/java/net/minecraftforge/common/data/ForgeBlockTagsProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeBlockTagsProvider.java index 4d4a8923e4..05d8c5aa73 100644 --- a/src/main/java/net/minecraftforge/common/data/ForgeBlockTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/ForgeBlockTagsProvider.java @@ -7,11 +7,13 @@ package net.minecraftforge.common.data; import net.minecraft.core.HolderLookup; import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.IntrinsicHolderTagsProvider; +import net.minecraft.data.tags.TagAppender; +import net.minecraft.data.tags.VanillaBlockTagsProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.common.Tags; @@ -27,45 +29,21 @@ import java.util.function.Consumer; import static net.minecraftforge.common.Tags.Blocks.*; @ApiStatus.Internal -public final class ForgeBlockTagsProvider extends BlockTagsProvider { +public final class ForgeBlockTagsProvider extends VanillaBlockTagsProvider { public ForgeBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { super(output, lookupProvider, "forge", existingFileHelper); } - @SuppressWarnings("unchecked") @Override public void addTags(HolderLookup.Provider p_256380_) { - tag(BARRELS) - .addTag(BARRELS_WOODEN) - .addOptionalTag(forgeTagKey("barrels")); - tag(BARRELS_WOODEN) - .add(Blocks.BARREL) - .addOptionalTag(forgeTagKey("barrels/wooden")); - tag(BOOKSHELVES) - .add(Blocks.BOOKSHELF) - .addOptionalTag(forgeTagKey("bookshelves")); - tag(BUDDING_BLOCKS).add(Blocks.BUDDING_AMETHYST); - tag(BUDS).add(Blocks.SMALL_AMETHYST_BUD).add(Blocks.MEDIUM_AMETHYST_BUD).add(Blocks.LARGE_AMETHYST_BUD); - tag(CHAINS).add(Blocks.CHAIN); - tag(CHESTS) - .addTags(CHESTS_ENDER, CHESTS_TRAPPED, CHESTS_WOODEN) - .addOptionalTag(forgeTagKey("chests")); - tag(CHESTS_ENDER).add(Blocks.ENDER_CHEST); // forge:chests/ender - tag(CHESTS_TRAPPED).add(Blocks.TRAPPED_CHEST); // forge:chests/trapped - tag(CHESTS_WOODEN) - .add(Blocks.CHEST, Blocks.TRAPPED_CHEST) - .addOptionalTag(forgeTagKey("chests/wooden")); + (new ForgeBlockItemTagsProvider() { + @Override + protected TagAppender tag(TagKey p_406922_, TagKey p_408417_) { + return ForgeBlockTagsProvider.this.tag(p_406922_); + } + }).run(); tag(CHORUS_ADDITIONALLY_GROWS_ON) - .addTag(END_STONES); - tag(CLUSTERS).add(Blocks.AMETHYST_CLUSTER); - tag(COBBLESTONES) - .addTags(COBBLESTONE_NORMAL, COBBLESTONE_INFESTED, COBBLESTONE_MOSSY, COBBLESTONE_DEEPSLATE) - .addOptionalTag(forgeTagKey("cobblestone")); - tag(COBBLESTONE_NORMAL).add(Blocks.COBBLESTONE); // forge:cobblestone/normal - tag(COBBLESTONE_INFESTED).add(Blocks.INFESTED_COBBLESTONE); // forge:cobblestone/infested - tag(COBBLESTONE_MOSSY).add(Blocks.MOSSY_COBBLESTONE); // forge:cobblestone/mossy - tag(COBBLESTONE_DEEPSLATE).add(Blocks.COBBLED_DEEPSLATE); // forge:cobblestone/deepslate - tag(CONCRETES).add(Blocks.WHITE_CONCRETE, Blocks.ORANGE_CONCRETE, Blocks.MAGENTA_CONCRETE, Blocks.LIGHT_BLUE_CONCRETE, Blocks.YELLOW_CONCRETE, Blocks.LIME_CONCRETE, Blocks.PINK_CONCRETE, Blocks.GRAY_CONCRETE, Blocks.LIGHT_GRAY_CONCRETE, Blocks.CYAN_CONCRETE, Blocks.PURPLE_CONCRETE, Blocks.BLUE_CONCRETE, Blocks.BROWN_CONCRETE, Blocks.GREEN_CONCRETE, Blocks.RED_CONCRETE, Blocks.BLACK_CONCRETE); + .addTag(END_STONES); addColored(DYED, "{color}_banner"); addColored(DYED, "{color}_bed"); addColored(DYED, "{color}_candle"); @@ -80,210 +58,15 @@ public final class ForgeBlockTagsProvider extends BlockTagsProvider { addColored(DYED, "{color}_wall_banner"); addColored(DYED, "{color}_wool"); addColoredTags(tag(DYED)::addTag, DYED); - tag(END_STONES).add(Blocks.END_STONE); // forge:end_stones tag(ENDERMAN_PLACE_ON_BLACKLIST); // forge:enderman_place_on_blacklist - tag(FENCE_GATES).addTags(FENCE_GATES_WOODEN); // forge:fence_gates - tag(FENCE_GATES_WOODEN).add(Blocks.OAK_FENCE_GATE, Blocks.SPRUCE_FENCE_GATE, Blocks.BIRCH_FENCE_GATE, Blocks.JUNGLE_FENCE_GATE, Blocks.ACACIA_FENCE_GATE, Blocks.DARK_OAK_FENCE_GATE, Blocks.CRIMSON_FENCE_GATE, Blocks.WARPED_FENCE_GATE, Blocks.MANGROVE_FENCE_GATE, Blocks.BAMBOO_FENCE_GATE, Blocks.CHERRY_FENCE_GATE); - tag(FENCES).addTags(FENCES_NETHER_BRICK, FENCES_WOODEN); // forge:fences - tag(FENCES_NETHER_BRICK).add(Blocks.NETHER_BRICK_FENCE); // forge:fences/nether_brick - tag(FENCES_WOODEN).addTag(BlockTags.WOODEN_FENCES); // forge:fences/wooden - tag(Tags.Blocks.FLOWERS_SMALL) - .add(Blocks.DANDELION, Blocks.POPPY, Blocks.BLUE_ORCHID, Blocks.ALLIUM, Blocks.AZURE_BLUET, Blocks.RED_TULIP, Blocks.ORANGE_TULIP, Blocks.WHITE_TULIP, Blocks.PINK_TULIP, Blocks.OXEYE_DAISY, Blocks.CORNFLOWER, Blocks.LILY_OF_THE_VALLEY, Blocks.WITHER_ROSE, Blocks.TORCHFLOWER, Blocks.OPEN_EYEBLOSSOM, Blocks.CLOSED_EYEBLOSSOM) - .addOptionalTag(BlockTags.SMALL_FLOWERS); - tag(Tags.Blocks.FLOWERS_TALL) - .add(Blocks.SUNFLOWER, Blocks.LILAC, Blocks.PEONY, Blocks.ROSE_BUSH, Blocks.PITCHER_PLANT) - .addOptional(ResourceLocation.withDefaultNamespace("tall_flowers")); - tag(Tags.Blocks.FLOWERS) - .add(Blocks.FLOWERING_AZALEA_LEAVES, Blocks.FLOWERING_AZALEA, Blocks.MANGROVE_PROPAGULE, Blocks.PINK_PETALS, Blocks.CHORUS_FLOWER, Blocks.SPORE_BLOSSOM) - .addTags(Tags.Blocks.FLOWERS_SMALL, Tags.Blocks.FLOWERS_TALL) - .addOptionalTag(BlockTags.FLOWERS); - tag(GLASS_BLOCKS) - .addTags(GLASS_BLOCKS_COLORLESS, GLASS_BLOCKS_CHEAP, GLASS_BLOCKS_TINTED) - .addOptionalTag(forgeTagKey("glass")); - tag(GLASS_BLOCKS_COLORLESS) - .add(Blocks.GLASS) - .addOptionalTag(forgeTagKey("glass/colorless")); - tag(GLASS_BLOCKS_CHEAP) - .add(Blocks.GLASS, Blocks.WHITE_STAINED_GLASS, Blocks.ORANGE_STAINED_GLASS, Blocks.MAGENTA_STAINED_GLASS, Blocks.LIGHT_BLUE_STAINED_GLASS, Blocks.YELLOW_STAINED_GLASS, Blocks.LIME_STAINED_GLASS, Blocks.PINK_STAINED_GLASS, Blocks.GRAY_STAINED_GLASS, Blocks.LIGHT_GRAY_STAINED_GLASS, Blocks.CYAN_STAINED_GLASS, Blocks.PURPLE_STAINED_GLASS, Blocks.BLUE_STAINED_GLASS, Blocks.BROWN_STAINED_GLASS, Blocks.GREEN_STAINED_GLASS, Blocks.RED_STAINED_GLASS, Blocks.BLACK_STAINED_GLASS) - .addOptionalTag(forgeTagKey("glass/silica")); - tag(GLASS_BLOCKS_TINTED) - .add(Blocks.TINTED_GLASS) - .addOptionalTag(forgeTagKey("glass/tinted")); - tag(GLASS_PANES) - .addTags(GLASS_PANES_COLORLESS).add(Blocks.WHITE_STAINED_GLASS_PANE, Blocks.ORANGE_STAINED_GLASS_PANE, Blocks.MAGENTA_STAINED_GLASS_PANE, Blocks.LIGHT_BLUE_STAINED_GLASS_PANE, Blocks.YELLOW_STAINED_GLASS_PANE, Blocks.LIME_STAINED_GLASS_PANE, Blocks.PINK_STAINED_GLASS_PANE, Blocks.GRAY_STAINED_GLASS_PANE, Blocks.LIGHT_GRAY_STAINED_GLASS_PANE, Blocks.CYAN_STAINED_GLASS_PANE, Blocks.PURPLE_STAINED_GLASS_PANE, Blocks.BLUE_STAINED_GLASS_PANE, Blocks.BROWN_STAINED_GLASS_PANE, Blocks.GREEN_STAINED_GLASS_PANE, Blocks.RED_STAINED_GLASS_PANE, Blocks.BLACK_STAINED_GLASS_PANE) - .addOptionalTag(forgeTagKey("glass_panes")); - tag(GLASS_PANES_COLORLESS) - .add(Blocks.GLASS_PANE) - .addOptionalTag(forgeTagKey("glass_panes/colorless")); - tag(GLAZED_TERRACOTTAS).add(Blocks.WHITE_GLAZED_TERRACOTTA, Blocks.ORANGE_GLAZED_TERRACOTTA, Blocks.MAGENTA_GLAZED_TERRACOTTA, Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA, Blocks.YELLOW_GLAZED_TERRACOTTA, Blocks.LIME_GLAZED_TERRACOTTA, Blocks.PINK_GLAZED_TERRACOTTA, Blocks.GRAY_GLAZED_TERRACOTTA, Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA, Blocks.CYAN_GLAZED_TERRACOTTA, Blocks.PURPLE_GLAZED_TERRACOTTA, Blocks.BLUE_GLAZED_TERRACOTTA, Blocks.BROWN_GLAZED_TERRACOTTA, Blocks.GREEN_GLAZED_TERRACOTTA, Blocks.RED_GLAZED_TERRACOTTA, Blocks.BLACK_GLAZED_TERRACOTTA); - tag(GRAVEL).add(Blocks.GRAVEL); // forge:gravel tag(SKULLS).add(Blocks.SKELETON_SKULL, Blocks.SKELETON_WALL_SKULL, Blocks.WITHER_SKELETON_SKULL, Blocks.WITHER_SKELETON_WALL_SKULL, Blocks.PLAYER_HEAD, Blocks.PLAYER_WALL_HEAD, Blocks.ZOMBIE_HEAD, Blocks.ZOMBIE_WALL_HEAD, Blocks.CREEPER_HEAD, Blocks.CREEPER_WALL_HEAD, Blocks.PIGLIN_HEAD, Blocks.PIGLIN_WALL_HEAD, Blocks.DRAGON_HEAD, Blocks.DRAGON_WALL_HEAD); tag(HIDDEN_FROM_RECIPE_VIEWERS); - tag(NETHERRACK).add(Blocks.NETHERRACK); // forge:netherrack - tag(OBSIDIANS_NORMAL).add(Blocks.OBSIDIAN); - tag(OBSIDIANS_CRYING).add(Blocks.CRYING_OBSIDIAN); - tag(OBSIDIANS) - .addTags(OBSIDIANS_NORMAL, OBSIDIANS_CRYING) - .addOptionalTag(forgeTagKey("obsidian")); - tag(ORE_BEARING_GROUND_DEEPSLATE).add(Blocks.DEEPSLATE); // forge:ore_bearing_ground/deepslate - tag(ORE_BEARING_GROUND_NETHERRACK).add(Blocks.NETHERRACK); // forge:ore_bearing_ground/netherrack - tag(ORE_BEARING_GROUND_STONE).add(Blocks.STONE); // forge:ore_bearing_ground/stone - tag(ORE_RATES_DENSE).add(Blocks.COPPER_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.DEEPSLATE_REDSTONE_ORE, Blocks.LAPIS_ORE, Blocks.REDSTONE_ORE); - tag(ORE_RATES_SINGULAR).add(Blocks.ANCIENT_DEBRIS, Blocks.COAL_ORE, Blocks.DEEPSLATE_COAL_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.GOLD_ORE, Blocks.IRON_ORE, Blocks.NETHER_QUARTZ_ORE); - tag(ORE_RATES_SPARSE).add(Blocks.NETHER_GOLD_ORE); - tag(ORES) - .addTags(ORES_COAL, ORES_COPPER, ORES_DIAMOND, ORES_EMERALD, ORES_GOLD, ORES_IRON, ORES_LAPIS, ORES_NETHERITE_SCRAP, ORES_REDSTONE, ORES_QUARTZ) - .addOptionalTag(forgeTagKey("ores")); - tag(ORES_COAL).addTag(BlockTags.COAL_ORES); // forge:ores/coal - tag(ORES_COPPER).addTag(BlockTags.COPPER_ORES); // forge:ores/copper - tag(ORES_DIAMOND).addTag(BlockTags.DIAMOND_ORES); // forge:ores/diamond - tag(ORES_EMERALD).addTag(BlockTags.EMERALD_ORES); // forge:ores/emerald - tag(ORES_GOLD).addTag(BlockTags.GOLD_ORES); // forge:ores/gold - tag(ORES_IRON).addTag(BlockTags.IRON_ORES); // forge:ores/iron - tag(ORES_LAPIS).addTag(BlockTags.LAPIS_ORES); // forge:ores/lapis - tag(ORES_QUARTZ) - .add(Blocks.NETHER_QUARTZ_ORE) - .addOptionalTag(forgeTagKey("ores/quartz")); - tag(ORES_REDSTONE).addTag(BlockTags.REDSTONE_ORES); // forge:ores/redstone - tag(ORES_NETHERITE_SCRAP) - .add(Blocks.ANCIENT_DEBRIS) - .addOptionalTag(forgeTagKey("ores/netherite_scrap")); - tag(ORES_IN_GROUND_DEEPSLATE).add(Blocks.DEEPSLATE_COAL_ORE, Blocks.DEEPSLATE_COPPER_ORE, Blocks.DEEPSLATE_DIAMOND_ORE, Blocks.DEEPSLATE_EMERALD_ORE, Blocks.DEEPSLATE_GOLD_ORE, Blocks.DEEPSLATE_IRON_ORE, Blocks.DEEPSLATE_LAPIS_ORE, Blocks.DEEPSLATE_REDSTONE_ORE); - tag(ORES_IN_GROUND_NETHERRACK).add(Blocks.NETHER_GOLD_ORE, Blocks.NETHER_QUARTZ_ORE); - tag(ORES_IN_GROUND_STONE).add(Blocks.COAL_ORE, Blocks.COPPER_ORE, Blocks.DIAMOND_ORE, Blocks.EMERALD_ORE, Blocks.GOLD_ORE, Blocks.IRON_ORE, Blocks.LAPIS_ORE, Blocks.REDSTONE_ORE); - tag(PLAYER_WORKSTATIONS_CRAFTING_TABLES).add(Blocks.CRAFTING_TABLE); - tag(PLAYER_WORKSTATIONS_FURNACES).add(Blocks.FURNACE); - tag(PUMPKINS).addTags(PUMPKINS_NORMAL, PUMPKINS_CARVED, PUMPKINS_JACK_O_LANTERNS); - tag(PUMPKINS_NORMAL).add(Blocks.PUMPKIN); - tag(PUMPKINS_CARVED).add(Blocks.CARVED_PUMPKIN); - tag(PUMPKINS_JACK_O_LANTERNS).add(Blocks.JACK_O_LANTERN); - tag(SAND).addTags(SAND_COLORLESS, SAND_RED); // forge:sand tag(RELOCATION_NOT_SUPPORTED); - tag(ROPES); - tag(SAND_COLORLESS).add(Blocks.SAND); // forge:sand/colorless - tag(SAND_RED).add(Blocks.RED_SAND); // forge:sand/red - - tag(SANDSTONE_RED_BLOCKS).add(Blocks.RED_SANDSTONE, Blocks.CUT_RED_SANDSTONE, Blocks.CHISELED_RED_SANDSTONE, Blocks.SMOOTH_RED_SANDSTONE); - tag(SANDSTONE_UNCOLORED_BLOCKS).add(Blocks.SANDSTONE, Blocks.CUT_SANDSTONE, Blocks.CHISELED_SANDSTONE, Blocks.SMOOTH_SANDSTONE); - tag(SANDSTONE_BLOCKS) - .addTags(SANDSTONE_RED_BLOCKS, SANDSTONE_UNCOLORED_BLOCKS) - .addOptionalTag(forgeTagKey("sandstone")); - tag(SANDSTONE_RED_SLABS).add(Blocks.RED_SANDSTONE_SLAB, Blocks.CUT_RED_SANDSTONE_SLAB, Blocks.SMOOTH_RED_SANDSTONE_SLAB); - tag(SANDSTONE_UNCOLORED_SLABS).add(Blocks.SANDSTONE_SLAB, Blocks.CUT_SANDSTONE_SLAB, Blocks.SMOOTH_SANDSTONE_SLAB); - tag(SANDSTONE_SLABS).addTags(SANDSTONE_RED_SLABS, SANDSTONE_UNCOLORED_SLABS); - tag(SANDSTONE_RED_STAIRS).add(Blocks.RED_SANDSTONE_STAIRS, Blocks.SMOOTH_RED_SANDSTONE_STAIRS); - tag(SANDSTONE_UNCOLORED_STAIRS).add(Blocks.SANDSTONE_STAIRS, Blocks.SMOOTH_SANDSTONE_STAIRS); - tag(SANDSTONE_STAIRS).addTags(SANDSTONE_RED_STAIRS, SANDSTONE_UNCOLORED_STAIRS); - - tag(STONES) - .add(Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.STONE, Blocks.DEEPSLATE, Blocks.TUFF); - //.addOptionalTag(forgeTagKey("stone")); // can't add this because it would include infested/polished variants which aren't contained in Fabric's `c:stones` - tag(STORAGE_BLOCKS) - .addTags(STORAGE_BLOCKS_BONE_MEAL, STORAGE_BLOCKS_COAL, - STORAGE_BLOCKS_COPPER, STORAGE_BLOCKS_DIAMOND, STORAGE_BLOCKS_DRIED_KELP, - STORAGE_BLOCKS_EMERALD, STORAGE_BLOCKS_GOLD, STORAGE_BLOCKS_IRON, - STORAGE_BLOCKS_LAPIS, STORAGE_BLOCKS_NETHERITE, STORAGE_BLOCKS_RAW_COPPER, - STORAGE_BLOCKS_RAW_GOLD, STORAGE_BLOCKS_RAW_IRON, STORAGE_BLOCKS_REDSTONE, - STORAGE_BLOCKS_SLIME, STORAGE_BLOCKS_WHEAT) - //.addOptionalTag(forgeTagKey("storage_blocks")); // can't add this because it would include contents from the non-common forge:storage_blocks/amethyst and forge:storage_blocks/quartz, which are not in the c namespace - .addOptionalTags(forgeTagKey("storage_blocks/coal"), forgeTagKey("storage_blocks/copper"), - forgeTagKey("storage_blocks/diamond"), forgeTagKey("storage_blocks/emerald"), - forgeTagKey("storage_blocks/gold"), forgeTagKey("storage_blocks/iron"), - forgeTagKey("storage_blocks/lapis"), forgeTagKey("storage_blocks/netherite"), - forgeTagKey("storage_blocks/raw_copper"), forgeTagKey("storage_blocks/raw_gold"), - forgeTagKey("storage_blocks/raw_iron"), forgeTagKey("storage_blocks/redstone")); - tag(STORAGE_BLOCKS_BONE_MEAL).add(Blocks.BONE_BLOCK); - tag(STORAGE_BLOCKS_COAL) - .add(Blocks.COAL_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/coal")); - tag(STORAGE_BLOCKS_COPPER) - .add(Blocks.COPPER_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/copper")); - tag(STORAGE_BLOCKS_DIAMOND) - .add(Blocks.DIAMOND_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/diamond")); - tag(STORAGE_BLOCKS_DRIED_KELP).add(Blocks.DRIED_KELP_BLOCK); - tag(STORAGE_BLOCKS_EMERALD) - .add(Blocks.EMERALD_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/emerald")); - tag(STORAGE_BLOCKS_GOLD) - .add(Blocks.GOLD_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/gold")); - tag(STORAGE_BLOCKS_IRON) - .add(Blocks.IRON_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/iron")); - tag(STORAGE_BLOCKS_LAPIS) - .add(Blocks.LAPIS_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/lapis")); - tag(STORAGE_BLOCKS_NETHERITE) - .add(Blocks.NETHERITE_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/netherite")); - tag(STORAGE_BLOCKS_RAW_COPPER) - .add(Blocks.RAW_COPPER_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/raw_copper")); - tag(STORAGE_BLOCKS_RAW_GOLD) - .add(Blocks.RAW_GOLD_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/raw_gold")); - tag(STORAGE_BLOCKS_RAW_IRON) - .add(Blocks.RAW_IRON_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/raw_iron")); - tag(STORAGE_BLOCKS_REDSTONE) - .add(Blocks.REDSTONE_BLOCK) - .addOptionalTag(forgeTagKey("storage_blocks/redstone")); - tag(STORAGE_BLOCKS_SLIME).add(Blocks.SLIME_BLOCK); - tag(STORAGE_BLOCKS_WHEAT).add(Blocks.HAY_BLOCK); - tag(Tags.Blocks.STRIPPED_LOGS).add( - Blocks.STRIPPED_ACACIA_LOG, Blocks.STRIPPED_BAMBOO_BLOCK, Blocks.STRIPPED_BIRCH_LOG, - Blocks.STRIPPED_CHERRY_LOG, Blocks.STRIPPED_DARK_OAK_LOG, Blocks.STRIPPED_JUNGLE_LOG, - Blocks.STRIPPED_MANGROVE_LOG, Blocks.STRIPPED_OAK_LOG, Blocks.STRIPPED_SPRUCE_LOG); - tag(Tags.Blocks.STRIPPED_WOODS).add( - Blocks.STRIPPED_ACACIA_WOOD, Blocks.STRIPPED_BIRCH_WOOD, Blocks.STRIPPED_CHERRY_WOOD, - Blocks.STRIPPED_DARK_OAK_WOOD, Blocks.STRIPPED_JUNGLE_WOOD, Blocks.STRIPPED_MANGROVE_WOOD, - Blocks.STRIPPED_OAK_WOOD, Blocks.STRIPPED_SPRUCE_WOOD); tag(VILLAGER_JOB_SITES).add( Blocks.BARREL, Blocks.BLAST_FURNACE, Blocks.BREWING_STAND, Blocks.CARTOGRAPHY_TABLE, Blocks.CAULDRON, Blocks.WATER_CAULDRON, Blocks.LAVA_CAULDRON, Blocks.POWDER_SNOW_CAULDRON, Blocks.COMPOSTER, Blocks.FLETCHING_TABLE, Blocks.GRINDSTONE, Blocks.LECTERN, Blocks.LOOM, Blocks.SMITHING_TABLE, Blocks.SMOKER, Blocks.STONECUTTER); - - // Backwards compat definitions for pre-1.21 legacy `forge:` tags. - // TODO: Remove backwards compat tag entries in 1.22 - tag(forgeTagKey("barrels")).addTag(forgeTagKey("barrels/wooden")); - tag(forgeTagKey("barrels/wooden")).add(Blocks.BARREL); - tag(forgeTagKey("bookshelves")).add(Blocks.BOOKSHELF); - tag(forgeTagKey("chests")).addTags(forgeTagKey("chests/ender"), forgeTagKey("chests/trapped"), forgeTagKey("chests/wooden")); - tag(forgeTagKey("chests/wooden")).add(Blocks.CHEST, Blocks.TRAPPED_CHEST); - tag(forgeTagKey("cobblestone")).addTags(forgeTagKey("cobblestone/normal"), forgeTagKey("cobblestone/infested"), forgeTagKey("cobblestone/mossy"), forgeTagKey("cobblestone/deepslate")); - tag(forgeTagKey("glass")).addTags(forgeTagKey("glass/colorless"), forgeTagKey("stained_glass"), forgeTagKey("glass/tinted")); - tag(forgeTagKey("glass/colorless")).add(Blocks.GLASS); - tag(forgeTagKey("glass/silica")).add(Blocks.GLASS, Blocks.BLACK_STAINED_GLASS, Blocks.BLUE_STAINED_GLASS, Blocks.BROWN_STAINED_GLASS, Blocks.CYAN_STAINED_GLASS, Blocks.GRAY_STAINED_GLASS, Blocks.GREEN_STAINED_GLASS, Blocks.LIGHT_BLUE_STAINED_GLASS, Blocks.LIGHT_GRAY_STAINED_GLASS, Blocks.LIME_STAINED_GLASS, Blocks.MAGENTA_STAINED_GLASS, Blocks.ORANGE_STAINED_GLASS, Blocks.PINK_STAINED_GLASS, Blocks.PURPLE_STAINED_GLASS, Blocks.RED_STAINED_GLASS, Blocks.WHITE_STAINED_GLASS, Blocks.YELLOW_STAINED_GLASS); - tag(forgeTagKey("glass/tinted")).add(Blocks.TINTED_GLASS); - addColored(tag(forgeTagKey("stained_glass"))::add, forgeTagKey("glass"), "{color}_stained_glass"); - tag(forgeTagKey("glass_panes")).addTags(forgeTagKey("glass_panes/colorless"), forgeTagKey("stained_glass_panes")); - tag(forgeTagKey("glass_panes/colorless")).add(Blocks.GLASS_PANE); - addColored(tag(forgeTagKey("stained_glass_panes"))::add, forgeTagKey("glass_panes"), "{color}_stained_glass_pane"); - tag(forgeTagKey("obsidian")).add(Blocks.OBSIDIAN); - tag(forgeTagKey("ores")).addTags(forgeTagKey("ores/coal"), forgeTagKey("ores/copper"), forgeTagKey("ores/diamond"), forgeTagKey("ores/emerald"), forgeTagKey("ores/gold"), forgeTagKey("ores/iron"), forgeTagKey("ores/lapis"), forgeTagKey("ores/redstone"), forgeTagKey("ores/quartz"), forgeTagKey("ores/netherite_scrap")); - tag(forgeTagKey("ores/quartz")).add(Blocks.NETHER_QUARTZ_ORE); - tag(forgeTagKey("ores/netherite_scrap")).add(Blocks.ANCIENT_DEBRIS); - tag(forgeTagKey("sandstone")).add(Blocks.SANDSTONE, Blocks.CUT_SANDSTONE, Blocks.CHISELED_SANDSTONE, Blocks.SMOOTH_SANDSTONE, Blocks.RED_SANDSTONE, Blocks.CUT_RED_SANDSTONE, Blocks.CHISELED_RED_SANDSTONE, Blocks.SMOOTH_RED_SANDSTONE); - tag(forgeTagKey("stone")).add(Blocks.ANDESITE, Blocks.DIORITE, Blocks.GRANITE, Blocks.INFESTED_STONE, Blocks.STONE, Blocks.POLISHED_ANDESITE, Blocks.POLISHED_DIORITE, Blocks.POLISHED_GRANITE, Blocks.DEEPSLATE, Blocks.POLISHED_DEEPSLATE, Blocks.INFESTED_DEEPSLATE, Blocks.TUFF); - tag(forgeTagKey("storage_blocks")) - .addTags(forgeTagKey("storage_blocks/amethyst"), forgeTagKey("storage_blocks/coal"), forgeTagKey("storage_blocks/copper"), forgeTagKey("storage_blocks/diamond"), forgeTagKey("storage_blocks/emerald"), forgeTagKey("storage_blocks/gold"), forgeTagKey("storage_blocks/iron"), forgeTagKey("storage_blocks/lapis"), forgeTagKey("storage_blocks/quartz"), forgeTagKey("storage_blocks/raw_copper"), forgeTagKey("storage_blocks/raw_gold"), forgeTagKey("storage_blocks/raw_iron"), forgeTagKey("storage_blocks/redstone"), forgeTagKey("storage_blocks/netherite")); - tag(forgeTagKey("storage_blocks/amethyst")).add(Blocks.AMETHYST_BLOCK); - tag(forgeTagKey("storage_blocks/coal")).add(Blocks.COAL_BLOCK); - tag(forgeTagKey("storage_blocks/copper")).add(Blocks.COPPER_BLOCK); - tag(forgeTagKey("storage_blocks/diamond")).add(Blocks.DIAMOND_BLOCK); - tag(forgeTagKey("storage_blocks/emerald")).add(Blocks.EMERALD_BLOCK); - tag(forgeTagKey("storage_blocks/gold")).add(Blocks.GOLD_BLOCK); - tag(forgeTagKey("storage_blocks/iron")).add(Blocks.IRON_BLOCK); - tag(forgeTagKey("storage_blocks/lapis")).add(Blocks.LAPIS_BLOCK); - tag(forgeTagKey("storage_blocks/quartz")).add(Blocks.QUARTZ_BLOCK); - tag(forgeTagKey("storage_blocks/raw_copper")).add(Blocks.RAW_COPPER_BLOCK); - tag(forgeTagKey("storage_blocks/raw_gold")).add(Blocks.RAW_GOLD_BLOCK); - tag(forgeTagKey("storage_blocks/raw_iron")).add(Blocks.RAW_IRON_BLOCK); - tag(forgeTagKey("storage_blocks/redstone")).add(Blocks.REDSTONE_BLOCK); - tag(forgeTagKey("storage_blocks/netherite")).add(Blocks.NETHERITE_BLOCK); } private void addColored(TagKey group, String pattern) { @@ -298,19 +81,6 @@ public final class ForgeBlockTagsProvider extends BlockTagsProvider { } } - private void addColored(Consumer consumer, TagKey group, String pattern) { - String prefix = group.location().getPath().toUpperCase(Locale.ENGLISH) + '_'; - for (DyeColor color : DyeColor.values()) { - ResourceLocation key = ResourceLocation.fromNamespaceAndPath("minecraft", pattern.replace("{color}", color.getName())); - TagKey tag = getForgeTag(prefix + color.getName()); - Block block = ForgeRegistries.BLOCKS.getValue(key); - if (block == null || block == Blocks.AIR) - throw new IllegalStateException("Unknown vanilla block: " + key.toString()); - tag(tag).add(block); - consumer.accept(block); - } - } - private static void addColoredTags(Consumer> consumer, TagKey group) { String prefix = group.location().getPath().toUpperCase(Locale.ENGLISH) + '_'; for (var color : DyeColor.values()) { diff --git a/src/main/java/net/minecraftforge/common/data/ForgeEnchantmentTagsProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeEnchantmentTagsProvider.java index 3ab4d70621..611f175fcd 100644 --- a/src/main/java/net/minecraftforge/common/data/ForgeEnchantmentTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/ForgeEnchantmentTagsProvider.java @@ -15,7 +15,7 @@ import java.util.concurrent.CompletableFuture; import static net.minecraftforge.common.Tags.Enchantments.*; @ApiStatus.Internal -public final class ForgeEnchantmentTagsProvider extends EnchantmentTagsProvider { +public final class ForgeEnchantmentTagsProvider extends net.minecraft.data.tags.EnchantmentTagsProvider { public ForgeEnchantmentTagsProvider(PackOutput output, CompletableFuture lookupProvider, ExistingFileHelper existingFileHelper) { super(output, lookupProvider, "forge", existingFileHelper); } diff --git a/src/main/java/net/minecraftforge/common/data/ForgeFluidTagsProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeFluidTagsProvider.java index 3d33cc88c5..436435fce7 100644 --- a/src/main/java/net/minecraftforge/common/data/ForgeFluidTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/ForgeFluidTagsProvider.java @@ -28,7 +28,9 @@ public final class ForgeFluidTagsProvider extends FluidTagsProvider { public void addTags(HolderLookup.Provider lookupProvider) { tag(WATER).add(net.minecraft.world.level.material.Fluids.WATER).add(net.minecraft.world.level.material.Fluids.FLOWING_WATER); tag(LAVA).add(net.minecraft.world.level.material.Fluids.LAVA).add(net.minecraft.world.level.material.Fluids.FLOWING_LAVA); - tag(MILK).addOptional(ForgeMod.MILK.getId()).addOptional(ForgeMod.FLOWING_MILK.getId()); + tag(MILK) + .addOptional(ForgeMod.MILK.getKey().location()) + .addOptional(ForgeMod.FLOWING_MILK.getKey().location()); tag(GASEOUS); tag(HONEY); tag(POTION); @@ -41,8 +43,8 @@ public final class ForgeFluidTagsProvider extends FluidTagsProvider { // Backwards compat definitions for pre-1.21 legacy `forge:` tags. // TODO: Remove backwards compat tag entries in 1.22 tag(forgeTagKey("milk")) - .addOptional(ForgeMod.MILK.getId()) - .addOptional(ForgeMod.FLOWING_MILK.getId()); + .addOptional(ForgeMod.MILK.getKey().location()) + .addOptional(ForgeMod.FLOWING_MILK.getKey().location()); } private static TagKey forgeTagKey(String path) { diff --git a/src/main/java/net/minecraftforge/common/data/ForgeItemTagsProvider.java b/src/main/java/net/minecraftforge/common/data/ForgeItemTagsProvider.java index 25ae50f1d6..2e1456cf42 100644 --- a/src/main/java/net/minecraftforge/common/data/ForgeItemTagsProvider.java +++ b/src/main/java/net/minecraftforge/common/data/ForgeItemTagsProvider.java @@ -8,9 +8,9 @@ package net.minecraftforge.common.data; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.data.tags.TagAppender; +import net.minecraft.data.tags.VanillaItemTagsProvider; import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.BlockTags; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; import net.minecraft.world.item.DyeColor; @@ -26,18 +26,21 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; @ApiStatus.Internal -public final class ForgeItemTagsProvider extends ItemTagsProvider { - public ForgeItemTagsProvider(PackOutput output, CompletableFuture lookupProvider, CompletableFuture> blockTagProvider, ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, blockTagProvider, "forge", existingFileHelper); +public final class ForgeItemTagsProvider extends VanillaItemTagsProvider { + public ForgeItemTagsProvider(PackOutput output, CompletableFuture lookupProvider, ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, "forge", existingFileHelper); } @SuppressWarnings({ "unchecked", "removal" }) @Override public void addTags(HolderLookup.Provider lookupProvider) { - copy(Tags.Blocks.BARRELS, Tags.Items.BARRELS); - copy(Tags.Blocks.BARRELS_WOODEN, Tags.Items.BARRELS_WOODEN); + (new ForgeBlockItemTagsProvider() { + @Override + protected TagAppender tag(TagKey p_409856_, TagKey p_406371_) { + return new VanillaItemTagsProvider.BlockToItemConverter(ForgeItemTagsProvider.this.tag(p_406371_)); + } + }).run(); tag(Tags.Items.BONES).add(Items.BONE); - copy(Tags.Blocks.BOOKSHELVES, Tags.Items.BOOKSHELVES); tag(Tags.Items.BRICKS).addTags(Tags.Items.BRICKS_NORMAL, Tags.Items.BRICKS_NETHER); tag(Tags.Items.BRICKS_NORMAL).add(Items.BRICK); tag(Tags.Items.BRICKS_NETHER).add(Items.NETHER_BRICK); @@ -48,20 +51,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(Tags.Items.BUCKETS_POWDER_SNOW).add(Items.POWDER_SNOW_BUCKET); tag(Tags.Items.BUCKETS_ENTITY_WATER).add(Items.AXOLOTL_BUCKET, Items.COD_BUCKET, Items.PUFFERFISH_BUCKET, Items.TADPOLE_BUCKET, Items.TROPICAL_FISH_BUCKET, Items.SALMON_BUCKET); tag(Tags.Items.BUCKETS).addTags(Tags.Items.BUCKETS_EMPTY, Tags.Items.BUCKETS_WATER, Tags.Items.BUCKETS_LAVA, Tags.Items.BUCKETS_MILK, Tags.Items.BUCKETS_POWDER_SNOW, Tags.Items.BUCKETS_ENTITY_WATER); - copy(Tags.Blocks.BUDDING_BLOCKS, Tags.Items.BUDDING_BLOCKS); - copy(Tags.Blocks.BUDS, Tags.Items.BUDS); - copy(Tags.Blocks.CHAINS, Tags.Items.CHAINS); - copy(Tags.Blocks.CHESTS, Tags.Items.CHESTS); - copy(Tags.Blocks.CHESTS_ENDER, Tags.Items.CHESTS_ENDER); - copy(Tags.Blocks.CHESTS_TRAPPED, Tags.Items.CHESTS_TRAPPED); - copy(Tags.Blocks.CHESTS_WOODEN, Tags.Items.CHESTS_WOODEN); - copy(Tags.Blocks.CLUSTERS, Tags.Items.CLUSTERS); - copy(Tags.Blocks.COBBLESTONES, Tags.Items.COBBLESTONES); - copy(Tags.Blocks.COBBLESTONE_NORMAL, Tags.Items.COBBLESTONE_NORMAL); - copy(Tags.Blocks.COBBLESTONE_INFESTED, Tags.Items.COBBLESTONE_INFESTED); - copy(Tags.Blocks.COBBLESTONE_MOSSY, Tags.Items.COBBLESTONE_MOSSY); - copy(Tags.Blocks.COBBLESTONE_DEEPSLATE, Tags.Items.COBBLESTONE_DEEPSLATE); - copy(Tags.Blocks.CONCRETES, Tags.Items.CONCRETES); tag(Tags.Items.CONCRETE_POWDERS) .add(Items.WHITE_CONCRETE_POWDER, Items.ORANGE_CONCRETE_POWDER, Items.MAGENTA_CONCRETE_POWDER, Items.LIGHT_BLUE_CONCRETE_POWDER, Items.YELLOW_CONCRETE_POWDER, Items.LIME_CONCRETE_POWDER, @@ -119,22 +108,13 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { addColoredTags(tag(Tags.Items.DYES)::addTags, Tags.Items.DYES); tag(Tags.Items.EGGS).add(Items.EGG); // forge:eggs tag(Tags.Items.ENCHANTING_FUELS).addTag(Tags.Items.GEMS_LAPIS); // forge:enchanting_fuels - copy(Tags.Blocks.END_STONES, Tags.Items.END_STONES); tag(Tags.Items.ENDER_PEARLS) .add(Items.ENDER_PEARL) .addOptionalTag(forgeItemTagKey("ender_pearls")); tag(Tags.Items.FEATHERS) .add(Items.FEATHER) .addOptionalTag(forgeItemTagKey("feathers")); - copy(Tags.Blocks.FENCE_GATES, Tags.Items.FENCE_GATES); - copy(Tags.Blocks.FENCE_GATES_WOODEN, Tags.Items.FENCE_GATES_WOODEN); - copy(Tags.Blocks.FENCES, Tags.Items.FENCES); - copy(Tags.Blocks.FENCES_NETHER_BRICK, Tags.Items.FENCES_NETHER_BRICK); - copy(Tags.Blocks.FENCES_WOODEN, Tags.Items.FENCES_WOODEN); tag(Tags.Items.FERTILIZERS).add(Items.BONE_MEAL); - copy(Tags.Blocks.FLOWERS_SMALL, Tags.Items.FLOWERS_SMALL); - copy(Tags.Blocks.FLOWERS_TALL, Tags.Items.FLOWERS_TALL); - copy(Tags.Blocks.FLOWERS, Tags.Items.FLOWERS); tag(Tags.Items.FOODS_FRUIT).add(Items.APPLE, Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE, Items.CHORUS_FRUIT, Items.MELON_SLICE); tag(Tags.Items.FOODS_VEGETABLE).add(Items.CARROT, Items.GOLDEN_CARROT, Items.POTATO, Items.BEETROOT); tag(Tags.Items.FOODS_BERRY).add(Items.SWEET_BERRIES, Items.GLOW_BERRIES); @@ -183,14 +163,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(Tags.Items.GEMS_QUARTZ) .add(Items.QUARTZ) .addOptionalTag(forgeItemTagKey("gems/quartz")); - copy(Tags.Blocks.GLASS_BLOCKS, Tags.Items.GLASS_BLOCKS); - copy(Tags.Blocks.GLASS_BLOCKS_COLORLESS, Tags.Items.GLASS_BLOCKS_COLORLESS); - copy(Tags.Blocks.GLASS_BLOCKS_TINTED, Tags.Items.GLASS_BLOCKS_TINTED); - copy(Tags.Blocks.GLASS_BLOCKS_CHEAP, Tags.Items.GLASS_BLOCKS_CHEAP); - copy(Tags.Blocks.GLASS_PANES, Tags.Items.GLASS_PANES); - copy(Tags.Blocks.GLASS_PANES_COLORLESS, Tags.Items.GLASS_PANES_COLORLESS); - copy(Tags.Blocks.GLAZED_TERRACOTTAS, Tags.Items.GLAZED_TERRACOTTAS); - copy(Tags.Blocks.GRAVEL, Tags.Items.GRAVEL); tag(Tags.Items.GUNPOWDER).add(Items.GUNPOWDER); // forge:gunpowder tag(Tags.Items.HIDDEN_FROM_RECIPE_VIEWERS); tag(Tags.Items.INGOTS) @@ -222,7 +194,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(Tags.Items.NETHER_STARS) .add(Items.NETHER_STAR) .addOptionalTag(forgeItemTagKey("nether_stars")); - copy(Tags.Blocks.NETHERRACK, Tags.Items.NETHERRACK); tag(Tags.Items.NUGGETS) .addTags(Tags.Items.NUGGETS_GOLD, Tags.Items.NUGGETS_IRON) .addOptionalTag(forgeItemTagKey("nuggets")); @@ -232,35 +203,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(Tags.Items.NUGGETS_GOLD) .add(Items.GOLD_NUGGET) .addOptionalTag(forgeItemTagKey("nuggets/gold")); - copy(Tags.Blocks.OBSIDIANS, Tags.Items.OBSIDIANS); - copy(Tags.Blocks.OBSIDIANS_NORMAL, Tags.Items.OBSIDIANS_NORMAL); - copy(Tags.Blocks.OBSIDIANS_CRYING, Tags.Items.OBSIDIANS_CRYING); - copy(Tags.Blocks.ORE_BEARING_GROUND_DEEPSLATE, Tags.Items.ORE_BEARING_GROUND_DEEPSLATE); - copy(Tags.Blocks.ORE_BEARING_GROUND_NETHERRACK, Tags.Items.ORE_BEARING_GROUND_NETHERRACK); - copy(Tags.Blocks.ORE_BEARING_GROUND_STONE, Tags.Items.ORE_BEARING_GROUND_STONE); - copy(Tags.Blocks.ORE_RATES_DENSE, Tags.Items.ORE_RATES_DENSE); - copy(Tags.Blocks.ORE_RATES_SINGULAR, Tags.Items.ORE_RATES_SINGULAR); - copy(Tags.Blocks.ORE_RATES_SPARSE, Tags.Items.ORE_RATES_SPARSE); - copy(Tags.Blocks.ORES, Tags.Items.ORES); - copy(Tags.Blocks.ORES_COAL, Tags.Items.ORES_COAL); - copy(Tags.Blocks.ORES_COPPER, Tags.Items.ORES_COPPER); - copy(Tags.Blocks.ORES_DIAMOND, Tags.Items.ORES_DIAMOND); - copy(Tags.Blocks.ORES_EMERALD, Tags.Items.ORES_EMERALD); - copy(Tags.Blocks.ORES_GOLD, Tags.Items.ORES_GOLD); - copy(Tags.Blocks.ORES_IRON, Tags.Items.ORES_IRON); - copy(Tags.Blocks.ORES_LAPIS, Tags.Items.ORES_LAPIS); - copy(Tags.Blocks.ORES_QUARTZ, Tags.Items.ORES_QUARTZ); - copy(Tags.Blocks.ORES_REDSTONE, Tags.Items.ORES_REDSTONE); - copy(Tags.Blocks.ORES_NETHERITE_SCRAP, Tags.Items.ORES_NETHERITE_SCRAP); - copy(Tags.Blocks.ORES_IN_GROUND_DEEPSLATE, Tags.Items.ORES_IN_GROUND_DEEPSLATE); - copy(Tags.Blocks.ORES_IN_GROUND_NETHERRACK, Tags.Items.ORES_IN_GROUND_NETHERRACK); - copy(Tags.Blocks.ORES_IN_GROUND_STONE, Tags.Items.ORES_IN_GROUND_STONE); - copy(Tags.Blocks.PLAYER_WORKSTATIONS_CRAFTING_TABLES, Tags.Items.PLAYER_WORKSTATIONS_CRAFTING_TABLES); - copy(Tags.Blocks.PLAYER_WORKSTATIONS_FURNACES, Tags.Items.PLAYER_WORKSTATIONS_FURNACES); - copy(Tags.Blocks.PUMPKINS, Tags.Items.PUMPKINS); - copy(Tags.Blocks.PUMPKINS_NORMAL, Tags.Items.PUMPKINS_NORMAL); - copy(Tags.Blocks.PUMPKINS_CARVED, Tags.Items.PUMPKINS_CARVED); - copy(Tags.Blocks.PUMPKINS_JACK_O_LANTERNS, Tags.Items.PUMPKINS_JACK_O_LANTERNS); tag(Tags.Items.RAW_MATERIALS) .addTags(Tags.Items.RAW_MATERIALS_COPPER, Tags.Items.RAW_MATERIALS_GOLD, Tags.Items.RAW_MATERIALS_IRON) .addOptionalTag(forgeItemTagKey("raw_materials")); @@ -283,19 +225,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(Tags.Items.RODS_WOODEN) .add(Items.STICK) .addOptionalTag(forgeItemTagKey("rods/wooden")); - copy(Tags.Blocks.ROPES, Tags.Items.ROPES); - copy(Tags.Blocks.SAND, Tags.Items.SAND); // forge:sand - copy(Tags.Blocks.SAND_COLORLESS, Tags.Items.SAND_COLORLESS); // forge:sand/colorless - copy(Tags.Blocks.SAND_RED, Tags.Items.SAND_RED); // forge:sand/red - copy(Tags.Blocks.SANDSTONE_BLOCKS, Tags.Items.SANDSTONE_BLOCKS); - copy(Tags.Blocks.SANDSTONE_SLABS, Tags.Items.SANDSTONE_SLABS); - copy(Tags.Blocks.SANDSTONE_STAIRS, Tags.Items.SANDSTONE_STAIRS); - copy(Tags.Blocks.SANDSTONE_RED_BLOCKS, Tags.Items.SANDSTONE_RED_BLOCKS); - copy(Tags.Blocks.SANDSTONE_RED_SLABS, Tags.Items.SANDSTONE_RED_SLABS); - copy(Tags.Blocks.SANDSTONE_RED_STAIRS, Tags.Items.SANDSTONE_RED_STAIRS); - copy(Tags.Blocks.SANDSTONE_UNCOLORED_BLOCKS, Tags.Items.SANDSTONE_UNCOLORED_BLOCKS); - copy(Tags.Blocks.SANDSTONE_UNCOLORED_SLABS, Tags.Items.SANDSTONE_UNCOLORED_SLABS); - copy(Tags.Blocks.SANDSTONE_UNCOLORED_STAIRS, Tags.Items.SANDSTONE_UNCOLORED_STAIRS); tag(Tags.Items.SEEDS).addTags(Tags.Items.SEEDS_BEETROOT, Tags.Items.SEEDS_MELON, Tags.Items.SEEDS_PUMPKIN, Tags.Items.SEEDS_WHEAT); tag(Tags.Items.SEEDS_BEETROOT).add(Items.BEETROOT_SEEDS); tag(Tags.Items.SEEDS_MELON).add(Items.MELON_SEEDS); @@ -311,29 +240,9 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { Items.LIGHT_GRAY_SHULKER_BOX, Items.CYAN_SHULKER_BOX, Items.PURPLE_SHULKER_BOX, Items.BLUE_SHULKER_BOX, Items.BROWN_SHULKER_BOX, Items.GREEN_SHULKER_BOX, Items.RED_SHULKER_BOX, Items.BLACK_SHULKER_BOX); - copy(Tags.Blocks.STONES, Tags.Items.STONES); - copy(Tags.Blocks.STORAGE_BLOCKS, Tags.Items.STORAGE_BLOCKS); - copy(Tags.Blocks.STORAGE_BLOCKS_BONE_MEAL, Tags.Items.STORAGE_BLOCKS_BONE_MEAL); - copy(Tags.Blocks.STORAGE_BLOCKS_COAL, Tags.Items.STORAGE_BLOCKS_COAL); - copy(Tags.Blocks.STORAGE_BLOCKS_COPPER, Tags.Items.STORAGE_BLOCKS_COPPER); - copy(Tags.Blocks.STORAGE_BLOCKS_DIAMOND, Tags.Items.STORAGE_BLOCKS_DIAMOND); - copy(Tags.Blocks.STORAGE_BLOCKS_DRIED_KELP, Tags.Items.STORAGE_BLOCKS_DRIED_KELP); - copy(Tags.Blocks.STORAGE_BLOCKS_EMERALD, Tags.Items.STORAGE_BLOCKS_EMERALD); - copy(Tags.Blocks.STORAGE_BLOCKS_GOLD, Tags.Items.STORAGE_BLOCKS_GOLD); - copy(Tags.Blocks.STORAGE_BLOCKS_IRON, Tags.Items.STORAGE_BLOCKS_IRON); - copy(Tags.Blocks.STORAGE_BLOCKS_LAPIS, Tags.Items.STORAGE_BLOCKS_LAPIS); - copy(Tags.Blocks.STORAGE_BLOCKS_NETHERITE, Tags.Items.STORAGE_BLOCKS_NETHERITE); - copy(Tags.Blocks.STORAGE_BLOCKS_RAW_COPPER, Tags.Items.STORAGE_BLOCKS_RAW_COPPER); - copy(Tags.Blocks.STORAGE_BLOCKS_RAW_GOLD, Tags.Items.STORAGE_BLOCKS_RAW_GOLD); - copy(Tags.Blocks.STORAGE_BLOCKS_RAW_IRON, Tags.Items.STORAGE_BLOCKS_RAW_IRON); - copy(Tags.Blocks.STORAGE_BLOCKS_REDSTONE, Tags.Items.STORAGE_BLOCKS_REDSTONE); - copy(Tags.Blocks.STORAGE_BLOCKS_SLIME, Tags.Items.STORAGE_BLOCKS_SLIME); - copy(Tags.Blocks.STORAGE_BLOCKS_WHEAT, Tags.Items.STORAGE_BLOCKS_WHEAT); tag(Tags.Items.STRINGS) .add(Items.STRING) .addOptionalTag(forgeItemTagKey("strings")); - copy(Tags.Blocks.STRIPPED_LOGS, Tags.Items.STRIPPED_LOGS); - copy(Tags.Blocks.STRIPPED_WOODS, Tags.Items.STRIPPED_WOODS); tag(Tags.Items.VILLAGER_JOB_SITES).add( Items.BARREL, Items.BLAST_FURNACE, Items.BREWING_STAND, Items.CARTOGRAPHY_TABLE, Items.CAULDRON, Items.COMPOSTER, Items.FLETCHING_TABLE, Items.GRINDSTONE, @@ -374,21 +283,9 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { .addOptionalTag(forgeItemTagKey("armors")); tag(Tags.Items.ENCHANTABLES).addTags(ItemTags.ARMOR_ENCHANTABLE, ItemTags.EQUIPPABLE_ENCHANTABLE, ItemTags.WEAPON_ENCHANTABLE, ItemTags.SWORD_ENCHANTABLE, ItemTags.MINING_ENCHANTABLE, ItemTags.MINING_LOOT_ENCHANTABLE, ItemTags.FISHING_ENCHANTABLE, ItemTags.TRIDENT_ENCHANTABLE, ItemTags.BOW_ENCHANTABLE, ItemTags.CROSSBOW_ENCHANTABLE, ItemTags.MACE_ENCHANTABLE, ItemTags.FIRE_ASPECT_ENCHANTABLE, ItemTags.DURABILITY_ENCHANTABLE, ItemTags.VANISHING_ENCHANTABLE); + tag(forgeItemTagKey("bones")).add(Items.BONE); // Backwards compat definitions for pre-1.21 legacy `forge:` tags. // TODO: Remove backwards compat tag entries in 1.22 - copy(forgeBlockTagKey("barrels"), forgeItemTagKey("barrels")); - copy(forgeBlockTagKey("barrels/wooden"), forgeItemTagKey("barrels/wooden")); - tag(forgeItemTagKey("bones")).add(Items.BONE); - copy(forgeBlockTagKey("bookshelves"), forgeItemTagKey("bookshelves")); - copy(forgeBlockTagKey("chests"), forgeItemTagKey("chests")); - copy(forgeBlockTagKey("chests/ender"), forgeItemTagKey("chests/ender")); - copy(forgeBlockTagKey("chests/trapped"), forgeItemTagKey("chests/trapped")); - copy(forgeBlockTagKey("chests/wooden"), forgeItemTagKey("chests/wooden")); - copy(forgeBlockTagKey("cobblestone"), forgeItemTagKey("cobblestone")); - copy(forgeBlockTagKey("cobblestone/normal"), forgeItemTagKey("cobblestone/normal")); - copy(forgeBlockTagKey("cobblestone/infested"), forgeItemTagKey("cobblestone/infested")); - copy(forgeBlockTagKey("cobblestone/mossy"), forgeItemTagKey("cobblestone/mossy")); - copy(forgeBlockTagKey("cobblestone/deepslate"), forgeItemTagKey("cobblestone/deepslate")); tag(forgeItemTagKey("crops")) .addTags(forgeItemTagKey("crops/beetroot"), forgeItemTagKey("crops/carrot"), forgeItemTagKey("crops/nether_wart"), forgeItemTagKey("crops/potato"), forgeItemTagKey("crops/wheat")); @@ -405,14 +302,8 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { addColored(tag(forgeItemTagKey("dyes"))::addTags, forgeItemTagKey("dyes"), "{color}_dye"); tag(forgeItemTagKey("eggs")).add(Items.EGG); tag(forgeItemTagKey("enchanting_fuels")).addTag(forgeItemTagKey("gems/lapis")); - copy(forgeBlockTagKey("end_stones"), forgeItemTagKey("end_stones")); tag(forgeItemTagKey("ender_pearls")).add(Items.ENDER_PEARL); tag(forgeItemTagKey("feathers")).add(Items.FEATHER); - copy(forgeBlockTagKey("fence_gates"), forgeItemTagKey("fence_gates")); - copy(forgeBlockTagKey("fence_gates/wooden"), forgeItemTagKey("fence_gates/wooden")); - copy(forgeBlockTagKey("fences"), forgeItemTagKey("fences")); - copy(forgeBlockTagKey("fences/nether_brick"), forgeItemTagKey("fences/nether_brick")); - copy(forgeBlockTagKey("fences/wooden"), forgeItemTagKey("fences/wooden")); tag(forgeItemTagKey("gems")) .addTags(forgeItemTagKey("gems/amethyst"), forgeItemTagKey("gems/diamond"), forgeItemTagKey("gems/emerald"), forgeItemTagKey("gems/lapis"), forgeItemTagKey("gems/prismarine"), forgeItemTagKey("gems/quartz")); @@ -422,14 +313,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(forgeItemTagKey("gems/lapis")).add(Items.LAPIS_LAZULI); tag(forgeItemTagKey("gems/prismarine")).add(Items.PRISMARINE_CRYSTALS); tag(forgeItemTagKey("gems/quartz")).add(Items.QUARTZ); - copy(forgeBlockTagKey("glass"), forgeItemTagKey("glass")); - copy(forgeBlockTagKey("glass/tinted"), forgeItemTagKey("glass/tinted")); - copy(forgeBlockTagKey("glass/silica"), forgeItemTagKey("glass/silica")); - copyColored(forgeBlockTagKey("glass"), forgeItemTagKey("glass")); - copy(forgeBlockTagKey("glass_panes"), forgeItemTagKey("glass_panes")); - copyColored(forgeBlockTagKey("glass_panes"), forgeItemTagKey("glass_panes")); - copy(forgeBlockTagKey("glass_panes/colorless"), forgeItemTagKey("glass_panes/colorless")); - copy(forgeBlockTagKey("gravel"), forgeItemTagKey("gravel")); tag(forgeItemTagKey("gunpowder")).add(Items.GUNPOWDER); tag(forgeItemTagKey("heads")).add(Items.CREEPER_HEAD, Items.DRAGON_HEAD, Items.PLAYER_HEAD, Items.SKELETON_SKULL, Items.WITHER_SKELETON_SKULL, Items.ZOMBIE_HEAD); tag(forgeItemTagKey("ingots")) @@ -444,31 +327,9 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(forgeItemTagKey("leather")).add(Items.LEATHER); tag(forgeItemTagKey("mushrooms")).add(Items.BROWN_MUSHROOM, Items.RED_MUSHROOM); tag(forgeItemTagKey("nether_stars")).add(Items.NETHER_STAR); - copy(forgeBlockTagKey("netherrack"), forgeItemTagKey("netherrack")); tag(forgeItemTagKey("nuggets")).addTags(forgeItemTagKey("nuggets/iron"), forgeItemTagKey("nuggets/gold")); tag(forgeItemTagKey("nuggets/iron")).add(Items.IRON_NUGGET); tag(forgeItemTagKey("nuggets/gold")).add(Items.GOLD_NUGGET); - copy(forgeBlockTagKey("obsidian"), forgeItemTagKey("obsidian")); - copy(Tags.Blocks.ORE_BEARING_GROUND_DEEPSLATE, Tags.Items.ORE_BEARING_GROUND_DEEPSLATE); - copy(Tags.Blocks.ORE_BEARING_GROUND_NETHERRACK, Tags.Items.ORE_BEARING_GROUND_NETHERRACK); - copy(Tags.Blocks.ORE_BEARING_GROUND_STONE, Tags.Items.ORE_BEARING_GROUND_STONE); - copy(Tags.Blocks.ORE_RATES_DENSE, Tags.Items.ORE_RATES_DENSE); - copy(Tags.Blocks.ORE_RATES_SINGULAR, Tags.Items.ORE_RATES_SINGULAR); - copy(Tags.Blocks.ORE_RATES_SPARSE, Tags.Items.ORE_RATES_SPARSE); - copy(forgeBlockTagKey("ores"), forgeItemTagKey("ores")); - copy(Tags.Blocks.ORES_COAL, Tags.Items.ORES_COAL); - copy(Tags.Blocks.ORES_COPPER, Tags.Items.ORES_COPPER); - copy(Tags.Blocks.ORES_DIAMOND, Tags.Items.ORES_DIAMOND); - copy(Tags.Blocks.ORES_EMERALD, Tags.Items.ORES_EMERALD); - copy(Tags.Blocks.ORES_GOLD, Tags.Items.ORES_GOLD); - copy(Tags.Blocks.ORES_IRON, Tags.Items.ORES_IRON); - copy(Tags.Blocks.ORES_LAPIS, Tags.Items.ORES_LAPIS); - copy(forgeBlockTagKey("ores/quartz"), forgeItemTagKey("ores/quartz")); - copy(Tags.Blocks.ORES_REDSTONE, Tags.Items.ORES_REDSTONE); - copy(forgeBlockTagKey("ores/netherite_scrap"), forgeItemTagKey("ores/netherite_scrap")); - copy(Tags.Blocks.ORES_IN_GROUND_DEEPSLATE, Tags.Items.ORES_IN_GROUND_DEEPSLATE); - copy(Tags.Blocks.ORES_IN_GROUND_NETHERRACK, Tags.Items.ORES_IN_GROUND_NETHERRACK); - copy(Tags.Blocks.ORES_IN_GROUND_STONE, Tags.Items.ORES_IN_GROUND_STONE); tag(forgeItemTagKey("raw_materials")).addTags(forgeItemTagKey("raw_materials/copper"), forgeItemTagKey("raw_materials/gold"), forgeItemTagKey("raw_materials/iron")); tag(forgeItemTagKey("raw_materials/copper")).add(Items.RAW_COPPER); tag(forgeItemTagKey("raw_materials/gold")).add(Items.RAW_GOLD); @@ -476,10 +337,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(forgeItemTagKey("rods")).addTags(forgeItemTagKey("rods/blaze"), forgeItemTagKey("rods/wooden")); tag(forgeItemTagKey("rods/blaze")).add(Items.BLAZE_ROD); tag(forgeItemTagKey("rods/wooden")).add(Items.STICK); - copy(Tags.Blocks.SAND, Tags.Items.SAND); - copy(Tags.Blocks.SAND_COLORLESS, Tags.Items.SAND_COLORLESS); - copy(Tags.Blocks.SAND_RED, Tags.Items.SAND_RED); - copy(forgeBlockTagKey("sandstone"), forgeItemTagKey("sandstone")); tag(Tags.Items.SEEDS).addTags(Tags.Items.SEEDS_BEETROOT, Tags.Items.SEEDS_MELON, Tags.Items.SEEDS_PUMPKIN, Tags.Items.SEEDS_WHEAT); tag(Tags.Items.SEEDS_BEETROOT).add(Items.BEETROOT_SEEDS); tag(Tags.Items.SEEDS_MELON).add(Items.MELON_SEEDS); @@ -487,24 +344,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { tag(Tags.Items.SEEDS_WHEAT).add(Items.WHEAT_SEEDS); tag(forgeItemTagKey("shears")).add(Items.SHEARS); // yes, it's forge:shears not forge:tools/shears tag(forgeItemTagKey("slimeballs")).add(Items.SLIME_BALL); - copy(Tags.Blocks.STAINED_GLASS, Tags.Items.STAINED_GLASS); - copy(Tags.Blocks.STAINED_GLASS_PANES, Tags.Items.STAINED_GLASS_PANES); - copy(forgeBlockTagKey("stone"), forgeItemTagKey("stone")); - copy(forgeBlockTagKey("storage_blocks"), forgeItemTagKey("storage_blocks")); - copy(Tags.Blocks.STORAGE_BLOCKS_AMETHYST, Tags.Items.STORAGE_BLOCKS_AMETHYST); - copy(forgeBlockTagKey("storage_blocks/coal"), forgeItemTagKey("storage_blocks/coal")); - copy(forgeBlockTagKey("storage_blocks/copper"), forgeItemTagKey("storage_blocks/copper")); - copy(forgeBlockTagKey("storage_blocks/diamond"), forgeItemTagKey("storage_blocks/diamond")); - copy(forgeBlockTagKey("storage_blocks/emerald"), forgeItemTagKey("storage_blocks/emerald")); - copy(forgeBlockTagKey("storage_blocks/gold"), forgeItemTagKey("storage_blocks/gold")); - copy(forgeBlockTagKey("storage_blocks/iron"), forgeItemTagKey("storage_blocks/iron")); - copy(forgeBlockTagKey("storage_blocks/lapis"), forgeItemTagKey("storage_blocks/lapis")); - copy(Tags.Blocks.STORAGE_BLOCKS_QUARTZ, Tags.Items.STORAGE_BLOCKS_QUARTZ); - copy(forgeBlockTagKey("storage_blocks/redstone"), forgeItemTagKey("storage_blocks/redstone")); - copy(forgeBlockTagKey("storage_blocks/raw_copper"), forgeItemTagKey("storage_blocks/raw_copper")); - copy(forgeBlockTagKey("storage_blocks/raw_gold"), forgeItemTagKey("storage_blocks/raw_gold")); - copy(forgeBlockTagKey("storage_blocks/raw_iron"), forgeItemTagKey("storage_blocks/raw_iron")); - copy(forgeBlockTagKey("storage_blocks/netherite"), forgeItemTagKey("storage_blocks/netherite")); tag(forgeItemTagKey("string")).add(Items.STRING); tag(forgeItemTagKey("tools/shields")).add(Items.SHIELD); tag(forgeItemTagKey("tools/bows")).add(Items.BOW); @@ -546,17 +385,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { } } - private void copyColored(TagKey blockGroup, TagKey itemGroup) { - String blockPre = blockGroup.location().getPath().toUpperCase(Locale.ENGLISH) + '_'; - String itemPre = itemGroup.location().getPath().toUpperCase(Locale.ENGLISH) + '_'; - for (DyeColor color : DyeColor.values()) { - TagKey from = getForgeBlockTag(blockPre + color.getName()); - TagKey to = getForgeItemTag(itemPre + color.getName()); - copy(from, to); - } - copy(getForgeBlockTag(blockPre + "colorless"), getForgeItemTag(itemPre + "colorless")); - } - private static void addColoredTags(Consumer> consumer, TagKey group) { String prefix = group.location().getPath().toUpperCase(Locale.ENGLISH) + '_'; for (DyeColor color : DyeColor.values()) { @@ -565,16 +393,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { } } - @SuppressWarnings("unchecked") - private static TagKey getForgeBlockTag(String name) { - try { - name = name.toUpperCase(Locale.ENGLISH); - return (TagKey) Tags.Blocks.class.getDeclaredField(name).get(null); - } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) { - throw new IllegalStateException(Tags.Blocks.class.getName() + " is missing tag name: " + name); - } - } - @SuppressWarnings("unchecked") private static TagKey getForgeItemTag(String name) { try { @@ -589,10 +407,6 @@ public final class ForgeItemTagsProvider extends ItemTagsProvider { return ResourceLocation.fromNamespaceAndPath("forge", path); } - private static TagKey forgeBlockTagKey(String path) { - return BlockTags.create(forgeRl(path)); - } - private static TagKey forgeItemTagKey(String path) { return ItemTags.create(forgeRl(path)); } diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java index 65904e5495..d30c449608 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeBlockEntity.java @@ -6,7 +6,6 @@ package net.minecraftforge.common.extensions; import net.minecraft.network.Connection; -import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; @@ -15,6 +14,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.phys.AABB; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; @@ -31,15 +31,15 @@ public interface IForgeBlockEntity extends ICapabilityProvider { /** * Called when you receive a TileEntityData packet for the location this TileEntity is currently in. On the client, - * the NetworkManager will always be the remote server. On the server, it will be whomever is responsible for + * the Connection will always be the remote server. On the server, it will be whomever is responsible for * sending the packet. * * @param connection The Connection the packet originated from - * @param pkt The data packet + * @param data The data from the packet, with registry access context * @param lookup The holder lookup provider */ - default void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket pkt, HolderLookup.Provider lookup) { - this.self().loadWithComponents(pkt.getTag(), lookup); + default void onDataPacket(Connection connection, ValueInput data, HolderLookup.Provider lookup) { + this.self().loadWithComponents(data); } /** @@ -49,8 +49,8 @@ public interface IForgeBlockEntity extends ICapabilityProvider { * * @param tag The {@link CompoundTag} sent from {@link BlockEntity#getUpdateTag()} */ - default void handleUpdateTag(CompoundTag tag, HolderLookup.Provider holders) { - self().loadWithComponents(tag, holders); + default void handleUpdateTag(ValueInput tag, HolderLookup.Provider holders) { + self().loadWithComponents(tag); } default void onChunkUnloaded(){} diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java b/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java index 0f47178776..4ae6f0ebcc 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeEntity.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.function.BiPredicate; import net.minecraft.sounds.SoundEvent; +import net.minecraft.util.ProblemReporter; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.vehicle.AbstractBoat; @@ -22,6 +23,8 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.storage.TagValueInput; +import net.minecraft.world.level.storage.TagValueOutput; import net.minecraftforge.common.SoundAction; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.entity.PartEntity; @@ -35,16 +38,21 @@ public interface IForgeEntity extends ICapabilitySerializable { @Override default void deserializeNBT(HolderLookup.Provider registryAccess, CompoundTag nbt) { - self().load(nbt); + try (var problems = new ProblemReporter.ScopedCollector(self().problemPath(), Entity.LOGGER)) { + self().load(TagValueInput.create(problems, registryAccess, nbt)); + } } @Override default CompoundTag serializeNBT(HolderLookup.Provider registryAccess) { - var ret = new CompoundTag(); - var id = self().getEncodeId(); - if (id != null) - ret.putString("id", self().getEncodeId()); - return self().saveWithoutId(ret); + try (var problems = new ProblemReporter.ScopedCollector(self().problemPath(), Entity.LOGGER)) { + var output = TagValueOutput.createWithContext(problems, registryAccess); + var id = self().getEncodeId(); + if (id != null) + output.putString("id", id); + self().saveWithoutId(output); + return output.buildResult(); + } } boolean canUpdate(); diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeGameTestHelper.java b/src/main/java/net/minecraftforge/common/extensions/IForgeGameTestHelper.java index 31102ecfe8..67d81af7fb 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeGameTestHelper.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeGameTestHelper.java @@ -43,7 +43,8 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.common.ForgeI18n; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; public interface IForgeGameTestHelper { private GameTestHelper self() { @@ -168,17 +169,17 @@ public interface IForgeGameTestHelper { /** * Registers an event listener that will be unregistered when the test is finished running. */ - default void addEventListener(Consumer consumer) { - MinecraftForge.EVENT_BUS.addListener(consumer); - self().addCleanup(success -> MinecraftForge.EVENT_BUS.unregister(consumer)); + default void addEventListener(EventBus bus, Consumer consumer) { + var key = bus.addListener(consumer); + self().addCleanup(success -> bus.removeListener(key)); } /** * Registers an event listener that will be unregistered when the test is finished running. */ default void registerEventListener(Object handler) { - MinecraftForge.EVENT_BUS.register(handler); - self().addCleanup(success -> MinecraftForge.EVENT_BUS.unregister(handler)); + var keys = MinecraftForge.EVENT_BUS.register(handler); + self().addCleanup(success -> MinecraftForge.EVENT_BUS.unregister(keys)); } /** diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeIntrinsicHolderTagAppender.java b/src/main/java/net/minecraftforge/common/extensions/IForgeIntrinsicHolderTagAppender.java deleted file mode 100644 index f4eaf2139d..0000000000 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeIntrinsicHolderTagAppender.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) Forge Development LLC and contributors - * SPDX-License-Identifier: LGPL-2.1-only - */ - -package net.minecraftforge.common.extensions; - -import net.minecraft.data.tags.IntrinsicHolderTagsProvider; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; - -public interface IForgeIntrinsicHolderTagAppender extends IForgeTagAppender { - private IntrinsicHolderTagsProvider.IntrinsicTagAppender self() { - return (IntrinsicHolderTagsProvider.IntrinsicTagAppender) this; - } - - ResourceKey getKey(T value); - - /** - * Adds a registry entry to the tag json's remove list. Callable during datageneration. - * - * @param entry The entry to remove - * @return The builder for chaining - */ - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(final T entry) { - return remove(this.getKey(entry)); - } - - /** - * Adds multiple registry entries to the tag json's remove list. Callable during datageneration. - * - * @param entries The entries to remove - * @return The builder for chaining - */ - @SuppressWarnings("unchecked") - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(final T first, final T...entries) { - this.remove(first); - for (T entry : entries) - this.remove(entry); - return self(); - } - - @Override - @SuppressWarnings("unchecked") - default IntrinsicHolderTagsProvider.IntrinsicTagAppender addTags(TagKey... values) { - IForgeTagAppender.super.addTags(values); - return self(); - } - - @Override - default IntrinsicHolderTagsProvider.IntrinsicTagAppender replace() { - IForgeTagAppender.super.replace(); - return self(); - } - - @Override - default IntrinsicHolderTagsProvider.IntrinsicTagAppender replace(boolean value) { - IForgeTagAppender.super.replace(value); - return self(); - } - - @Override - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(final ResourceLocation location) { - IForgeTagAppender.super.remove(location); - return self(); - } - - @Override - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(final ResourceLocation first, final ResourceLocation... locations) { - IForgeTagAppender.super.remove(first, locations); - return self(); - } - - @Override - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(final ResourceKey resourceKey) { - IForgeTagAppender.super.remove(resourceKey); - return self(); - } - - @Override - @SuppressWarnings("unchecked") - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(final ResourceKey firstResourceKey, final ResourceKey... resourceKeys) { - IForgeTagAppender.super.remove(firstResourceKey, resourceKeys); - return self(); - } - - @Override - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(TagKey tag) { - IForgeTagAppender.super.remove(tag); - return self(); - } - - @Override - @SuppressWarnings("unchecked") - default IntrinsicHolderTagsProvider.IntrinsicTagAppender remove(TagKey first, TagKey...tags) { - IForgeTagAppender.super.remove(first, tags); - return self(); - } -} diff --git a/src/main/java/net/minecraftforge/common/extensions/IForgeTagAppender.java b/src/main/java/net/minecraftforge/common/extensions/IForgeTagAppender.java index 6568d3ae5b..e8181fc892 100644 --- a/src/main/java/net/minecraftforge/common/extensions/IForgeTagAppender.java +++ b/src/main/java/net/minecraftforge/common/extensions/IForgeTagAppender.java @@ -5,129 +5,140 @@ package net.minecraftforge.common.extensions; -import net.minecraft.data.tags.TagsProvider; +import net.minecraft.data.tags.TagAppender; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagBuilder; import net.minecraft.tags.TagKey; -public interface IForgeTagAppender -{ - private TagsProvider.TagAppender self() { - return (TagsProvider.TagAppender) this; +public interface IForgeTagAppender { + private TagAppender self() { + return (TagAppender)this; } + /** + * Gets the backing TagBuilder, will throw an exception if its not set. + * This is only available during data generation, and if they use TagAppender.forBuilder + */ + default TagBuilder getInternalBuilder() { + throw new IllegalStateException("Could not determine internal tag builder"); + } + + default String getSourceName() { + return "unknown"; + } + + /** + * Adds a registry entry to the tag json's remove list. Callable during datageneration. + * + * @param entry The entry to remove + * @return The builder for chaining + */ + default TagAppender remove(final E entry) { + throw new UnsupportedOperationException("TagAppender.remove is not implemented in class: " + this.getClass()); + } + + /** + * Adds multiple registry entries to the tag json's remove list. Callable during datageneration. + * + * @param entries The entries to remove + * @return The builder for chaining + */ @SuppressWarnings("unchecked") - default TagsProvider.TagAppender addTags(TagKey... values) { - TagsProvider.TagAppender builder = self(); + default TagAppender remove(final E first, final E...entries) { + this.remove(first); + for (E entry : entries) + this.remove(entry); + return self(); + } + + + @SuppressWarnings("unchecked") + default TagAppender addTags(TagKey... values) { + var builder = self(); for (TagKey value : values) { builder.addTag(value); } return builder; } - default TagsProvider.TagAppender addOptionalTag(TagKey value) { - return self().addOptionalTag(value.location()); + default TagAppender addOptional(ResourceLocation location) { + self().getInternalBuilder().addOptionalElement(location); + return self(); } @SuppressWarnings("unchecked") - default TagsProvider.TagAppender addOptionalTags(TagKey... values) { - TagsProvider.TagAppender builder = self(); - for (TagKey value : values) { - builder.addOptionalTag(value.location()); - } + default TagAppenderaddOptionalTags(TagKey... values) { + var builder = self(); + for (var value : values) + builder.addOptionalTag(value); return builder; } - default TagsProvider.TagAppender replace() { + default TagAppender replace() { return replace(true); } - default TagsProvider.TagAppender replace(boolean value) { + default TagAppender replace(boolean value) { self().getInternalBuilder().replace(value); return self(); } /** - * Adds a single element's ID to the tag json's remove list. Callable during datageneration. + * Adds a single element's ID to the tag json's remove list. Only available during data generation. * @param location The ID of the element to remove * @return The builder for chaining */ - default TagsProvider.TagAppender remove(final ResourceLocation location) - { - TagsProvider.TagAppender builder = self(); - builder.getInternalBuilder().removeElement(location, builder.getModID()); + default TagAppender remove(final ResourceLocation location) { + var builder = self(); + builder.getInternalBuilder().removeElement(location, builder.getSourceName()); return builder; } /** - * Adds multiple elements' IDs to the tag json's remove list. Callable during datageneration. + * Adds multiple elements' IDs to the tag json's remove list. Only available during data generation. * @param locations The IDs of the elements to remove * @return The builder for chaining */ - default TagsProvider.TagAppender remove(final ResourceLocation first, final ResourceLocation... locations) - { + default TagAppender remove(final ResourceLocation first, final ResourceLocation... locations) { this.remove(first); - for (ResourceLocation location : locations) - { + for (var location : locations) this.remove(location); - } return self(); } /** - * Adds a resource key to the tag json's remove list. Callable during datageneration. + * Adds a resource key to the tag json's remove list. Only available during data generation. * * @param resourceKey The resource key of the element to remove * @return The appender for chaining */ - default TagsProvider.TagAppender remove(final ResourceKey resourceKey) - { + default TagAppender remove(final ResourceKey resourceKey) { this.remove(resourceKey.location()); return self(); } /** - * Adds multiple resource keys to the tag json's remove list. Callable during datageneration. - * - * @param resourceKeys The resource keys of the elements to remove - * @return The appender for chaining - */ - @SuppressWarnings("unchecked") - default TagsProvider.TagAppender remove(final ResourceKey firstResourceKey, final ResourceKey... resourceKeys) - { - this.remove(firstResourceKey.location()); - for (ResourceKey resourceKey : resourceKeys) - { - this.remove(resourceKey.location()); - } - return self(); - } - - /** - * Adds a tag to the tag json's remove list. Callable during datageneration. + * Adds a tag to the tag json's remove list. Only available during data generation. * @param tag The ID of the tag to remove * @return The builder for chaining */ - default TagsProvider.TagAppender remove(TagKey tag) - { - TagsProvider.TagAppender builder = self(); - builder.getInternalBuilder().removeTag(tag.location(), builder.getModID()); + default TagAppender remove(TagKey tag) { + var builder = self(); + builder.getInternalBuilder().removeTag(tag.location(), builder.getSourceName()); return builder; } /** - * Adds multiple tags to the tag json's remove list. Callable during datageneration. + * Adds multiple tags to the tag json's remove list. Only available during data generation. * @param tags The IDs of the tags to remove * @return The builder for chaining */ @SuppressWarnings("unchecked") - default TagsProvider.TagAppender remove(TagKey first, TagKey...tags) - { + default TagAppender remove(TagKey first, TagKey...tags) { this.remove(first); - for (TagKey tag : tags) - { + for (var tag : tags) this.remove(tag); - } return self(); } } diff --git a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java index 4bb4f8a55e..72ff3e38cc 100644 --- a/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java +++ b/src/main/java/net/minecraftforge/common/util/BlockSnapshot.java @@ -10,16 +10,21 @@ import java.util.Objects; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.TagValueInput; import net.minecraft.world.level.block.Blocks; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.resources.ResourceKey; +import net.minecraft.util.ProblemReporter; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.Level; import net.minecraftforge.server.ServerLifecycleHooks; import org.jetbrains.annotations.Nullable; +import org.slf4j.Logger; + +import com.mojang.logging.LogUtils; /** * Represents a captured snapshot of a block which will not change @@ -29,6 +34,7 @@ import org.jetbrains.annotations.Nullable; * can exist multiple times for any given Block. */ public class BlockSnapshot { + private static final Logger LOGGER = LogUtils.getLogger(); private static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("forge.debugBlockSnapshot", "false")); private final ResourceKey dim; @@ -65,7 +71,7 @@ public class BlockSnapshot { @Nullable private static CompoundTag getBlockEntityTag(@Nullable BlockEntity te, HolderLookup.Provider lookup) { - return te == null ? null : te.saveCustomAndMetadata(lookup); + return te == null ? null : te.saveWithFullMetadata(lookup); } public BlockState getCurrentBlock() { @@ -127,7 +133,10 @@ public class BlockSnapshot { if (getTag() != null) { te = world.getBlockEntity(pos); if (te != null) { - te.loadWithComponents(nbt, world.registryAccess()); + try (var problems = new ProblemReporter.ScopedCollector(te.problemPath(), LOGGER)) { + te.loadWithComponents(TagValueInput.create(problems, world.registryAccess(), getTag())); + } + te.setChanged(); } } diff --git a/src/main/java/net/minecraftforge/common/util/HasResult.java b/src/main/java/net/minecraftforge/common/util/HasResult.java new file mode 100644 index 0000000000..672d934b94 --- /dev/null +++ b/src/main/java/net/minecraftforge/common/util/HasResult.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.common.util; + +import net.minecraftforge.eventbus.api.event.RecordEvent; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public interface HasResult { + Result getResult(); + void setResult(Result result); + + /** + * A version of {@link HasResult} tailored for {@link RecordEvent}s. + */ + @NullMarked + interface Record extends HasResult { + Result.Holder resultHolder(); + + default Result getResult() { + return resultHolder().get(); + } + + default void setResult(Result result) { + resultHolder().set(result); + } + } +} diff --git a/src/main/java/net/minecraftforge/common/util/Result.java b/src/main/java/net/minecraftforge/common/util/Result.java new file mode 100644 index 0000000000..599ac4ba2b --- /dev/null +++ b/src/main/java/net/minecraftforge/common/util/Result.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.minecraftforge.common.util; + +import net.minecraftforge.eventbus.api.event.RecordEvent; +import org.jspecify.annotations.NullMarked; + +import java.util.Objects; + +@NullMarked +public enum Result { + ALLOW, + DEFAULT, + DENY; + + public boolean isAllowed() { + return this == ALLOW; + } + + public boolean isDefault() { + return this == DEFAULT; + } + + public boolean isDenied() { + return this == DENY; + } + + /** + * A mutable holder for a Result, useful for {@link RecordEvent}s combined with {@link HasResult.Record} + */ + @NullMarked + public static final class Holder { + private Result value; + + public Holder() { + set(DEFAULT); + } + + public Holder(Result value) { + set(value); + } + + public Result get() { + return value; + } + + public void set(Result value) { + Objects.requireNonNull(value); + this.value = value; + } + + @Override + public String toString() { + return "Result.Holder{value=" + value + "\"}"; + } + + @Override + public boolean equals(Object that) { + return this == that || (that instanceof Holder thatHolder && this.value == thatHolder.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + } +} diff --git a/src/main/java/net/minecraftforge/data/event/GatherDataEvent.java b/src/main/java/net/minecraftforge/data/event/GatherDataEvent.java index 6ac002cfd2..5bce113110 100644 --- a/src/main/java/net/minecraftforge/data/event/GatherDataEvent.java +++ b/src/main/java/net/minecraftforge/data/event/GatherDataEvent.java @@ -10,7 +10,8 @@ import net.minecraft.DetectedVersion; import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.event.IModBusEvent; @@ -25,15 +26,17 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Function; import java.util.stream.Collectors; -public final class GatherDataEvent extends Event implements IModBusEvent -{ +public final class GatherDataEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, GatherDataEvent.class); + } + private final DataGenerator dataGenerator; private final DataGeneratorConfig config; private final ExistingFileHelper existingFileHelper; private final ModContainer modContainer; - public GatherDataEvent(final ModContainer mc, final DataGenerator dataGenerator, final DataGeneratorConfig dataGeneratorConfig, ExistingFileHelper existingFileHelper) - { + public GatherDataEvent(final ModContainer mc, final DataGenerator dataGenerator, final DataGeneratorConfig dataGeneratorConfig, ExistingFileHelper existingFileHelper) { this.modContainer = mc; this.dataGenerator = dataGenerator; this.config = dataGeneratorConfig; diff --git a/src/main/java/net/minecraftforge/event/AddPackFindersEvent.java b/src/main/java/net/minecraftforge/event/AddPackFindersEvent.java index cb43d9c04a..c1adb20b28 100644 --- a/src/main/java/net/minecraftforge/event/AddPackFindersEvent.java +++ b/src/main/java/net/minecraftforge/event/AddPackFindersEvent.java @@ -8,7 +8,8 @@ package net.minecraftforge.event; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.packs.repository.RepositorySource; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.event.IModBusEvent; import java.util.function.Consumer; @@ -16,7 +17,11 @@ import java.util.function.Consumer; /** * Fired on {@link PackRepository} creation to allow mods to add new pack finders. */ -public final class AddPackFindersEvent extends Event implements IModBusEvent { +public final class AddPackFindersEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, AddPackFindersEvent.class); + } + private final PackType packType; private final Consumer sources; diff --git a/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java b/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java index 9e2a36e2ae..3ce1669bb4 100644 --- a/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java +++ b/src/main/java/net/minecraftforge/event/AddReloadListenerEvent.java @@ -15,7 +15,8 @@ import net.minecraft.server.packs.resources.PreparableReloadListener; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.crafting.conditions.ICondition; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.ModLoader; import java.util.ArrayList; @@ -29,7 +30,9 @@ import java.util.concurrent.Executor; * The event is fired on each reload and lets modders add their own ReloadListeners, for server-side resources. * The event is fired on the {@link MinecraftForge#EVENT_BUS} */ -public final class AddReloadListenerEvent extends Event { +public final class AddReloadListenerEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(AddReloadListenerEvent.class); + private final List listeners = new ArrayList<>(); private final ReloadableServerResources serverResources; diff --git a/src/main/java/net/minecraftforge/event/AnvilUpdateEvent.java b/src/main/java/net/minecraftforge/event/AnvilUpdateEvent.java index 586fac224e..c3bad38556 100644 --- a/src/main/java/net/minecraftforge/event/AnvilUpdateEvent.java +++ b/src/main/java/net/minecraftforge/event/AnvilUpdateEvent.java @@ -8,8 +8,9 @@ package net.minecraftforge.event; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AnvilMenu; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.Nullable; /** @@ -20,8 +21,9 @@ import org.jetbrains.annotations.Nullable; * If the event is not canceled, but the output is not empty, it will set the output and not run vanilla behavior.
    * if the output is empty, and the event is not canceled, vanilla behavior will execute.
    */ -@Cancelable -public final class AnvilUpdateEvent extends Event { +public final class AnvilUpdateEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(AnvilUpdateEvent.class); + private final ItemStack left; private final ItemStack right; private final String name; diff --git a/src/main/java/net/minecraftforge/event/AttachCapabilitiesEvent.java b/src/main/java/net/minecraftforge/event/AttachCapabilitiesEvent.java index e871e2bd9b..6f8fbba836 100644 --- a/src/main/java/net/minecraftforge/event/AttachCapabilitiesEvent.java +++ b/src/main/java/net/minecraftforge/event/AttachCapabilitiesEvent.java @@ -5,14 +5,23 @@ package net.minecraftforge.event; +import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; + import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.eventbus.api.GenericEvent; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import org.jspecify.annotations.NullMarked; /** * Fired whenever an object with Capabilities support {currently TileEntity/Item/Entity) @@ -20,26 +29,69 @@ import net.minecraftforge.eventbus.api.GenericEvent; * * Please note that as this is fired for ALL object creations efficient code is recommended. * And if possible use one of the sub-classes to filter your intended objects. + * + * @see Entities + * @see BlockEntities + * @see ItemStacks + * @see Levels + * @see LevelChunks */ -public class AttachCapabilitiesEvent extends GenericEvent -{ +@NullMarked +public abstract class AttachCapabilitiesEvent extends MutableEvent implements InheritableEvent { private final T obj; - private final Map caps = Maps.newLinkedHashMap(); + private final Map caps = new LinkedHashMap<>(); private final Map view = Collections.unmodifiableMap(caps); - private final List listeners = Lists.newArrayList(); + private final List listeners = new ArrayList<>(); private final List listenersView = Collections.unmodifiableList(listeners); - public AttachCapabilitiesEvent(Class type, T obj) - { - super(type); + public static class Entities extends AttachCapabilitiesEvent { + public static final EventBus BUS = EventBus.create(Entities.class); + + public Entities(Entity obj) { + super(obj); + } + } + + public static class BlockEntities extends AttachCapabilitiesEvent { + public static final EventBus BUS = EventBus.create(BlockEntities.class); + + public BlockEntities(BlockEntity obj) { + super(obj); + } + } + + public static class ItemStacks extends AttachCapabilitiesEvent { + public static final EventBus BUS = EventBus.create(ItemStacks.class); + + public ItemStacks(ItemStack obj) { + super(obj); + } + } + + public static class Levels extends AttachCapabilitiesEvent { + public static final EventBus BUS = EventBus.create(Levels.class); + + public Levels(Level obj) { + super(obj); + } + } + + public static class LevelChunks extends AttachCapabilitiesEvent { + public static final EventBus BUS = EventBus.create(LevelChunks.class); + + public LevelChunks(LevelChunk obj) { + super(obj); + } + } + + protected AttachCapabilitiesEvent(T obj) { this.obj = obj; } /** * Retrieves the object that is being created, Not much state is set. */ - public T getObject() - { + public T getObject() { return this.obj; } @@ -51,8 +103,7 @@ public class AttachCapabilitiesEvent extends GenericEvent * @param key The name of owner of this capability provider. * @param cap The capability provider */ - public void addCapability(ResourceLocation key, ICapabilityProvider cap) - { + public void addCapability(ResourceLocation key, ICapabilityProvider cap) { if (caps.containsKey(key)) throw new IllegalStateException("Duplicate Capability Key: " + key + " " + cap); this.caps.put(key, cap); @@ -61,8 +112,7 @@ public class AttachCapabilitiesEvent extends GenericEvent /** * A unmodifiable view of the capabilities that will be attached to this object. */ - public Map getCapabilities() - { + public Map getCapabilities() { return view; } @@ -71,13 +121,11 @@ public class AttachCapabilitiesEvent extends GenericEvent * Such as a Entity/TileEntity being removed from world. * All attached providers should invalidate all of their held capability instances. */ - public void addListener(Runnable listener) - { + public void addListener(Runnable listener) { this.listeners.add(listener); } - public List getListeners() - { + public List getListeners() { return this.listenersView; } } diff --git a/src/main/java/net/minecraftforge/event/BuildCreativeModeTabContentsEvent.java b/src/main/java/net/minecraftforge/event/BuildCreativeModeTabContentsEvent.java index eafae5759f..2e1b4239f8 100644 --- a/src/main/java/net/minecraftforge/event/BuildCreativeModeTabContentsEvent.java +++ b/src/main/java/net/minecraftforge/event/BuildCreativeModeTabContentsEvent.java @@ -11,8 +11,8 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; import net.minecraftforge.common.util.MutableHashedLinkedMap; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -29,7 +29,11 @@ import java.util.function.Supplier; * This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * only on the {@linkplain LogicalSide#CLIENT logical client}. */ -public final class BuildCreativeModeTabContentsEvent extends Event implements IModBusEvent, CreativeModeTab.Output { +public final class BuildCreativeModeTabContentsEvent implements IModBusEvent, CreativeModeTab.Output { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, BuildCreativeModeTabContentsEvent.class); + } + private final CreativeModeTab tab; private final CreativeModeTab.ItemDisplayParameters parameters; private final MutableHashedLinkedMap entries; diff --git a/src/main/java/net/minecraftforge/event/CommandEvent.java b/src/main/java/net/minecraftforge/event/CommandEvent.java index 0eda4bafaa..b4c435117d 100644 --- a/src/main/java/net/minecraftforge/event/CommandEvent.java +++ b/src/main/java/net/minecraftforge/event/CommandEvent.java @@ -9,8 +9,9 @@ import com.mojang.brigadier.ParseResults; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.Nullable; @@ -24,28 +25,25 @@ import org.jetbrains.annotations.Nullable; * This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#SERVER logical server}. **/ -@Cancelable -public final class CommandEvent extends Event -{ +public final class CommandEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(CommandEvent.class); + private ParseResults parse; @Nullable private Throwable exception; - public CommandEvent(ParseResults parse) - { + public CommandEvent(ParseResults parse) { this.parse = parse; } /** * {@return the parsed command results} */ - public ParseResults getParseResults() - { + public ParseResults getParseResults() { return this.parse; } - public void setParseResults(ParseResults parse) - { + public void setParseResults(ParseResults parse) { this.parse = parse; } @@ -53,13 +51,11 @@ public final class CommandEvent extends Event * {@return an exception to be thrown when performing the command, starts null} */ @Nullable - public Throwable getException() - { + public Throwable getException() { return this.exception; } - public void setException(@Nullable Throwable exception) - { + public void setException(@Nullable Throwable exception) { this.exception = exception; } } diff --git a/src/main/java/net/minecraftforge/event/DifficultyChangeEvent.java b/src/main/java/net/minecraftforge/event/DifficultyChangeEvent.java index 8d01ca383d..c59c49ad77 100644 --- a/src/main/java/net/minecraftforge/event/DifficultyChangeEvent.java +++ b/src/main/java/net/minecraftforge/event/DifficultyChangeEvent.java @@ -8,7 +8,8 @@ package net.minecraftforge.event; import net.minecraft.world.Difficulty; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; /** * DifficultyChangeEvent is fired when difficulty is changing.
    @@ -19,20 +20,6 @@ import net.minecraftforge.eventbus.api.Event; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -public final class DifficultyChangeEvent extends Event { - private final Difficulty difficulty; - private final Difficulty oldDifficulty; - - public DifficultyChangeEvent(Difficulty difficulty, Difficulty oldDifficulty) { - this.difficulty = difficulty; - this.oldDifficulty = oldDifficulty; - } - - public Difficulty getDifficulty() { - return difficulty; - } - - public Difficulty getOldDifficulty() { - return oldDifficulty; - } +public record DifficultyChangeEvent(Difficulty getDifficulty, Difficulty getOldDifficulty) implements RecordEvent { + public static final EventBus BUS = EventBus.create(DifficultyChangeEvent.class); } diff --git a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java index 1ba2a131eb..279db4c1ae 100644 --- a/src/main/java/net/minecraftforge/event/ForgeEventFactory.java +++ b/src/main/java/net/minecraftforge/event/ForgeEventFactory.java @@ -21,8 +21,7 @@ import net.minecraft.world.entity.*; import net.minecraft.world.item.Item; import net.minecraft.world.level.chunk.storage.SerializableChunkData; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.Result; import net.minecraftforge.fml.ModLoader; import net.minecraftforge.fml.event.IModBusEvent; import org.jetbrains.annotations.ApiStatus; @@ -42,7 +41,6 @@ import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.NonNullList; import net.minecraft.core.RegistryAccess; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; @@ -107,6 +105,7 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.portal.PortalShape; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.ServerLevelData; +import net.minecraft.world.level.storage.ValueInput; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; @@ -201,7 +200,6 @@ import net.minecraftforge.event.level.SleepFinishedTimeEvent; import net.minecraftforge.event.network.ChannelRegistrationChangeEvent; import net.minecraftforge.event.network.ConnectionStartEvent; import net.minecraftforge.event.network.GatherLoginConfigurationTasksEvent; -import net.minecraftforge.eventbus.api.Event.Result; import net.minecraftforge.fml.LogicalSide; @ApiStatus.Internal @@ -210,54 +208,35 @@ public final class ForgeEventFactory { private ForgeEventFactory() {} - /** - * Post an event to the {@link MinecraftForge#EVENT_BUS} - * @return true if the event is {@link Cancelable} and has been canceled - */ - private static boolean post(Event e) { - return MinecraftForge.EVENT_BUS.post(e); - } - - /** - * Post an event to the {@link MinecraftForge#EVENT_BUS}, then return the event object - * @return the event object passed in and possibly modified by listeners - */ - private static E fire(E e) { - post(e); - return e; - } - /** * Post an event to the {@link ModLoader#get()} event bus */ - private static void postModBus(T e) { + private static void postModBus(T e) { ML.postEvent(e); } public static boolean onMultiBlockPlace(@Nullable Entity entity, List blockSnapshots, Direction direction) { - var snap = blockSnapshots.get(0); + var snap = blockSnapshots.getFirst(); var placedAgainst = snap.getLevel().getBlockState(snap.getPos().relative(direction.getOpposite())); - var event = new EntityMultiPlaceEvent(blockSnapshots, placedAgainst, entity); - return post(event); + return EntityMultiPlaceEvent.BUS.post(new EntityMultiPlaceEvent(blockSnapshots, placedAgainst, entity)); } public static boolean onBlockPlace(@Nullable Entity entity, @NotNull BlockSnapshot blockSnapshot, @NotNull Direction direction) { var placedAgainst = blockSnapshot.getLevel().getBlockState(blockSnapshot.getPos().relative(direction.getOpposite())); - var event = new BlockEvent.EntityPlaceEvent(blockSnapshot, placedAgainst, entity); - return post(event); + return BlockEvent.EntityPlaceEvent.BUS.post(new BlockEvent.EntityPlaceEvent(blockSnapshot, placedAgainst, entity)); } public static boolean onNeighborNotify(Level level, BlockPos pos, BlockState state, EnumSet notifiedSides, boolean forceRedstoneUpdate) { - return post(new NeighborNotifyEvent(level, pos, state, notifiedSides, forceRedstoneUpdate)); + return NeighborNotifyEvent.BUS.post(new NeighborNotifyEvent(level, pos, state, notifiedSides, forceRedstoneUpdate)); } public static boolean doPlayerHarvestCheck(Player player, BlockState state, boolean success) { - return fire(new PlayerEvent.HarvestCheck(player, state, success)).canHarvest(); + return PlayerEvent.HarvestCheck.BUS.fire(new PlayerEvent.HarvestCheck(player, state, success)).canHarvest(); } public static float getBreakSpeed(Player player, BlockState state, float original, BlockPos pos) { var event = new PlayerEvent.BreakSpeed(player, state, original, pos); - return (post(event) ? -1 : event.getNewSpeed()); + return PlayerEvent.BreakSpeed.BUS.post(event) ? -1 : event.getNewSpeed(); } public static void onPlayerDestroyItem(Player player, @NotNull ItemStack stack, @Nullable InteractionHand hand) { @@ -265,11 +244,11 @@ public final class ForgeEventFactory { } public static void onPlayerDestroyItem(Player player, @NotNull ItemStack stack, @Nullable EquipmentSlot slot) { - post(new PlayerDestroyItemEvent(player, stack, slot)); + PlayerDestroyItemEvent.BUS.post(new PlayerDestroyItemEvent(player, stack, slot)); } public static boolean checkSpawnPlacements(EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnType, BlockPos pos, RandomSource random, boolean defaultResult) { - var result = fire(new SpawnPlacementCheck(entityType, level, spawnType, pos, random, defaultResult)).getResult(); + var result = SpawnPlacementCheck.BUS.fire(new SpawnPlacementCheck(entityType, level, spawnType, pos, random, defaultResult)).getResult(); return result == Result.DEFAULT ? defaultResult : result == Result.ALLOW; } @@ -283,7 +262,7 @@ public final class ForgeEventFactory { * @see PositionCheck */ public static boolean checkSpawnPosition(Mob mob, ServerLevelAccessor level, EntitySpawnReason spawnType) { - var result = fire(new PositionCheck(mob, level, spawnType, null)).getResult(); + var result = PositionCheck.BUS.fire(new PositionCheck(mob, level, spawnType, null)).getResult(); if (result == Result.DEFAULT) return mob.checkSpawnRules(level, spawnType) && mob.checkSpawnObstruction(level); return result == Result.ALLOW; @@ -295,7 +274,7 @@ public final class ForgeEventFactory { * @implNote See in-line comments about custom spawn rules. */ public static boolean checkSpawnPositionSpawner(Mob mob, ServerLevelAccessor level, EntitySpawnReason spawnType, SpawnData spawnData, BaseSpawner spawner) { - var result = fire(new PositionCheck(mob, level, spawnType, null)).getResult(); + var result = PositionCheck.BUS.fire(new PositionCheck(mob, level, spawnType, null)).getResult(); if (result == Result.DEFAULT) { // Spawners do not evaluate Mob#checkSpawnRules if any custom rules are present. This is despite the fact that these two methods do not check the same things. return (spawnData.getCustomSpawnRules().isPresent() || mob.checkSpawnRules(level, spawnType)) && mob.checkSpawnObstruction(level); @@ -337,7 +316,7 @@ public final class ForgeEventFactory { @SuppressWarnings("deprecation") // Call to deprecated Mob#finalizeSpawn is expected. public static SpawnGroupData onFinalizeSpawn(Mob mob, ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnType, @Nullable SpawnGroupData spawnData) { var event = new MobSpawnEvent.FinalizeSpawn(mob, level, mob.getX(), mob.getY(), mob.getZ(), difficulty, spawnType, spawnData, null, null); - boolean cancel = post(event); + boolean cancel = MobSpawnEvent.FinalizeSpawn.BUS.post(event); if (!cancel) return mob.finalizeSpawn(level, event.getDifficulty(), event.getSpawnReason(), event.getSpawnData()); @@ -352,96 +331,97 @@ public final class ForgeEventFactory { * @see #onFinalizeSpawn */ @Nullable - public static MobSpawnEvent.FinalizeSpawn onFinalizeSpawnSpawner(Mob mob, ServerLevelAccessor level, DifficultyInstance difficulty, @Nullable SpawnGroupData spawnData, @Nullable CompoundTag spawnTag, BaseSpawner spawner) { - return fire(new MobSpawnEvent.FinalizeSpawn(mob, level, mob.getX(), mob.getY(), mob.getZ(), difficulty, EntitySpawnReason.SPAWNER, spawnData, spawnTag, spawner)); + public static MobSpawnEvent.FinalizeSpawn onFinalizeSpawnSpawner(Mob mob, ServerLevelAccessor level, DifficultyInstance difficulty, @Nullable SpawnGroupData spawnData, @Nullable ValueInput spawnTag, BaseSpawner spawner) { + var event = new MobSpawnEvent.FinalizeSpawn(mob, level, mob.getX(), mob.getY(), mob.getZ(), difficulty, EntitySpawnReason.SPAWNER, spawnData, spawnTag, spawner); + return MobSpawnEvent.FinalizeSpawn.BUS.post(event) ? null : event; } public static Result canEntityDespawn(Mob entity, ServerLevelAccessor level) { - return fire(new AllowDespawn(entity, level)).getResult(); + return AllowDespawn.BUS.fire(new AllowDespawn(entity, level)).getResult(); } public static int getItemBurnTime(@NotNull ItemStack itemStack, int burnTime, @Nullable RecipeType recipeType) { - return fire(new FurnaceFuelBurnTimeEvent(itemStack, burnTime, recipeType)).getBurnTime(); + return FurnaceFuelBurnTimeEvent.BUS.fire(new FurnaceFuelBurnTimeEvent(itemStack, burnTime, recipeType)).getBurnTime(); } public static int getExperienceDrop(LivingEntity entity, Player attackingPlayer, int originalExperience) { var event = new LivingExperienceDropEvent(entity, attackingPlayer, originalExperience); - if (post(event)) + if (LivingExperienceDropEvent.BUS.post(event)) return 0; return event.getDroppedExperience(); } public static int getMaxSpawnPackSize(Mob entity) { - var maxCanSpawnEvent = fire(new LivingPackSizeEvent(entity)); + var maxCanSpawnEvent = LivingPackSizeEvent.BUS.fire(new LivingPackSizeEvent(entity)); return maxCanSpawnEvent.getResult() == Result.ALLOW ? maxCanSpawnEvent.getMaxPackSize() : entity.getMaxSpawnClusterSize(); } public static Component getPlayerDisplayName(Player player, Component username) { - return fire(new PlayerEvent.NameFormat(player, username)).getDisplayname(); + return PlayerEvent.NameFormat.BUS.fire(new PlayerEvent.NameFormat(player, username)).getDisplayname(); } public static Component getPlayerTabListDisplayName(Player player) { - return fire(new PlayerEvent.TabListNameFormat(player)).getDisplayName(); + return PlayerEvent.TabListNameFormat.BUS.fire(new PlayerEvent.TabListNameFormat(player)).getDisplayName(); } public static BlockState fireFluidPlaceBlockEvent(LevelAccessor level, BlockPos pos, BlockPos liquidPos, BlockState state) { - return fire(new BlockEvent.FluidPlaceBlockEvent(level, pos, liquidPos, state)).getNewState(); + return BlockEvent.FluidPlaceBlockEvent.BUS.fire(new BlockEvent.FluidPlaceBlockEvent(level, pos, liquidPos, state)).getNewState(); } public static ItemTooltipEvent onItemTooltip(ItemStack itemStack, @Nullable Player entityPlayer, List list, TooltipFlag flags) { - return fire(new ItemTooltipEvent(itemStack, entityPlayer, list, flags)); + return ItemTooltipEvent.BUS.fire(new ItemTooltipEvent(itemStack, entityPlayer, list, flags)); } public static SummonAidEvent fireZombieSummonAid(Zombie zombie, Level level, int x, int y, int z, LivingEntity attacker, double summonChance) { - return fire(new SummonAidEvent(zombie, level, x, y, z, attacker, summonChance)); + return SummonAidEvent.BUS.fire(new SummonAidEvent(zombie, level, x, y, z, attacker, summonChance)); } public static boolean onEntityStruckByLightning(Entity entity, LightningBolt bolt) { - return post(new EntityStruckByLightningEvent(entity, bolt)); + return EntityStruckByLightningEvent.BUS.post(new EntityStruckByLightningEvent(entity, bolt)); } public static int onItemUseStart(LivingEntity entity, ItemStack item, int duration) { var event = new LivingEntityUseItemEvent.Start(entity, item, duration); - return post(event) ? -1 : event.getDuration(); + return LivingEntityUseItemEvent.Start.BUS.post(event) ? -1 : event.getDuration(); } public static int onItemUseTick(LivingEntity entity, ItemStack item, int duration) { var event = new LivingEntityUseItemEvent.Tick(entity, item, duration); - return post(event) ? -1 : event.getDuration(); + return LivingEntityUseItemEvent.Tick.BUS.post(event) ? -1 : event.getDuration(); } public static boolean onUseItemStop(LivingEntity entity, ItemStack item, int duration) { - return post(new LivingEntityUseItemEvent.Stop(entity, item, duration)); + return LivingEntityUseItemEvent.Stop.BUS.post(new LivingEntityUseItemEvent.Stop(entity, item, duration)); } public static ItemStack onItemUseFinish(LivingEntity entity, ItemStack item, int duration, ItemStack result) { - return fire(new LivingEntityUseItemEvent.Finish(entity, item, duration, result)).getResultStack(); + return LivingEntityUseItemEvent.Finish.BUS.fire(new LivingEntityUseItemEvent.Finish(entity, item, duration, result)).getResultStack(); } public static void onStartEntityTracking(Entity entity, Player player) { - post(new PlayerEvent.StartTracking(player, entity)); + PlayerEvent.StartTracking.BUS.post(new PlayerEvent.StartTracking(player, entity)); } public static void onStopEntityTracking(Entity entity, Player player) { - post(new PlayerEvent.StopTracking(player, entity)); + PlayerEvent.StopTracking.BUS.post(new PlayerEvent.StopTracking(player, entity)); } public static void firePlayerLoadingEvent(Player player, File playerDirectory, String uuidString) { - post(new PlayerEvent.LoadFromFile(player, playerDirectory, uuidString)); + PlayerEvent.LoadFromFile.BUS.post(new PlayerEvent.LoadFromFile(player, playerDirectory, uuidString)); } public static void firePlayerSavingEvent(Player player, File playerDirectory, String uuidString) { - post(new PlayerEvent.SaveToFile(player, playerDirectory, uuidString)); + PlayerEvent.SaveToFile.BUS.post(new PlayerEvent.SaveToFile(player, playerDirectory, uuidString)); } public static void firePlayerLoadingEvent(Player player, PlayerDataStorage playerFileData, String uuidString) { - post(new PlayerEvent.LoadFromFile(player, playerFileData.getPlayerDataFolder(), uuidString)); + PlayerEvent.LoadFromFile.BUS.post(new PlayerEvent.LoadFromFile(player, playerFileData.getPlayerDataFolder(), uuidString)); } @Nullable public static BlockState onToolUse(BlockState originalState, UseOnContext context, ToolAction toolAction, boolean simulate) { var event = new BlockToolModificationEvent(originalState, context, toolAction, simulate); - return post(event) ? null : event.getFinalState(); + return BlockToolModificationEvent.BUS.post(event) ? null : event.getFinalState(); } public static int onApplyBonemeal(@Nullable Player player, Level level, BlockPos pos, BlockState state, ItemStack stack) { @@ -449,7 +429,7 @@ public final class ForgeEventFactory { return 0; var event = new BonemealEvent(player, level, pos, state, stack); - if (post(event)) return -1; + if (BonemealEvent.BUS.post(event)) return -1; if (event.getResult() == Result.ALLOW) { if (!level.isClientSide) stack.shrink(1); @@ -461,7 +441,7 @@ public final class ForgeEventFactory { @Nullable public static InteractionResult onBucketUse(@NotNull Player player, @NotNull Level level, @NotNull ItemStack stack, @Nullable HitResult target) { var event = new FillBucketEvent(player, stack, level, target); - if (post(event)) + if (FillBucketEvent.BUS.post(event)) return InteractionResult.FAIL; if (event.getResult() == Result.ALLOW) { @@ -480,84 +460,87 @@ public final class ForgeEventFactory { return null; } - public static PlayLevelSoundEvent.AtEntity onPlaySoundAtEntity(Level level, Entity entity, Holder name, SoundSource category, float volume, float pitch) { - return fire(new PlayLevelSoundEvent.AtEntity(level, entity, name, category, volume, pitch)); + public static @Nullable PlayLevelSoundEvent.AtEntity onPlaySoundAtEntity(Level level, Entity entity, Holder name, SoundSource category, float volume, float pitch) { + var event = new PlayLevelSoundEvent.AtEntity(level, entity, name, category, volume, pitch); + return PlayLevelSoundEvent.AtEntity.BUS.post(event) ? null : event; } public static PlayLevelSoundEvent.AtPosition onPlaySoundAtPosition(Level level, double x, double y, double z, Holder name, SoundSource category, float volume, float pitch) { - return fire(new PlayLevelSoundEvent.AtPosition(level, new Vec3(x, y, z), name, category, volume, pitch)); + var event = new PlayLevelSoundEvent.AtPosition(level, new Vec3(x, y, z), name, category, volume, pitch); + return PlayLevelSoundEvent.AtPosition.BUS.post(event) ? null : event; } public static int onItemExpire(ItemEntity entity, @NotNull ItemStack item) { if (item.isEmpty()) return -1; var event = new ItemExpireEvent(entity, (item.isEmpty() ? 6000 : item.getItem().getEntityLifespan(item, entity.level()))); - if (!post(event)) return -1; + if (!ItemExpireEvent.BUS.post(event)) return -1; return event.getExtraLife(); } public static int onItemPickup(ItemEntity entityItem, Player player) { var event = new EntityItemPickupEvent(player, entityItem); - if (post(event)) return -1; + if (EntityItemPickupEvent.BUS.post(event)) return -1; return event.getResult() == Result.ALLOW ? 1 : 0; } public static boolean canMountEntity(Entity entityMounting, Entity entityBeingMounted, boolean isMounting) { - boolean isCanceled = post(new EntityMountEvent(entityMounting, entityBeingMounted, entityMounting.level(), isMounting)); + boolean isCanceled = EntityMountEvent.BUS.post(new EntityMountEvent(entityMounting, entityBeingMounted, entityMounting.level(), isMounting)); - if(isCanceled) { + if (isCanceled) { entityMounting.absSnapTo(entityMounting.getX(), entityMounting.getY(), entityMounting.getZ(), entityMounting.yRotO, entityMounting.xRotO); return false; - } else + } else { return true; + } } public static boolean onAnimalTame(Animal animal, Player tamer) { - return post(new AnimalTameEvent(animal, tamer)); + return AnimalTameEvent.BUS.post(new AnimalTameEvent(animal, tamer)); } public static boolean onPlayerPickupXp(Player player, ExperienceOrb orb) { - return post(new PlayerXpEvent.PickupXp(player, orb)); + return PlayerXpEvent.PickupXp.BUS.post(new PlayerXpEvent.PickupXp(player, orb)); } public static Player.BedSleepingProblem onPlayerSleepInBed(Player player, Optional pos) { - return fire(new PlayerSleepInBedEvent(player, pos)).getResultStatus(); + return PlayerSleepInBedEvent.BUS.fire(new PlayerSleepInBedEvent(player, pos)).getResultStatus(); } public static void onPlayerWakeup(Player player, boolean wakeImmediately, boolean updateLevel) { - post(new PlayerWakeUpEvent(player, wakeImmediately, updateLevel)); + PlayerWakeUpEvent.BUS.post(new PlayerWakeUpEvent(player, wakeImmediately, updateLevel)); } public static void onPlayerFall(Player player, float distance, float multiplier) { - post(new PlayerFlyableFallEvent(player, distance, multiplier)); + PlayerFlyableFallEvent.BUS.post(new PlayerFlyableFallEvent(player, distance, multiplier)); } public static boolean onPlayerSpawnSet(ServerPlayer player, ServerPlayer.RespawnConfig config) { - return post(new PlayerSetSpawnEvent(player, config)); + return PlayerSetSpawnEvent.BUS.post(new PlayerSetSpawnEvent(player, config)); } public static PlayerSpawnPhantomsEvent onPlayerSpawnPhantom(Player player, int phantomsToSpawn) { - return fire(new PlayerSpawnPhantomsEvent(player, phantomsToSpawn)); + return PlayerSpawnPhantomsEvent.BUS.fire(new PlayerSpawnPhantomsEvent(player, phantomsToSpawn)); } public static void onPlayerClone(Player player, Player oldPlayer, boolean wasDeath) { - post(new PlayerEvent.Clone(player, oldPlayer, wasDeath)); + PlayerEvent.Clone.BUS.post(new PlayerEvent.Clone(player, oldPlayer, wasDeath)); } public static boolean onExplosionStart(Level level, Explosion explosion) { - return post(new ExplosionEvent.Start(level, explosion)); + return ExplosionEvent.Start.BUS.post(new ExplosionEvent.Start(level, explosion)); } public static void onExplosionDetonate(Level level, Explosion explosion, List blocks, List entities, double diameter) { - post(new ExplosionEvent.Detonate(level, explosion, blocks, entities)); + ExplosionEvent.Detonate.BUS.post(new ExplosionEvent.Detonate(level, explosion, blocks, entities)); } public static boolean onCreateWorldSpawn(Level level, ServerLevelData settings) { - return post(new LevelEvent.CreateSpawnPosition(level, settings)); + return LevelEvent.CreateSpawnPosition.BUS.post(new LevelEvent.CreateSpawnPosition(level, settings)); } public static float onLivingHeal(LivingEntity entity, float amount) { var event = new LivingHealEvent(entity, amount); - return (post(event) ? 0 : event.getAmount()); + return LivingHealEvent.BUS.post(event) ? 0 : event.getAmount(); } public static boolean onPotionAttemptBrew(NonNullList stacks) { @@ -566,7 +549,7 @@ public final class ForgeEventFactory { tmp.set(x, stacks.get(x).copy()); var event = new PotionBrewEvent.Pre(tmp); - if (post(event)) { + if (PotionBrewEvent.Pre.BUS.post(event)) { boolean changed = false; for (int x = 0; x < stacks.size(); x++) { changed |= ItemStack.matches(tmp.get(x), stacks.get(x)); @@ -580,33 +563,32 @@ public final class ForgeEventFactory { } public static void onPotionBrewed(NonNullList brewingItemStacks) { - post(new PotionBrewEvent.Post(brewingItemStacks)); + PotionBrewEvent.Post.BUS.post(new PotionBrewEvent.Post(brewingItemStacks)); } public static void onPlayerBrewedPotion(Player player, ItemStack stack) { - post(new PlayerBrewedPotionEvent(player, stack)); + PlayerBrewedPotionEvent.BUS.post(new PlayerBrewedPotionEvent(player, stack)); } - @Nullable - public static CapabilityDispatcher gatherCapabilities(Class type, T provider) { - return gatherCapabilities(type, provider, null); - } +// @Nullable +// public static CapabilityDispatcher gatherCapabilities(Class type, T provider) { +// return gatherCapabilities(type, provider, null); +// } - @SuppressWarnings("unchecked") - @Nullable - public static CapabilityDispatcher gatherCapabilities(Class type, T provider, @Nullable ICapabilityProvider parent) { - return gatherCapabilities(new AttachCapabilitiesEvent((Class) type, provider), parent); - } +// @SuppressWarnings("unchecked") +// @Nullable +// public static CapabilityDispatcher gatherCapabilities(Class type, T provider, @Nullable ICapabilityProvider parent) { +// return gatherCapabilities(new AttachCapabilitiesEvent((Class) type, provider), parent); +// } @Nullable - private static CapabilityDispatcher gatherCapabilities(AttachCapabilitiesEvent event, @Nullable ICapabilityProvider parent) { - post(event); + public static CapabilityDispatcher gatherCapabilities(AttachCapabilitiesEvent event, @Nullable ICapabilityProvider parent) { return !event.getCapabilities().isEmpty() || parent != null ? new CapabilityDispatcher(event.getCapabilities(), event.getListeners(), parent) : null; } public static boolean fireSleepingLocationCheck(LivingEntity player, BlockPos sleepingLocation) { var evt = new SleepingLocationCheckEvent(player, sleepingLocation); - post(evt); + SleepingLocationCheckEvent.BUS.post(evt); Result canContinueSleep = evt.getResult(); if (canContinueSleep == Result.DEFAULT) @@ -617,7 +599,7 @@ public final class ForgeEventFactory { public static boolean onSleepingTimeCheck(Player player, Optional sleepingLocation) { var evt = new SleepingTimeCheckEvent(player, sleepingLocation); - post(evt); + SleepingTimeCheckEvent.BUS.post(evt); var canContinueSleep = evt.getResult(); if (canContinueSleep == Result.DEFAULT) @@ -628,20 +610,20 @@ public final class ForgeEventFactory { public static InteractionResult onArrowNock(ItemStack item, Level level, Player player, InteractionHand hand, boolean hasAmmo) { var event = new ArrowNockEvent(player, item, hand, level, hasAmmo); - if (post(event)) + if (ArrowNockEvent.BUS.post(event)) return InteractionResult.FAIL; return event.getAction(); } public static int onArrowLoose(ItemStack stack, Level level, Player player, int charge, boolean hasAmmo) { var event = new ArrowLooseEvent(player, stack, level, charge, hasAmmo); - if (post(event)) + if (ArrowLooseEvent.BUS.post(event)) return -1; return event.getCharge(); } public static ProjectileImpactEvent.ImpactResult onProjectileImpactResult(Projectile projectile, HitResult ray) { - return fire(new ProjectileImpactEvent(projectile, ray)).getImpactResult(); + return ProjectileImpactEvent.BUS.fire(new ProjectileImpactEvent(projectile, ray)).getImpactResult(); } public static boolean onProjectileImpact(Projectile projectile, HitResult ray) { @@ -650,333 +632,330 @@ public final class ForgeEventFactory { public static @Nullable LootTable onLoadLootTable(ResourceLocation name, LootTable table) { var event = new LootTableLoadEvent(name, table); - return post(event) ? null : event.getTable(); + return LootTableLoadEvent.BUS.post(event) ? null : event.getTable(); } public static boolean canCreateFluidSource(Level level, BlockPos pos, BlockState state, boolean def) { - var result = fire(new CreateFluidSourceEvent(level, pos, state)).getResult(); + var result = CreateFluidSourceEvent.BUS.fire(new CreateFluidSourceEvent(level, pos, state)).getResult(); return result == Result.DEFAULT ? def : result == Result.ALLOW; } public static Optional onTrySpawnPortal(LevelAccessor level, BlockPos pos, Optional size) { - if (!size.isPresent()) return size; - return !post(new BlockEvent.PortalSpawnEvent(level, pos, level.getBlockState(pos), size.get())) ? size : Optional.empty(); + if (size.isEmpty()) return size; + return BlockEvent.PortalSpawnEvent.BUS.post(new BlockEvent.PortalSpawnEvent(level, pos, level.getBlockState(pos), size.get())) ? Optional.empty() : size; } public static int onEnchantmentLevelSet(Level level, BlockPos pos, int enchantRow, int power, ItemStack itemStack, int enchantmentLevel) { - return fire(new EnchantmentLevelSetEvent(level, pos, enchantRow, power, itemStack, enchantmentLevel)).getEnchantLevel(); + return EnchantmentLevelSetEvent.BUS.fire(new EnchantmentLevelSetEvent(level, pos, enchantRow, power, itemStack, enchantmentLevel)).getEnchantLevel(); } public static boolean onEntityDestroyBlock(LivingEntity entity, BlockPos pos, BlockState state) { - return !post(new LivingDestroyBlockEvent(entity, pos, state)); + return !LivingDestroyBlockEvent.BUS.post(new LivingDestroyBlockEvent(entity, pos, state)); } public static boolean getMobGriefingEvent(ServerLevel level, @Nullable Entity entity) { if (entity == null) return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); - var result = fire(new EntityMobGriefingEvent(entity)).getResult(); + var result = EntityMobGriefingEvent.BUS.fire(new EntityMobGriefingEvent(entity)).getResult(); return result == Result.DEFAULT ? level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) : result == Result.ALLOW; } @SuppressWarnings("removal") public static SaplingGrowTreeEvent blockGrowFeature(LevelAccessor level, RandomSource randomSource, BlockPos pos, @Nullable Holder> holder) { - return fire(new SaplingGrowTreeEvent(level, randomSource, pos, holder)); + return SaplingGrowTreeEvent.BUS.fire(new SaplingGrowTreeEvent(level, randomSource, pos, holder)); } public static BlockState alterGround(LevelSimulatedReader level, RandomSource random, BlockPos pos, BlockState altered) { - return fire(new AlterGroundEvent(level, random, pos, altered)).getNewAlteredState(); + return AlterGroundEvent.BUS.fire(new AlterGroundEvent(level, random, pos, altered)).getNewAlteredState(); } public static void fireChunkTicketLevelUpdated(ServerLevel level, long chunkPos, int oldTicketLevel, int newTicketLevel, @Nullable ChunkHolder chunkHolder) { if (oldTicketLevel != newTicketLevel) - post(new ChunkTicketLevelUpdatedEvent(level, chunkPos, oldTicketLevel, newTicketLevel, chunkHolder)); + ChunkTicketLevelUpdatedEvent.BUS.post(new ChunkTicketLevelUpdatedEvent(level, chunkPos, oldTicketLevel, newTicketLevel, chunkHolder)); } public static void fireChunkWatch(ServerPlayer entity, LevelChunk chunk, ServerLevel level) { - post(new ChunkWatchEvent.Watch(entity, chunk, level)); + ChunkWatchEvent.Watch.BUS.post(new ChunkWatchEvent.Watch(entity, chunk, level)); } public static void fireChunkUnWatch(ServerPlayer entity, ChunkPos chunkpos, ServerLevel level) { - post(new ChunkWatchEvent.UnWatch(entity, chunkpos, level)); + ChunkWatchEvent.UnWatch.BUS.post(new ChunkWatchEvent.UnWatch(entity, chunkpos, level)); } public static boolean onPistonMovePre(Level level, BlockPos pos, Direction direction, boolean extending) { - return post(new PistonEvent.Pre(level, pos, direction, extending ? PistonEvent.PistonMoveType.EXTEND : PistonEvent.PistonMoveType.RETRACT)); + return PistonEvent.Pre.BUS.post(new PistonEvent.Pre(level, pos, direction, extending ? PistonEvent.PistonMoveType.EXTEND : PistonEvent.PistonMoveType.RETRACT)); } public static boolean onPistonMovePost(Level level, BlockPos pos, Direction direction, boolean extending) { - return post(new PistonEvent.Post(level, pos, direction, extending ? PistonEvent.PistonMoveType.EXTEND : PistonEvent.PistonMoveType.RETRACT)); + return PistonEvent.Post.BUS.post(new PistonEvent.Post(level, pos, direction, extending ? PistonEvent.PistonMoveType.EXTEND : PistonEvent.PistonMoveType.RETRACT)); } public static long onSleepFinished(ServerLevel level, long newTime, long minTime) { - return fire(new SleepFinishedTimeEvent(level, newTime, minTime)).getNewTime(); + return SleepFinishedTimeEvent.BUS.fire(new SleepFinishedTimeEvent(level, newTime, minTime)).getNewTime(); } @Deprecated(forRemoval = true, since = "1.21.4") public static List onResourceReload(ReloadableServerResources serverResources, RegistryAccess registryAccess) { - return fire(new AddReloadListenerEvent(serverResources, registryAccess)).getListeners(); + return AddReloadListenerEvent.BUS.fire(new AddReloadListenerEvent(serverResources, registryAccess)).getListeners(); } public static List onResourceReload(ReloadableServerResources serverResources, HolderLookup.Provider lookupProvider, @Deprecated(forRemoval = true, since = "1.21.4") RegistryAccess registryAccess) { - return fire(new AddReloadListenerEvent(serverResources, lookupProvider, registryAccess)).getListeners(); + return AddReloadListenerEvent.BUS.fire(new AddReloadListenerEvent(serverResources, lookupProvider, registryAccess)).getListeners(); } public static void onCommandRegister(CommandDispatcher dispatcher, Commands.CommandSelection environment, CommandBuildContext context) { - post(new RegisterCommandsEvent(dispatcher, environment, context)); + RegisterCommandsEvent.BUS.post(new RegisterCommandsEvent(dispatcher, environment, context)); } public static boolean canLivingConvert(LivingEntity entity, EntityType outcome, Consumer timer) { - return !post(new LivingConversionEvent.Pre(entity, outcome, timer)); + return !LivingConversionEvent.Pre.BUS.post(new LivingConversionEvent.Pre(entity, outcome, timer)); } public static void onLivingConvert(LivingEntity entity, LivingEntity outcome) { - post(new LivingConversionEvent.Post(entity, outcome)); + LivingConversionEvent.Post.BUS.post(new LivingConversionEvent.Post(entity, outcome)); } - public static BabyEntitySpawnEvent onBabySpawn(Mob parentA, Mob parentB, @Nullable AgeableMob proposedChild) { - return fire(new BabyEntitySpawnEvent(parentA, parentB, proposedChild)); - + public static @Nullable EntityTeleportEvent.TeleportCommand onEntityTeleportCommand(Entity entity, double targetX, double targetY, double targetZ) { + var event = new EntityTeleportEvent.TeleportCommand(entity, targetX, targetY, targetZ); + return EntityTeleportEvent.TeleportCommand.BUS.post(event) ? null : event; } - public static EntityTeleportEvent.TeleportCommand onEntityTeleportCommand(Entity entity, double targetX, double targetY, double targetZ) { - return fire(new EntityTeleportEvent.TeleportCommand(entity, targetX, targetY, targetZ)); + public static @Nullable EntityTeleportEvent.SpreadPlayersCommand onEntityTeleportSpreadPlayersCommand(Entity entity, double targetX, double targetY, double targetZ) { + var event = new EntityTeleportEvent.SpreadPlayersCommand(entity, targetX, targetY, targetZ); + return EntityTeleportEvent.SpreadPlayersCommand.BUS.post(event) ? null : event; } - public static EntityTeleportEvent.SpreadPlayersCommand onEntityTeleportSpreadPlayersCommand(Entity entity, double targetX, double targetY, double targetZ) { - return fire(new EntityTeleportEvent.SpreadPlayersCommand(entity, targetX, targetY, targetZ)); + public static @Nullable EntityTeleportEvent.EnderEntity onEnderManTeleport(LivingEntity entity, double targetX, double targetY, double targetZ) { + var event = new EntityTeleportEvent.EnderEntity(entity, targetX, targetY, targetZ); + return EntityTeleportEvent.EnderEntity.BUS.post(event) ? null : event; } - public static EntityTeleportEvent.EnderEntity onEnderTeleport(LivingEntity entity, double targetX, double targetY, double targetZ) { - return fire(new EntityTeleportEvent.EnderEntity(entity, targetX, targetY, targetZ)); - } - - public static EntityTeleportEvent.EnderPearl onEnderPearlLand(ServerPlayer entity, double targetX, double targetY, double targetZ, ThrownEnderpearl pearlEntity, float attackDamage, HitResult hitResult) { - return fire(new EntityTeleportEvent.EnderPearl(entity, targetX, targetY, targetZ, pearlEntity, attackDamage, hitResult)); + public static @Nullable EntityTeleportEvent.EnderPearl onEnderPearlLand(ServerPlayer entity, double targetX, double targetY, double targetZ, ThrownEnderpearl pearlEntity, float attackDamage, HitResult hitResult) { + var event = new EntityTeleportEvent.EnderPearl(entity, targetX, targetY, targetZ, pearlEntity, attackDamage, hitResult); + return EntityTeleportEvent.EnderPearl.BUS.post(event) ? null : event; } public static EntityTeleportEvent.ChorusFruit onChorusFruitTeleport(LivingEntity entity, double targetX, double targetY, double targetZ) { - return fire(new EntityTeleportEvent.ChorusFruit(entity, targetX, targetY, targetZ)); + return EntityTeleportEvent.ChorusFruit.BUS.fire(new EntityTeleportEvent.ChorusFruit(entity, targetX, targetY, targetZ)); } public static boolean onPermissionChanged(GameProfile gameProfile, int newLevel, PlayerList playerList) { var oldLevel = playerList.getServer().getProfilePermissions(gameProfile); var player = playerList.getPlayer(gameProfile.getId()); if (newLevel != oldLevel && player != null) - return post(new PermissionsChangedEvent(player, newLevel, oldLevel)); + return PermissionsChangedEvent.BUS.post(new PermissionsChangedEvent(player, newLevel, oldLevel)); return false; } public static void onPlayerChangedDimension(Player player, ResourceKey fromDim, ResourceKey toDim) { - post(new PlayerEvent.PlayerChangedDimensionEvent(player, fromDim, toDim)); + PlayerEvent.PlayerChangedDimensionEvent.BUS.post(new PlayerEvent.PlayerChangedDimensionEvent(player, fromDim, toDim)); } public static void firePlayerLoggedIn(Player player) { - post(new PlayerEvent.PlayerLoggedInEvent(player)); + PlayerEvent.PlayerLoggedInEvent.BUS.post(new PlayerEvent.PlayerLoggedInEvent(player)); } public static void firePlayerLoggedOut(Player player) { - post(new PlayerEvent.PlayerLoggedOutEvent(player)); + PlayerEvent.PlayerLoggedOutEvent.BUS.post(new PlayerEvent.PlayerLoggedOutEvent(player)); } public static void firePlayerRespawnEvent(Player player, boolean endConquered) { - post(new PlayerEvent.PlayerRespawnEvent(player, endConquered)); + PlayerEvent.PlayerRespawnEvent.BUS.post(new PlayerEvent.PlayerRespawnEvent(player, endConquered)); } public static void firePlayerItemPickupEvent(Player player, ItemEntity item, ItemStack clone) { - post(new PlayerEvent.ItemPickupEvent(player, item, clone)); + PlayerEvent.ItemPickupEvent.BUS.post(new PlayerEvent.ItemPickupEvent(player, item, clone)); } public static void firePlayerCraftingEvent(Player player, ItemStack crafted, Container craftMatrix) { - post(new PlayerEvent.ItemCraftedEvent(player, crafted, craftMatrix)); + PlayerEvent.ItemCraftedEvent.BUS.post(new PlayerEvent.ItemCraftedEvent(player, crafted, craftMatrix)); } public static void firePlayerSmeltedEvent(Player player, ItemStack smelted) { - post(new PlayerEvent.ItemSmeltedEvent(player, smelted)); + PlayerEvent.ItemSmeltedEvent.BUS.post(new PlayerEvent.ItemSmeltedEvent(player, smelted)); } public static void onPlayerPreTick(Player player) { - post(new TickEvent.PlayerTickEvent.Pre(player)); + TickEvent.PlayerTickEvent.Pre.BUS.post(new TickEvent.PlayerTickEvent.Pre(player)); } public static void onPlayerPostTick(Player player) { - post(new TickEvent.PlayerTickEvent.Post(player)); + TickEvent.PlayerTickEvent.Post.BUS.post(new TickEvent.PlayerTickEvent.Post(player)); } public static void onPreLevelTick(Level level, BooleanSupplier haveTime) { - post(new TickEvent.LevelTickEvent.Pre(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, level, haveTime)); + TickEvent.LevelTickEvent.Pre.BUS.post(new TickEvent.LevelTickEvent.Pre(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, level, haveTime)); } public static void onPostLevelTick(Level level, BooleanSupplier haveTime) { - post(new TickEvent.LevelTickEvent.Post(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, level, haveTime)); + TickEvent.LevelTickEvent.Post.BUS.post(new TickEvent.LevelTickEvent.Post(level.isClientSide ? LogicalSide.CLIENT : LogicalSide.SERVER, level, haveTime)); } public static void onPreClientTick() { - post(new TickEvent.ClientTickEvent.Pre()); + TickEvent.ClientTickEvent.Pre.BUS.post(TickEvent.ClientTickEvent.Pre.INSTANCE); } public static void onPostClientTick() { - post(new TickEvent.ClientTickEvent.Post()); + TickEvent.ClientTickEvent.Post.BUS.post(TickEvent.ClientTickEvent.Post.INSTANCE); } public static void onPreServerTick(BooleanSupplier haveTime, MinecraftServer server) { - post(new TickEvent.ServerTickEvent.Pre(haveTime, server)); + TickEvent.ServerTickEvent.Pre.BUS.post(new TickEvent.ServerTickEvent.Pre(haveTime, server)); } public static void onPostServerTick(BooleanSupplier haveTime, MinecraftServer server) { - post(new TickEvent.ServerTickEvent.Post(haveTime, server)); + TickEvent.ServerTickEvent.Post.BUS.post(new TickEvent.ServerTickEvent.Post(haveTime, server)); } public static WeightedList getPotentialSpawns(LevelAccessor level, MobCategory category, BlockPos pos, WeightedList oldList) { - LevelEvent.PotentialSpawns event = new LevelEvent.PotentialSpawns(level, category, pos, oldList); - if (post(event)) + var event = new LevelEvent.PotentialSpawns(level, category, pos, oldList); + if (LevelEvent.PotentialSpawns.BUS.post(event)) return WeightedList.of(); //System.out.println("List: " + oldList.unwrap() + " " + event.getSpawnerDataList()); return WeightedList.of(event.getSpawnerDataList()); } public static void onAdvancementEarned(Player player, AdvancementHolder holder) { - post(new AdvancementEarnEvent(player, holder)); + AdvancementEarnEvent.BUS.post(new AdvancementEarnEvent(player, holder)); } public static void onAdvancementGrant(Player player, AdvancementHolder holder, AdvancementProgress advancementProgress, String criterion) { - post(new AdvancementProgressEvent(player, holder, advancementProgress, criterion, ProgressType.GRANT)); + AdvancementProgressEvent.BUS.post(new AdvancementProgressEvent(player, holder, advancementProgress, criterion, ProgressType.GRANT)); } public static void onAdvancementRevoke(Player player, AdvancementHolder holder, AdvancementProgress advancementProgress, String criterion) { - post(new AdvancementProgressEvent(player, holder, advancementProgress, criterion, ProgressType.REVOKE)); + AdvancementProgressEvent.BUS.post(new AdvancementProgressEvent(player, holder, advancementProgress, criterion, ProgressType.REVOKE)); } public static void onEntityConstructing(Entity entity) { - post(new EntityEvent.EntityConstructing(entity)); + EntityEvent.EntityConstructing.BUS.post(new EntityEvent.EntityConstructing(entity)); } public static void onPlayerOpenContainer(ServerPlayer player, AbstractContainerMenu menu) { - post(new PlayerContainerEvent.Open(player, menu)); + PlayerContainerEvent.Open.BUS.post(new PlayerContainerEvent.Open(player, menu)); } public static void onPlayerCloseContainer(ServerPlayer player, AbstractContainerMenu menu) { - post(new PlayerContainerEvent.Close(player, menu)); + PlayerContainerEvent.Close.BUS.post(new PlayerContainerEvent.Close(player, menu)); } public static boolean onTravelToDimension(Entity entity, ResourceKey dimension) { - return post(new EntityTravelToDimensionEvent(entity, dimension)); + return EntityTravelToDimensionEvent.BUS.post(new EntityTravelToDimensionEvent(entity, dimension)); } public static void onChunkUnload(ChunkAccess chunk) { - post(new ChunkEvent.Unload(chunk)); + ChunkEvent.Unload.BUS.post(new ChunkEvent.Unload(chunk)); } public static void onChunkLoad(ChunkAccess chunk, boolean newChunk) { - post(new ChunkEvent.Load(chunk, newChunk)); + ChunkEvent.Load.BUS.post(new ChunkEvent.Load(chunk, newChunk)); } public static void onLevelUnload(Level level) { - post(new LevelEvent.Unload(level)); + LevelEvent.Unload.BUS.post(new LevelEvent.Unload(level)); } public static void onLevelLoad(Level level) { - post(new LevelEvent.Load(level)); + LevelEvent.Load.BUS.post(new LevelEvent.Load(level)); } public static void onLevelSave(Level level) { - post(new LevelEvent.Save(level)); + LevelEvent.Save.BUS.post(new LevelEvent.Save(level)); } public static void onChunkDataSave(ChunkAccess chunk, LevelAccessor world, SerializableChunkData data) { - post(new ChunkDataEvent.Save(chunk, world, data)); + ChunkDataEvent.Save.BUS.post(new ChunkDataEvent.Save(chunk, world, data)); } public static void onChunkDataLoad(ChunkAccess chunk, SerializableChunkData data, ChunkType status) { - post(new ChunkDataEvent.Load(chunk, data, status)); + ChunkDataEvent.Load.BUS.post(new ChunkDataEvent.Load(chunk, data, status)); } public static void onGameShuttingDown() { - post(new GameShuttingDownEvent()); + GameShuttingDownEvent.BUS.post(new GameShuttingDownEvent()); } public static void gatherLoginConfigTasks(Connection connection, Consumer add) { - post(new GatherLoginConfigurationTasksEvent(connection, add)); + GatherLoginConfigurationTasksEvent.BUS.post(new GatherLoginConfigurationTasksEvent(connection, add)); } public static void onConnectionStart(Connection connection) { - post(new ConnectionStartEvent(connection)); + ConnectionStartEvent.BUS.post(new ConnectionStartEvent(connection)); } public static void onChannelRegistrationChange(Connection connection, ChannelRegistrationChangeEvent.Type changeType, HashSet changed) { - post(new ChannelRegistrationChangeEvent(connection, changeType, changed)); + ChannelRegistrationChangeEvent.BUS.post(new ChannelRegistrationChangeEvent(connection, changeType, changed)); } - public static LivingSwapItemsEvent.Hands onLivingSwapHandItems(LivingEntity entity) { - return fire(new LivingSwapItemsEvent.Hands(entity)); + public static @Nullable LivingSwapItemsEvent.Hands onLivingSwapHandItems(LivingEntity entity) { + var event = new LivingSwapItemsEvent.Hands(entity); + return LivingSwapItemsEvent.Hands.BUS.post(event) ? null : event; } - public static ShieldBlockEvent onShieldBlock(LivingEntity blocker, DamageSource source, float blocked, ItemStack blockedWith) { - return fire(new ShieldBlockEvent(blocker, source, blocked, blockedWith)); + public static @Nullable ShieldBlockEvent onShieldBlock(LivingEntity blocker, DamageSource source, float blocked, ItemStack blockedWith) { + var event = new ShieldBlockEvent(blocker, source, blocked, blockedWith); + return ShieldBlockEvent.BUS.post(event) ? null : event; } public static void onEntityEnterSection(Entity entity, long packedOldPos, long packedNewPos) { - post(new EntityEvent.EnteringSection(entity, packedOldPos, packedNewPos)); + EntityEvent.EnteringSection.BUS.post(new EntityEvent.EnteringSection(entity, packedOldPos, packedNewPos)); } public static boolean onLivingTick(LivingEntity entity) { - return post(new LivingEvent.LivingTickEvent(entity)); + return LivingEvent.LivingTickEvent.BUS.post(new LivingEvent.LivingTickEvent(entity)); } - public static LivingFallEvent onLivingFall(LivingEntity entity, double distance, float damageMultiplier) { - return fire(new LivingFallEvent(entity, distance, damageMultiplier)); + public static @Nullable LivingFallEvent onLivingFall(LivingEntity entity, double distance, float damageMultiplier) { + var event = new LivingFallEvent(entity, distance, damageMultiplier); + return LivingFallEvent.BUS.post(event) ? null : event; } public static LivingBreatheEvent onLivingBreathe(LivingEntity entity, boolean canBreathe, int consumeAirAmount, int refillAirAmount, boolean canRefillAir) { - return fire(new LivingBreatheEvent(entity, canBreathe, consumeAirAmount, refillAirAmount, canRefillAir)); + return LivingBreatheEvent.BUS.fire(new LivingBreatheEvent(entity, canBreathe, consumeAirAmount, refillAirAmount, canRefillAir)); } public static LivingDrownEvent onLivingDrown(LivingEntity entity, boolean isDrowning, float damageAmount, int bubbleCount) { - return fire(new LivingDrownEvent(entity, isDrowning, damageAmount, bubbleCount)); + return LivingDrownEvent.BUS.fire(new LivingDrownEvent(entity, isDrowning, damageAmount, bubbleCount)); } - public static LivingKnockBackEvent onLivingKnockBack(LivingEntity target, float strength, double ratioX, double ratioZ) { - return fire(new LivingKnockBackEvent(target, strength, ratioX, ratioZ)); + public static @Nullable LivingKnockBackEvent onLivingKnockBack(LivingEntity target, float strength, double ratioX, double ratioZ) { + var event = new LivingKnockBackEvent(target, strength, ratioX, ratioZ); + return LivingKnockBackEvent.BUS.post(event) ? null : event; } public static boolean onLivingDeath(LivingEntity entity, DamageSource src) { - return post(new LivingDeathEvent(entity, src)); + return LivingDeathEvent.BUS.post(new LivingDeathEvent(entity, src)); } public static boolean onLivingDrops(LivingEntity entity, DamageSource source, Collection drops, boolean recentlyHit) { - return post(new LivingDropsEvent(entity, source, drops, recentlyHit)); + return LivingDropsEvent.BUS.post(new LivingDropsEvent(entity, source, drops, recentlyHit)); } public static void onLeftClickEmpty(Player player) { - post(new PlayerInteractEvent.LeftClickEmpty(player)); + PlayerInteractEvent.LeftClickEmpty.BUS.post(new PlayerInteractEvent.LeftClickEmpty(player)); } - public static PlayerInteractEvent.LeftClickBlock onLeftClickBlock(Player player, BlockPos pos, Direction face, ServerboundPlayerActionPacket.Action action) { - return fire(new PlayerInteractEvent.LeftClickBlock(player, pos, face, PlayerInteractEvent.LeftClickBlock.Action.convert(action))); + public static @Nullable PlayerInteractEvent.LeftClickBlock onLeftClickBlock(Player player, BlockPos pos, Direction face, ServerboundPlayerActionPacket.Action action) { + var event = new PlayerInteractEvent.LeftClickBlock(player, pos, face, PlayerInteractEvent.LeftClickBlock.Action.convert(action)); + return PlayerInteractEvent.LeftClickBlock.BUS.post(event) ? null : event; + } + + public static boolean isLeftClickBlockCancelled(Player player, BlockPos pos, Direction face, ServerboundPlayerActionPacket.Action action) { + return PlayerInteractEvent.LeftClickBlock.BUS.post(new PlayerInteractEvent.LeftClickBlock(player, pos, face, PlayerInteractEvent.LeftClickBlock.Action.convert(action))); } public static PlayerInteractEvent.LeftClickBlock onLeftClickBlockHold(Player player, BlockPos pos, Direction face) { - return fire(new PlayerInteractEvent.LeftClickBlock(player, pos, face, PlayerInteractEvent.LeftClickBlock.Action.CLIENT_HOLD)); - } - - public static PlayerInteractEvent.RightClickBlock onRightClickBlock(Player player, InteractionHand hand, BlockPos pos, BlockHitResult hitVec) { - return fire(new PlayerInteractEvent.RightClickBlock(player, hand, pos, hitVec)); - } - - public static PlayerInteractEvent.RightClickItem onRightClickItem(Player player, InteractionHand hand) { - return fire(new PlayerInteractEvent.RightClickItem(player, hand)); - } - - public static PlayerInteractEvent.EntityInteract onEntityInteract(Player player, Entity entity, InteractionHand hand) { - return fire(new PlayerInteractEvent.EntityInteract(player, hand, entity)); - } - - public static PlayerInteractEvent.EntityInteractSpecific onEntityInteractSpecific(Player player, Entity entity, InteractionHand hand, Vec3 vec3d) { - return fire(new PlayerInteractEvent.EntityInteractSpecific(player, hand, entity, vec3d)); + var event = new PlayerInteractEvent.LeftClickBlock(player, pos, face, PlayerInteractEvent.LeftClickBlock.Action.CLIENT_HOLD); + if (PlayerInteractEvent.LeftClickBlock.BUS.post(event)) { + event.setUseBlock(Result.DENY); + event.setUseItem(Result.DENY); + } + return event; } public static void onRightClickEmpty(Player player, InteractionHand hand) { - post(new PlayerInteractEvent.RightClickEmpty(player, hand)); + PlayerInteractEvent.RightClickEmpty.BUS.post(new PlayerInteractEvent.RightClickEmpty(player, hand)); } // TODO: Remove from mod bus - Lex 04222024 @@ -985,110 +964,112 @@ public final class ForgeEventFactory { } public static boolean onEntityJoinLevel(Entity entity, Level level) { - return post(new EntityJoinLevelEvent(entity, level)); + return EntityJoinLevelEvent.BUS.post(new EntityJoinLevelEvent(entity, level)); } public static boolean onEntityJoinLevel(Entity entity, Level level, boolean loadedFromDisk) { - return post(new EntityJoinLevelEvent(entity, level, loadedFromDisk)); + return EntityJoinLevelEvent.BUS.post(new EntityJoinLevelEvent(entity, level, loadedFromDisk)); } public static boolean onEntityLeaveLevel(Entity entity, Level level) { - return post(new EntityLeaveLevelEvent(entity, level)); + return EntityLeaveLevelEvent.BUS.post(new EntityLeaveLevelEvent(entity, level)); } public static void onDifficultyChange(Difficulty difficulty, Difficulty oldDifficulty) { - post(new DifficultyChangeEvent(difficulty, oldDifficulty)); + DifficultyChangeEvent.BUS.post(new DifficultyChangeEvent(difficulty, oldDifficulty)); } public static void onTagsUpdated(RegistryAccess registryAccess, boolean fromClientPacket, boolean isIntegratedServerConnection) { - post(new TagsUpdatedEvent(registryAccess, fromClientPacket, isIntegratedServerConnection)); + TagsUpdatedEvent.BUS.post(new TagsUpdatedEvent(registryAccess, fromClientPacket, isIntegratedServerConnection)); } public static boolean onLivingAttackEntity(LivingEntity entity, DamageSource src, float amount) { - return post(new LivingAttackEvent(entity, src, amount)); + return LivingAttackEvent.BUS.post(new LivingAttackEvent(entity, src, amount)); } public static boolean onVanillaGameEvent(Level level, Holder vanillaEvent, Vec3 pos, GameEvent.Context context) { - return post(new VanillaGameEvent(level, vanillaEvent.get(), pos, context)); + return VanillaGameEvent.BUS.post(new VanillaGameEvent(level, vanillaEvent.get(), pos, context)); } public static boolean onLivingEffectExpire(LivingEntity entity, MobEffectInstance effect) { - return post(new MobEffectEvent.Expired(entity, effect)); + return MobEffectEvent.Expired.BUS.post(new MobEffectEvent.Expired(entity, effect)); } public static boolean onLivingEffectAdd(LivingEntity entity, MobEffectInstance oldEffect, MobEffectInstance newEffect, Entity source) { - return post(new MobEffectEvent.Added(entity, oldEffect, newEffect, source)); + return MobEffectEvent.Added.BUS.post(new MobEffectEvent.Added(entity, oldEffect, newEffect, source)); } public static boolean onLivingEffectRemove(LivingEntity entity, MobEffect effect) { - return post(new MobEffectEvent.Remove(entity, effect)); + return MobEffectEvent.Remove.BUS.post(new MobEffectEvent.Remove(entity, effect)); } public static boolean onLivingEffectRemove(LivingEntity entity, MobEffectInstance effect) { - return post(new MobEffectEvent.Remove(entity, effect)); + return MobEffectEvent.Remove.BUS.post(new MobEffectEvent.Remove(entity, effect)); } public static MobEffectEvent.Applicable onLivingEffectCanApply(LivingEntity entity, MobEffectInstance effect) { - return fire(new MobEffectEvent.Applicable(entity, effect)); + return MobEffectEvent.Applicable.BUS.fire(new MobEffectEvent.Applicable(entity, effect)); } public static void onLivingEquipmentChange(LivingEntity entity, EquipmentSlot slot, ItemStack from, ItemStack to) { - fire(new LivingEquipmentChangeEvent(entity, slot, from, to)); + LivingEquipmentChangeEvent.BUS.post(new LivingEquipmentChangeEvent(entity, slot, from, to)); } - public static LivingChangeTargetEvent onLivingChangeTargetMob(LivingEntity entity, LivingEntity originalTarget) { - return fire(new LivingChangeTargetEvent(entity, originalTarget, LivingChangeTargetEvent.LivingTargetType.MOB_TARGET)); + public static @Nullable LivingChangeTargetEvent onLivingChangeTargetMob(LivingEntity entity, LivingEntity originalTarget) { + var event = new LivingChangeTargetEvent(entity, originalTarget, LivingChangeTargetEvent.LivingTargetType.MOB_TARGET); + return LivingChangeTargetEvent.BUS.post(event) ? null : event; } - public static LivingChangeTargetEvent onLivingChangeTargetBehavior(LivingEntity entity, LivingEntity originalTarget) { - return fire(new LivingChangeTargetEvent(entity, originalTarget, LivingChangeTargetEvent.LivingTargetType.BEHAVIOR_TARGET)); + public static @Nullable LivingChangeTargetEvent onLivingChangeTargetBehavior(LivingEntity entity, LivingEntity originalTarget) { + var event = new LivingChangeTargetEvent(entity, originalTarget, LivingChangeTargetEvent.LivingTargetType.BEHAVIOR_TARGET); + return LivingChangeTargetEvent.BUS.post(event) ? null : event; } - public static ItemFishedEvent onPlayerFishedItem(List stacks, int rodDamage, FishingHook hook) { - return fire(new ItemFishedEvent(stacks, rodDamage, hook)); + public static @Nullable PlayerXpEvent.XpChange onPlayerXpChange(Player player, int xp) { + var event = new PlayerXpEvent.XpChange(player, xp); + return PlayerXpEvent.XpChange.BUS.post(event) ? null : event; } - public static PlayerXpEvent.XpChange onPlayerXpChange(Player player, int xp) { - return fire(new PlayerXpEvent.XpChange(player, xp)); - } - - public static PlayerXpEvent.LevelChange onPlayerLevelChange(Player player, int levels) { - return fire(new PlayerXpEvent.LevelChange(player, levels)); + public static @Nullable PlayerXpEvent.LevelChange onPlayerLevelChange(Player player, int levels) { + var event = new PlayerXpEvent.LevelChange(player, levels); + return PlayerXpEvent.LevelChange.BUS.post(event) ? null : event; } - public static GrindstoneEvent.OnPlaceItem onGrindstoneChange(@NotNull ItemStack top, @NotNull ItemStack bottom, Container outputSlot, int xp) { - return fire(new GrindstoneEvent.OnPlaceItem(top, bottom, xp)); + public static @Nullable GrindstoneEvent.OnPlaceItem onGrindstoneChange(@NotNull ItemStack top, @NotNull ItemStack bottom, Container outputSlot, int xp) { + var event = new GrindstoneEvent.OnPlaceItem(top, bottom, xp); + return GrindstoneEvent.OnPlaceItem.BUS.post(event) ? null : event; } public static void onBrewingRecipeRegister(Builder builder, FeatureFlagSet features) { - fire(new BrewingRecipeRegisterEvent(builder, features)); + BrewingRecipeRegisterEvent.BUS.post(new BrewingRecipeRegisterEvent(builder, features)); } public static boolean onItemStackedOn(ItemStack carriedItem, ItemStack stackedOnItem, Slot slot, ClickAction action, Player player, SlotAccess carriedSlotAccess) { - return post(new ItemStackedOnOtherEvent(carriedItem, stackedOnItem, slot, action, player, carriedSlotAccess)); + return ItemStackedOnOtherEvent.BUS.post(new ItemStackedOnOtherEvent(carriedItem, stackedOnItem, slot, action, player, carriedSlotAccess)); } - public static NoteBlockEvent.Play onNotePlay(Level world, BlockPos pos, BlockState state, int note, NoteBlockInstrument instrument) { - return fire(new NoteBlockEvent.Play(world, pos, state, note, instrument)); + public static @Nullable NoteBlockEvent.Play onNotePlay(Level world, BlockPos pos, BlockState state, int note, NoteBlockInstrument instrument) { + var event = new NoteBlockEvent.Play(world, pos, state, note, instrument); + return NoteBlockEvent.Play.BUS.post(event) ? null : event; } public static AnvilRepairEvent onAnvilRepair(Player player, @NotNull ItemStack output, @NotNull ItemStack left, @NotNull ItemStack right) { - return fire(new AnvilRepairEvent(player, left, right, output)); + return AnvilRepairEvent.BUS.fire(new AnvilRepairEvent(player, left, right, output)); } public static void onPlayerTradeWithVillager(Player player, MerchantOffer offer, AbstractVillager villager) { - post(new TradeWithVillagerEvent(player, offer, villager)); + TradeWithVillagerEvent.BUS.post(new TradeWithVillagerEvent(player, offer, villager)); } public static GatherComponentsEvent.Item gatherItemComponentsEvent(Item item, DataComponentMap dataComponents) { - return fire(new GatherComponentsEvent.Item(item, dataComponents)); + return GatherComponentsEvent.Item.BUS.fire(new GatherComponentsEvent.Item(item, dataComponents)); } public static LootingLevelEvent fireLootingLevel(LivingEntity target, @Nullable DamageSource cause, int level) { - return fire(new LootingLevelEvent(target, cause, level)); + return LootingLevelEvent.BUS.fire(new LootingLevelEvent(target, cause, level)); } public static boolean fireFarmlandTrampleEvent(ServerLevel level, BlockPos pos, BlockState state, double fallDistance, Entity entity) { - return post(new BlockEvent.FarmlandTrampleEvent(level, pos, state, fallDistance, entity)); + return BlockEvent.FarmlandTrampleEvent.BUS.post(new BlockEvent.FarmlandTrampleEvent(level, pos, state, fallDistance, entity)); } } diff --git a/src/main/java/net/minecraftforge/event/GameShuttingDownEvent.java b/src/main/java/net/minecraftforge/event/GameShuttingDownEvent.java index e40d177918..ee5143b657 100644 --- a/src/main/java/net/minecraftforge/event/GameShuttingDownEvent.java +++ b/src/main/java/net/minecraftforge/event/GameShuttingDownEvent.java @@ -5,19 +5,22 @@ package net.minecraftforge.event; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; +import net.minecraftforge.eventbus.api.event.characteristic.SelfDestructing; +import org.jspecify.annotations.NullMarked; /** * A simple marker event that notifies when the game is about to close. * Fires once on the physical client and physical server. * Does not fire for the Integrated Server on a physical Client. - * + *
    * On the client, the GL Context is still valid when the event is fired. * Fired on the FORGE event bus. * * @author Curle */ -public final class GameShuttingDownEvent extends Event -{ - public GameShuttingDownEvent() {} +@NullMarked +public record GameShuttingDownEvent() implements SelfDestructing, RecordEvent { + public static final EventBus BUS = EventBus.create(GameShuttingDownEvent.class); } diff --git a/src/main/java/net/minecraftforge/event/GatherComponentsEvent.java b/src/main/java/net/minecraftforge/event/GatherComponentsEvent.java index 82c57475d3..1cb7823e49 100644 --- a/src/main/java/net/minecraftforge/event/GatherComponentsEvent.java +++ b/src/main/java/net/minecraftforge/event/GatherComponentsEvent.java @@ -9,16 +9,17 @@ import net.minecraft.core.component.DataComponentMap; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.world.item.Item; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import org.jetbrains.annotations.ApiStatus; import javax.annotation.Nullable; -/** - Where all the events fore Gathering Components will exist. - */ +/** Where all the events for Gathering Components will exist */ +public abstract sealed class GatherComponentsEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(GatherComponentsEvent.class); -public abstract sealed class GatherComponentsEvent extends Event { private final DataComponentMap.Builder components = DataComponentMap.builder(); private final DataComponentMap originalComponents; private final Object owner; @@ -55,6 +56,8 @@ public abstract sealed class GatherComponentsEvent extends Event { * References in {@link net.minecraft.world.item.Items} may not be valid at the current time. */ public static final class Item extends GatherComponentsEvent { + public static final EventBus BUS = EventBus.create(Item.class); + public Item(net.minecraft.world.item.Item item, DataComponentMap dataComponents) { super(item, dataComponents); } diff --git a/src/main/java/net/minecraftforge/event/GrindstoneEvent.java b/src/main/java/net/minecraftforge/event/GrindstoneEvent.java index 6574ae2c88..536d152fac 100644 --- a/src/main/java/net/minecraftforge/event/GrindstoneEvent.java +++ b/src/main/java/net/minecraftforge/event/GrindstoneEvent.java @@ -8,17 +8,20 @@ package net.minecraftforge.event; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.GrindstoneMenu; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; + +public abstract sealed class GrindstoneEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(GrindstoneEvent.class); -public abstract sealed class GrindstoneEvent extends Event -{ private final ItemStack top; private final ItemStack bottom; private int xp; - protected GrindstoneEvent(ItemStack top, ItemStack bottom, int xp) - { + protected GrindstoneEvent(ItemStack top, ItemStack bottom, int xp) { this.top = top; this.bottom = bottom; this.xp = xp; @@ -27,16 +30,14 @@ public abstract sealed class GrindstoneEvent extends Event /** * @return The item in the top input grindstone slot.
    */ - public ItemStack getTopItem() - { + public ItemStack getTopItem() { return top; } /** * @return The item in the bottom input grindstone slot.
    */ - public ItemStack getBottomItem() - { + public ItemStack getBottomItem() { return bottom; } @@ -44,8 +45,7 @@ public abstract sealed class GrindstoneEvent extends Event * This is the experience amount determined by the event. It will be {@code -1} unless {@link #setXp(int)} is called.
    * @return The experience amount given to the player.
    */ - public int getXp() - { + public int getXp() { return xp; } @@ -53,8 +53,7 @@ public abstract sealed class GrindstoneEvent extends Event * Sets the experience amount.
    * @param xp The experience amount given to the player.
    */ - public void setXp(int xp) - { + public void setXp(int xp) { this.xp = xp; } @@ -78,13 +77,12 @@ public abstract sealed class GrindstoneEvent extends Event * * */ - @Cancelable - public static final class OnPlaceItem extends GrindstoneEvent - { + public static final class OnPlaceItem extends GrindstoneEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(OnPlaceItem.class); + private ItemStack output; - public OnPlaceItem(ItemStack top, ItemStack bottom, int xp) - { + public OnPlaceItem(ItemStack top, ItemStack bottom, int xp) { super(top, bottom, xp); this.output = ItemStack.EMPTY; } @@ -96,8 +94,7 @@ public abstract sealed class GrindstoneEvent extends Event * If this event is cancelled, this output stack is discarded.
    * @return The item to set in the output grindstone slot.
    */ - public ItemStack getOutput() - { + public ItemStack getOutput() { return output; } @@ -105,8 +102,7 @@ public abstract sealed class GrindstoneEvent extends Event * Sets the output slot to a specific itemstack. * @param output The stack to change the output to. */ - public void setOutput(ItemStack output) - { + public void setOutput(ItemStack output) { this.output = output; } } @@ -118,30 +114,27 @@ public abstract sealed class GrindstoneEvent extends Event * If the event is canceled, vanilla behavior will not run, and no inputs will be consumed.
    * if the amount of experience is larger than or equal 0, the vanilla behavior for calculating experience will not run.
    */ - @Cancelable - public static final class OnTakeItem extends GrindstoneEvent - { + public static final class OnTakeItem extends GrindstoneEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(OnTakeItem.class); + private ItemStack newTop = ItemStack.EMPTY; private ItemStack newBottom = ItemStack.EMPTY; - public OnTakeItem(ItemStack top, ItemStack bottom, int xp) - { + public OnTakeItem(ItemStack top, ItemStack bottom, int xp) { super(top, bottom, xp); } /** * @return The item in that will be in the top input grindstone slot after the event.
    */ - public ItemStack getNewTopItem() - { + public ItemStack getNewTopItem() { return newTop; } /** * @return The item in that will be in the bottom input grindstone slot after the event.
    */ - public ItemStack getNewBottomItem() - { + public ItemStack getNewBottomItem() { return newBottom; } @@ -149,8 +142,7 @@ public abstract sealed class GrindstoneEvent extends Event * Sets the itemstack in the top slot.
    * @param newTop */ - public void setNewTopItem(ItemStack newTop) - { + public void setNewTopItem(ItemStack newTop) { this.newTop = newTop; } @@ -158,8 +150,7 @@ public abstract sealed class GrindstoneEvent extends Event * Sets the itemstack in the bottom slot.
    * @param newBottom */ - public void setNewBottomItem(ItemStack newBottom) - { + public void setNewBottomItem(ItemStack newBottom) { this.newBottom = newBottom; } @@ -167,8 +158,7 @@ public abstract sealed class GrindstoneEvent extends Event * This is the experience amount that will be returned by the event.
    * @return The experience amount given to the player.
    */ - public int getXp() - { + public int getXp() { return super.getXp(); } } diff --git a/src/main/java/net/minecraftforge/event/ItemStackedOnOtherEvent.java b/src/main/java/net/minecraftforge/event/ItemStackedOnOtherEvent.java index 1c41c33db3..6df2b41be3 100644 --- a/src/main/java/net/minecraftforge/event/ItemStackedOnOtherEvent.java +++ b/src/main/java/net/minecraftforge/event/ItemStackedOnOtherEvent.java @@ -12,8 +12,9 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -33,9 +34,9 @@ import org.jetbrains.annotations.ApiStatus; * If the event is cancelled, the container's logic halts, the carried item and the slot will not be swapped, and handling is assumed to have been done by the mod. * This also means that the two vanilla checks described above will not be called. */ -@Cancelable -public final class ItemStackedOnOtherEvent extends Event -{ +public final class ItemStackedOnOtherEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ItemStackedOnOtherEvent.class); + private final ItemStack carriedItem; private final ItemStack stackedOnItem; private final Slot slot; @@ -44,8 +45,7 @@ public final class ItemStackedOnOtherEvent extends Event private final SlotAccess carriedSlotAccess; @ApiStatus.Internal - public ItemStackedOnOtherEvent(ItemStack carriedItem, ItemStack stackedOnItem, Slot slot, ClickAction action, Player player, SlotAccess carriedSlotAccess) - { + public ItemStackedOnOtherEvent(ItemStack carriedItem, ItemStack stackedOnItem, Slot slot, ClickAction action, Player player, SlotAccess carriedSlotAccess) { this.carriedItem = carriedItem; this.stackedOnItem = stackedOnItem; this.slot = slot; @@ -57,48 +57,42 @@ public final class ItemStackedOnOtherEvent extends Event /** * {@return the stack being carried by the mouse} This may be empty! */ - public ItemStack getCarriedItem() - { + public ItemStack getCarriedItem() { return carriedItem; } /** * {@return the stack currently in the slot being clicked on} This may be empty! */ - public ItemStack getStackedOnItem() - { + public ItemStack getStackedOnItem() { return stackedOnItem; } /** * {@return the slot being clicked on} */ - public Slot getSlot() - { + public Slot getSlot() { return slot; } /** * {@return the click action being used} By default {@linkplain ClickAction#PRIMARY} corresponds to left-click, and {@linkplain ClickAction#SECONDARY} is right-click. */ - public ClickAction getClickAction() - { + public ClickAction getClickAction() { return action; } /** * {@return the player doing the item swap attempt} */ - public Player getPlayer() - { + public Player getPlayer() { return player; } /** * {@return a fake slot allowing the listener to see and change what item is being carried} */ - public SlotAccess getCarriedSlotAccess() - { + public SlotAccess getCarriedSlotAccess() { return carriedSlotAccess; } } diff --git a/src/main/java/net/minecraftforge/event/LootTableLoadEvent.java b/src/main/java/net/minecraftforge/event/LootTableLoadEvent.java index 8b43dac0c1..1962e575dd 100644 --- a/src/main/java/net/minecraftforge/event/LootTableLoadEvent.java +++ b/src/main/java/net/minecraftforge/event/LootTableLoadEvent.java @@ -8,8 +8,9 @@ package net.minecraftforge.event; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; /** @@ -23,30 +24,26 @@ import net.minecraftforge.fml.LogicalSide; *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#SERVER logical server}.

    */ -@Cancelable -public final class LootTableLoadEvent extends Event -{ +public final class LootTableLoadEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LootTableLoadEvent.class); + private final ResourceLocation name; private LootTable table; - public LootTableLoadEvent(ResourceLocation name, LootTable table) - { + public LootTableLoadEvent(ResourceLocation name, LootTable table) { this.name = name; this.table = table; } - public ResourceLocation getName() - { + public ResourceLocation getName() { return this.name; } - public LootTable getTable() - { + public LootTable getTable() { return this.table; } - public void setTable(LootTable table) - { + public void setTable(LootTable table) { this.table = table; } } diff --git a/src/main/java/net/minecraftforge/event/ModMismatchEvent.java b/src/main/java/net/minecraftforge/event/ModMismatchEvent.java index ede6b53390..a6e954f601 100644 --- a/src/main/java/net/minecraftforge/event/ModMismatchEvent.java +++ b/src/main/java/net/minecraftforge/event/ModMismatchEvent.java @@ -6,8 +6,8 @@ package net.minecraftforge.event; import net.minecraft.world.level.storage.LevelStorageSource; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModList; @@ -39,8 +39,11 @@ import java.util.stream.Stream; *

    This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * on both {@linkplain LogicalSide logical sides}.

    */ -public final class ModMismatchEvent extends Event implements IModBusEvent -{ +public final class ModMismatchEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, ModMismatchEvent.class); + } + /** * The level being loaded. Useful for things like {@link net.minecraft.world.level.storage.DimensionDataStorage} * to manage multiple files changing between mod versions. @@ -58,8 +61,7 @@ public final class ModMismatchEvent extends Event implements IModBusEvent private final HashMap resolved; @ApiStatus.Internal - public ModMismatchEvent(LevelStorageSource.LevelDirectory levelDirectory, Map previousVersions, Map missingVersions) - { + public ModMismatchEvent(LevelStorageSource.LevelDirectory levelDirectory, Map previousVersions, Map missingVersions) { this.levelDirectory = levelDirectory; this.resolved = new HashMap<>(previousVersions.size()); this.versionDifferences = new HashMap<>(); @@ -76,8 +78,7 @@ public final class ModMismatchEvent extends Event implements IModBusEvent * Gets the current level directory for the world being loaded. * Can be used for file operations and manual modification of mod files before world load. */ - public LevelStorageSource.LevelDirectory getLevelDirectory() - { + public LevelStorageSource.LevelDirectory getLevelDirectory() { return this.levelDirectory; } @@ -87,8 +88,7 @@ public final class ModMismatchEvent extends Event implements IModBusEvent * @return The previously known mod version, or {@link Optional#empty()} if unknown/not found. */ @Nullable - public ArtifactVersion getPreviousVersion(String modId) - { + public ArtifactVersion getPreviousVersion(String modId) { if (this.versionDifferences.containsKey(modId)) return this.versionDifferences.get(modId).oldVersion(); @@ -96,8 +96,7 @@ public final class ModMismatchEvent extends Event implements IModBusEvent } @Nullable - public ArtifactVersion getCurrentVersion(String modid) - { + public ArtifactVersion getCurrentVersion(String modid) { if (this.versionDifferences.containsKey(modid)) return this.versionDifferences.get(modid).newVersion(); @@ -107,8 +106,7 @@ public final class ModMismatchEvent extends Event implements IModBusEvent /** * Marks the mod version mismatch as having been resolved safely by the current mod. */ - public void markResolved(String modId) - { + public void markResolved(String modId) { final var resolvedBy = ModLoadingContext.get().getActiveContainer(); resolved.putIfAbsent(modId, resolvedBy); } @@ -116,65 +114,53 @@ public final class ModMismatchEvent extends Event implements IModBusEvent /** * Fetches the status of a mod mismatch handling state. */ - public boolean wasResolved(String modId) - { + public boolean wasResolved(String modId) { return this.resolved.containsKey(modId); } - public Optional getVersionDifference(String modid) - { + public Optional getVersionDifference(String modid) { return Optional.ofNullable(this.versionDifferences.get(modid)); } - public Optional getResolver(String modid) - { + public Optional getResolver(String modid) { return Optional.ofNullable(this.resolved.get(modid)); } - public boolean anyUnresolved() - { + public boolean anyUnresolved() { return resolved.size() < versionDifferences.size(); } - public Stream getUnresolved() - { + public Stream getUnresolved() { return versionDifferences.keySet().stream() .filter(modid -> !resolved.containsKey(modid)) .map(unresolved -> new MismatchResolutionResult(unresolved, versionDifferences.get(unresolved), null)) .sorted(Comparator.comparing(MismatchResolutionResult::modid)); } - public boolean anyResolved() - { + public boolean anyResolved() { return !resolved.isEmpty(); } - public Stream getResolved() - { + public Stream getResolved() { return resolved.keySet().stream() .map(modid -> new MismatchResolutionResult(modid, versionDifferences.get(modid), resolved.get(modid))) .sorted(Comparator.comparing(MismatchResolutionResult::modid)); } - public record MismatchResolutionResult(String modid, MismatchedVersionInfo versionDifference, @Nullable ModContainer resolver) - { - public boolean wasSelfResolved() - { + public record MismatchResolutionResult(String modid, MismatchedVersionInfo versionDifference, @Nullable ModContainer resolver) { + public boolean wasSelfResolved() { return resolver != null && resolver.getModId().equals(modid); } } - public record MismatchedVersionInfo(ArtifactVersion oldVersion, @Nullable ArtifactVersion newVersion) - { - public boolean isMissing() - { + public record MismatchedVersionInfo(ArtifactVersion oldVersion, @Nullable ArtifactVersion newVersion) { + public boolean isMissing() { return newVersion == null; } - public boolean wasUpgrade() - { + public boolean wasUpgrade() { if (newVersion == null) return false; return newVersion.compareTo(oldVersion) > 0; } } -} \ No newline at end of file +} diff --git a/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java b/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java index 031b6c9220..c77ab0694b 100644 --- a/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java +++ b/src/main/java/net/minecraftforge/event/OnDatapackSyncEvent.java @@ -7,7 +7,8 @@ package net.minecraftforge.event; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.players.PlayerList; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -17,7 +18,9 @@ import java.util.List; * before tags and crafting recipes are sent to the client. Send datapack data * to clients when this event fires. */ -public final class OnDatapackSyncEvent extends Event { +public final class OnDatapackSyncEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(OnDatapackSyncEvent.class); + private final PlayerList playerList; @Nullable diff --git a/src/main/java/net/minecraftforge/event/PlayLevelSoundEvent.java b/src/main/java/net/minecraftforge/event/PlayLevelSoundEvent.java index 94af2abe84..0dd73edb9c 100644 --- a/src/main/java/net/minecraftforge/event/PlayLevelSoundEvent.java +++ b/src/main/java/net/minecraftforge/event/PlayLevelSoundEvent.java @@ -13,8 +13,11 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Objects; @@ -37,8 +40,9 @@ import java.util.Objects; *

    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. */ -@Cancelable -public sealed class PlayLevelSoundEvent extends Event { +public sealed class PlayLevelSoundEvent extends MutableEvent implements Cancellable, InheritableEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(PlayLevelSoundEvent.class); + private final Level level; private final float originalVolume; private final float originalPitch; @@ -150,6 +154,8 @@ public sealed class PlayLevelSoundEvent extends Event { * This event is fired on the {@link MinecraftForge#EVENT_BUS}. */ public static final class AtEntity extends PlayLevelSoundEvent { + public static final EventBus BUS = EventBus.create(AtEntity.class); + private final Entity entity; public AtEntity(Level level, @Nullable Entity entity, Holder sound, SoundSource source, float volume, float pitch) { @@ -177,6 +183,8 @@ public sealed class PlayLevelSoundEvent extends Event { * This event is fired on the {@link MinecraftForge#EVENT_BUS}. */ public static final class AtPosition extends PlayLevelSoundEvent { + public static final EventBus BUS = EventBus.create(AtPosition.class); + private final Vec3 position; public AtPosition(Level level, Vec3 position, Holder sound, SoundSource source, float volume, float pitch) { diff --git a/src/main/java/net/minecraftforge/event/RegisterCommandsEvent.java b/src/main/java/net/minecraftforge/event/RegisterCommandsEvent.java index 0824aa3d78..767b09a44e 100644 --- a/src/main/java/net/minecraftforge/event/RegisterCommandsEvent.java +++ b/src/main/java/net/minecraftforge/event/RegisterCommandsEvent.java @@ -9,11 +9,11 @@ import com.mojang.brigadier.CommandDispatcher; import net.minecraft.commands.CommandBuildContext; import net.minecraft.server.ReloadableServerResources; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; - import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; /** * Commands are rebuilt whenever {@link ReloadableServerResources} is recreated. @@ -21,14 +21,14 @@ import net.minecraft.commands.Commands; * * The event is fired on the {@link MinecraftForge#EVENT_BUS} */ -public final class RegisterCommandsEvent extends Event -{ +public final class RegisterCommandsEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(RegisterCommandsEvent.class); + private final CommandDispatcher dispatcher; private final Commands.CommandSelection environment; private final CommandBuildContext context; - public RegisterCommandsEvent(CommandDispatcher dispatcher, Commands.CommandSelection environment, CommandBuildContext context) - { + public RegisterCommandsEvent(CommandDispatcher dispatcher, Commands.CommandSelection environment, CommandBuildContext context) { this.dispatcher = dispatcher; this.environment = environment; this.context = context; @@ -37,24 +37,21 @@ public final class RegisterCommandsEvent extends Event /** * {@return the command dispatcher for registering commands to be executed on the client} */ - public CommandDispatcher getDispatcher() - { + public CommandDispatcher getDispatcher() { return dispatcher; } /** * {@return the environment the command is being registered for} */ - public Commands.CommandSelection getCommandSelection() - { + public Commands.CommandSelection getCommandSelection() { return environment; } /** * {@return the context to build the commands for} */ - public CommandBuildContext getBuildContext() - { + public CommandBuildContext getBuildContext() { return context; } } diff --git a/src/main/java/net/minecraftforge/event/RegisterStructureConversionsEvent.java b/src/main/java/net/minecraftforge/event/RegisterStructureConversionsEvent.java index 21f979f546..69b6ee352a 100644 --- a/src/main/java/net/minecraftforge/event/RegisterStructureConversionsEvent.java +++ b/src/main/java/net/minecraftforge/event/RegisterStructureConversionsEvent.java @@ -8,13 +8,14 @@ package net.minecraftforge.event; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.datafix.fixes.StructuresBecomeConfiguredFix; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; import java.util.Locale; import java.util.Map; import com.google.common.base.Preconditions; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import org.jetbrains.annotations.ApiStatus; /** * Fired for registering structure conversions for pre-1.18.2 worlds. This is used by {@link StructuresBecomeConfiguredFix} @@ -35,15 +36,16 @@ import com.google.common.base.Preconditions; * @see StructuresBecomeConfiguredFix * @see #register(String, StructuresBecomeConfiguredFix.Conversion) */ -public final class RegisterStructureConversionsEvent extends Event -{ +public final class RegisterStructureConversionsEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(RegisterStructureConversionsEvent.class); + private final Map map; /** * @hidden For internal use only. */ - public RegisterStructureConversionsEvent(Map map) - { + @ApiStatus.Internal + public RegisterStructureConversionsEvent(Map map) { this.map = map; } @@ -89,15 +91,13 @@ public final class RegisterStructureConversionsEvent extends Event * @throws IllegalArgumentException if the old structure ID is not in full lowercase, or if a conversion for that * structure ID has already been registered previously */ - public void register(String oldStructureID, StructuresBecomeConfiguredFix.Conversion conversion) - { + public void register(String oldStructureID, StructuresBecomeConfiguredFix.Conversion conversion) { Preconditions.checkNotNull(oldStructureID, "Original structure ID must not be null"); Preconditions.checkArgument(oldStructureID.toLowerCase(Locale.ROOT).equals(oldStructureID), "Original structure ID should be in all lowercase"); Preconditions.checkNotNull(conversion, "Structure conversion must not be null"); Preconditions.checkNotNull(conversion.fallback(), "Fallback structure ID in structure conversion must not be null"); - if (map.putIfAbsent(oldStructureID.toLowerCase(Locale.ROOT), conversion) != null) - { + if (map.putIfAbsent(oldStructureID.toLowerCase(Locale.ROOT), conversion) != null) { throw new IllegalArgumentException("Conversion has already been registered for structure " + oldStructureID); } } diff --git a/src/main/java/net/minecraftforge/event/ServerChatEvent.java b/src/main/java/net/minecraftforge/event/ServerChatEvent.java index 820b883c5b..e6f580af8d 100644 --- a/src/main/java/net/minecraftforge/event/ServerChatEvent.java +++ b/src/main/java/net/minecraftforge/event/ServerChatEvent.java @@ -10,8 +10,9 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ServerboundChatPacket; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -25,8 +26,9 @@ import org.jetbrains.annotations.ApiStatus; * This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#SERVER logical server}. **/ -@Cancelable -public final class ServerChatEvent extends Event { +public final class ServerChatEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ServerChatEvent.class); + private final ServerPlayer player; private final String username; private final String rawText; diff --git a/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java b/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java index f93cb487f0..cf1ab704fb 100644 --- a/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java +++ b/src/main/java/net/minecraftforge/event/TagsUpdatedEvent.java @@ -6,19 +6,20 @@ package net.minecraftforge.event; import net.minecraft.core.RegistryAccess; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; /** * Fired when tags are updated on either server or client. This event can be used to refresh data that depends on tags. */ -public final class TagsUpdatedEvent extends Event -{ +public final class TagsUpdatedEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(TagsUpdatedEvent.class); + private final RegistryAccess registryAccess; private final UpdateCause updateCause; private final boolean integratedServer; - public TagsUpdatedEvent(RegistryAccess registryAccess, boolean fromClientPacket, boolean isIntegratedServerConnection) - { + public TagsUpdatedEvent(RegistryAccess registryAccess, boolean fromClientPacket, boolean isIntegratedServerConnection) { this.registryAccess = registryAccess; this.updateCause = fromClientPacket ? UpdateCause.CLIENT_PACKET_RECEIVED : UpdateCause.SERVER_DATA_LOAD; this.integratedServer = isIntegratedServerConnection; @@ -27,16 +28,14 @@ public final class TagsUpdatedEvent extends Event /** * @return The dynamic registries that have had their tags rebound. */ - public RegistryAccess getRegistryAccess() - { + public RegistryAccess getRegistryAccess() { return registryAccess; } /** * @return the cause for this tag update */ - public UpdateCause getUpdateCause() - { + public UpdateCause getUpdateCause() { return updateCause; } @@ -44,16 +43,14 @@ public final class TagsUpdatedEvent extends Event * Whether static data (which in single player is shared between server and client thread) should be updated as a * result of this event. Effectively this means that in single player only the server-side updates this data. */ - public boolean shouldUpdateStaticData() - { + public boolean shouldUpdateStaticData() { return updateCause == UpdateCause.SERVER_DATA_LOAD || !integratedServer; } /** * Represents the cause for a tag update. */ - public enum UpdateCause - { + public enum UpdateCause { /** * The tag update is caused by the server loading datapack data. Note that in single player this still happens * on the client thread. diff --git a/src/main/java/net/minecraftforge/event/TickEvent.java b/src/main/java/net/minecraftforge/event/TickEvent.java index e03a00eb95..278f02fdda 100644 --- a/src/main/java/net/minecraftforge/event/TickEvent.java +++ b/src/main/java/net/minecraftforge/event/TickEvent.java @@ -13,10 +13,19 @@ import java.util.function.BooleanSupplier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; -public sealed class TickEvent extends Event { +public sealed class TickEvent extends MutableEvent implements InheritableEvent { + /** + * @deprecated Use one of the subclasses instead, as subscribing to the abstract {@link TickEvent} class will call + * your listener possibly hundreds of times per tick which is inefficient/slow and probably not what you want + */ + @Deprecated(forRemoval = true, since = "1.21.6") + public static final EventBus BUS = EventBus.create(TickEvent.class); + public enum Type { LEVEL, PLAYER, CLIENT, SERVER, RENDER } @@ -27,6 +36,11 @@ public sealed class TickEvent extends Event { public final Type type; public final LogicalSide side; + + /** + * @deprecated For better performance, add listeners to the Pre or Post event subclasses instead of checking the phase + */ + @Deprecated(forRemoval = true, since = "1.21.6") public final Phase phase; public TickEvent(Type type, LogicalSide side, Phase phase) { @@ -36,6 +50,12 @@ public sealed class TickEvent extends Event { } public static sealed class ServerTickEvent extends TickEvent { + /** + * @deprecated Use {@link ServerTickEvent.Pre} or {@link ServerTickEvent.Post} instead + */ + @Deprecated(forRemoval = true, since = "1.21.6") + public static final EventBus BUS = EventBus.create(ServerTickEvent.class); + private final BooleanSupplier haveTime; private final MinecraftServer server; @@ -62,12 +82,16 @@ public sealed class TickEvent extends Event { } public static final class Pre extends ServerTickEvent { + public static final EventBus

     BUS = EventBus.create(Pre.class);
    +
                 public Pre(BooleanSupplier haveTime, MinecraftServer server) {
                     super(haveTime, server, Phase.START);
                 }
             }
     
             public static final class Post extends ServerTickEvent {
    +            public static final EventBus BUS = EventBus.create(Post.class);
    +
                 public Post(BooleanSupplier haveTime, MinecraftServer server) {
                     super(haveTime, server, Phase.END);
                 }
    @@ -75,17 +99,29 @@ public sealed class TickEvent extends Event {
         }
     
         public static sealed class ClientTickEvent extends TickEvent {
    +        /**
    +         * @deprecated Use {@link ClientTickEvent.Pre} or {@link ClientTickEvent.Post} instead
    +         */
    +        @Deprecated(forRemoval = true, since = "1.21.6")
    +        public static final EventBus BUS = EventBus.create(ClientTickEvent.class);
    +
             protected ClientTickEvent(Phase phase) {
                 super(Type.CLIENT, LogicalSide.CLIENT, phase);
             }
     
             public static final class Pre extends ClientTickEvent {
    +            public static final EventBus
     BUS = EventBus.create(Pre.class);
    +            public static final Pre INSTANCE = new Pre();
    +
                 public Pre() {
                     super(Phase.START);
                 }
             }
     
             public static final class Post extends ClientTickEvent {
    +            public static final EventBus BUS = EventBus.create(Post.class);
    +            public static final Post INSTANCE = new Post();
    +
                 public Post() {
                     super(Phase.END);
                 }
    @@ -93,6 +129,12 @@ public sealed class TickEvent extends Event {
         }
     
         public static sealed class LevelTickEvent extends TickEvent {
    +        /**
    +         * @deprecated Use {@link LevelTickEvent.Pre} or {@link LevelTickEvent.Post} instead
    +         */
    +        @Deprecated(forRemoval = true, since = "1.21.6")
    +        public static final EventBus BUS = EventBus.create(LevelTickEvent.class);
    +
             public final Level level;
             private final BooleanSupplier haveTime;
     
    @@ -113,12 +155,16 @@ public sealed class TickEvent extends Event {
             }
     
             public static final class Pre extends LevelTickEvent {
    +            public static final EventBus
     BUS = EventBus.create(Pre.class);
    +
                 public Pre(LogicalSide side, Level level, BooleanSupplier haveTime) {
                     super(side, level, haveTime, Phase.START);
                 }
             }
     
             public static final class Post extends LevelTickEvent {
    +            public static final EventBus BUS = EventBus.create(Post.class);
    +
                 public Post(LogicalSide side, Level level, BooleanSupplier haveTime) {
                     super(side, level, haveTime, Phase.END);
                 }
    @@ -126,6 +172,12 @@ public sealed class TickEvent extends Event {
         }
     
         public static sealed class PlayerTickEvent extends TickEvent {
    +        /**
    +         * @deprecated Use {@link PlayerTickEvent.Pre} or {@link PlayerTickEvent.Post} instead
    +         */
    +        @Deprecated(forRemoval = true, since = "1.21.6")
    +        public static final EventBus BUS = EventBus.create(PlayerTickEvent.class);
    +
             public final Player player;
     
             protected PlayerTickEvent(Player player, Phase phase) {
    @@ -134,19 +186,29 @@ public sealed class TickEvent extends Event {
             }
     
             public static final class Pre extends PlayerTickEvent {
    +            public static final EventBus
     BUS = EventBus.create(Pre.class);
    +
                 public Pre(Player player) {
                     super(player, Phase.START);
                 }
             }
     
             public static final class Post extends PlayerTickEvent {
    +            public static final EventBus BUS = EventBus.create(Post.class);
    +
                 public Post(Player player) {
                     super(player, Phase.END);
                 }
             }
         }
     
    -    public static sealed class RenderTickEvent extends TickEvent {
    +    public static sealed abstract class RenderTickEvent extends TickEvent {
    +        /**
    +         * @deprecated Use {@link RenderTickEvent.Pre} or {@link RenderTickEvent.Post} instead
    +         */
    +        @Deprecated(forRemoval = true, since = "1.21.6")
    +        public static final EventBus BUS = EventBus.create(RenderTickEvent.class);
    +
             private final DeltaTracker timer;
     
             private RenderTickEvent(Phase phase, DeltaTracker timer) {
    @@ -159,12 +221,16 @@ public sealed class TickEvent extends Event {
             }
     
             public static final class Pre extends RenderTickEvent {
    +            public static final EventBus
     BUS = EventBus.create(Pre.class);
    +
                 public Pre(DeltaTracker timer) {
                     super(Phase.START, timer);
                 }
             }
     
             public static final class Post extends RenderTickEvent {
    +            public static final EventBus BUS = EventBus.create(Post.class);
    +
                 public Post(DeltaTracker timer) {
                     super(Phase.END, timer);
                 }
    diff --git a/src/main/java/net/minecraftforge/event/VanillaGameEvent.java b/src/main/java/net/minecraftforge/event/VanillaGameEvent.java
    index 3059985b62..782e8f95c9 100644
    --- a/src/main/java/net/minecraftforge/event/VanillaGameEvent.java
    +++ b/src/main/java/net/minecraftforge/event/VanillaGameEvent.java
    @@ -10,8 +10,9 @@ import net.minecraft.world.level.Level;
     import net.minecraft.world.level.gameevent.GameEvent;
     import net.minecraft.world.phys.Vec3;
     import net.minecraftforge.common.MinecraftForge;
    -import net.minecraftforge.eventbus.api.Cancelable;
    -import net.minecraftforge.eventbus.api.Event;
    +import net.minecraftforge.eventbus.api.bus.CancellableEventBus;
    +import net.minecraftforge.eventbus.api.event.MutableEvent;
    +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable;
     import org.jetbrains.annotations.Nullable;
     
     /**
    @@ -23,16 +24,15 @@ import org.jetbrains.annotations.Nullable;
      * 
    * Cancel this event to prevent Vanilla from posting the {@link GameEvent} to all nearby {@link net.minecraft.world.level.gameevent.GameEventListener GameEventListeners}. **/ -@Cancelable -public final class VanillaGameEvent extends Event -{ +public final class VanillaGameEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(VanillaGameEvent.class); + private final Level level; private final GameEvent vanillaEvent; private final Vec3 position; private final GameEvent.Context context; - public VanillaGameEvent(Level level, GameEvent vanillaEvent, Vec3 position, GameEvent.Context context) - { + public VanillaGameEvent(Level level, GameEvent vanillaEvent, Vec3 position, GameEvent.Context context) { this.level = level; this.vanillaEvent = vanillaEvent; this.position = position; @@ -42,8 +42,7 @@ public final class VanillaGameEvent extends Event /** * @return The level the Vanilla {@link GameEvent} occurred. */ - public Level getLevel() - { + public Level getLevel() { return level; } @@ -51,32 +50,28 @@ public final class VanillaGameEvent extends Event * @return The entity that was the source or "cause" of the {@link GameEvent}. */ @Nullable - public Entity getCause() - { + public Entity getCause() { return context.sourceEntity(); } /** * @return The Vanilla event. */ - public GameEvent getVanillaEvent() - { + public GameEvent getVanillaEvent() { return vanillaEvent; } /** * @return The position the event took place at. */ - public Vec3 getEventPosition() - { + public Vec3 getEventPosition() { return position; } /** * @return the context of the vanilla event */ - public GameEvent.Context getContext() - { + public GameEvent.Context getContext() { return context; } } diff --git a/src/main/java/net/minecraftforge/event/brewing/BrewingRecipeRegisterEvent.java b/src/main/java/net/minecraftforge/event/brewing/BrewingRecipeRegisterEvent.java index 73f62ad5ae..74663ca183 100644 --- a/src/main/java/net/minecraftforge/event/brewing/BrewingRecipeRegisterEvent.java +++ b/src/main/java/net/minecraftforge/event/brewing/BrewingRecipeRegisterEvent.java @@ -5,6 +5,8 @@ package net.minecraftforge.event.brewing; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; import org.jetbrains.annotations.ApiStatus; import net.minecraft.world.flag.FeatureFlagSet; @@ -13,38 +15,27 @@ import net.minecraft.world.item.alchemy.PotionBrewing; import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.common.brewing.BrewingRecipe; import net.minecraftforge.common.brewing.IBrewingRecipe; -import net.minecraftforge.eventbus.api.Event; +import org.jspecify.annotations.NullMarked; -public final class BrewingRecipeRegisterEvent extends Event { - private final PotionBrewing.Builder builder; - private final FeatureFlagSet features; +@NullMarked +public record BrewingRecipeRegisterEvent(PotionBrewing.Builder getBuilder, FeatureFlagSet getFeatures) implements RecordEvent { + public static final EventBus BUS = EventBus.create(BrewingRecipeRegisterEvent.class); @ApiStatus.Internal - public BrewingRecipeRegisterEvent(PotionBrewing.Builder builder, FeatureFlagSet features) { - this.builder = builder; - this.features = features; - } - - public PotionBrewing.Builder getBuilder() { - return this.builder; - } - - public FeatureFlagSet getFeatures() { - return this.features; + public BrewingRecipeRegisterEvent { + assert getBuilder != null; + assert getFeatures != null; } /** * Adds a recipe to the registry. Due to the nature of the brewing stand * inputs that stack (a.k.a max stack size > 1) are not allowed. * - * @param input - * The Ingredient that goes in same slots as the water bottles - * would. - * @param ingredient - * The Ingredient that goes in the same slot as nether wart would. - * @param output - * The ItemStack that will replace the input once the brewing is - * done. + * @param input The Ingredient that goes in same slots as the water bottles + * would. + * @param ingredient The Ingredient that goes in the same slot as nether wart would. + * @param output The ItemStack that will replace the input once the brewing is + * done. */ public void addRecipe(Ingredient input, Ingredient ingredient, ItemStack output) { addRecipe(new BrewingRecipe(input, ingredient, output)); @@ -55,6 +46,6 @@ public final class BrewingRecipeRegisterEvent extends Event { * inputs that stack (a.k.a max stack size > 1) are not allowed. */ public void addRecipe(IBrewingRecipe recipe) { - getBuilder().add(recipe); + getBuilder.add(recipe); } } diff --git a/src/main/java/net/minecraftforge/event/brewing/PlayerBrewedPotionEvent.java b/src/main/java/net/minecraftforge/event/brewing/PlayerBrewedPotionEvent.java index 4e1a4b0077..66ff872095 100644 --- a/src/main/java/net/minecraftforge/event/brewing/PlayerBrewedPotionEvent.java +++ b/src/main/java/net/minecraftforge/event/brewing/PlayerBrewedPotionEvent.java @@ -8,17 +8,18 @@ package net.minecraftforge.event.brewing; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraftforge.event.entity.player.PlayerEvent; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; /** * This event is called when a player picks up a potion from a brewing stand. */ -public final class PlayerBrewedPotionEvent extends PlayerEvent -{ +public final class PlayerBrewedPotionEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerBrewedPotionEvent.class); + private final ItemStack stack; - public PlayerBrewedPotionEvent(Player player, @NotNull ItemStack stack) - { + public PlayerBrewedPotionEvent(Player player, @NotNull ItemStack stack) { super(player); this.stack = stack; } @@ -27,8 +28,7 @@ public final class PlayerBrewedPotionEvent extends PlayerEvent * The ItemStack of the potion. */ @NotNull - public ItemStack getStack() - { + public ItemStack getStack() { return stack; } } diff --git a/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java b/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java index e7bd7fc4ad..46389df637 100644 --- a/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java +++ b/src/main/java/net/minecraftforge/event/brewing/PotionBrewEvent.java @@ -8,36 +8,35 @@ package net.minecraftforge.event.brewing; import net.minecraft.world.item.ItemStack; import net.minecraft.core.NonNullList; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; -public sealed class PotionBrewEvent extends Event -{ +public sealed abstract class PotionBrewEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(PotionBrewEvent.class); + private final NonNullList stacks; - protected PotionBrewEvent(NonNullList stacks) - { + protected PotionBrewEvent(NonNullList stacks) { this.stacks = stacks; } @NotNull - public ItemStack getItem(int index) - { + public ItemStack getItem(int index) { if (index < 0 || index >= stacks.size()) return ItemStack.EMPTY; return stacks.get(index); } - public void setItem(int index, @NotNull ItemStack stack) - { - if (index < stacks.size()) - { + public void setItem(int index, @NotNull ItemStack stack) { + if (index < stacks.size()) { stacks.set(index, stack); } } - public int getLength() - { + public int getLength() { return stacks.size(); } @@ -58,11 +57,10 @@ public sealed class PotionBrewEvent extends Event *
    * If this event is canceled, and items have been modified, PotionBrewEvent.Post will automatically be fired. **/ - @Cancelable - public static final class Pre extends PotionBrewEvent - { - public Pre(NonNullList stacks) - { + public static final class Pre extends PotionBrewEvent implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
    +        public Pre(NonNullList stacks) {
                 super(stacks);
             }
         }
    @@ -80,10 +78,10 @@ public sealed class PotionBrewEvent extends Event
          * 
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ - public static final class Post extends PotionBrewEvent - { - public Post(NonNullList stacks) - { + public static final class Post extends PotionBrewEvent { + public static final EventBus BUS = EventBus.create(Post.class); + + public Post(NonNullList stacks) { super(stacks); } } diff --git a/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java b/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java index 5472f57d9f..385aea8695 100644 --- a/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java +++ b/src/main/java/net/minecraftforge/event/enchanting/EnchantmentLevelSetEvent.java @@ -8,6 +8,8 @@ package net.minecraftforge.event.enchanting; import net.minecraft.world.item.ItemStack; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import org.jetbrains.annotations.NotNull; /** @@ -18,8 +20,9 @@ import org.jetbrains.annotations.NotNull; * from 0-15 and indicates how many bookshelves surround the enchanting table. The {@link #itemStack} representing the item being * enchanted is also available. */ -public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus.api.Event -{ +public final class EnchantmentLevelSetEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(EnchantmentLevelSetEvent.class); + private final Level level; private final BlockPos pos; private final int enchantRow; @@ -29,8 +32,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. private final int originalLevel; private int enchantLevel; - public EnchantmentLevelSetEvent(Level level, BlockPos pos, int enchantRow, int power, @NotNull ItemStack itemStack, int enchantLevel) - { + public EnchantmentLevelSetEvent(Level level, BlockPos pos, int enchantRow, int power, @NotNull ItemStack itemStack, int enchantLevel) { this.level = level; this.pos = pos; this.enchantRow = enchantRow; @@ -45,8 +47,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @return the world object */ - public Level getLevel() - { + public Level getLevel() { return level; } @@ -55,8 +56,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @return the pos of the enchantment table */ - public BlockPos getPos() - { + public BlockPos getPos() { return pos; } @@ -65,8 +65,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @return the row for which the enchantment level is being set */ - public int getEnchantRow() - { + public int getEnchantRow() { return enchantRow; } @@ -75,8 +74,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @return the power (# of bookshelves) for the enchanting table */ - public int getPower() - { + public int getPower() { return power; } @@ -86,8 +84,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * @return the item being enchanted */ @NotNull - public ItemStack getItem() - { + public ItemStack getItem() { return itemStack; } @@ -96,8 +93,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @return the original level of the enchantment for this row (0-30) */ - public int getOriginalLevel() - { + public int getOriginalLevel() { return originalLevel; } @@ -106,8 +102,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @return the level of the enchantment for this row (0-30) */ - public int getEnchantLevel() - { + public int getEnchantLevel() { return enchantLevel; } @@ -116,8 +111,7 @@ public final class EnchantmentLevelSetEvent extends net.minecraftforge.eventbus. * * @param level the new level of the enchantment (0-30) */ - public void setEnchantLevel(int level) - { + public void setEnchantLevel(int level) { this.enchantLevel = level; } } diff --git a/src/main/java/net/minecraftforge/event/entity/EntityAttributeCreationEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityAttributeCreationEvent.java index c889c205cd..e01d37b6dd 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityAttributeCreationEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityAttributeCreationEvent.java @@ -11,7 +11,8 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.DefaultAttributes; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.event.IModBusEvent; /** @@ -21,7 +22,11 @@ import net.minecraftforge.fml.event.IModBusEvent; *
    * Fired on the Mod bus {@link IModBusEvent}.
    **/ -public final class EntityAttributeCreationEvent extends Event implements IModBusEvent { +public final class EntityAttributeCreationEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, EntityAttributeCreationEvent.class); + } + private final Map, AttributeSupplier> map; public EntityAttributeCreationEvent(Map, AttributeSupplier> map) { diff --git a/src/main/java/net/minecraftforge/event/entity/EntityAttributeModificationEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityAttributeModificationEvent.java index 56d12c853a..ee1cc5a240 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityAttributeModificationEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityAttributeModificationEvent.java @@ -13,7 +13,8 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.DefaultAttributes; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.registries.ForgeRegistries; @@ -28,7 +29,11 @@ import java.util.stream.Collectors; *
    * Fired on the Mod bus {@link IModBusEvent}.
    **/ -public final class EntityAttributeModificationEvent extends Event implements IModBusEvent { +public final class EntityAttributeModificationEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, EntityAttributeModificationEvent.class); + } + private final Map, AttributeSupplier.Builder> entityAttributes; private final List> entityTypes; diff --git a/src/main/java/net/minecraftforge/event/entity/EntityEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityEvent.java index bf4770c1e1..59a262548b 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityEvent.java @@ -8,7 +8,9 @@ package net.minecraftforge.event.entity; import net.minecraft.core.SectionPos; import net.minecraft.world.entity.Entity; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; /** * EntityEvent is fired when an event involving any Entity occurs.
    @@ -19,7 +21,9 @@ import net.minecraftforge.eventbus.api.Event; *
    * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ -public class EntityEvent extends Event { +public class EntityEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(EntityEvent.class); + private final Entity entity; public EntityEvent(Entity entity) { @@ -41,6 +45,8 @@ public class EntityEvent extends Event { * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ public static final class EntityConstructing extends EntityEvent { + public static final EventBus BUS = EventBus.create(EntityConstructing.class); + public EntityConstructing(Entity entity) { super(entity); } @@ -59,6 +65,8 @@ public class EntityEvent extends Event { * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}.
    **/ public static final class EnteringSection extends EntityEvent { + public static final EventBus BUS = EventBus.create(EnteringSection.class); + private final long packedOldPos; private final long packedNewPos; diff --git a/src/main/java/net/minecraftforge/event/entity/EntityJoinLevelEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityJoinLevelEvent.java index 201ef66dfd..014135e4cc 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityJoinLevelEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityJoinLevelEvent.java @@ -9,7 +9,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; /** @@ -26,8 +27,9 @@ import net.minecraftforge.fml.LogicalSide; * This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus} * on both logical sides. **/ -@Cancelable -public final class EntityJoinLevelEvent extends EntityEvent { +public final class EntityJoinLevelEvent extends EntityEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityJoinLevelEvent.class); + private final Level level; private final boolean loadedFromDisk; diff --git a/src/main/java/net/minecraftforge/event/entity/EntityLeaveLevelEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityLeaveLevelEvent.java index 589185c32d..17be51e519 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityLeaveLevelEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityLeaveLevelEvent.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraft.world.level.entity.LevelCallback; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * This event is fired whenever an {@link Entity} leaves a {@link Level}. @@ -21,6 +21,8 @@ import net.minecraftforge.eventbus.api.Cancelable; * on both logical sides. **/ public final class EntityLeaveLevelEvent extends EntityEvent { + public static final EventBus BUS = EventBus.create(EntityLeaveLevelEvent.class); + private final Level level; public EntityLeaveLevelEvent(Entity entity, Level level) { diff --git a/src/main/java/net/minecraftforge/event/entity/EntityMobGriefingEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityMobGriefingEvent.java index f1d02b7547..da59a89101 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityMobGriefingEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityMobGriefingEvent.java @@ -7,7 +7,9 @@ package net.minecraftforge.event.entity; import net.minecraft.world.entity.Entity; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event.HasResult; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * EntityMobGriefingEvent is fired when mob griefing is about to occur and allows an event listener to specify whether it should or not.
    @@ -21,11 +23,22 @@ import net.minecraftforge.eventbus.api.Event.HasResult; * * This event is fired on the {@link MinecraftForge#EVENT_BUS}. */ -@HasResult -public final class EntityMobGriefingEvent extends EntityEvent -{ - public EntityMobGriefingEvent(Entity entity) - { +public final class EntityMobGriefingEvent extends EntityEvent implements HasResult { + public static final EventBus BUS = EventBus.create(EntityMobGriefingEvent.class); + + private Result result = Result.DEFAULT; + + public EntityMobGriefingEvent(Entity entity) { super(entity); } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/EntityMountEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityMountEvent.java index 3f62a60f4a..f5cee87687 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityMountEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityMountEvent.java @@ -8,7 +8,8 @@ package net.minecraftforge.event.entity; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * This event gets fired whenever a entity mounts/dismounts another entity.
    @@ -23,10 +24,8 @@ import net.minecraftforge.eventbus.api.Cancelable; * This event is fired on the {@link MinecraftForge#EVENT_BUS}. * */ - -@Cancelable -public final class EntityMountEvent extends EntityEvent -{ +public final class EntityMountEvent extends EntityEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityMountEvent.class); private final Entity entityMounting; private final Entity entityBeingMounted; @@ -34,8 +33,7 @@ public final class EntityMountEvent extends EntityEvent private final boolean isMounting; - public EntityMountEvent(Entity entityMounting, Entity entityBeingMounted, Level level, boolean isMounting) - { + public EntityMountEvent(Entity entityMounting, Entity entityBeingMounted, Level level, boolean isMounting) { super(entityMounting); this.entityMounting = entityMounting; this.entityBeingMounted = entityBeingMounted; @@ -43,28 +41,23 @@ public final class EntityMountEvent extends EntityEvent this.isMounting = isMounting; } - public boolean isMounting() - { + public boolean isMounting() { return isMounting; } - public boolean isDismounting() - { + public boolean isDismounting() { return !isMounting; } - public Entity getEntityMounting() - { + public Entity getEntityMounting() { return entityMounting; } - public Entity getEntityBeingMounted() - { + public Entity getEntityBeingMounted() { return entityBeingMounted; } - public Level getLevel() - { + public Level getLevel() { return level; } } diff --git a/src/main/java/net/minecraftforge/event/entity/EntityStruckByLightningEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityStruckByLightningEvent.java index f228b91c5e..c458a0b981 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityStruckByLightningEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityStruckByLightningEvent.java @@ -9,7 +9,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LightningBolt; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * EntityStruckByLightningEvent is fired when an Entity is about to be struck by lightening.
    @@ -25,19 +26,17 @@ import net.minecraftforge.eventbus.api.Cancelable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ -@net.minecraftforge.eventbus.api.Cancelable -public final class EntityStruckByLightningEvent extends EntityEvent -{ +public final class EntityStruckByLightningEvent extends EntityEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityStruckByLightningEvent.class); + private final LightningBolt lightning; - public EntityStruckByLightningEvent(Entity entity, LightningBolt lightning) - { + public EntityStruckByLightningEvent(Entity entity, LightningBolt lightning) { super(entity); this.lightning = lightning; } - public LightningBolt getLightning() - { + public LightningBolt getLightning() { return lightning; } } diff --git a/src/main/java/net/minecraftforge/event/entity/EntityTeleportEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityTeleportEvent.java index 6f9360c001..09fc73ea62 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityTeleportEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityTeleportEvent.java @@ -12,8 +12,8 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -28,9 +28,9 @@ import org.jetbrains.annotations.Nullable; *
    * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ -@Cancelable -public sealed class EntityTeleportEvent extends EntityEvent -{ +public sealed class EntityTeleportEvent extends EntityEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityTeleportEvent.class); + protected double targetX; protected double targetY; protected double targetZ; @@ -69,11 +69,10 @@ public sealed class EntityTeleportEvent extends EntityEvent *
    * If this event is canceled, the entity will not be teleported. */ - @Cancelable - public static final class TeleportCommand extends EntityTeleportEvent - { - public TeleportCommand(Entity entity, double targetX, double targetY, double targetZ) - { + public static final class TeleportCommand extends EntityTeleportEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(TeleportCommand.class); + + public TeleportCommand(Entity entity, double targetX, double targetY, double targetZ) { super(entity, targetX, targetY, targetZ); } } @@ -93,11 +92,10 @@ public sealed class EntityTeleportEvent extends EntityEvent *
    * If this event is canceled, the entity will not be teleported. */ - @Cancelable - public static final class SpreadPlayersCommand extends EntityTeleportEvent - { - public SpreadPlayersCommand(Entity entity, double targetX, double targetY, double targetZ) - { + public static final class SpreadPlayersCommand extends EntityTeleportEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(SpreadPlayersCommand.class); + + public SpreadPlayersCommand(Entity entity, double targetX, double targetY, double targetZ) { super(entity, targetX, targetY, targetZ); } } @@ -116,19 +114,17 @@ public sealed class EntityTeleportEvent extends EntityEvent *
    * If this event is canceled, the entity will not be teleported. */ - @Cancelable - public static final class EnderEntity extends EntityTeleportEvent - { + public static final class EnderEntity extends EntityTeleportEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(EnderEntity.class); + private final LivingEntity entityLiving; - public EnderEntity(LivingEntity entity, double targetX, double targetY, double targetZ) - { + public EnderEntity(LivingEntity entity, double targetX, double targetY, double targetZ) { super(entity, targetX, targetY, targetZ); this.entityLiving = entity; } - public LivingEntity getEntityLiving() - { + public LivingEntity getEntityLiving() { return entityLiving; } } @@ -147,17 +143,16 @@ public sealed class EntityTeleportEvent extends EntityEvent *
    * If this event is canceled, the entity will not be teleported. */ - @Cancelable - public static final class EnderPearl extends EntityTeleportEvent - { + public static final class EnderPearl extends EntityTeleportEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(EnderPearl.class); + private final ServerPlayer player; private final ThrownEnderpearl pearlEntity; private float attackDamage; private final HitResult hitResult; @ApiStatus.Internal - public EnderPearl(ServerPlayer entity, double targetX, double targetY, double targetZ, ThrownEnderpearl pearlEntity, float attackDamage, HitResult hitResult) - { + public EnderPearl(ServerPlayer entity, double targetX, double targetY, double targetZ, ThrownEnderpearl pearlEntity, float attackDamage, HitResult hitResult) { super(entity, targetX, targetY, targetZ); this.pearlEntity = pearlEntity; this.player = entity; @@ -165,29 +160,24 @@ public sealed class EntityTeleportEvent extends EntityEvent this.hitResult = hitResult; } - public ThrownEnderpearl getPearlEntity() - { + public ThrownEnderpearl getPearlEntity() { return pearlEntity; } - public ServerPlayer getPlayer() - { + public ServerPlayer getPlayer() { return player; } @Nullable - public HitResult getHitResult() - { + public HitResult getHitResult() { return this.hitResult; } - public float getAttackDamage() - { + public float getAttackDamage() { return attackDamage; } - public void setAttackDamage(float attackDamage) - { + public void setAttackDamage(float attackDamage) { this.attackDamage = attackDamage; } } @@ -206,19 +196,17 @@ public sealed class EntityTeleportEvent extends EntityEvent *
    * If this event is canceled, the entity will not be teleported. */ - @Cancelable - public static final class ChorusFruit extends EntityTeleportEvent - { + public static final class ChorusFruit extends EntityTeleportEvent { + public static final CancellableEventBus BUS = CancellableEventBus.create(ChorusFruit.class); + private final LivingEntity entityLiving; - public ChorusFruit(LivingEntity entity, double targetX, double targetY, double targetZ) - { + public ChorusFruit(LivingEntity entity, double targetX, double targetY, double targetZ) { super(entity, targetX, targetY, targetZ); this.entityLiving = entity; } - public LivingEntity getEntityLiving() - { + public LivingEntity getEntityLiving() { return entityLiving; } } diff --git a/src/main/java/net/minecraftforge/event/entity/EntityTravelToDimensionEvent.java b/src/main/java/net/minecraftforge/event/entity/EntityTravelToDimensionEvent.java index 9f37d3c50a..0f53c0d3d3 100644 --- a/src/main/java/net/minecraftforge/event/entity/EntityTravelToDimensionEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/EntityTravelToDimensionEvent.java @@ -9,7 +9,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * EntityTravelToDimensionEvent is fired before an Entity travels to a dimension.
    @@ -23,19 +24,17 @@ import net.minecraftforge.eventbus.api.Cancelable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ -@Cancelable -public final class EntityTravelToDimensionEvent extends EntityEvent -{ +public final class EntityTravelToDimensionEvent extends EntityEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityTravelToDimensionEvent.class); + private final ResourceKey dimension; - public EntityTravelToDimensionEvent(Entity entity, ResourceKey dimension) - { + public EntityTravelToDimensionEvent(Entity entity, ResourceKey dimension) { super(entity); this.dimension = dimension; } - public ResourceKey getDimension() - { + public ResourceKey getDimension() { return dimension; } } diff --git a/src/main/java/net/minecraftforge/event/entity/ProjectileImpactEvent.java b/src/main/java/net/minecraftforge/event/entity/ProjectileImpactEvent.java index f206668b77..16ef14e9a2 100644 --- a/src/main/java/net/minecraftforge/event/entity/ProjectileImpactEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/ProjectileImpactEvent.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.projectile.Projectile; import net.minecraft.world.phys.HitResult; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; import java.util.Objects; @@ -23,6 +24,8 @@ import java.util.Objects; * @see #setImpactResult(ImpactResult) */ public final class ProjectileImpactEvent extends EntityEvent { + public static final EventBus BUS = EventBus.create(ProjectileImpactEvent.class); + private final HitResult ray; private final Projectile projectile; diff --git a/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java b/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java index b033fbc3d9..f9868a0ba3 100644 --- a/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/SpawnPlacementRegisterEvent.java @@ -16,9 +16,8 @@ import net.minecraft.world.entity.SpawnPlacementType; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.SpawnPlacements; import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.registries.ForgeRegistries; @@ -42,7 +41,11 @@ import org.jetbrains.annotations.ApiStatus; * * Fired on the Mod bus {@link IModBusEvent}.
    */ -public final class SpawnPlacementRegisterEvent extends Event implements IModBusEvent { +public final class SpawnPlacementRegisterEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, SpawnPlacementRegisterEvent.class); + } + private final Map, MergedSpawnPredicate> map; @ApiStatus.Internal diff --git a/src/main/java/net/minecraftforge/event/entity/item/ItemEvent.java b/src/main/java/net/minecraftforge/event/entity/item/ItemEvent.java index 5fe62843c6..b51abe5bc6 100644 --- a/src/main/java/net/minecraftforge/event/entity/item/ItemEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/item/ItemEvent.java @@ -7,6 +7,7 @@ package net.minecraftforge.event.entity.item; import net.minecraft.world.entity.item.ItemEntity; import net.minecraftforge.event.entity.EntityEvent; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Base class for all {@link ItemEntity} events. Contains a reference to the @@ -14,8 +15,9 @@ import net.minecraftforge.event.entity.EntityEvent; * additional useful data from the firing method that isn't already contained * within the ItemEntity instance. */ -public class ItemEvent extends EntityEvent -{ +public sealed class ItemEvent extends EntityEvent permits ItemExpireEvent, ItemTossEvent { + public static final EventBus BUS = EventBus.create(ItemEvent.class); + private final ItemEntity itemEntity; /** @@ -23,8 +25,7 @@ public class ItemEvent extends EntityEvent * * @param itemEntity The ItemEntity for this event */ - public ItemEvent(ItemEntity itemEntity) - { + public ItemEvent(ItemEntity itemEntity) { super(itemEntity); this.itemEntity = itemEntity; } @@ -33,8 +34,7 @@ public class ItemEvent extends EntityEvent * The relevant {@link ItemEntity} for this event. */ @Override - public ItemEntity getEntity() - { + public ItemEntity getEntity() { return itemEntity; } } diff --git a/src/main/java/net/minecraftforge/event/entity/item/ItemExpireEvent.java b/src/main/java/net/minecraftforge/event/entity/item/ItemExpireEvent.java index 8776ee2782..97e58df041 100644 --- a/src/main/java/net/minecraftforge/event/entity/item/ItemExpireEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/item/ItemExpireEvent.java @@ -5,8 +5,9 @@ package net.minecraftforge.event.entity.item; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.item.ItemEntity; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * Event that is fired when an EntityItem's age has reached its maximum @@ -14,9 +15,8 @@ import net.minecraft.world.entity.item.ItemEntity; * flagged as dead, thus staying it's removal from the world. If canceled * it will add more time to the entities life equal to extraLife. */ -@Cancelable -public final class ItemExpireEvent extends ItemEvent -{ +public final class ItemExpireEvent extends ItemEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ItemExpireEvent.class); private int extraLife; @@ -26,19 +26,16 @@ public final class ItemExpireEvent extends ItemEvent * @param entityItem The EntityItem being deleted. * @param extraLife The amount of time to be added to this entities lifespan if the event is canceled. */ - public ItemExpireEvent(ItemEntity entityItem, int extraLife) - { + public ItemExpireEvent(ItemEntity entityItem, int extraLife) { super(entityItem); this.setExtraLife(extraLife); } - public int getExtraLife() - { + public int getExtraLife() { return extraLife; } - public void setExtraLife(int extraLife) - { + public void setExtraLife(int extraLife) { this.extraLife = extraLife; } } diff --git a/src/main/java/net/minecraftforge/event/entity/item/ItemTossEvent.java b/src/main/java/net/minecraftforge/event/entity/item/ItemTossEvent.java index 6444936b31..60851aa293 100644 --- a/src/main/java/net/minecraftforge/event/entity/item/ItemTossEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/item/ItemTossEvent.java @@ -5,9 +5,10 @@ package net.minecraftforge.event.entity.item; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * Event that is fired whenever a player tosses (Q) an item or drag-n-drops a @@ -15,9 +16,8 @@ import net.minecraft.world.entity.player.Player; * stop the items from entering the world, but will not prevent them being * removed from the inventory - and thus removed from the system. */ -@Cancelable -public final class ItemTossEvent extends ItemEvent -{ +public final class ItemTossEvent extends ItemEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ItemTossEvent.class); private final Player player; @@ -27,8 +27,7 @@ public final class ItemTossEvent extends ItemEvent * @param entityItem The EntityItem being tossed. * @param player The player tossing the item. */ - public ItemTossEvent(ItemEntity entityItem, Player player) - { + public ItemTossEvent(ItemEntity entityItem, Player player) { super(entityItem); this.player = player; } @@ -36,8 +35,7 @@ public final class ItemTossEvent extends ItemEvent /** * The player tossing the item. */ - public Player getPlayer() - { + public Player getPlayer() { return player; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/AnimalTameEvent.java b/src/main/java/net/minecraftforge/event/entity/living/AnimalTameEvent.java index fb13d2edd2..bea4e208b1 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/AnimalTameEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/AnimalTameEvent.java @@ -9,7 +9,8 @@ import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * This event is fired when an {@link Animal} is tamed.
    @@ -18,26 +19,23 @@ import net.minecraftforge.eventbus.api.Cancelable; * This event is {@link net.minecraftforge.eventbus.api.Cancelable}. If canceled, taming the animal will fail. * This event is fired on the {@link MinecraftForge#EVENT_BUS}. */ -@Cancelable -public final class AnimalTameEvent extends LivingEvent -{ +public final class AnimalTameEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(AnimalTameEvent.class); + private final Animal animal; private final Player tamer; - public AnimalTameEvent(Animal animal, Player tamer) - { + public AnimalTameEvent(Animal animal, Player tamer) { super(animal); this.animal = animal; this.tamer = tamer; } - public Animal getAnimal() - { + public Animal getAnimal() { return animal; } - public Player getTamer() - { + public Player getTamer() { return tamer; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/BabyEntitySpawnEvent.java b/src/main/java/net/minecraftforge/event/entity/living/BabyEntitySpawnEvent.java index 23235ec38f..a4dccbcce7 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/BabyEntitySpawnEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/BabyEntitySpawnEvent.java @@ -12,9 +12,10 @@ import net.minecraft.world.entity.animal.Animal; import net.minecraft.world.entity.animal.Fox; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.Nullable; /** @@ -37,8 +38,9 @@ import org.jetbrains.annotations.Nullable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class BabyEntitySpawnEvent extends Event { +public final class BabyEntitySpawnEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(BabyEntitySpawnEvent.class); + private final Mob parentA; private final Mob parentB; private final Player causedByPlayer; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingAttackEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingAttackEvent.java index b87314beea..e772819b86 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingAttackEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingAttackEvent.java @@ -8,9 +8,10 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingAttackEvent is fired when a living Entity is attacked.
    @@ -30,13 +31,13 @@ import net.minecraft.world.entity.LivingEntity; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class LivingAttackEvent extends LivingEvent -{ +public final class LivingAttackEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingAttackEvent.class); + private final DamageSource source; private final float amount; - public LivingAttackEvent(LivingEntity entity, DamageSource source, float amount) - { + + public LivingAttackEvent(LivingEntity entity, DamageSource source, float amount) { super(entity); this.source = source; this.amount = amount; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingBreatheEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingBreatheEvent.java index b3bafb5344..30ca0d9176 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingBreatheEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingBreatheEvent.java @@ -5,12 +5,12 @@ package net.minecraftforge.event.entity.living; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.ApiStatus; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; /** * LivingBreatheEvent is fired whenever a living entity ticks.
    @@ -24,6 +24,8 @@ import net.minecraftforge.eventbus.api.Cancelable; * This event is fired on {@link MinecraftForge#EVENT_BUS} */ public final class LivingBreatheEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingBreatheEvent.class); + private boolean canBreathe; private boolean canRefillAir; private int consumeAirAmount; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingChangeTargetEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingChangeTargetEvent.java index 49e8b0b5bd..852d5343eb 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingChangeTargetEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingChangeTargetEvent.java @@ -10,7 +10,8 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.behavior.StartAttacking; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * This event allows you to change the target an entity has.
    @@ -33,8 +34,9 @@ import net.minecraftforge.eventbus.api.Cancelable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. */ -@Cancelable -public final class LivingChangeTargetEvent extends LivingEvent { +public final class LivingChangeTargetEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingChangeTargetEvent.class); + private final ILivingTargetType targetType; private final LivingEntity originalTarget; private LivingEntity newTarget; @@ -81,12 +83,12 @@ public final class LivingChangeTargetEvent extends LivingEvent { * targets. For a list of default target types, take a look at * {@link LivingTargetType}. */ - public static interface ILivingTargetType { } + public interface ILivingTargetType {} /** * This enum contains two default living target types. */ - public static enum LivingTargetType implements ILivingTargetType { + public enum LivingTargetType implements ILivingTargetType { /** * This target type indicates that the target has been set by calling {@link Mob#setTarget(LivingEntity)}. */ @@ -94,6 +96,6 @@ public final class LivingChangeTargetEvent extends LivingEvent { /** * This target type indicates that the target has been set by the {@link StartAttacking} behavior. */ - BEHAVIOR_TARGET; + BEHAVIOR_TARGET } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingConversionEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingConversionEvent.java index b4deb7845c..a39a0ac7a9 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingConversionEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingConversionEvent.java @@ -7,7 +7,10 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import java.util.function.Consumer; @@ -25,7 +28,9 @@ import java.util.function.Consumer; * Tadpole -> Frog when it grows up * Mushroom Cow -> Cow when sheared */ -public sealed class LivingConversionEvent extends LivingEvent { +public sealed class LivingConversionEvent extends LivingEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(LivingConversionEvent.class); + public LivingConversionEvent(LivingEntity entity) { super(entity); } @@ -41,8 +46,9 @@ public sealed class LivingConversionEvent extends LivingEvent { * This event is {@link Cancelable} * If cancelled, the replacement will not occur */ - @Cancelable - public static final class Pre extends LivingConversionEvent { + public static final class Pre extends LivingConversionEvent implements Cancellable { + public static final CancellableEventBus
     BUS = CancellableEventBus.create(Pre.class);
    +
             private final EntityType outcome;
             private final Consumer timer;
     
    @@ -80,6 +86,8 @@ public sealed class LivingConversionEvent extends LivingEvent {
          * The old living entity is likely to be removed right after this event.
          */
         public static final class Post extends LivingConversionEvent {
    +        public static final EventBus BUS = EventBus.create(Post.class);
    +
             private final LivingEntity outcome;
     
             public Post(LivingEntity entity, LivingEntity outcome) {
    diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingDamageEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingDamageEvent.java
    index 1a1d0ff465..212faf0e53 100644
    --- a/src/main/java/net/minecraftforge/event/entity/living/LivingDamageEvent.java
    +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingDamageEvent.java
    @@ -6,9 +6,10 @@
     package net.minecraftforge.event.entity.living;
     
     import net.minecraftforge.common.ForgeHooks;
    -import net.minecraftforge.eventbus.api.Cancelable;
     import net.minecraft.world.damagesource.DamageSource;
     import net.minecraft.world.entity.LivingEntity;
    +import net.minecraftforge.eventbus.api.bus.CancellableEventBus;
    +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable;
     
     /**
      * LivingDamageEvent is fired just before damage is applied to entity.
    @@ -29,13 +30,13 @@ import net.minecraft.world.entity.LivingEntity; * This event does not have a result. {@link HasResult}
    * @see LivingHurtEvent **/ -@Cancelable -public final class LivingDamageEvent extends LivingEvent -{ +public final class LivingDamageEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingDamageEvent.class); + private final DamageSource source; private float amount; - public LivingDamageEvent(LivingEntity entity, DamageSource source, float amount) - { + + public LivingDamageEvent(LivingEntity entity, DamageSource source, float amount) { super(entity); this.source = source; this.amount = amount; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingDeathEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingDeathEvent.java index f900123fb2..e5652c0e56 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingDeathEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingDeathEvent.java @@ -9,9 +9,10 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingDeathEvent is fired when an Entity dies.
    @@ -31,12 +32,12 @@ import net.minecraft.world.entity.LivingEntity; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class LivingDeathEvent extends LivingEvent -{ +public final class LivingDeathEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingDeathEvent.class); + private final DamageSource source; - public LivingDeathEvent(LivingEntity entity, DamageSource source) - { + + public LivingDeathEvent(LivingEntity entity, DamageSource source) { super(entity); this.source = source; } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingDestroyBlockEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingDestroyBlockEvent.java index 09c857ff92..c09dfcbfef 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingDestroyBlockEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingDestroyBlockEvent.java @@ -12,7 +12,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.entity.LivingEntity; import net.minecraft.core.BlockPos; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * Fired when the ender dragon or wither attempts to destroy a block and when ever a zombie attempts to break a door. Basically a event version of {@link Block#canEntityDestroy(BlockState, BlockGetter, BlockPos, Entity)}
    @@ -24,14 +25,13 @@ import net.minecraftforge.eventbus.api.Cancelable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class LivingDestroyBlockEvent extends LivingEvent -{ +public final class LivingDestroyBlockEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingDestroyBlockEvent.class); + private final BlockPos pos; private final BlockState state; - public LivingDestroyBlockEvent(LivingEntity entity, BlockPos pos, BlockState state) - { + public LivingDestroyBlockEvent(LivingEntity entity, BlockPos pos, BlockState state) { super(entity); this.pos = pos; this.state = state; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingDropsEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingDropsEvent.java index 82a1b0656d..1f36157fa8 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingDropsEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingDropsEvent.java @@ -12,7 +12,8 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingDropsEvent is fired when an Entity's death causes dropped items to appear.
    @@ -33,8 +34,9 @@ import net.minecraftforge.eventbus.api.Cancelable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@net.minecraftforge.eventbus.api.Cancelable -public final class LivingDropsEvent extends LivingEvent { +public final class LivingDropsEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingDropsEvent.class); + private final DamageSource source; private final Collection drops; private final boolean recentlyHit; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingDrownEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingDrownEvent.java index 6af4477914..107c684ad7 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingDrownEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingDrownEvent.java @@ -5,6 +5,8 @@ package net.minecraftforge.event.entity.living; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.ApiStatus; import net.minecraft.core.particles.ParticleTypes; @@ -12,21 +14,19 @@ import net.minecraft.world.damagesource.DamageSources; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; /** * LivingDrownEvent is fired whenever a living entity can't breathe and its air supply is less than or equal to zero. *

    * This event is fired via {@link ForgeHooks#onLivingBreathe(LivingEntity, int, int)}. *

    - * This event is {@link Cancelable}. Effects of cancellation are noted in {@link #setCanceled(boolean)}. + * This event is {@link Cancellable}. Cancelling the event also acts as if you called {@link #setDrowning(boolean)} with + * a value of {@code false}. *

    - * This event does not {@linkplain HasResult have a result}. - * This event is fired on {@link MinecraftForge#EVENT_BUS} **/ -@Cancelable -public final class LivingDrownEvent extends LivingEvent { +public final class LivingDrownEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingDrownEvent.class); + private boolean isDrowning; private float damageAmount; private int bubbleCount; @@ -111,14 +111,4 @@ public final class LivingDrownEvent extends LivingEvent { public void setBubbleCount(int bubbleCount) { this.bubbleCount = bubbleCount; } - - /** - * Cancels the drowning event.
    - * Cancellation is mostly equivalent to {@link #setDrowning(boolean)} with a value of false.
    - * However, this also incurs the usual side effects of cancellation. - */ - @Override - public void setCanceled(boolean cancel) { - super.setCanceled(cancel); - } -} \ No newline at end of file +} diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingEntityUseItemEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingEntityUseItemEvent.java index e505162d90..87a8ea5d9c 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingEntityUseItemEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingEntityUseItemEvent.java @@ -7,34 +7,33 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; -public sealed class LivingEntityUseItemEvent extends LivingEvent -{ +public sealed abstract class LivingEntityUseItemEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingEntityUseItemEvent.class); + private final ItemStack item; private int duration; - private LivingEntityUseItemEvent(LivingEntity entity, @NotNull ItemStack item, int duration) - { + private LivingEntityUseItemEvent(LivingEntity entity, @NotNull ItemStack item, int duration) { super(entity); this.item = item; this.setDuration(duration); } @NotNull - public ItemStack getItem() - { + public ItemStack getItem() { return item; } - public int getDuration() - { + public int getDuration() { return duration; } - public void setDuration(int duration) - { + public void setDuration(int duration) { this.duration = duration; } @@ -49,11 +48,10 @@ public sealed class LivingEntityUseItemEvent extends LivingEvent * Cancel the event, or set the duration or {@literal <} 0 to prevent it from processing. * */ - @Cancelable - public static final class Start extends LivingEntityUseItemEvent - { - public Start(LivingEntity entity, @NotNull ItemStack item, int duration) - { + public static final class Start extends LivingEntityUseItemEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Start.class); + + public Start(LivingEntity entity, @NotNull ItemStack item, int duration) { super(entity, item, duration); } } @@ -64,11 +62,10 @@ public sealed class LivingEntityUseItemEvent extends LivingEvent * Cancel the event, or set the duration to {@literal <=} 0 to cause the player to stop using the item. * */ - @Cancelable - public static final class Tick extends LivingEntityUseItemEvent - { - public Tick(LivingEntity entity, @NotNull ItemStack item, int duration) - { + public static final class Tick extends LivingEntityUseItemEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Tick.class); + + public Tick(LivingEntity entity, @NotNull ItemStack item, int duration) { super(entity, item, duration); } } @@ -85,11 +82,10 @@ public sealed class LivingEntityUseItemEvent extends LivingEvent * Canceling this event will prevent the Item from being notified that it has stopped being used, * The only vanilla item this would effect are bows, and it would cause them NOT to fire there arrow. */ - @Cancelable - public static final class Stop extends LivingEntityUseItemEvent - { - public Stop(LivingEntity entity, @NotNull ItemStack item, int duration) - { + public static final class Stop extends LivingEntityUseItemEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Stop.class); + + public Stop(LivingEntity entity, @NotNull ItemStack item, int duration) { super(entity, item, duration); } } @@ -106,11 +102,12 @@ public sealed class LivingEntityUseItemEvent extends LivingEvent * The result item stack is the stack that is placed in the player's inventory in replacement of the stack that is currently being used. * */ - public static final class Finish extends LivingEntityUseItemEvent - { + public static final class Finish extends LivingEntityUseItemEvent { + public static final EventBus BUS = EventBus.create(Finish.class); + private ItemStack result; - public Finish(LivingEntity entity, @NotNull ItemStack item, int duration, @NotNull ItemStack result) - { + + public Finish(LivingEntity entity, @NotNull ItemStack item, int duration, @NotNull ItemStack result) { super(entity, item, duration); this.setResultStack(result); } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java index dd919f9a65..d0d9250a00 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingEquipmentChangeEvent.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; /** @@ -29,6 +29,8 @@ import org.jetbrains.annotations.NotNull; * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ public final class LivingEquipmentChangeEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingEquipmentChangeEvent.class); + private final EquipmentSlot slot; private final ItemStack from; private final ItemStack to; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingEvent.java index 83032d9994..4d9fb6ca84 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingEvent.java @@ -9,10 +9,11 @@ import net.minecraft.world.entity.Entity; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.event.entity.EntityEvent; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.Nullable; /** @@ -22,19 +23,18 @@ import org.jetbrains.annotations.Nullable; *
    * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
    **/ -public class LivingEvent extends EntityEvent -{ +public class LivingEvent extends EntityEvent { + public static final EventBus BUS = EventBus.create(LivingEvent.class); + private final LivingEntity livingEntity; - public LivingEvent(LivingEntity entity) - { + public LivingEvent(LivingEntity entity) { super(entity); livingEntity = entity; } @Override - public LivingEntity getEntity() - { + public LivingEntity getEntity() { return livingEntity; } @@ -50,10 +50,10 @@ public class LivingEvent extends EntityEvent *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - @Cancelable - public static final class LivingTickEvent extends LivingEvent - { - public LivingTickEvent(LivingEntity e){ super(e); } + public static final class LivingTickEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingTickEvent.class); + + public LivingTickEvent(LivingEntity e) { super(e); } } /** @@ -70,19 +70,20 @@ public class LivingEvent extends EntityEvent *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - public static final class LivingJumpEvent extends LivingEvent - { - public LivingJumpEvent(LivingEntity e){ super(e); } + public static final class LivingJumpEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingJumpEvent.class); + + public LivingJumpEvent(LivingEntity e) { super(e); } } - public static final class LivingVisibilityEvent extends LivingEvent - { + public static final class LivingVisibilityEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingVisibilityEvent.class); + private double visibilityModifier; @Nullable private final Entity lookingEntity; - public LivingVisibilityEvent(LivingEntity livingEntity, @Nullable Entity lookingEntity, double originalMultiplier) - { + public LivingVisibilityEvent(LivingEntity livingEntity, @Nullable Entity lookingEntity, double originalMultiplier) { super(livingEntity); this.visibilityModifier = originalMultiplier; this.lookingEntity = lookingEntity; @@ -91,16 +92,14 @@ public class LivingEvent extends EntityEvent /** * @param mod Is multiplied with the current modifier */ - public void modifyVisibility(double mod) - { + public void modifyVisibility(double mod) { visibilityModifier *= mod; } /** * @return The current modifier */ - public double getVisibilityModifier() - { + public double getVisibilityModifier() { return visibilityModifier; } @@ -108,8 +107,7 @@ public class LivingEvent extends EntityEvent * @return The entity trying to see this LivingEntity, if available */ @Nullable - public Entity getLookingEntity() - { + public Entity getLookingEntity() { return lookingEntity; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingExperienceDropEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingExperienceDropEvent.java index a7b527947f..072942d066 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingExperienceDropEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingExperienceDropEvent.java @@ -7,7 +7,8 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.Nullable; /** @@ -15,29 +16,26 @@ import org.jetbrains.annotations.Nullable; * the amount of experience points dropped or completely prevent dropping of experience * by canceling the event. */ -@Cancelable -public final class LivingExperienceDropEvent extends LivingEvent -{ +public final class LivingExperienceDropEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingExperienceDropEvent.class); + @Nullable private final Player attackingPlayer; private final int originalExperiencePoints; private int droppedExperiencePoints; - public LivingExperienceDropEvent(LivingEntity entity, @Nullable Player attackingPlayer, int originalExperience) - { + public LivingExperienceDropEvent(LivingEntity entity, @Nullable Player attackingPlayer, int originalExperience) { super(entity); this.attackingPlayer = attackingPlayer; this.originalExperiencePoints = this.droppedExperiencePoints = originalExperience; } - public int getDroppedExperience() - { + public int getDroppedExperience() { return droppedExperiencePoints; } - public void setDroppedExperience(int droppedExperience) - { + public void setDroppedExperience(int droppedExperience) { this.droppedExperiencePoints = droppedExperience; } @@ -45,13 +43,11 @@ public final class LivingExperienceDropEvent extends LivingEvent * @return The player that last attacked the entity and thus caused the experience. This can be null, in case the player has since logged out. */ @Nullable - public Player getAttackingPlayer() - { + public Player getAttackingPlayer() { return attackingPlayer; } - public int getOriginalExperience() - { + public int getOriginalExperience() { return originalExperiencePoints; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingFallEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingFallEvent.java index 8a652444b9..e7e36c4460 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingFallEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingFallEvent.java @@ -6,10 +6,10 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.damagesource.DamageSource; -import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingFallEvent is fired when an Entity is set to be falling.
    @@ -27,8 +27,9 @@ import net.minecraft.world.entity.LivingEntity; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class LivingFallEvent extends LivingEvent { +public final class LivingFallEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingFallEvent.class); + private double distance; private float damageMultiplier; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingGetProjectileEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingGetProjectileEvent.java index 309a67ed4c..9703b4ed36 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingGetProjectileEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingGetProjectileEvent.java @@ -7,6 +7,7 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * This event is fired when a living entity attempts to get a projectile with the @@ -20,13 +21,13 @@ import net.minecraft.world.item.ItemStack; *

    * This event is fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS}. */ -public final class LivingGetProjectileEvent extends LivingEvent -{ +public final class LivingGetProjectileEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingGetProjectileEvent.class); + private final ItemStack projectileWeaponItemStack; private ItemStack projectileItemStack; - public LivingGetProjectileEvent(LivingEntity livingEntity, ItemStack projectileWeaponItemStack, ItemStack ammo) - { + public LivingGetProjectileEvent(LivingEntity livingEntity, ItemStack projectileWeaponItemStack, ItemStack ammo) { super(livingEntity); this.projectileWeaponItemStack = projectileWeaponItemStack; this.projectileItemStack = ammo; @@ -37,8 +38,7 @@ public final class LivingGetProjectileEvent extends LivingEvent * an itemstack of a {@link net.minecraft.world.item.ProjectileWeaponItem}, but it's possible for that to not be the * case if modder uses a different implementation of {@link LivingEntity#getProjectile(ItemStack)}. */ - public ItemStack getProjectileWeaponItemStack() - { + public ItemStack getProjectileWeaponItemStack() { return this.projectileWeaponItemStack; } @@ -47,8 +47,7 @@ public final class LivingGetProjectileEvent extends LivingEvent * behaviour, but it's possible for thatnot to be the case if a modder uses a different implementation of * {@link LivingEntity#getProjectile(ItemStack)}. */ - public ItemStack getProjectileItemStack() - { + public ItemStack getProjectileItemStack() { return this.projectileItemStack; } @@ -63,8 +62,7 @@ public final class LivingGetProjectileEvent extends LivingEvent * {@link LivingEntity#level} is client-side, you will want to make a conditional to always set the item stack to * what you'd want it to be to avoid client-server desyncs. */ - public void setProjectileItemStack(ItemStack projectileItemStack) - { + public void setProjectileItemStack(ItemStack projectileItemStack) { this.projectileItemStack = projectileItemStack; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingHealEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingHealEvent.java index 4d2782ba94..2c555cd82c 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingHealEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingHealEvent.java @@ -7,8 +7,9 @@ package net.minecraftforge.event.entity.living; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.LivingEntity; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingHealEvent is fired when an Entity is set to be healed.
    @@ -25,23 +26,21 @@ import net.minecraft.world.entity.LivingEntity; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class LivingHealEvent extends LivingEvent -{ +public final class LivingHealEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingHealEvent.class); + private float amount; - public LivingHealEvent(LivingEntity entity, float amount) - { + + public LivingHealEvent(LivingEntity entity, float amount) { super(entity); this.setAmount(amount); } - public float getAmount() - { + public float getAmount() { return amount; } - public void setAmount(float amount) - { + public void setAmount(float amount) { this.amount = amount; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingHurtEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingHurtEvent.java index 7c5ced3075..b8fb612aa5 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingHurtEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingHurtEvent.java @@ -9,7 +9,8 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingHurtEvent is fired when an Entity is set to be hurt.
    @@ -30,13 +31,13 @@ import net.minecraftforge.eventbus.api.Cancelable; * This event is fired on the {@link MinecraftForge#EVENT_BUS}. * @see LivingDamageEvent **/ -@net.minecraftforge.eventbus.api.Cancelable -public final class LivingHurtEvent extends LivingEvent -{ +public final class LivingHurtEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingHurtEvent.class); + private final DamageSource source; private float amount; - public LivingHurtEvent(LivingEntity entity, DamageSource source, float amount) - { + + public LivingHurtEvent(LivingEntity entity, DamageSource source, float amount) { super(entity); this.source = source; this.amount = amount; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingKnockBackEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingKnockBackEvent.java index c3859d2d23..6e114299d2 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingKnockBackEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingKnockBackEvent.java @@ -12,7 +12,8 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * LivingKnockBackEvent is fired when a living entity is about to be knocked back.
    @@ -28,23 +29,19 @@ import net.minecraftforge.eventbus.api.Cancelable; * {@link #ratioX} contains the x ratio of the knock back.
    * {@link #ratioZ} contains the z ratio of the knock back.
    *
    - * This event is {@link Cancelable}.
    * If this event is canceled, the entity is not knocked back.
    - *
    - * This event does not have a result. {@link HasResult}
    *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public class LivingKnockBackEvent extends LivingEvent -{ +public class LivingKnockBackEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingKnockBackEvent.class); + protected float strength; protected double ratioX, ratioZ; protected final float originalStrength; protected final double originalRatioX, originalRatioZ; - public LivingKnockBackEvent(LivingEntity target, float strength, double ratioX, double ratioZ) - { + public LivingKnockBackEvent(LivingEntity target, float strength, double ratioX, double ratioZ) { super(target); this.strength = this.originalStrength = strength; this.ratioX = this.originalRatioX = ratioX; diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingMakeBrainEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingMakeBrainEvent.java index aed4ace88c..6b22cddbec 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingMakeBrainEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingMakeBrainEvent.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.ai.Brain; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.BrainBuilder; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * LivingMakeBrainEvent is fired whenever a new {@link net.minecraft.world.entity.ai.Brain} instance is created using {@link LivingEntity#makeBrain(Dynamic)}.
    @@ -31,18 +31,18 @@ import net.minecraftforge.eventbus.api.Cancelable; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -public final class LivingMakeBrainEvent extends LivingEvent -{ +public final class LivingMakeBrainEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LivingMakeBrainEvent.class); + private final BrainBuilder brainBuilder; - public LivingMakeBrainEvent(LivingEntity entity, BrainBuilder brainBuilder) - { + public LivingMakeBrainEvent(LivingEntity entity, BrainBuilder brainBuilder) { super(entity); this.brainBuilder = brainBuilder; } - public BrainBuilder getTypedBrainBuilder(E ignoredEntity) - { + @SuppressWarnings("unchecked") + public BrainBuilder getTypedBrainBuilder(E ignoredEntity) { return (BrainBuilder) this.brainBuilder; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingPackSizeEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingPackSizeEvent.java index 5f85ebaa71..a7916b2f42 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingPackSizeEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingPackSizeEvent.java @@ -5,16 +5,20 @@ package net.minecraftforge.event.entity.living; -import net.minecraftforge.eventbus.api.Event.HasResult; +import net.minecraftforge.common.util.HasResult; import net.minecraft.world.entity.Mob; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.EventBus; +import org.jspecify.annotations.NullMarked; + +@NullMarked +public final class LivingPackSizeEvent extends LivingEvent implements HasResult { + public static final EventBus BUS = EventBus.create(LivingPackSizeEvent.class); -@HasResult -public final class LivingPackSizeEvent extends LivingEvent -{ private int maxPackSize; + private Result result = Result.DEFAULT; - public LivingPackSizeEvent(Mob entity) - { + public LivingPackSizeEvent(Mob entity) { super(entity); } @@ -26,13 +30,21 @@ public final class LivingPackSizeEvent extends LivingEvent * If you set the result to 'ALLOW', it means that you want to return * the value of maxPackSize as the maximum pack size for current entity. */ - public int getMaxPackSize() - { + public int getMaxPackSize() { return maxPackSize; } - public void setMaxPackSize(int maxPackSize) - { + public void setMaxPackSize(int maxPackSize) { this.maxPackSize = maxPackSize; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingSwapItemsEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingSwapItemsEvent.java index 2bfe6a4627..4d195fa836 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingSwapItemsEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingSwapItemsEvent.java @@ -8,11 +8,13 @@ package net.minecraftforge.event.entity.living; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.ApiStatus; -public sealed class LivingSwapItemsEvent extends LivingEvent -{ +public sealed class LivingSwapItemsEvent extends LivingEvent { + public static final EventBus EVENT_BUS = EventBus.create(LivingSwapItemsEvent.class); @ApiStatus.Internal public LivingSwapItemsEvent(LivingEntity entity) @@ -26,15 +28,14 @@ public sealed class LivingSwapItemsEvent extends LivingEvent * *

    This event is {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}. */ - @Cancelable - public static final class Hands extends LivingSwapItemsEvent - { + public static final class Hands extends LivingSwapItemsEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Hands.class); + private ItemStack toMainHand; private ItemStack toOffHand; @ApiStatus.Internal - public Hands(LivingEntity entity) - { + public Hands(LivingEntity entity) { super(entity); this.toMainHand = entity.getOffhandItem(); //the main hand will be swapped with the offhand this.toOffHand = entity.getMainHandItem(); //the offhand will be swapped with the main hand @@ -44,8 +45,7 @@ public sealed class LivingSwapItemsEvent extends LivingEvent * Gets the item that will be swapped to the main hand of the entity. * @return The item that will be swapped to the main hand. */ - public ItemStack getItemSwappedToMainHand() - { + public ItemStack getItemSwappedToMainHand() { return toMainHand; } @@ -53,8 +53,7 @@ public sealed class LivingSwapItemsEvent extends LivingEvent * Gets the item that will be swapped to the offhand of the entity. * @return The item that will be swapped to the offhand. */ - public ItemStack getItemSwappedToOffHand() - { + public ItemStack getItemSwappedToOffHand() { return toOffHand; } @@ -62,8 +61,7 @@ public sealed class LivingSwapItemsEvent extends LivingEvent * Sets the item that will be swapped to the main hand of the entity. * @param item The item to swap to the main hand. */ - public void setItemSwappedToMainHand(ItemStack item) - { + public void setItemSwappedToMainHand(ItemStack item) { this.toMainHand = item; } @@ -71,8 +69,7 @@ public sealed class LivingSwapItemsEvent extends LivingEvent * Sets the item that will be swapped to the offhand of the entity. * @param item The item to swap to the offhand. */ - public void setItemSwappedToOffHand(ItemStack item) - { + public void setItemSwappedToOffHand(ItemStack item) { this.toOffHand = item; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LivingUseTotemEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LivingUseTotemEvent.java index 7709c9953d..5a6b1074c1 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LivingUseTotemEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LivingUseTotemEvent.java @@ -10,7 +10,8 @@ import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; /** @@ -22,15 +23,14 @@ import net.minecraftforge.fml.LogicalSide; *

    This event is fired on the {@linkplain MinecraftForge#EVENT_BUS Forge event bus}, * only on the {@linkplain LogicalSide#SERVER logical server}.

    */ -@Cancelable -public final class LivingUseTotemEvent extends LivingEvent -{ +public final class LivingUseTotemEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LivingUseTotemEvent.class); + private final DamageSource source; private final ItemStack totem; private final InteractionHand hand; - public LivingUseTotemEvent(LivingEntity entity, DamageSource source, ItemStack totem, InteractionHand hand) - { + public LivingUseTotemEvent(LivingEntity entity, DamageSource source, ItemStack totem, InteractionHand hand) { super(entity); this.source = source; this.totem = totem; @@ -40,24 +40,21 @@ public final class LivingUseTotemEvent extends LivingEvent /** * {@return the damage source that caused the entity to die} */ - public DamageSource getSource() - { + public DamageSource getSource() { return source; } /** * {@return the totem of undying being used from the entity's inventory} */ - public ItemStack getTotem() - { + public ItemStack getTotem() { return totem; } /** * {@return the hand holding the totem} */ - public InteractionHand getHandHolding() - { + public InteractionHand getHandHolding() { return hand; } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/LootingLevelEvent.java b/src/main/java/net/minecraftforge/event/entity/living/LootingLevelEvent.java index a76d06e290..a111bd5d11 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/LootingLevelEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/LootingLevelEvent.java @@ -8,9 +8,11 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.damagesource.DamageSource; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.Nullable; public final class LootingLevelEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(LootingLevelEvent.class); @Nullable private final DamageSource damageSource; diff --git a/src/main/java/net/minecraftforge/event/entity/living/MobEffectEvent.java b/src/main/java/net/minecraftforge/event/entity/living/MobEffectEvent.java index c692388542..48d279612a 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/MobEffectEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/MobEffectEvent.java @@ -11,7 +11,11 @@ import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -21,6 +25,8 @@ import org.jetbrains.annotations.Nullable; * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}. */ public sealed class MobEffectEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(MobEffectEvent.class); + @Nullable protected final MobEffectInstance effectInstance; @@ -39,8 +45,9 @@ public sealed class MobEffectEvent extends LivingEvent { * This Event is {@link Cancelable}. If canceled, the effect will not be removed. * This Event does not have a result. */ - @Cancelable - public static final class Remove extends MobEffectEvent { + public static final class Remove extends MobEffectEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Remove.class); + private final MobEffect effect; public Remove(LivingEntity living, MobEffect effect) { @@ -79,8 +86,11 @@ public sealed class MobEffectEvent extends LivingEvent { * {@link Result#DENY DENY} will not apply this mob effect. * {@link Result#DEFAULT DEFAULT} will run vanilla logic to determine if this mob effect is applicable in {@link LivingEntity#canBeAffected}. */ - @HasResult - public static final class Applicable extends MobEffectEvent { + public static final class Applicable extends MobEffectEvent implements HasResult { + public static final EventBus BUS = EventBus.create(Applicable.class); + + private Result result = Result.DEFAULT; + public Applicable(LivingEntity living, @NotNull MobEffectInstance effectInstance) { super(living, effectInstance); } @@ -90,6 +100,16 @@ public sealed class MobEffectEvent extends LivingEvent { public MobEffectInstance getEffectInstance() { return super.getEffectInstance(); } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } /** @@ -99,6 +119,8 @@ public sealed class MobEffectEvent extends LivingEvent { * This event does not have a result. */ public static final class Added extends MobEffectEvent { + public static final EventBus BUS = EventBus.create(Added.class); + private final MobEffectInstance oldEffectInstance; private final Entity source; @@ -140,6 +162,8 @@ public sealed class MobEffectEvent extends LivingEvent { * This event does not have a result. */ public static final class Expired extends MobEffectEvent { + public static final EventBus BUS = EventBus.create(Expired.class); + public Expired(LivingEntity living, MobEffectInstance effect) { super(living, effect); } diff --git a/src/main/java/net/minecraftforge/event/entity/living/MobSpawnEvent.java b/src/main/java/net/minecraftforge/event/entity/living/MobSpawnEvent.java index 1d2efda097..093b33633b 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/MobSpawnEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/MobSpawnEvent.java @@ -6,23 +6,27 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.*; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.WorldGenRegion; import net.minecraft.util.RandomSource; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ServerLevelAccessor; +import net.minecraft.world.level.storage.ValueInput; import net.minecraftforge.common.ForgeInternalHandler; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.entity.EntityEvent; import net.minecraftforge.event.entity.SpawnPlacementRegisterEvent; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.LogicalSide; /** @@ -37,6 +41,8 @@ import net.minecraftforge.fml.LogicalSide; * {@link AllowDespawn} is not related to the mob spawn event flow, as it fires when a despawn is attempted. */ public abstract sealed class MobSpawnEvent extends EntityEvent { + public static final EventBus BUS = EventBus.create(MobSpawnEvent.class); + private final ServerLevelAccessor level; private final double x; private final double y; @@ -103,14 +109,16 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { * @apiNote If your modifications are for a single entity, and do not vary at runtime, use {@link SpawnPlacementRegisterEvent}. * @see SpawnPlacementRegisterEvent */ - @HasResult - public static final class SpawnPlacementCheck extends Event { + public static final class SpawnPlacementCheck extends MutableEvent implements HasResult { + public static final EventBus BUS = EventBus.create(SpawnPlacementCheck.class); + private final EntityType entityType; private final ServerLevelAccessor level; private final EntitySpawnReason spawnReason; private final BlockPos pos; private final RandomSource random; private final boolean defaultResult; + private Result result = Result.DEFAULT; /** * Internal. @@ -171,6 +179,16 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { public boolean getDefaultResult() { return this.defaultResult; } + + @Override + public Result getResult() { + return this.result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } /** @@ -200,11 +218,13 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { * @see {@link SpawnPlacementRegisterEvent} To modify spawn placements statically at startup. * @see {@link SpawnPlacementCheck} To modify the result of spawn placements at runtime. */ - @HasResult - public static final class PositionCheck extends MobSpawnEvent { + public static final class PositionCheck extends MobSpawnEvent implements HasResult { + public static final EventBus BUS = EventBus.create(PositionCheck.class); + @Nullable private final BaseSpawner spawner; private final EntitySpawnReason spawnReason; + private Result result = Result.DEFAULT; public PositionCheck(Mob mob, ServerLevelAccessor level, EntitySpawnReason spawnReason, @Nullable BaseSpawner spawner) { super(mob, level, mob.getX(), mob.getY(), mob.getZ()); @@ -230,6 +250,16 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { public EntitySpawnReason getSpawnReason() { return this.spawnReason; } + + @Override + public Result getResult() { + return this.result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } /** @@ -244,8 +274,9 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { * @see ForgeEventFactory#onFinalizeSpawn * @apiNote Callers do not need to check if the entity's spawn was cancelled, as the spawn will be blocked by Forge. */ - @Cancelable - public static final class FinalizeSpawn extends MobSpawnEvent { + public static final class FinalizeSpawn extends MobSpawnEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(FinalizeSpawn.class); + private final EntitySpawnReason spawnReason; @Nullable private final BaseSpawner spawner; @@ -254,13 +285,13 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { @Nullable private SpawnGroupData spawnData; @Nullable - private CompoundTag spawnTag; + private ValueInput spawnTag; /** * @apiNote Do not construct directly. Access via {@link ForgeEventFactory#onFinalizeSpawn} / {@link ForgeEventFactory#onFinalizeSpawnSpawner}. */ @ApiStatus.Internal - public FinalizeSpawn(Mob entity, ServerLevelAccessor level, double x, double y, double z, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnData, @Nullable CompoundTag spawnTag, @Nullable BaseSpawner spawner) { + public FinalizeSpawn(Mob entity, ServerLevelAccessor level, double x, double y, double z, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnData, @Nullable ValueInput spawnTag, @Nullable BaseSpawner spawner) { super(entity, level, x, y, z); this.difficulty = difficulty; this.spawnReason = spawnReason; @@ -320,7 +351,7 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { * @return The spawn data this entity was or will be loaded from, if any. */ @Nullable - public CompoundTag getSpawnTag() { + public ValueInput getSpawnTag() { return this.spawnTag; } @@ -329,7 +360,7 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { * The only vanilla mob known to use this tag for anything in finalize is tropical fish for setting the variant when spawned via bucket. * @param tag The new spawn tag */ - public void setSpawnTag(@Nullable CompoundTag tag) { + public void setSpawnTag(@Nullable ValueInput tag) { this.spawnTag = tag; } @@ -382,10 +413,23 @@ public abstract sealed class MobSpawnEvent extends EntityEvent { */ // TODO: 1.20 Move to standalone class, as it is unrelated to the complex mob spawning flow. // Such a refactor will allow the BaseSpawner and MobSpawnType params to be hoisted to MobSpawnEvent. - @HasResult - public static final class AllowDespawn extends MobSpawnEvent { + public static final class AllowDespawn extends MobSpawnEvent implements HasResult { + public static final EventBus BUS = EventBus.create(AllowDespawn.class); + + private Result result = Result.DEFAULT; + public AllowDespawn(Mob mob, ServerLevelAccessor level) { super(mob, level, mob.getX(), mob.getY(), mob.getZ()); } + + @Override + public Result getResult() { + return this.result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/MonsterDisguiseEvent.java b/src/main/java/net/minecraftforge/event/entity/living/MonsterDisguiseEvent.java index 05ab26d970..18b55e523f 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/MonsterDisguiseEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/MonsterDisguiseEvent.java @@ -8,7 +8,8 @@ package net.minecraftforge.event.entity.living; import net.minecraft.world.entity.monster.Monster; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.extensions.IForgeItem; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * This event is fired on the forge bus before an Monster detects that a player is looking at them. @@ -19,8 +20,9 @@ import net.minecraftforge.eventbus.api.Cancelable; *

    * This event does not have a {@link Result}. */ -@Cancelable -public final class MonsterDisguiseEvent extends LivingEvent { +public final class MonsterDisguiseEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(MonsterDisguiseEvent.class); + private final Player player; public MonsterDisguiseEvent(Monster monster, Player player) { @@ -37,6 +39,6 @@ public final class MonsterDisguiseEvent extends LivingEvent { @Override public Monster getEntity() { - return (Monster)super.getEntity(); + return (Monster) super.getEntity(); } } diff --git a/src/main/java/net/minecraftforge/event/entity/living/ShieldBlockEvent.java b/src/main/java/net/minecraftforge/event/entity/living/ShieldBlockEvent.java index ad42b31382..a87316733b 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/ShieldBlockEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/ShieldBlockEvent.java @@ -9,7 +9,8 @@ import net.minecraft.util.Mth; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * The ShieldBlockEvent is fired when an entity successfully blocks with a shield.
    @@ -18,8 +19,9 @@ import net.minecraftforge.eventbus.api.Cancelable; * Note: The shield item stack "should" be available from {@link LivingEntity#getUseItem()} * at least for players. */ -@Cancelable -public final class ShieldBlockEvent extends LivingEvent { +public final class ShieldBlockEvent extends LivingEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ShieldBlockEvent.class); + private final DamageSource source; private final float originalBlocked; private float dmgBlocked; diff --git a/src/main/java/net/minecraftforge/event/entity/living/ZombieEvent.java b/src/main/java/net/minecraftforge/event/entity/living/ZombieEvent.java index e0b27c6110..b2e1949e7f 100644 --- a/src/main/java/net/minecraftforge/event/entity/living/ZombieEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/living/ZombieEvent.java @@ -9,9 +9,11 @@ import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.entity.EntityEvent; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * ZombieEvent is fired whenever a zombie is spawned for aid. @@ -21,17 +23,17 @@ import net.minecraftforge.eventbus.api.Cancelable; * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}. **/ public sealed class ZombieEvent extends EntityEvent { + public static final EventBus BUS = EventBus.create(ZombieEvent.class); + private final Zombie zombie; - public ZombieEvent(Zombie zombie) - { + public ZombieEvent(Zombie zombie) { super(zombie); this.zombie = zombie; } @Override - public Zombie getEntity() - { + public Zombie getEntity() { return this.zombie; } @@ -58,8 +60,9 @@ public sealed class ZombieEvent extends EntityEvent { * * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - @HasResult - public static final class SummonAidEvent extends ZombieEvent { + public static final class SummonAidEvent extends ZombieEvent implements HasResult { + public static final EventBus BUS = EventBus.create(SummonAidEvent.class); + private Zombie customSummonedAid; private final Level level; @@ -68,9 +71,9 @@ public sealed class ZombieEvent extends EntityEvent { private final int z; private final LivingEntity attacker; private final double summonChance; + private Result result = Result.DEFAULT; - public SummonAidEvent(Zombie zombie, Level level, int x, int y, int z, LivingEntity attacker, double summonChance) - { + public SummonAidEvent(Zombie zombie, Level level, int x, int y, int z, LivingEntity attacker, double summonChance) { super(zombie); this.level = level; this.x = x; @@ -91,5 +94,15 @@ public sealed class ZombieEvent extends EntityEvent { public int getZ() { return z; } public LivingEntity getAttacker() { return attacker; } public double getSummonChance() { return summonChance; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/AdvancementEvent.java b/src/main/java/net/minecraftforge/event/entity/player/AdvancementEvent.java index 41306bb153..2c2b4c36f9 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/AdvancementEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/AdvancementEvent.java @@ -10,6 +10,7 @@ import net.minecraft.advancements.AdvancementHolder; import net.minecraft.advancements.AdvancementProgress; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Base class used for advancement-related events. Should not be used directly. @@ -17,6 +18,8 @@ import net.minecraftforge.common.MinecraftForge; * @see AdvancementProgressEvent */ public sealed class AdvancementEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(AdvancementEvent.class); + private final AdvancementHolder advancement; public AdvancementEvent(Player player, AdvancementHolder advancement) { @@ -42,6 +45,8 @@ public sealed class AdvancementEvent extends PlayerEvent { * @see AdvancementProgress#isDone() */ public static final class AdvancementEarnEvent extends AdvancementEvent { + public static final EventBus BUS = EventBus.create(AdvancementEarnEvent.class); + public AdvancementEarnEvent(Player player, AdvancementHolder earned) { super(player, earned); } @@ -60,6 +65,8 @@ public sealed class AdvancementEvent extends PlayerEvent { * @see net.minecraft.server.PlayerAdvancements#revoke(Advancement, String) */ public static final class AdvancementProgressEvent extends AdvancementEvent { + public static final EventBus BUS = EventBus.create(AdvancementProgressEvent.class); + private final AdvancementProgress advancementProgress; private final String criterionName; private final AdvancementEvent.AdvancementProgressEvent.ProgressType progressType; diff --git a/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java b/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java index ef7adf96d8..54d1bfc33a 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/AnvilRepairEvent.java @@ -7,6 +7,7 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; /** @@ -16,8 +17,9 @@ import org.jetbrains.annotations.NotNull; * * ItemStacks are the inputs/output from the anvil. They cannot be edited. */ -public final class AnvilRepairEvent extends PlayerEvent -{ +public final class AnvilRepairEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(AnvilRepairEvent.class); + @NotNull private final ItemStack left; // The left side of the input @NotNull @@ -26,8 +28,7 @@ public final class AnvilRepairEvent extends PlayerEvent private final ItemStack output; // Set this to set the output stack private float breakChance; // Anvil's chance to break (reduced by 1 durability) when this is complete. Default is 12% (0.12f) - public AnvilRepairEvent(Player player, @NotNull ItemStack left, @NotNull ItemStack right, @NotNull ItemStack output) - { + public AnvilRepairEvent(Player player, @NotNull ItemStack left, @NotNull ItemStack right, @NotNull ItemStack output) { super(player); this.output = output; this.left = left; diff --git a/src/main/java/net/minecraftforge/event/entity/player/ArrowLooseEvent.java b/src/main/java/net/minecraftforge/event/entity/player/ArrowLooseEvent.java index bd0625276d..0e1cb423b3 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/ArrowLooseEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/ArrowLooseEvent.java @@ -8,10 +8,11 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.BowItem; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; /** @@ -30,16 +31,15 @@ import org.jetbrains.annotations.NotNull; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class ArrowLooseEvent extends PlayerEvent -{ +public final class ArrowLooseEvent extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ArrowLooseEvent.class); + private final ItemStack bow; private final Level level; private final boolean hasAmmo; private int charge; - public ArrowLooseEvent(Player player, @NotNull ItemStack bow, Level level, int charge, boolean hasAmmo) - { + public ArrowLooseEvent(Player player, @NotNull ItemStack bow, Level level, int charge, boolean hasAmmo) { super(player); this.bow = bow; this.level = level; diff --git a/src/main/java/net/minecraftforge/event/entity/player/ArrowNockEvent.java b/src/main/java/net/minecraftforge/event/entity/player/ArrowNockEvent.java index 3dcfea04de..5a99a7bc50 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/ArrowNockEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/ArrowNockEvent.java @@ -12,6 +12,7 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; /** @@ -22,6 +23,8 @@ import org.jetbrains.annotations.NotNull; * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ public final class ArrowNockEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(ArrowNockEvent.class); + private final ItemStack bow; private final InteractionHand hand; private final Level level; diff --git a/src/main/java/net/minecraftforge/event/entity/player/AttackEntityEvent.java b/src/main/java/net/minecraftforge/event/entity/player/AttackEntityEvent.java index 352844337a..def4d71e59 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/AttackEntityEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/AttackEntityEvent.java @@ -6,9 +6,10 @@ package net.minecraftforge.event.entity.player; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * AttackEntityEvent is fired when a player attacks an Entity.
    @@ -24,18 +25,17 @@ import net.minecraft.world.entity.player.Player; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@Cancelable -public final class AttackEntityEvent extends PlayerEvent -{ +public final class AttackEntityEvent extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(AttackEntityEvent.class); + private final Entity target; - public AttackEntityEvent(Player player, Entity target) - { + + public AttackEntityEvent(Player player, Entity target) { super(player); this.target = target; } - public Entity getTarget() - { + public Entity getTarget() { return target; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/BonemealEvent.java b/src/main/java/net/minecraftforge/event/entity/player/BonemealEvent.java index 365ffe83f6..e63bfd081c 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/BonemealEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/BonemealEvent.java @@ -5,13 +5,15 @@ package net.minecraftforge.event.entity.player; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event.HasResult; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -24,14 +26,15 @@ import org.jetbrains.annotations.Nullable; * * setResult(ALLOW) is the same as the old setHandled() */ -@Cancelable -@HasResult // TODO: Redesign BonemealEvent the whole thing, it doens't make sense. -public final class BonemealEvent extends PlayerEvent { +public final class BonemealEvent extends PlayerEvent implements Cancellable, HasResult { + public static final CancellableEventBus BUS = CancellableEventBus.create(BonemealEvent.class); + private final Level level; private final BlockPos pos; private final BlockState block; private final ItemStack stack; + private Result result = Result.DEFAULT; public BonemealEvent(@Nullable Player player, Level level, BlockPos pos, BlockState block, ItemStack stack) { super(player); @@ -57,4 +60,14 @@ public final class BonemealEvent extends PlayerEvent { public ItemStack getStack() { return stack; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/CriticalHitEvent.java b/src/main/java/net/minecraftforge/event/entity/player/CriticalHitEvent.java index 035cf5929e..9426e82330 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/CriticalHitEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/CriticalHitEvent.java @@ -6,8 +6,8 @@ package net.minecraftforge.event.entity.player; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event.HasResult; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; @@ -24,16 +24,14 @@ import net.minecraft.world.entity.player.Player; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -@HasResult -public final class CriticalHitEvent extends PlayerEvent -{ +public final class CriticalHitEvent extends PlayerEvent implements HasResult { private float damageModifier; private final float oldDamageModifier; private final Entity target; private final boolean vanillaCritical; + private Result result = Result.DEFAULT; - public CriticalHitEvent(Player player, Entity target, float damageModifier, boolean vanillaCritical) - { + public CriticalHitEvent(Player player, Entity target, float damageModifier, boolean vanillaCritical) { super(player); this.target = target; this.damageModifier = damageModifier; @@ -44,8 +42,7 @@ public final class CriticalHitEvent extends PlayerEvent /** * The Entity that was damaged by the player. */ - public Entity getTarget() - { + public Entity getTarget() { return target; } @@ -53,8 +50,7 @@ public final class CriticalHitEvent extends PlayerEvent * This set the damage multiplier for the hit. * If you set it to 0, then the particles are still generated but damage is not done. */ - public void setDamageModifier(float mod) - { + public void setDamageModifier(float mod) { this.damageModifier = mod; } @@ -62,8 +58,7 @@ public final class CriticalHitEvent extends PlayerEvent * The damage modifier for the hit.
    * This is by default 1.5F for ciritcal hits and 1F for normal hits . */ - public float getDamageModifier() - { + public float getDamageModifier() { return this.damageModifier; } @@ -71,16 +66,24 @@ public final class CriticalHitEvent extends PlayerEvent * The orignal damage modifier for the hit wthout any changes.
    * This is 1.5F for ciritcal hits and 1F for normal hits . */ - public float getOldDamageModifier() - { + public float getOldDamageModifier() { return this.oldDamageModifier; } /** * Returns true if this hit was critical by vanilla */ - public boolean isVanillaCritical() - { + public boolean isVanillaCritical() { return vanillaCritical; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/EntityItemPickupEvent.java b/src/main/java/net/minecraftforge/event/entity/player/EntityItemPickupEvent.java index 8f9870d66a..6f9c6934dc 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/EntityItemPickupEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/EntityItemPickupEvent.java @@ -5,10 +5,12 @@ package net.minecraftforge.event.entity.player; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * This event is called when a player collides with a EntityItem on the ground. @@ -20,20 +22,28 @@ import net.minecraft.world.entity.player.Player; * * setResult(ALLOW) is the same as the old setHandled() */ -@Cancelable -@Event.HasResult -public final class EntityItemPickupEvent extends PlayerEvent -{ - private final ItemEntity item; +public final class EntityItemPickupEvent extends PlayerEvent implements Cancellable, HasResult { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityItemPickupEvent.class); - public EntityItemPickupEvent(Player player, ItemEntity item) - { + private final ItemEntity item; + private Result result = Result.DEFAULT; + + public EntityItemPickupEvent(Player player, ItemEntity item) { super(player); this.item = item; } - public ItemEntity getItem() - { + public ItemEntity getItem() { return item; } + + @Override + public Result getResult() { + return this.result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java b/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java index 44371b3769..afaa628fa8 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/FillBucketEvent.java @@ -5,12 +5,14 @@ package net.minecraftforge.event.entity.player; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.HitResult; import net.minecraft.world.level.Level; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,10 +25,8 @@ import org.jetbrains.annotations.Nullable; * ItemStack to your inventory and reducing the stack size to process. * setResult(ALLOW) is the same as the old setHandled(); */ -@Cancelable -@Event.HasResult -public final class FillBucketEvent extends PlayerEvent -{ +public final class FillBucketEvent extends PlayerEvent implements Cancellable, HasResult { + public static final CancellableEventBus BUS = CancellableEventBus.create(FillBucketEvent.class); private final ItemStack current; private final Level level; @@ -34,9 +34,9 @@ public final class FillBucketEvent extends PlayerEvent private final HitResult target; private ItemStack result; + private Result eventResult = Result.DEFAULT; - public FillBucketEvent(Player player, @NotNull ItemStack current, Level level, @Nullable HitResult target) - { + public FillBucketEvent(Player player, @NotNull ItemStack current, Level level, @Nullable HitResult target) { super(player); this.current = current; this.level = level; @@ -51,4 +51,14 @@ public final class FillBucketEvent extends PlayerEvent @NotNull public ItemStack getFilledBucket() { return this.result; } public void setFilledBucket(@NotNull ItemStack bucket) { this.result = bucket; } + + @Override + public Result getResult() { + return this.eventResult; + } + + @Override + public void setResult(Result result) { + this.eventResult = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/ItemFishedEvent.java b/src/main/java/net/minecraftforge/event/entity/player/ItemFishedEvent.java index 5ed3878ba2..66daef50ff 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/ItemFishedEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/ItemFishedEvent.java @@ -9,7 +9,8 @@ import com.google.common.base.Preconditions; import net.minecraft.world.entity.projectile.FishingHook; import net.minecraft.world.item.ItemStack; import net.minecraft.core.NonNullList; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import javax.annotation.Nonnegative; import java.util.List; @@ -21,8 +22,9 @@ import java.util.List; * Canceling the event will cause the player to receive no items at all. * The hook will still take the damage specified */ -@Cancelable -public final class ItemFishedEvent extends PlayerEvent { +public final class ItemFishedEvent extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(ItemFishedEvent.class); + private final NonNullList stacks = NonNullList.create(); private final FishingHook hook; private int rodDamage; diff --git a/src/main/java/net/minecraftforge/event/entity/player/ItemTooltipEvent.java b/src/main/java/net/minecraftforge/event/entity/player/ItemTooltipEvent.java index adf5aa74e7..020191bde5 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/ItemTooltipEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/ItemTooltipEvent.java @@ -12,11 +12,13 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.network.chat.Component; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public final class ItemTooltipEvent extends PlayerEvent -{ +public final class ItemTooltipEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(ItemTooltipEvent.class); + private final TooltipFlag flags; @NotNull private final ItemStack itemStack; diff --git a/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java index c80a658c2c..325668be04 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PermissionsChangedEvent.java @@ -6,21 +6,21 @@ package net.minecraftforge.event.entity.player; import net.minecraft.server.level.ServerPlayer; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * This event will fire when the player is opped or deopped. *

    * This event is cancelable which will stop the op or deop from happening. */ -@Cancelable -public final class PermissionsChangedEvent extends PlayerEvent -{ +public final class PermissionsChangedEvent extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(PermissionsChangedEvent.class); + private final int newLevel; private final int oldLevel; - public PermissionsChangedEvent(ServerPlayer player, int newLevel, int oldLevel) - { + public PermissionsChangedEvent(ServerPlayer player, int newLevel, int oldLevel) { super(player); this.oldLevel = oldLevel; this.newLevel = newLevel; @@ -29,15 +29,13 @@ public final class PermissionsChangedEvent extends PlayerEvent /** * @return The new permission level. */ - public int getNewLevel() - { + public int getNewLevel() { return newLevel; } /** * @return The old permission level. */ - public int getOldLevel() - { + public int getOldLevel() { return oldLevel; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerContainerEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerContainerEvent.java index f1a1f5bba3..8e02813c51 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerContainerEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerContainerEvent.java @@ -7,33 +7,35 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraftforge.eventbus.api.bus.EventBus; + +public sealed class PlayerContainerEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerContainerEvent.class); -public sealed class PlayerContainerEvent extends PlayerEvent -{ private final AbstractContainerMenu container; - public PlayerContainerEvent(Player player, AbstractContainerMenu container) - { + + public PlayerContainerEvent(Player player, AbstractContainerMenu container) { super(player); this.container = container; } - public static final class Open extends PlayerContainerEvent - { - public Open(Player player, AbstractContainerMenu container) - { - super(player, container); - } - } - public static final class Close extends PlayerContainerEvent - { - public Close(Player player, AbstractContainerMenu container) - { + public static final class Open extends PlayerContainerEvent { + public static final EventBus BUS = EventBus.create(Open.class); + + public Open(Player player, AbstractContainerMenu container) { super(player, container); } } - public AbstractContainerMenu getContainer() - { + public static final class Close extends PlayerContainerEvent { + public static final EventBus BUS = EventBus.create(Close.class); + + public Close(Player player, AbstractContainerMenu container) { + super(player, container); + } + } + + public AbstractContainerMenu getContainer() { return container; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerDestroyItemEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerDestroyItemEvent.java index 57bd88a6e5..b528cd36eb 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerDestroyItemEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerDestroyItemEvent.java @@ -20,7 +20,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,6 +49,8 @@ import org.jetbrains.annotations.Nullable; * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ public final class PlayerDestroyItemEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerDestroyItemEvent.class); + @NotNull private final ItemStack original; @Nullable @@ -69,5 +71,4 @@ public final class PlayerDestroyItemEvent extends PlayerEvent { public EquipmentSlot getSlot() { return this.slot; } - } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java index 65994d3f24..e116002fc0 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerEvent.java @@ -17,13 +17,15 @@ import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.network.chat.Component; import net.minecraftforge.event.entity.living.LivingEvent; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -31,22 +33,19 @@ import org.jetbrains.annotations.Nullable; * PlayerEvent is fired whenever an event involving a {@link Player} occurs.
    * If a method utilizes this {@link net.minecraftforge.eventbus.api.Event} as its parameter, the method will * receive every child event of this class.
    - *
    - * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}. **/ -public class PlayerEvent extends LivingEvent -{ +public class PlayerEvent extends LivingEvent { + public static final EventBus BUS = EventBus.create(PlayerEvent.class); + private final Player player; - public PlayerEvent(Player player) - { + public PlayerEvent(Player player) { super(player); this.player = player; } @Override - public Player getEntity() - { + public Player getEntity() { return player; } @@ -59,20 +58,14 @@ public class PlayerEvent extends LivingEvent *
    * {@link #state} contains the {@link BlockState} that is being checked for harvesting.
    * {@link #success} contains the boolean value for whether the Block will be successfully harvested.
    - *
    - * This event is not {@link net.minecraftforge.eventbus.api.Cancelable}.
    - *
    - * This event does not have a result. {@link HasResult}
    - *
    - * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - public static final class HarvestCheck extends PlayerEvent - { + public static final class HarvestCheck extends PlayerEvent { + public static final EventBus BUS = EventBus.create(HarvestCheck.class); + private final BlockState state; private boolean success; - public HarvestCheck(Player player, BlockState state, boolean success) - { + public HarvestCheck(Player player, BlockState state, boolean success) { super(player); this.state = state; this.success = success; @@ -80,7 +73,7 @@ public class PlayerEvent extends LivingEvent public BlockState getTargetBlock() { return this.state; } public boolean canHarvest() { return this.success; } - public void setCanHarvest(boolean success){ this.success = success; } + public void setCanHarvest(boolean success) { this.success = success; } } /** @@ -95,24 +88,18 @@ public class PlayerEvent extends LivingEvent * {@link #newSpeed} contains the newSpeed at which the player will break the block.
    * {@link #pos} contains the coordinates at which this event is occurring. Optional value.
    *
    - * This event is {@link net.minecraftforge.eventbus.api.Cancelable}.
    * If it is canceled, the player is unable to break the block.
    - *
    - * This event does not have a result. {@link HasResult}
    - *
    - * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - @Cancelable - public static final class BreakSpeed extends PlayerEvent - { + public static final class BreakSpeed extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(BreakSpeed.class); + private static final BlockPos LEGACY_UNKNOWN = new BlockPos(0, -1, 0); private final BlockState state; private final float originalSpeed; private float newSpeed = 0.0f; private final Optional pos; // Y position of -1 notes unknown location - public BreakSpeed(Player player, BlockState state, float original, @Nullable BlockPos pos) - { + public BreakSpeed(Player player, BlockState state, float original, @Nullable BlockPos pos) { super(player); this.state = state; this.originalSpeed = original; @@ -136,37 +123,28 @@ public class PlayerEvent extends LivingEvent *
    * {@link #username} contains the username of the player. * {@link #displayname} contains the display name of the player. - *
    - * This event is not {@link net.minecraftforge.eventbus.api.Cancelable}. - *
    - * This event does not have a result. {@link HasResult} - *
    - * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - public static final class NameFormat extends PlayerEvent - { + public static final class NameFormat extends PlayerEvent { + public static final EventBus BUS = EventBus.create(NameFormat.class); + private final Component username; private Component displayname; - public NameFormat(Player player, Component username) - { + public NameFormat(Player player, Component username) { super(player); this.username = username; this.setDisplayname(username); } - public Component getUsername() - { + public Component getUsername() { return username; } - public Component getDisplayname() - { + public Component getDisplayname() { return displayname; } - public void setDisplayname(Component displayname) - { + public void setDisplayname(Component displayname) { this.displayname = displayname; } } @@ -179,31 +157,23 @@ public class PlayerEvent extends LivingEvent * This event is fired via the {@link ForgeEventFactory#getPlayerTabListDisplayName(Player)}.
    *
    * {@link #getDisplayName()} contains the display name of the player or null if the client should determine the display name itself. - *
    - * This event is not {@link net.minecraftforge.eventbus.api.Cancelable}. - *
    - * This event does not have a result. {@link HasResult} - *
    - * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ - public static final class TabListNameFormat extends PlayerEvent - { + public static final class TabListNameFormat extends PlayerEvent { + public static final EventBus BUS = EventBus.create(TabListNameFormat.class); + @Nullable private Component displayName; - public TabListNameFormat(Player player) - { + public TabListNameFormat(Player player) { super(player); } @Nullable - public Component getDisplayName() - { + public Component getDisplayName() { return displayName; } - public void setDisplayName(@Nullable Component displayName) - { + public void setDisplayName(@Nullable Component displayName) { this.displayName = displayName; } } @@ -212,13 +182,13 @@ public class PlayerEvent extends LivingEvent * Fired when the EntityPlayer is cloned, typically caused by the impl sending a RESPAWN_PLAYER event. * Either caused by death, or by traveling from the End to the overworld. */ - public static final class Clone extends PlayerEvent - { + public static final class Clone extends PlayerEvent { + public static final EventBus BUS = EventBus.create(Clone.class); + private final Player original; private final boolean wasDeath; - public Clone(Player _new, Player oldPlayer, boolean wasDeath) - { + public Clone(Player _new, Player oldPlayer, boolean wasDeath) { super(_new); this.original = oldPlayer; this.wasDeath = wasDeath; @@ -227,8 +197,7 @@ public class PlayerEvent extends LivingEvent /** * The old EntityPlayer that this new entity is a clone of. */ - public Player getOriginal() - { + public Player getOriginal() { return original; } @@ -236,8 +205,7 @@ public class PlayerEvent extends LivingEvent * True if this event was fired because the player died. * False if it was fired because the entity switched dimensions. */ - public boolean isWasDeath() - { + public boolean isWasDeath() { return wasDeath; } } @@ -247,11 +215,11 @@ public class PlayerEvent extends LivingEvent * */ public static final class StartTracking extends PlayerEvent { + public static final EventBus BUS = EventBus.create(StartTracking.class); private final Entity target; - public StartTracking(Player player, Entity target) - { + public StartTracking(Player player, Entity target) { super(player); this.target = target; } @@ -259,8 +227,7 @@ public class PlayerEvent extends LivingEvent /** * The Entity now being tracked. */ - public Entity getTarget() - { + public Entity getTarget() { return target; } } @@ -270,11 +237,11 @@ public class PlayerEvent extends LivingEvent * */ public static final class StopTracking extends PlayerEvent { + public static final EventBus BUS = EventBus.create(StopTracking.class); private final Entity target; - public StopTracking(Player player, Entity target) - { + public StopTracking(Player player, Entity target) { super(player); this.target = target; } @@ -282,8 +249,7 @@ public class PlayerEvent extends LivingEvent /** * The Entity no longer being tracked. */ - public Entity getTarget() - { + public Entity getTarget() { return target; } } @@ -295,11 +261,12 @@ public class PlayerEvent extends LivingEvent * containing additional mod related player data. */ public static final class LoadFromFile extends PlayerEvent { + public static final EventBus BUS = EventBus.create(LoadFromFile.class); + private final File playerDirectory; private final String playerUUID; - public LoadFromFile(Player player, File originDirectory, String playerUUID) - { + public LoadFromFile(Player player, File originDirectory, String playerUUID) { super(player); this.playerDirectory = originDirectory; this.playerUUID = playerUUID; @@ -309,8 +276,7 @@ public class PlayerEvent extends LivingEvent * Construct and return a recommended file for the supplied suffix * @param suffix The suffix to use. */ - public File getPlayerFile(String suffix) - { + public File getPlayerFile(String suffix) { if ("dat".equals(suffix)) throw new IllegalArgumentException("The suffix 'dat' is reserved"); return new File(this.getPlayerDirectory(), this.getPlayerUUID() +"."+suffix); } @@ -319,8 +285,7 @@ public class PlayerEvent extends LivingEvent * The directory where player data is being stored. Use this * to locate your mod additional file. */ - public File getPlayerDirectory() - { + public File getPlayerDirectory() { return playerDirectory; } @@ -328,8 +293,7 @@ public class PlayerEvent extends LivingEvent * The UUID is the standard for player related file storage. * It is broken out here for convenience for quick file generation. */ - public String getPlayerUUID() - { + public String getPlayerUUID() { return playerUUID; } } @@ -347,11 +311,12 @@ public class PlayerEvent extends LivingEvent * corrupt the world state. */ public static final class SaveToFile extends PlayerEvent { + public static final EventBus BUS = EventBus.create(SaveToFile.class); + private final File playerDirectory; private final String playerUUID; - public SaveToFile(Player player, File originDirectory, String playerUUID) - { + public SaveToFile(Player player, File originDirectory, String playerUUID) { super(player); this.playerDirectory = originDirectory; this.playerUUID = playerUUID; @@ -361,8 +326,7 @@ public class PlayerEvent extends LivingEvent * Construct and return a recommended file for the supplied suffix * @param suffix The suffix to use. */ - public File getPlayerFile(String suffix) - { + public File getPlayerFile(String suffix) { if ("dat".equals(suffix)) throw new IllegalArgumentException("The suffix 'dat' is reserved"); return new File(this.getPlayerDirectory(), this.getPlayerUUID() +"."+suffix); } @@ -371,8 +335,7 @@ public class PlayerEvent extends LivingEvent * The directory where player data is being stored. Use this * to locate your mod additional file. */ - public File getPlayerDirectory() - { + public File getPlayerDirectory() { return playerDirectory; } @@ -380,13 +343,14 @@ public class PlayerEvent extends LivingEvent * The UUID is the standard for player related file storage. * It is broken out here for convenience for quick file generation. */ - public String getPlayerUUID() - { + public String getPlayerUUID() { return playerUUID; } } public static final class ItemPickupEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(ItemPickupEvent.class); + /** * Original EntityItem with current remaining stack size */ @@ -395,8 +359,8 @@ public class PlayerEvent extends LivingEvent * Clone item stack, containing the item and amount picked up */ private final ItemStack stack; - public ItemPickupEvent(Player player, ItemEntity entPickedUp, ItemStack stack) - { + + public ItemPickupEvent(Player player, ItemEntity entPickedUp, ItemStack stack) { super(player); this.originalEntity = entPickedUp; this.stack = stack; @@ -412,63 +376,67 @@ public class PlayerEvent extends LivingEvent } public static final class ItemCraftedEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(ItemCraftedEvent.class); + @NotNull private final ItemStack crafting; private final Container craftMatrix; - public ItemCraftedEvent(Player player, @NotNull ItemStack crafting, Container craftMatrix) - { + + public ItemCraftedEvent(Player player, @NotNull ItemStack crafting, Container craftMatrix) { super(player); this.crafting = crafting; this.craftMatrix = craftMatrix; } @NotNull - public ItemStack getCrafting() - { + public ItemStack getCrafting() { return this.crafting; } - public Container getInventory() - { + public Container getInventory() { return this.craftMatrix; } } public static final class ItemSmeltedEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(ItemSmeltedEvent.class); + @NotNull private final ItemStack smelting; - public ItemSmeltedEvent(Player player, @NotNull ItemStack crafting) - { + + public ItemSmeltedEvent(Player player, @NotNull ItemStack crafting) { super(player); this.smelting = crafting; } @NotNull - public ItemStack getSmelting() - { + public ItemStack getSmelting() { return this.smelting; } } public static final class PlayerLoggedInEvent extends PlayerEvent { - public PlayerLoggedInEvent(Player player) - { + public static final EventBus BUS = EventBus.create(PlayerLoggedInEvent.class); + + public PlayerLoggedInEvent(Player player) { super(player); } } public static final class PlayerLoggedOutEvent extends PlayerEvent { - public PlayerLoggedOutEvent(Player player) - { + public static final EventBus BUS = EventBus.create(PlayerLoggedOutEvent.class); + + public PlayerLoggedOutEvent(Player player) { super(player); } } public static final class PlayerRespawnEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerRespawnEvent.class); + private final boolean endConquered; - public PlayerRespawnEvent(Player player, boolean endConquered) - { + public PlayerRespawnEvent(Player player, boolean endConquered) { super(player); this.endConquered = endConquered; } @@ -477,31 +445,28 @@ public class PlayerEvent extends LivingEvent * Did this respawn event come from the player conquering the end? * @return if this respawn was because the player conquered the end */ - public boolean isEndConquered() - { + public boolean isEndConquered() { return this.endConquered; } - - } public static final class PlayerChangedDimensionEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerChangedDimensionEvent.class); + private final ResourceKey fromDim; private final ResourceKey toDim; - public PlayerChangedDimensionEvent(Player player, ResourceKey fromDim, ResourceKey toDim) - { + + public PlayerChangedDimensionEvent(Player player, ResourceKey fromDim, ResourceKey toDim) { super(player); this.fromDim = fromDim; this.toDim = toDim; } - public ResourceKey getFrom() - { + public ResourceKey getFrom() { return this.fromDim; } - public ResourceKey getTo() - { + public ResourceKey getTo() { return this.toDim; } } @@ -510,34 +475,30 @@ public class PlayerEvent extends LivingEvent * Fired when the game type of a server player is changed to a different value than what it was previously. Eg Creative to Survival, not Survival to Survival. * If the event is cancelled the game mode of the player is not changed and the value of newGameMode is ignored. */ - @Cancelable - public static final class PlayerChangeGameModeEvent extends PlayerEvent - { + public static final class PlayerChangeGameModeEvent extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(PlayerChangeGameModeEvent.class); + private final GameType currentGameMode; private GameType newGameMode; - public PlayerChangeGameModeEvent(Player player, GameType currentGameMode, GameType newGameMode) - { + public PlayerChangeGameModeEvent(Player player, GameType currentGameMode, GameType newGameMode) { super(player); this.currentGameMode = currentGameMode; this.newGameMode = newGameMode; } - public GameType getCurrentGameMode() - { + public GameType getCurrentGameMode() { return currentGameMode; } - public GameType getNewGameMode() - { + public GameType getNewGameMode() { return newGameMode; } /** * Sets the game mode the player will be changed to if this event is not cancelled. */ - public void setNewGameMode(GameType newGameMode) - { + public void setNewGameMode(GameType newGameMode) { this.newGameMode = newGameMode; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerFlyableFallEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerFlyableFallEvent.java index a383962c10..fffb4df28f 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerFlyableFallEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerFlyableFallEvent.java @@ -6,19 +6,20 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Occurs when a player falls, but is able to fly. Doesn't need to be cancelable, this is mainly for notification purposes. * @author Mithion * */ -public final class PlayerFlyableFallEvent extends PlayerEvent -{ +public final class PlayerFlyableFallEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerFlyableFallEvent.class); + private float distance; private float multiplier; - public PlayerFlyableFallEvent(Player player, float distance, float multiplier) - { + public PlayerFlyableFallEvent(Player player, float distance, float multiplier) { super(player); this.distance = distance; this.multiplier = multiplier; diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java index 6d729e389d..298656cf7e 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java @@ -24,8 +24,11 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.ApiStatus; @@ -38,6 +41,8 @@ import org.jetbrains.annotations.Nullable; * See the individual documentation on each subevent for more details. **/ public sealed class PlayerInteractEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerInteractEvent.class); + private final InteractionHand hand; private final BlockPos pos; @Nullable @@ -60,8 +65,9 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * Let result be the return value of {@link Entity#interactAt(Player, Vec3, InteractionHand)}, or {@link #cancellationResult} if the event is cancelled. * If we are on the client and result is not {@link InteractionResult#SUCCESS}, the client will then try {@link EntityInteract}. */ - @Cancelable - public static final class EntityInteractSpecific extends PlayerInteractEvent { + public static final class EntityInteractSpecific extends PlayerInteractEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityInteractSpecific.class); + private final Vec3 localPos; private final Entity target; @@ -99,8 +105,9 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * or {@link #cancellationResult} if the event is cancelled. * If we are on the client and result is not {@link InteractionResult#SUCCESS}, the client will then try {@link RightClickItem}. */ - @Cancelable - public static final class EntityInteract extends PlayerInteractEvent { + public static final class EntityInteract extends PlayerInteractEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityInteract.class); + private final Entity target; public EntityInteract(Player player, InteractionHand hand, Entity target) { @@ -117,7 +124,7 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * This event is fired on both sides whenever the player right clicks while targeting a block.
    * This event controls which of {@link Item#onItemUseFirst}, {@link Block#use(BlockState, Level, BlockPos, Player, InteractionHand, BlockHitResult)}, * and {@link Item#useOn(UseOnContext)} will be called.
    - * Canceling the event will cause none of the above three to be called.
    + * Cancelling the event will cause none of the above three to be called.
    *
    * Let result be the first non-pass return value of the above three methods, or pass, if they all pass.
    * Or {@link #cancellationResult} if the event is cancelled.
    @@ -126,8 +133,9 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * There are various results to this event, see the getters below.
    * Note that handling things differently on the client vs server may cause desynchronizations! */ - @Cancelable - public static final class RightClickBlock extends PlayerInteractEvent { + public static final class RightClickBlock extends PlayerInteractEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RightClickBlock.class); + private Result useBlock = Result.DEFAULT; private Result useItem = Result.DEFAULT; private final BlockHitResult hitVec; @@ -176,15 +184,6 @@ public sealed class PlayerInteractEvent extends PlayerEvent { public void setUseItem(Result triggerItem) { this.useItem = triggerItem; } - - @Override - public void setCanceled(boolean canceled) { - super.setCanceled(canceled); - if (canceled) { - useBlock = Result.DENY; - useItem = Result.DENY; - } - } } /** @@ -194,8 +193,9 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * Let result be the return value of {@link Item#use(Level, Player, InteractionHand)}, or {@link #cancellationResult} if the event is cancelled. * If we are on the client and result is not {@link InteractionResult#SUCCESS}, the client will then continue to other hands. */ - @Cancelable - public static final class RightClickItem extends PlayerInteractEvent { + public static final class RightClickItem extends PlayerInteractEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(RightClickItem.class); + public RightClickItem(Player player, InteractionHand hand) { super(player, hand, player.blockPosition(), null); } @@ -207,6 +207,8 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * This event cannot be canceled. */ public static final class RightClickEmpty extends PlayerInteractEvent { + public static final EventBus BUS = EventBus.create(RightClickEmpty.class); + public RightClickEmpty(Player player, InteractionHand hand) { super(player, hand, player.blockPosition(), null); } @@ -227,8 +229,9 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * Also note that creative mode directly breaks the block without running any other logic. * Therefore, in creative mode, {@link #setUseBlock} and {@link #setUseItem} have no effect. */ - @Cancelable - public static final class LeftClickBlock extends PlayerInteractEvent { + public static final class LeftClickBlock extends PlayerInteractEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LeftClickBlock.class); + private Result useBlock = Result.DEFAULT; private Result useItem = Result.DEFAULT; private final Action action; @@ -269,16 +272,7 @@ public sealed class PlayerInteractEvent extends PlayerEvent { this.useItem = triggerItem; } - @Override - public void setCanceled(boolean canceled) { - super.setCanceled(canceled); - if (canceled) { - useBlock = Result.DENY; - useItem = Result.DENY; - } - } - - public static enum Action { + public enum Action { /** * When the player first left clicks a block */ @@ -314,6 +308,8 @@ public sealed class PlayerInteractEvent extends PlayerEvent { * This event cannot be canceled. */ public static final class LeftClickEmpty extends PlayerInteractEvent { + public static final EventBus BUS = EventBus.create(LeftClickEmpty.class); + public LeftClickEmpty(Player player) { super(player, InteractionHand.MAIN_HAND, player.blockPosition(), null); } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerSetSpawnEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerSetSpawnEvent.java index 7ba0882a52..e4b32535c4 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerSetSpawnEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerSetSpawnEvent.java @@ -9,7 +9,8 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.Level; import net.minecraft.core.BlockPos; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.Nullable; /** @@ -17,8 +18,9 @@ import org.jetbrains.annotations.Nullable; *

    * The event can be canceled, which will prevent the spawn point from being changed. */ -@Cancelable -public final class PlayerSetSpawnEvent extends PlayerEvent { +public final class PlayerSetSpawnEvent extends PlayerEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(PlayerSetSpawnEvent.class); + private final @Nullable ServerPlayer.RespawnConfig config; @Deprecated(forRemoval = true, since = "1.21.5") diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerSleepInBedEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerSleepInBedEvent.java index 9152d2e995..a75cf9db21 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerSleepInBedEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerSleepInBedEvent.java @@ -9,6 +9,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player.BedSleepingProblem; import net.minecraft.core.BlockPos; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.bus.EventBus; import java.util.Optional; @@ -24,34 +25,30 @@ import java.util.Optional; *
    * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/ -public final class PlayerSleepInBedEvent extends PlayerEvent -{ +public final class PlayerSleepInBedEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerSleepInBedEvent.class); + private BedSleepingProblem result = null; private final Optional pos; - public PlayerSleepInBedEvent(Player player, Optional pos) - { + public PlayerSleepInBedEvent(Player player, Optional pos) { super(player); this.pos = pos; } - public BedSleepingProblem getResultStatus() - { + public BedSleepingProblem getResultStatus() { return result; } - public void setResult(BedSleepingProblem result) - { + public void setResult(BedSleepingProblem result) { this.result = result; } - public BlockPos getPos() - { + public BlockPos getPos() { return pos.orElse(null); } public Optional getOptionalPos() { return pos; } - } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerSpawnPhantomsEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerSpawnPhantomsEvent.java index d687db5161..7b2abc24a1 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerSpawnPhantomsEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerSpawnPhantomsEvent.java @@ -8,7 +8,9 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.level.levelgen.PhantomSpawner; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.NotNull; /** @@ -22,9 +24,11 @@ import org.jetbrains.annotations.NotNull; * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
    * @see PlayerSpawnPhantomsEvent#setResult for the effects of each result. */ -@Event.HasResult -public final class PlayerSpawnPhantomsEvent extends PlayerEvent { +public final class PlayerSpawnPhantomsEvent extends PlayerEvent implements HasResult { + public static final EventBus BUS = EventBus.create(PlayerSpawnPhantomsEvent.class); + private int phantomsToSpawn; + private Result result = Result.DEFAULT; public PlayerSpawnPhantomsEvent(Player player, int phantomsToSpawn) { super(player); @@ -46,6 +50,11 @@ public final class PlayerSpawnPhantomsEvent extends PlayerEvent { this.phantomsToSpawn = phantomsToSpawn; } + @Override + public Result getResult() { + return result; + } + /** * The result of this event controls if phantoms will be spawned.
    *

      @@ -56,6 +65,6 @@ public final class PlayerSpawnPhantomsEvent extends PlayerEvent { */ @Override public void setResult(@NotNull Result result) { - super.setResult(result); + this.result = result; } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerWakeUpEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerWakeUpEvent.java index 16843882a3..6792cb33c7 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerWakeUpEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerWakeUpEvent.java @@ -6,20 +6,20 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.player.Player; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * This event is fired when the player is waking up.
      * This is merely for purposes of listening for this to happen.
      * There is nothing that can be manipulated with this event. */ -public final class PlayerWakeUpEvent extends PlayerEvent -{ - private final boolean wakeImmediately; +public final class PlayerWakeUpEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerWakeUpEvent.class); + private final boolean wakeImmediately; private final boolean updateLevel; - public PlayerWakeUpEvent(Player player, boolean wakeImmediately, boolean updateLevel) - { + public PlayerWakeUpEvent(Player player, boolean wakeImmediately, boolean updateLevel) { super(player); this.wakeImmediately = wakeImmediately; this.updateLevel = updateLevel; diff --git a/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java b/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java index 04b5c896f9..1b1213967b 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/PlayerXpEvent.java @@ -8,7 +8,9 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.ExperienceOrb; import net.minecraft.world.entity.player.Player; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * PlayerXpEvent is fired whenever an event involving player experience occurs.
      @@ -18,6 +20,8 @@ import net.minecraftforge.eventbus.api.Cancelable; * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}. */ public sealed class PlayerXpEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(PlayerXpEvent.class); + public PlayerXpEvent(Player player) { super(player); } @@ -26,8 +30,9 @@ public sealed class PlayerXpEvent extends PlayerEvent { * This event is fired after the player collides with an experience orb, but before the player has been given the experience. * It can be cancelled, and no further processing will be done. */ - @Cancelable - public static final class PickupXp extends PlayerXpEvent { + public static final class PickupXp extends PlayerXpEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(PickupXp.class); + private final ExperienceOrb orb; public PickupXp(Player player, ExperienceOrb orb) { @@ -44,8 +49,9 @@ public sealed class PlayerXpEvent extends PlayerEvent { * This event is fired when the player's experience changes through the {@link Player#giveExperiencePoints(int)} method. * It can be cancelled, and no further processing will be done. */ - @Cancelable - public static final class XpChange extends PlayerXpEvent { + public static final class XpChange extends PlayerXpEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(XpChange.class); + private int amount; public XpChange(Player player, int amount) { @@ -66,8 +72,9 @@ public sealed class PlayerXpEvent extends PlayerEvent { * This event is fired when the player's experience level changes through the {@link Player#giveExperienceLevels(int)} method. * It can be cancelled, and no further processing will be done. */ - @Cancelable - public static final class LevelChange extends PlayerXpEvent { + public static final class LevelChange extends PlayerXpEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(LevelChange.class); + private int levels; public LevelChange(Player player, int levels) { diff --git a/src/main/java/net/minecraftforge/event/entity/player/SleepingLocationCheckEvent.java b/src/main/java/net/minecraftforge/event/entity/player/SleepingLocationCheckEvent.java index 176f555b28..e7e7f6a648 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/SleepingLocationCheckEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/SleepingLocationCheckEvent.java @@ -11,8 +11,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import net.minecraftforge.event.entity.living.LivingEvent; -import net.minecraftforge.eventbus.api.Event.HasResult; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * This event is fired when game checks, if sleeping player should be still considered "in bed".
      @@ -23,20 +25,28 @@ import net.minecraftforge.eventbus.api.Event.HasResult; * setResult(ALLOW) informs game that player is still "in bed"
      * setResult(DEFAULT) causes game to check {@link Block#isBed(BlockState, BlockGetter, BlockPos, Entity)} instead */ -@HasResult -public final class SleepingLocationCheckEvent extends LivingEvent -{ +public final class SleepingLocationCheckEvent extends LivingEvent implements HasResult { + public static final EventBus BUS = EventBus.create(SleepingLocationCheckEvent.class); private final BlockPos sleepingLocation; + private Result result = Result.DEFAULT; - public SleepingLocationCheckEvent(LivingEntity player, BlockPos sleepingLocation) - { + public SleepingLocationCheckEvent(LivingEntity player, BlockPos sleepingLocation) { super(player); this.sleepingLocation = sleepingLocation; } - public BlockPos getSleepingLocation() - { + public BlockPos getSleepingLocation() { return sleepingLocation; } + + @Override + public Result getResult() { + return result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/SleepingTimeCheckEvent.java b/src/main/java/net/minecraftforge/event/entity/player/SleepingTimeCheckEvent.java index 28f7ed012b..b5b42807a3 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/SleepingTimeCheckEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/SleepingTimeCheckEvent.java @@ -8,7 +8,9 @@ package net.minecraftforge.event.entity.player; import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.minecraftforge.eventbus.api.Event.HasResult; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; +import net.minecraftforge.eventbus.api.bus.EventBus; import java.util.Optional; @@ -21,13 +23,13 @@ import java.util.Optional; * setResult(ALLOW) informs game that player can sleep at this time.
      * setResult(DEFAULT) causes game to check !{@link Level#isDay()} instead. */ -@HasResult -public final class SleepingTimeCheckEvent extends PlayerEvent -{ - private final Optional sleepingLocation; +public final class SleepingTimeCheckEvent extends PlayerEvent implements HasResult { + public static final EventBus BUS = EventBus.create(SleepingTimeCheckEvent.class); - public SleepingTimeCheckEvent(Player player, Optional sleepingLocation) - { + private final Optional sleepingLocation; + private Result result = Result.DEFAULT; + + public SleepingTimeCheckEvent(Player player, Optional sleepingLocation) { super(player); this.sleepingLocation = sleepingLocation; } @@ -36,8 +38,17 @@ public final class SleepingTimeCheckEvent extends PlayerEvent * Note that the sleeping location may be an approximated one. * @return The player's sleeping location. */ - public Optional getSleepingLocation() - { + public Optional getSleepingLocation() { return sleepingLocation; } + + @Override + public Result getResult() { + return this.result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } diff --git a/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java b/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java index 9a130d3301..04885497de 100644 --- a/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java +++ b/src/main/java/net/minecraftforge/event/entity/player/TradeWithVillagerEvent.java @@ -9,7 +9,7 @@ import net.minecraft.world.entity.npc.AbstractVillager; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.trading.MerchantOffer; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.ApiStatus; /** @@ -20,14 +20,14 @@ import org.jetbrains.annotations.ApiStatus; *

      This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}, * only on the {@linkplain LogicalSide#SERVER logical server}.

      */ -public final class TradeWithVillagerEvent extends PlayerEvent -{ +public final class TradeWithVillagerEvent extends PlayerEvent { + public static final EventBus BUS = EventBus.create(TradeWithVillagerEvent.class); + private final MerchantOffer offer; private final AbstractVillager abstractVillager; @ApiStatus.Internal - public TradeWithVillagerEvent(Player player, MerchantOffer offer, AbstractVillager abstractVillager) - { + public TradeWithVillagerEvent(Player player, MerchantOffer offer, AbstractVillager abstractVillager) { super(player); this.offer = offer; this.abstractVillager = abstractVillager; @@ -36,16 +36,14 @@ public final class TradeWithVillagerEvent extends PlayerEvent /** * {@return the {@link MerchantOffer} selected by the player to trade with} */ - public MerchantOffer getMerchantOffer() - { + public MerchantOffer getMerchantOffer() { return offer; } /** * {@return the villager the player traded with} */ - public AbstractVillager getAbstractVillager() - { + public AbstractVillager getAbstractVillager() { return abstractVillager; } } \ No newline at end of file diff --git a/src/main/java/net/minecraftforge/event/furnace/FurnaceFuelBurnTimeEvent.java b/src/main/java/net/minecraftforge/event/furnace/FurnaceFuelBurnTimeEvent.java index 7382d2775f..3bdcd7894b 100644 --- a/src/main/java/net/minecraftforge/event/furnace/FurnaceFuelBurnTimeEvent.java +++ b/src/main/java/net/minecraftforge/event/furnace/FurnaceFuelBurnTimeEvent.java @@ -8,10 +8,10 @@ package net.minecraftforge.event.furnace; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.ForgeEventFactory; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -22,23 +22,18 @@ import org.jetbrains.annotations.Nullable; *
      * This event is fired from {@link ForgeEventFactory#getItemBurnTime(ItemStack, int, RecipeType)}.
      *
      - * This event is {@link Cancelable} to prevent later handlers from changing the value.
      - *
      - * This event does not have a result. {@link HasResult}
      - *
      - * This event is fired on the {@link MinecraftForge#EVENT_BUS}. + * This event is {@link Cancellable} to prevent later handlers from changing the value. **/ -@Cancelable -public final class FurnaceFuelBurnTimeEvent extends Event -{ +public final class FurnaceFuelBurnTimeEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(FurnaceFuelBurnTimeEvent.class); + @NotNull private final ItemStack itemStack; @Nullable private final RecipeType recipeType; private int burnTime; - public FurnaceFuelBurnTimeEvent(@NotNull ItemStack itemStack, int burnTime, @Nullable RecipeType recipeType) - { + public FurnaceFuelBurnTimeEvent(@NotNull ItemStack itemStack, int burnTime, @Nullable RecipeType recipeType) { this.itemStack = itemStack; this.burnTime = burnTime; this.recipeType = recipeType; @@ -48,8 +43,7 @@ public final class FurnaceFuelBurnTimeEvent extends Event * Get the ItemStack "fuel" in question. */ @NotNull - public ItemStack getItemStack() - { + public ItemStack getItemStack() { return itemStack; } @@ -58,8 +52,7 @@ public final class FurnaceFuelBurnTimeEvent extends Event * Get the recipe type for which to obtain the burn time, if known. */ @Nullable - public RecipeType getRecipeType() - { + public RecipeType getRecipeType() { return recipeType; } @@ -67,12 +60,9 @@ public final class FurnaceFuelBurnTimeEvent extends Event * Set the burn time for the given ItemStack. * Setting it to 0 will prevent the item from being used as fuel, overriding vanilla's decision. */ - public void setBurnTime(int burnTime) - { - if (burnTime >= 0) - { + public void setBurnTime(int burnTime) { + if (burnTime >= 0) { this.burnTime = burnTime; - setCanceled(true); } } @@ -80,8 +70,7 @@ public final class FurnaceFuelBurnTimeEvent extends Event * The resulting value of this event, the burn time for the ItemStack. * A value of 0 will prevent the item from being used as fuel, overriding vanilla's decision. */ - public int getBurnTime() - { + public int getBurnTime() { return burnTime; } } diff --git a/src/main/java/net/minecraftforge/event/level/AlterGroundEvent.java b/src/main/java/net/minecraftforge/event/level/AlterGroundEvent.java index 97a204bea4..c7d2edfdda 100644 --- a/src/main/java/net/minecraftforge/event/level/AlterGroundEvent.java +++ b/src/main/java/net/minecraftforge/event/level/AlterGroundEvent.java @@ -11,8 +11,8 @@ import net.minecraft.world.level.LevelSimulatedReader; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import org.jetbrains.annotations.ApiStatus; /** @@ -24,7 +24,9 @@ import org.jetbrains.annotations.ApiStatus; * This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus} * only on the {@linkplain net.minecraftforge.fml.LogicalSide#SERVER logical server}. */ -public final class AlterGroundEvent extends Event { +public final class AlterGroundEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(AlterGroundEvent.class); + private final LevelSimulatedReader level; private final RandomSource random; private final BlockPos pos; diff --git a/src/main/java/net/minecraftforge/event/level/BlockEvent.java b/src/main/java/net/minecraftforge/event/level/BlockEvent.java index 4332a93eeb..6a77e72f47 100644 --- a/src/main/java/net/minecraftforge/event/level/BlockEvent.java +++ b/src/main/java/net/minecraftforge/event/level/BlockEvent.java @@ -27,14 +27,22 @@ import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.common.ToolAction; import net.minecraftforge.common.ToolActions; import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.common.util.HasResult; +import net.minecraftforge.common.util.Result; import com.google.common.collect.ImmutableList; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.RecordEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class BlockEvent extends Event { +public class BlockEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(BlockEvent.class); + private static final boolean DEBUG = Boolean.parseBoolean(System.getProperty("forge.debugBlockEvent", "false")); private final LevelAccessor level; @@ -61,17 +69,20 @@ public class BlockEvent extends Event { /** * Event that is fired when an Block is about to be broken by a player - * Canceling this event will prevent the Block from being broken. + * Setting the result to {@link Result#DENY} will prevent the Block from being broken. */ - @Cancelable - public static final class BreakEvent extends BlockEvent { + public static final class BreakEvent extends BlockEvent implements Cancellable, HasResult { + public static final CancellableEventBus BUS = CancellableEventBus.create(BreakEvent.class); + /** Reference to the Player who broke the block. If no player is available, use a EntityFakePlayer */ private final Player player; private int exp; + private Result result; - public BreakEvent(Level level, BlockPos pos, BlockState state, Player player) { + public BreakEvent(Level level, BlockPos pos, BlockState state, Player player, Result result) { super(level, pos, state); this.player = player; + this.result = result; if (state == null || !ForgeHooks.isCorrectToolForDrops(state, player)) { // Handle empty block or player unable to break block scenario this.exp = 0; @@ -91,10 +102,10 @@ public class BlockEvent extends Event { /** * Get the experience dropped by the block after the event has processed * - * @return The experience to drop or 0 if the event was canceled + * @return The experience to drop or 0 if the event was denied */ public int getExpToDrop() { - return this.isCanceled() ? 0 : exp; + return this.getResult().isDenied() ? 0 : exp; } /** @@ -105,6 +116,16 @@ public class BlockEvent extends Event { public void setExpToDrop(int exp) { this.exp = exp; } + + @Override + public Result getResult() { + return this.result; + } + + @Override + public void setResult(Result result) { + this.result = result; + } } /** @@ -112,8 +133,9 @@ public class BlockEvent extends Event { * * If a Block Place event is cancelled, the block will not be placed. */ - @Cancelable - public static sealed class EntityPlaceEvent extends BlockEvent { + public static sealed class EntityPlaceEvent extends BlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityPlaceEvent.class); + private final Entity entity; private final BlockSnapshot blockSnapshot; private final BlockState placedBlock; @@ -145,8 +167,9 @@ public class BlockEvent extends Event { * the placed block would exist if the placement only affected a single * block. */ - @Cancelable - public static final class EntityMultiPlaceEvent extends EntityPlaceEvent { + public static final class EntityMultiPlaceEvent extends EntityPlaceEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(EntityMultiPlaceEvent.class); + private final List blockSnapshots; public EntityMultiPlaceEvent(@NotNull List blockSnapshots, @NotNull BlockState placedAgainst, @Nullable Entity entity) { @@ -173,8 +196,9 @@ public class BlockEvent extends Event { * a way for mods to detect physics updates, in the same way a BUD switch * does. This event is only called on the server. */ - @Cancelable - public static final class NeighborNotifyEvent extends BlockEvent { + public static final class NeighborNotifyEvent extends BlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(NeighborNotifyEvent.class); + private final EnumSet notifiedSides; private final boolean forceRedstoneUpdate; @@ -208,28 +232,11 @@ public class BlockEvent extends Event { * usually doesn't do that (like lava), and a result of DENY prevents creation * even if the liquid usually does do that (like water). */ - @HasResult - public static final class CreateFluidSourceEvent extends Event { - private final Level level; - private final BlockPos pos; - private final BlockState state; + public record CreateFluidSourceEvent(Level getLevel, BlockPos getPos, BlockState getState, Result.Holder resultHolder) implements RecordEvent, HasResult.Record { + public static final EventBus BUS = EventBus.create(CreateFluidSourceEvent.class); public CreateFluidSourceEvent(Level level, BlockPos pos, BlockState state) { - this.level = level; - this.pos = pos; - this.state = state; - } - - public Level getLevel() { - return level; - } - - public BlockPos getPos() { - return pos; - } - - public BlockState getState() { - return state; + this(level, pos, state, new Result.Holder()); } } @@ -241,8 +248,9 @@ public class BlockEvent extends Event { * {@link #getState()} will return the block that was originally going to be placed. * {@link #getPos()} will return the position of the block to be changed. */ - @Cancelable - public static final class FluidPlaceBlockEvent extends BlockEvent { + public static final class FluidPlaceBlockEvent extends BlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(FluidPlaceBlockEvent.class); + private final BlockPos liquidPos; private BlockState newState; private final BlockState origState; @@ -285,6 +293,8 @@ public class BlockEvent extends Event { * */ public static sealed class CropGrowEvent extends BlockEvent { + public static final EventBus BUS = EventBus.create(CropGrowEvent.class); + public CropGrowEvent(Level level, BlockPos pos, BlockState state) { super(level, pos, state); } @@ -300,11 +310,24 @@ public class BlockEvent extends Event { * This event is not {@link Cancelable}.
      *
      */ - @HasResult - public static final class Pre extends CropGrowEvent { + public static final class Pre extends CropGrowEvent implements HasResult { + public static final EventBus
       BUS = EventBus.create(Pre.class);
      +
      +            private Result result = Result.DEFAULT;
      +
                   public Pre(Level level, BlockPos pos, BlockState state) {
                       super(level, pos, state);
                   }
      +
      +            @Override
      +            public Result getResult() {
      +                return result;
      +            }
      +
      +            @Override
      +            public void setResult(Result result) {
      +                this.result = result;
      +            }
               }
       
               /**
      @@ -317,6 +340,8 @@ public class BlockEvent extends Event {
                * This event does not have a result. {@link HasResult}
      */ public static final class Post extends CropGrowEvent { + public static final EventBus BUS = EventBus.create(Post.class); + private final BlockState originalState; public Post(Level level, BlockPos pos, BlockState original, BlockState state) { @@ -334,8 +359,9 @@ public class BlockEvent extends Event { * Fired when when farmland gets trampled * This event is {@link Cancelable} */ - @Cancelable - public static final class FarmlandTrampleEvent extends BlockEvent { + public static final class FarmlandTrampleEvent extends BlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(FarmlandTrampleEvent.class); + private final Entity entity; private final double fallDistance; @@ -360,8 +386,9 @@ public class BlockEvent extends Event { * * If cancelled, the portal will not be spawned. */ - @Cancelable - public static final class PortalSpawnEvent extends BlockEvent { + public static final class PortalSpawnEvent extends BlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(PortalSpawnEvent.class); + private final PortalShape size; public PortalSpawnEvent(LevelAccessor level, BlockPos pos, BlockState state, PortalShape size) { @@ -384,8 +411,9 @@ public class BlockEvent extends Event { * This event is {@link Cancelable}. If canceled, this will prevent the tool * from changing the block's state. */ - @Cancelable - public static final class BlockToolModificationEvent extends BlockEvent { + public static final class BlockToolModificationEvent extends BlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(BlockToolModificationEvent.class); + private final UseOnContext context; private final ToolAction toolAction; private final boolean simulate; diff --git a/src/main/java/net/minecraftforge/event/level/ChunkDataEvent.java b/src/main/java/net/minecraftforge/event/level/ChunkDataEvent.java index 70d2f96abf..6f2a3e3ca1 100644 --- a/src/main/java/net/minecraftforge/event/level/ChunkDataEvent.java +++ b/src/main/java/net/minecraftforge/event/level/ChunkDataEvent.java @@ -13,8 +13,7 @@ import net.minecraft.world.level.chunk.status.ChunkType; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.storage.SerializableChunkData; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * ChunkDataEvent is fired when an event involving chunk data occurs.
      @@ -26,6 +25,8 @@ import net.minecraftforge.eventbus.api.Event; * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public sealed class ChunkDataEvent extends ChunkEvent { + public static final EventBus BUS = EventBus.create(ChunkDataEvent.class); + private final SerializableChunkData data; public ChunkDataEvent(ChunkAccess chunk, SerializableChunkData data) { @@ -46,14 +47,10 @@ public sealed class ChunkDataEvent extends ChunkEvent { * ChunkDataEvent.Load is fired when vanilla Minecraft attempts to load Chunk data.
      * This event is fired during chunk loading in * {@link ChunkSerializer#read(ServerLevel, PoiManager, ChunkPos, SerializableChunkData)} which means it is async, so be careful.
      - *
      - * This event is not {@link Cancelable}.
      - *
      - * This event does not have a result. {@link HasResult}
      - *
      - * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public static final class Load extends ChunkDataEvent { + public static final EventBus BUS = EventBus.create(ChunkDataEvent.Load.class); + private final ChunkType status; public Load(ChunkAccess chunk, SerializableChunkData data, ChunkType status) { @@ -70,14 +67,10 @@ public sealed class ChunkDataEvent extends ChunkEvent { * ChunkDataEvent.Save is fired when vanilla Minecraft attempts to save Chunk data.
      * This event is fired during chunk saving in * {@code ChunkMap#save(ChunkAccess)}.
      - *
      - * This event is not {@link Cancelable}.
      - *
      - * This event does not have a result. {@link HasResult}
      - *
      - * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public static final class Save extends ChunkDataEvent { + public static final EventBus BUS = EventBus.create(ChunkDataEvent.Save.class); + public Save(ChunkAccess chunk, LevelAccessor world, SerializableChunkData data) { super(chunk, world, data); } diff --git a/src/main/java/net/minecraftforge/event/level/ChunkEvent.java b/src/main/java/net/minecraftforge/event/level/ChunkEvent.java index ff198effb1..2e5d0175a2 100644 --- a/src/main/java/net/minecraftforge/event/level/ChunkEvent.java +++ b/src/main/java/net/minecraftforge/event/level/ChunkEvent.java @@ -9,8 +9,7 @@ import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; import org.jetbrains.annotations.ApiStatus; /** @@ -23,6 +22,8 @@ import org.jetbrains.annotations.ApiStatus; * All children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public class ChunkEvent extends LevelEvent { + public static final EventBus BUS = EventBus.create(ChunkEvent.class); + private final ChunkAccess chunk; public ChunkEvent(ChunkAccess chunk) { @@ -53,6 +54,8 @@ public class ChunkEvent extends LevelEvent { * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public static final class Load extends ChunkEvent { + public static final EventBus BUS = EventBus.create(ChunkEvent.Load.class); + private final boolean newChunk; @ApiStatus.Internal @@ -85,14 +88,16 @@ public class ChunkEvent extends LevelEvent { * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public static final class Unload extends ChunkEvent { + public static final EventBus BUS = EventBus.create(ChunkEvent.Unload.class); + public Unload(ChunkAccess chunk) { super(chunk); } } - + /** * ChunkEvent.LightingCalculated is fired when MinecraftForge flags that lighting is correct in a chunk.
      - * This event is fired during light propagation in ThreadedLevelLightEngine.CompletableFuture(), specifically upon setting + * This event is fired during light propagation in ThreadedLevelLightEngine.CompletableFuture(), specifically upon setting * the ChunkAccess isLightCorrect to true.
      *
      * The game test for this event is lighting_event_test in net.minecraftforge.debug.chunk
      @@ -104,6 +109,8 @@ public class ChunkEvent extends LevelEvent { * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      **/ public static final class LightingCalculated extends ChunkEvent { + public static final EventBus BUS = EventBus.create(ChunkEvent.LightingCalculated.class); + public LightingCalculated(ChunkAccess chunk) { super(chunk); } diff --git a/src/main/java/net/minecraftforge/event/level/ChunkTicketLevelUpdatedEvent.java b/src/main/java/net/minecraftforge/event/level/ChunkTicketLevelUpdatedEvent.java index d7213f1e71..14665a3703 100644 --- a/src/main/java/net/minecraftforge/event/level/ChunkTicketLevelUpdatedEvent.java +++ b/src/main/java/net/minecraftforge/event/level/ChunkTicketLevelUpdatedEvent.java @@ -8,8 +8,8 @@ package net.minecraftforge.event.level; import net.minecraft.server.level.ChunkHolder; import net.minecraft.server.level.ServerLevel; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.Nullable; @@ -29,8 +29,9 @@ import org.jetbrains.annotations.Nullable; * This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus} * only on the {@linkplain LogicalSide#SERVER logical server}. **/ -public final class ChunkTicketLevelUpdatedEvent extends Event -{ +public final class ChunkTicketLevelUpdatedEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(ChunkTicketLevelUpdatedEvent.class); + private final ServerLevel level; private final long chunkPos; private final int oldTicketLevel; @@ -38,8 +39,7 @@ public final class ChunkTicketLevelUpdatedEvent extends Event @Nullable private final ChunkHolder chunkHolder; - public ChunkTicketLevelUpdatedEvent(ServerLevel level, long chunkPos, int oldTicketLevel, int newTicketLevel, @Nullable ChunkHolder chunkHolder) - { + public ChunkTicketLevelUpdatedEvent(ServerLevel level, long chunkPos, int oldTicketLevel, int newTicketLevel, @Nullable ChunkHolder chunkHolder) { this.level = level; this.chunkPos = chunkPos; this.oldTicketLevel = oldTicketLevel; @@ -50,32 +50,28 @@ public final class ChunkTicketLevelUpdatedEvent extends Event /** * {@return the server level containing the chunk} */ - public ServerLevel getLevel() - { + public ServerLevel getLevel() { return this.level; } /** * {@return the long representation of the chunk position the ticket level changed for} */ - public long getChunkPos() - { + public long getChunkPos() { return this.chunkPos; } /** * {@return the previous ticket level the chunk had} */ - public int getOldTicketLevel() - { + public int getOldTicketLevel() { return this.oldTicketLevel; } /** * {@return the new ticket level for the chunk} */ - public int getNewTicketLevel() - { + public int getNewTicketLevel() { return this.newTicketLevel; } @@ -83,8 +79,7 @@ public final class ChunkTicketLevelUpdatedEvent extends Event * {@return chunk that had its ticket level updated} */ @Nullable - public ChunkHolder getChunkHolder() - { + public ChunkHolder getChunkHolder() { return this.chunkHolder; } } diff --git a/src/main/java/net/minecraftforge/event/level/ChunkWatchEvent.java b/src/main/java/net/minecraftforge/event/level/ChunkWatchEvent.java index 03774b244b..710ebe271f 100644 --- a/src/main/java/net/minecraftforge/event/level/ChunkWatchEvent.java +++ b/src/main/java/net/minecraftforge/event/level/ChunkWatchEvent.java @@ -10,8 +10,9 @@ import net.minecraft.world.level.ChunkPos; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.fml.LogicalSide; /** @@ -25,7 +26,9 @@ import net.minecraftforge.fml.LogicalSide; * This event is fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus} * only on the {@linkplain LogicalSide#SERVER logical server}. **/ -public sealed class ChunkWatchEvent extends Event { +public sealed class ChunkWatchEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(ChunkWatchEvent.class); + private final ServerLevel level; private final ServerPlayer player; private final ChunkPos pos; @@ -68,6 +71,8 @@ public sealed class ChunkWatchEvent extends Event { * only on the {@linkplain LogicalSide#SERVER logical server}. **/ public static final class Watch extends ChunkWatchEvent { + public static final EventBus BUS = EventBus.create(Watch.class); + private final LevelChunk chunk; public Watch(ServerPlayer player, LevelChunk chunk, ServerLevel level) { @@ -89,6 +94,8 @@ public sealed class ChunkWatchEvent extends Event { * only on the {@linkplain LogicalSide#SERVER logical server}. **/ public static final class UnWatch extends ChunkWatchEvent { + public static final EventBus BUS = EventBus.create(UnWatch.class); + public UnWatch(ServerPlayer player, ChunkPos pos, ServerLevel level) { super(player, pos, level); } diff --git a/src/main/java/net/minecraftforge/event/level/ExplosionEvent.java b/src/main/java/net/minecraftforge/event/level/ExplosionEvent.java index 892ed3f30e..10e7feae3e 100644 --- a/src/main/java/net/minecraftforge/event/level/ExplosionEvent.java +++ b/src/main/java/net/minecraftforge/event/level/ExplosionEvent.java @@ -8,12 +8,15 @@ package net.minecraftforge.event.level; import java.util.List; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; import net.minecraft.world.entity.Entity; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** ExplosionEvent triggers when an explosion happens in the level.
      *
      @@ -25,7 +28,9 @@ import net.minecraft.world.level.Level; * Children do not use {@link HasResult}.
      * Children of this event are fired on the {@link MinecraftForge#EVENT_BUS}.
      */ -public sealed class ExplosionEvent extends Event { +public sealed class ExplosionEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(ExplosionEvent.class); + private final Level level; private final Explosion explosion; @@ -48,8 +53,9 @@ public sealed class ExplosionEvent extends Event { * This event does not use {@link HasResult}.
      * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      */ - @Cancelable - public static final class Start extends ExplosionEvent { + public static final class Start extends ExplosionEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Start.class); + public Start(Level level, Explosion explosion) { super(level, explosion); } @@ -62,6 +68,8 @@ public sealed class ExplosionEvent extends Event { * This event is fired on the {@link MinecraftForge#EVENT_BUS}.
      */ public static final class Detonate extends ExplosionEvent { + public static final EventBus BUS = EventBus.create(Detonate.class); + private final List blocks; private final List entityList; diff --git a/src/main/java/net/minecraftforge/event/level/LevelEvent.java b/src/main/java/net/minecraftforge/event/level/LevelEvent.java index cddd8311b4..19e46902ec 100644 --- a/src/main/java/net/minecraftforge/event/level/LevelEvent.java +++ b/src/main/java/net/minecraftforge/event/level/LevelEvent.java @@ -27,8 +27,11 @@ import net.minecraft.world.level.biome.MobSpawnSettings; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import net.minecraftforge.fml.LogicalSide; import org.jetbrains.annotations.UnmodifiableView; @@ -37,7 +40,9 @@ import org.jetbrains.annotations.UnmodifiableView; *

      * All children of this event are fired on the {@linkplain MinecraftForge#EVENT_BUS main Forge event bus}. */ -public class LevelEvent extends Event { +public class LevelEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(LevelEvent.class); + private final LevelAccessor level; public LevelEvent(LevelAccessor level) { @@ -62,6 +67,8 @@ public class LevelEvent extends Event { * on both logical sides. **/ public static final class Load extends LevelEvent { + public static final EventBus BUS = EventBus.create(Load.class); + public Load(LevelAccessor level) { super(level); } } @@ -78,6 +85,8 @@ public class LevelEvent extends Event { * on both logical sides. **/ public static final class Unload extends LevelEvent { + public static final EventBus BUS = EventBus.create(Unload.class); + public Unload(LevelAccessor level) { super(level); } } @@ -92,6 +101,8 @@ public class LevelEvent extends Event { * only on the {@linkplain LogicalSide#SERVER logical server}. **/ public static final class Save extends LevelEvent { + public static final EventBus BUS = EventBus.create(Save.class); + public Save(LevelAccessor level) { super(level); } } @@ -107,8 +118,9 @@ public class LevelEvent extends Event { * * @see ServerLevelData#isInitialized() */ - @Cancelable - public static final class CreateSpawnPosition extends LevelEvent { + public static final class CreateSpawnPosition extends LevelEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(CreateSpawnPosition.class); + private final ServerLevelData settings; public CreateSpawnPosition(LevelAccessor level, ServerLevelData settings) { @@ -132,8 +144,9 @@ public class LevelEvent extends Event { *

      This event is {@linkplain Cancelable cancellable}, and does not {@linkplain HasResult have a result}. * Canceling the event will result in an empty list, meaning no entity will be spawned.

      */ - @Cancelable - public static final class PotentialSpawns extends LevelEvent { + public static final class PotentialSpawns extends LevelEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(PotentialSpawns.class); + private final MobCategory mobcategory; private final BlockPos pos; private final List> list; diff --git a/src/main/java/net/minecraftforge/event/level/NoteBlockEvent.java b/src/main/java/net/minecraftforge/event/level/NoteBlockEvent.java index 00194da9cd..7971802775 100644 --- a/src/main/java/net/minecraftforge/event/level/NoteBlockEvent.java +++ b/src/main/java/net/minecraftforge/event/level/NoteBlockEvent.java @@ -9,15 +9,18 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.minecraftforge.eventbus.api.Cancelable; import com.google.common.base.Preconditions; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * Base class for Noteblock Events - * */ -public sealed class NoteBlockEvent extends BlockEvent { +public sealed abstract class NoteBlockEvent extends BlockEvent { + public static final EventBus BUS = EventBus.create(NoteBlockEvent.class); + private int noteId; protected NoteBlockEvent(Level world, BlockPos pos, BlockState state, int note) { @@ -64,8 +67,9 @@ public sealed class NoteBlockEvent extends BlockEvent { * Fired when a Noteblock plays it's note. You can override the note and instrument * Canceling this event will stop the note from playing. */ - @Cancelable - public static final class Play extends NoteBlockEvent { + public static final class Play extends NoteBlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Play.class); + private NoteBlockInstrument instrument; public Play(Level world, BlockPos pos, BlockState state, int note, NoteBlockInstrument instrument) { @@ -86,8 +90,9 @@ public sealed class NoteBlockEvent extends BlockEvent { * Fired when a Noteblock is changed. You can adjust the note it will change to via {@link #setNote(Note, Octave)}. * Canceling this event will not change the note and also stop the Noteblock from playing it's note. */ - @Cancelable - public static final class Change extends NoteBlockEvent { + public static final class Change extends NoteBlockEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(Change.class); + private final Note oldNote; private final Octave oldOctave; diff --git a/src/main/java/net/minecraftforge/event/level/PistonEvent.java b/src/main/java/net/minecraftforge/event/level/PistonEvent.java index 63859c09ac..ffa09f63bb 100644 --- a/src/main/java/net/minecraftforge/event/level/PistonEvent.java +++ b/src/main/java/net/minecraftforge/event/level/PistonEvent.java @@ -9,14 +9,16 @@ import net.minecraft.world.level.block.piston.PistonStructureResolver; import net.minecraft.core.Direction; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.minecraftforge.eventbus.api.Cancelable; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; import org.jetbrains.annotations.Nullable; /** * Base piston event, use {@link PistonEvent.Post} and {@link PistonEvent.Pre} */ -public abstract sealed class PistonEvent extends BlockEvent -{ +public abstract sealed class PistonEvent extends BlockEvent { + public static final EventBus BUS = EventBus.create(PistonEvent.class); private final Direction direction; private final PistonMoveType moveType; @@ -25,8 +27,7 @@ public abstract sealed class PistonEvent extends BlockEvent * @param pos - The position of the piston * @param direction - The move direction of the piston */ - public PistonEvent(Level world, BlockPos pos, Direction direction, PistonMoveType moveType) - { + public PistonEvent(Level world, BlockPos pos, Direction direction, PistonMoveType moveType) { super(world, pos, world.getBlockState(pos)); this.direction = direction; this.moveType = moveType; @@ -35,24 +36,21 @@ public abstract sealed class PistonEvent extends BlockEvent /** * @return The direction of the piston block */ - public Direction getDirection() - { + public Direction getDirection() { return this.direction; } /** * Helper method that gets the piston position offset by its facing */ - public BlockPos getFaceOffsetPos() - { + public BlockPos getFaceOffsetPos() { return this.getPos().relative(direction); } /** * @return The movement type of the piston (extension, retraction) */ - public PistonMoveType getPistonMoveType() - { + public PistonMoveType getPistonMoveType() { return moveType; } @@ -60,9 +58,8 @@ public abstract sealed class PistonEvent extends BlockEvent * @return A piston structure helper for this movement. Returns null if the world stored is not a {@link Level} */ @Nullable - public PistonStructureResolver getStructureHelper() - { - if(this.getLevel() instanceof Level) { + public PistonStructureResolver getStructureHelper() { + if (this.getLevel() instanceof Level) { return new PistonStructureResolver((Level) this.getLevel(), this.getPos(), this.getDirection(), this.getPistonMoveType().isExtend); } else { return null; @@ -72,33 +69,29 @@ public abstract sealed class PistonEvent extends BlockEvent /** * Fires after the piston has moved and set surrounding states. This will not fire if {@link PistonEvent.Pre} is cancelled. */ - public static final class Post extends PistonEvent - { + public static final class Post extends PistonEvent { + public static final EventBus BUS = EventBus.create(Post.class); - public Post(Level world, BlockPos pos, Direction direction, PistonMoveType moveType) - { + public Post(Level world, BlockPos pos, Direction direction, PistonMoveType moveType) { super(world, pos, direction, moveType); } - } /** * Fires before the piston has updated block states. Cancellation prevents movement. */ - @Cancelable - public static final class Pre extends PistonEvent - { + public static final class Pre extends PistonEvent implements Cancellable { + public static final CancellableEventBus
       BUS = CancellableEventBus.create(Pre.class);
       
      -        public Pre(Level world, BlockPos pos, Direction direction, PistonMoveType moveType)
      -        {
      +        public Pre(Level world, BlockPos pos, Direction direction, PistonMoveType moveType) {
                   super(world, pos, direction, moveType);
               }
       
           }
       
      -    public static enum PistonMoveType
      -    {
      -        EXTEND(true), RETRACT(false);
      +    public enum PistonMoveType {
      +        EXTEND(true),
      +        RETRACT(false);
       
               public final boolean isExtend;
       
      @@ -107,5 +100,4 @@ public abstract sealed class PistonEvent extends BlockEvent
                   this.isExtend = isExtend;
               }
           }
      -
       }
      diff --git a/src/main/java/net/minecraftforge/event/level/SaplingGrowTreeEvent.java b/src/main/java/net/minecraftforge/event/level/SaplingGrowTreeEvent.java
      index 92efe14614..7cf1b5d4e9 100644
      --- a/src/main/java/net/minecraftforge/event/level/SaplingGrowTreeEvent.java
      +++ b/src/main/java/net/minecraftforge/event/level/SaplingGrowTreeEvent.java
      @@ -13,8 +13,9 @@ import net.minecraft.util.RandomSource;
       import net.minecraft.world.level.LevelAccessor;
       import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
       import net.minecraftforge.common.MinecraftForge;
      -import net.minecraftforge.eventbus.api.Cancelable;
      -import net.minecraftforge.eventbus.api.Event.HasResult;
      +import net.minecraftforge.common.util.HasResult;
      +import net.minecraftforge.common.util.Result;
      +import net.minecraftforge.eventbus.api.bus.EventBus;
       import org.jetbrains.annotations.Nullable;
       
       /**
      @@ -29,13 +30,15 @@ import org.jetbrains.annotations.Nullable;
        * only on the {@linkplain net.minecraftforge.fml.LogicalSide#SERVER logical server}.
        */
       // TODO: Rename to BlockFeatureGrowEvent in 1.20
      -@HasResult
       @Deprecated(forRemoval = true, since = "1.21.1") // Dont remove, rename
      -public final class SaplingGrowTreeEvent extends LevelEvent {
      +public final class SaplingGrowTreeEvent extends LevelEvent implements HasResult {
      +    public static final EventBus BUS = EventBus.create(SaplingGrowTreeEvent.class);
      +
           private final RandomSource randomSource;
           private final BlockPos pos;
           @Nullable
           private Holder> feature;
      +    private Result result = Result.DEFAULT;
       
           public SaplingGrowTreeEvent(LevelAccessor level, RandomSource randomSource, BlockPos pos, @Nullable Holder> feature) {
               super(level);
      @@ -79,4 +82,14 @@ public final class SaplingGrowTreeEvent extends LevelEvent {
           public void setFeature(ResourceKey> featureKey) {
               this.feature = this.getLevel().registryAccess().lookupOrThrow(Registries.CONFIGURED_FEATURE).get(featureKey).orElse(null);
           }
      +
      +    @Override
      +    public Result getResult() {
      +        return result;
      +    }
      +
      +    @Override
      +    public void setResult(Result result) {
      +        this.result = result;
      +    }
       }
      diff --git a/src/main/java/net/minecraftforge/event/level/SleepFinishedTimeEvent.java b/src/main/java/net/minecraftforge/event/level/SleepFinishedTimeEvent.java
      index b91fb0f40e..990fc6e8f2 100644
      --- a/src/main/java/net/minecraftforge/event/level/SleepFinishedTimeEvent.java
      +++ b/src/main/java/net/minecraftforge/event/level/SleepFinishedTimeEvent.java
      @@ -6,19 +6,20 @@
       package net.minecraftforge.event.level;
       
       import net.minecraft.server.level.ServerLevel;
      +import net.minecraftforge.eventbus.api.bus.EventBus;
       
       /**
        * This event is fired when all players are asleep and the time should be set to day.
      * * setWakeUpTime(wakeUpTime) sets a new time that will be added to the dayTime.
      */ -public final class SleepFinishedTimeEvent extends LevelEvent -{ +public final class SleepFinishedTimeEvent extends LevelEvent { + public static final EventBus BUS = EventBus.create(SleepFinishedTimeEvent.class); + private long newTime; private final long minTime; - public SleepFinishedTimeEvent(ServerLevel level, long newTime, long minTime) - { + public SleepFinishedTimeEvent(ServerLevel level, long newTime, long minTime) { super(level); this.newTime = newTime; this.minTime = minTime; @@ -27,8 +28,7 @@ public final class SleepFinishedTimeEvent extends LevelEvent /** * @return the new time */ - public long getNewTime() - { + public long getNewTime() { return newTime; } @@ -37,10 +37,10 @@ public final class SleepFinishedTimeEvent extends LevelEvent * @param newTimeIn The new time at wakeup * @return {@code false} if newTimeIn was lower than current time */ - public boolean setTimeAddition(long newTimeIn) - { + public boolean setTimeAddition(long newTimeIn) { if (minTime > newTimeIn) return false; + this.newTime = newTimeIn; return true; } diff --git a/src/main/java/net/minecraftforge/event/network/ChannelRegistrationChangeEvent.java b/src/main/java/net/minecraftforge/event/network/ChannelRegistrationChangeEvent.java index 3af4d02610..512c1b4fe0 100644 --- a/src/main/java/net/minecraftforge/event/network/ChannelRegistrationChangeEvent.java +++ b/src/main/java/net/minecraftforge/event/network/ChannelRegistrationChangeEvent.java @@ -10,15 +10,18 @@ import java.util.Set; import net.minecraft.network.Connection; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; /** * Fired when the channel registration (see minecraft custom channel documentation) changes. - * + *
      * It seems plausible that this will fire multiple times for the same state, depending on what the server is doing. * It just directly dispatches upon receipt. */ -public final class ChannelRegistrationChangeEvent extends Event { +public final class ChannelRegistrationChangeEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(ChannelRegistrationChangeEvent.class); + public enum Type { REGISTER, UNREGISTER } @@ -44,4 +47,4 @@ public final class ChannelRegistrationChangeEvent extends Event { public Set getChannels() { return channels; } -} \ No newline at end of file +} diff --git a/src/main/java/net/minecraftforge/event/network/ConnectionStartEvent.java b/src/main/java/net/minecraftforge/event/network/ConnectionStartEvent.java index 992aa11bb1..69f2c01be0 100644 --- a/src/main/java/net/minecraftforge/event/network/ConnectionStartEvent.java +++ b/src/main/java/net/minecraftforge/event/network/ConnectionStartEvent.java @@ -5,32 +5,27 @@ package net.minecraftforge.event.network; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; import org.jetbrains.annotations.ApiStatus; import net.minecraft.network.Connection; import net.minecraft.network.protocol.PacketFlow; -import net.minecraftforge.eventbus.api.Event; /** * Fired when a network connection is started, either on the server when it receives the * ClientIntentionPacket or on the client when the channel is first activated. This is * intended to allow modders to attach things to the channel that can be used in the future. - * + *
      * As this is a blocking event modders can also do things like load data. Need some example uses. */ -public final class ConnectionStartEvent extends Event { - private final Connection connection; +public record ConnectionStartEvent(Connection getConnection) implements RecordEvent { + public static final EventBus BUS = EventBus.create(ConnectionStartEvent.class); @ApiStatus.Internal - public ConnectionStartEvent(Connection connection) { - this.connection = connection; - } - - public Connection getConnection() { - return this.connection; - } + public ConnectionStartEvent {} public boolean isClient() { - return this.connection.getSending() == PacketFlow.SERVERBOUND; + return getConnection.getSending() == PacketFlow.SERVERBOUND; } } diff --git a/src/main/java/net/minecraftforge/event/network/CustomPayloadEvent.java b/src/main/java/net/minecraftforge/event/network/CustomPayloadEvent.java index 302ee98341..3e92c606b2 100644 --- a/src/main/java/net/minecraftforge/event/network/CustomPayloadEvent.java +++ b/src/main/java/net/minecraftforge/event/network/CustomPayloadEvent.java @@ -15,49 +15,29 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.network.ServerGamePacketListenerImpl; import net.minecraft.network.Connection; import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.RecordEvent; import net.minecraftforge.network.ForgePayload; import net.minecraftforge.common.util.LogicalSidedProvider; import org.jetbrains.annotations.Nullable; import java.util.concurrent.CompletableFuture; -// TODO make this not an event, and instead move it to a callback in the Channel itself. -// But also expose it as a generic listener event for anyone who cares about it but is outside out channel control system. -public class CustomPayloadEvent extends Event { - private final ResourceLocation channel; - private final Object payload; - private final FriendlyByteBuf data; - private final Context source; - private final int loginIndex; +/** + * This is fired when a CustomPayload packet is received. It will first be offered to any Channels registered for its name. + * If they do not handle it, then it is fired on its BUS. + */ +public record CustomPayloadEvent( + ResourceLocation getChannel, + Object getPayloadObject, + @Nullable FriendlyByteBuf getPayload, + Context getSource, + int getLoginIndex +) implements RecordEvent { + public static final EventBus BUS = EventBus.create(CustomPayloadEvent.class); public CustomPayloadEvent(ResourceLocation channel, Object payload, Context source, int loginIndex) { - this.channel = channel; - this.payload = payload; - this.data = payload instanceof ForgePayload forge ? forge.data() : null; - this.source = source; - this.loginIndex = loginIndex; - } - - public ResourceLocation getChannel() { - return this.channel; - } - - @Nullable - public FriendlyByteBuf getPayload() { - return data; - } - - public Object getPayloadObject() { - return this.payload; - } - - public int getLoginIndex() { - return loginIndex; - } - - public Context getSource() { - return source; + this(channel, payload, payload instanceof ForgePayload forge ? forge.data() : null, source, loginIndex); } /** diff --git a/src/main/java/net/minecraftforge/event/network/GatherLoginConfigurationTasksEvent.java b/src/main/java/net/minecraftforge/event/network/GatherLoginConfigurationTasksEvent.java index 3a81dc9bfd..3a5affbab3 100644 --- a/src/main/java/net/minecraftforge/event/network/GatherLoginConfigurationTasksEvent.java +++ b/src/main/java/net/minecraftforge/event/network/GatherLoginConfigurationTasksEvent.java @@ -9,13 +9,16 @@ import java.util.function.Consumer; import net.minecraft.network.Connection; import net.minecraft.server.network.ConfigurationTask; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; /** * Gathers tasks that need to be run during the initial login configuration. * @see net.minecraft.server.network.ServerConfigurationPacketListenerImpl#startConfiguration() startConfiguration */ -public final class GatherLoginConfigurationTasksEvent extends Event { +public final class GatherLoginConfigurationTasksEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(GatherLoginConfigurationTasksEvent.class); + private final Connection connection; private final Consumer add; diff --git a/src/main/java/net/minecraftforge/event/server/ServerAboutToStartEvent.java b/src/main/java/net/minecraftforge/event/server/ServerAboutToStartEvent.java index e59c9af479..c8f799b0f5 100644 --- a/src/main/java/net/minecraftforge/event/server/ServerAboutToStartEvent.java +++ b/src/main/java/net/minecraftforge/event/server/ServerAboutToStartEvent.java @@ -6,19 +6,20 @@ package net.minecraftforge.event.server; import net.minecraft.server.MinecraftServer; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; /** * Called before the server begins loading anything. Called after {@link InterModProcessEvent} on the dedicated * server, and after the player has hit "Play Selected World" in the client. Called before {@link ServerStartingEvent}. - * + *
      * You can obtain a reference to the server with this event. * @author cpw */ public final class ServerAboutToStartEvent extends ServerLifecycleEvent { + public static final EventBus BUS = EventBus.create(ServerAboutToStartEvent.class); - public ServerAboutToStartEvent(MinecraftServer server) - { + public ServerAboutToStartEvent(MinecraftServer server) { super(server); } } diff --git a/src/main/java/net/minecraftforge/event/server/ServerLifecycleEvent.java b/src/main/java/net/minecraftforge/event/server/ServerLifecycleEvent.java index b450b5a70e..926dd73c95 100644 --- a/src/main/java/net/minecraftforge/event/server/ServerLifecycleEvent.java +++ b/src/main/java/net/minecraftforge/event/server/ServerLifecycleEvent.java @@ -6,20 +6,21 @@ package net.minecraftforge.event.server; import net.minecraft.server.MinecraftServer; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; -public sealed class ServerLifecycleEvent extends Event +public sealed class ServerLifecycleEvent extends MutableEvent implements InheritableEvent permits ServerAboutToStartEvent, ServerStartedEvent, ServerStartingEvent, ServerStoppedEvent, ServerStoppingEvent { + public static final EventBus BUS = EventBus.create(ServerLifecycleEvent.class); protected final MinecraftServer server; - public ServerLifecycleEvent(MinecraftServer server) - { + public ServerLifecycleEvent(MinecraftServer server) { this.server = server; } - public MinecraftServer getServer() - { + public MinecraftServer getServer() { return server; } } diff --git a/src/main/java/net/minecraftforge/event/server/ServerStartedEvent.java b/src/main/java/net/minecraftforge/event/server/ServerStartedEvent.java index b0c28b6bc9..9a962143bc 100644 --- a/src/main/java/net/minecraftforge/event/server/ServerStartedEvent.java +++ b/src/main/java/net/minecraftforge/event/server/ServerStartedEvent.java @@ -6,17 +6,17 @@ package net.minecraftforge.event.server; import net.minecraft.server.MinecraftServer; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Called after {@link ServerStartingEvent} when the server is available and ready to play. * * @author cpw */ -public final class ServerStartedEvent extends ServerLifecycleEvent -{ +public final class ServerStartedEvent extends ServerLifecycleEvent { + public static final EventBus BUS = EventBus.create(ServerStartedEvent.class); - public ServerStartedEvent(final MinecraftServer server) - { + public ServerStartedEvent(final MinecraftServer server) { super(server); } } diff --git a/src/main/java/net/minecraftforge/event/server/ServerStartingEvent.java b/src/main/java/net/minecraftforge/event/server/ServerStartingEvent.java index 0b2769c68d..071b878519 100644 --- a/src/main/java/net/minecraftforge/event/server/ServerStartingEvent.java +++ b/src/main/java/net/minecraftforge/event/server/ServerStartingEvent.java @@ -6,6 +6,7 @@ package net.minecraftforge.event.server; import net.minecraft.server.MinecraftServer; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Called after {@link ServerAboutToStartEvent} and before {@link ServerStartedEvent}. @@ -15,11 +16,10 @@ import net.minecraft.server.MinecraftServer; * * @author cpw */ -public final class ServerStartingEvent extends ServerLifecycleEvent -{ - public ServerStartingEvent(final MinecraftServer server) - { +public final class ServerStartingEvent extends ServerLifecycleEvent { + public static final EventBus BUS = EventBus.create(ServerStartingEvent.class); + + public ServerStartingEvent(final MinecraftServer server) { super(server); } - } diff --git a/src/main/java/net/minecraftforge/event/server/ServerStoppedEvent.java b/src/main/java/net/minecraftforge/event/server/ServerStoppedEvent.java index cd7b3ef92d..48d792a110 100644 --- a/src/main/java/net/minecraftforge/event/server/ServerStoppedEvent.java +++ b/src/main/java/net/minecraftforge/event/server/ServerStoppedEvent.java @@ -6,6 +6,7 @@ package net.minecraftforge.event.server; import net.minecraft.server.MinecraftServer; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Called after {@link ServerStoppingEvent} when the server has completely shut down. @@ -15,8 +16,9 @@ import net.minecraft.server.MinecraftServer; * @author cpw */ public final class ServerStoppedEvent extends ServerLifecycleEvent { - public ServerStoppedEvent(MinecraftServer server) - { + public static final EventBus BUS = EventBus.create(ServerStoppedEvent.class); + + public ServerStoppedEvent(MinecraftServer server) { super(server); } } diff --git a/src/main/java/net/minecraftforge/event/server/ServerStoppingEvent.java b/src/main/java/net/minecraftforge/event/server/ServerStoppingEvent.java index c0abc416a5..179c94ca69 100644 --- a/src/main/java/net/minecraftforge/event/server/ServerStoppingEvent.java +++ b/src/main/java/net/minecraftforge/event/server/ServerStoppingEvent.java @@ -6,16 +6,17 @@ package net.minecraftforge.event.server; import net.minecraft.server.MinecraftServer; +import net.minecraftforge.eventbus.api.bus.EventBus; /** * Called when the server begins an orderly shutdown, before {@link ServerStoppedEvent}. * * @author cpw */ -public final class ServerStoppingEvent extends ServerLifecycleEvent -{ - public ServerStoppingEvent(MinecraftServer server) - { +public final class ServerStoppingEvent extends ServerLifecycleEvent { + public static final EventBus BUS = EventBus.create(ServerStoppingEvent.class); + + public ServerStoppingEvent(MinecraftServer server) { super(server); } } diff --git a/src/main/java/net/minecraftforge/event/server/package-info.java b/src/main/java/net/minecraftforge/event/server/package-info.java new file mode 100644 index 0000000000..250cd19bf6 --- /dev/null +++ b/src/main/java/net/minecraftforge/event/server/package-info.java @@ -0,0 +1,9 @@ +/* + * Copyright (c) Forge Development LLC and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +@NullMarked +package net.minecraftforge.event.server; + +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/net/minecraftforge/event/village/VillageSiegeEvent.java b/src/main/java/net/minecraftforge/event/village/VillageSiegeEvent.java index 73302f68b2..d8dc124836 100644 --- a/src/main/java/net/minecraftforge/event/village/VillageSiegeEvent.java +++ b/src/main/java/net/minecraftforge/event/village/VillageSiegeEvent.java @@ -9,53 +9,44 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import net.minecraft.world.entity.ai.village.VillageSiege; import net.minecraft.world.level.Level; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.CancellableEventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; +import net.minecraftforge.eventbus.api.event.characteristic.Cancellable; /** * VillageSiegeEvent is fired just before a zombie siege finds a successful location in * {@code VillageSiege#tryToSetupSiege(ServerLevel)}, to give mods the chance to stop the siege.
      *
      - * This event is {@link Cancelable}; canceling stops the siege.
      - *
      - * This event does not have a result. {@link HasResult}
      - *
      - * This event is fired on the {@link MinecraftForge#EVENT_BUS}. + * Canceling this event stops the siege.
      */ -@Cancelable -public final class VillageSiegeEvent extends Event -{ +public final class VillageSiegeEvent extends MutableEvent implements Cancellable { + public static final CancellableEventBus BUS = CancellableEventBus.create(VillageSiegeEvent.class); + private final VillageSiege siege; private final Level level; private final Player player; private final Vec3 attemptedSpawnPos; - public VillageSiegeEvent(VillageSiege siege, Level level, Player player, Vec3 attemptedSpawnPos) - { + public VillageSiegeEvent(VillageSiege siege, Level level, Player player, Vec3 attemptedSpawnPos) { this.siege = siege; this.level = level; this.player = player; this.attemptedSpawnPos = attemptedSpawnPos; } - public VillageSiege getSiege() - { + public VillageSiege getSiege() { return siege; } - public Level getLevel() - { + public Level getLevel() { return level; } - public Player getPlayer() - { + public Player getPlayer() { return player; } - public Vec3 getAttemptedSpawnPos() - { + public Vec3 getAttemptedSpawnPos() { return attemptedSpawnPos; } } diff --git a/src/main/java/net/minecraftforge/event/village/VillagerTradesEvent.java b/src/main/java/net/minecraftforge/event/village/VillagerTradesEvent.java index ef699dd788..3b7448f7b9 100644 --- a/src/main/java/net/minecraftforge/event/village/VillagerTradesEvent.java +++ b/src/main/java/net/minecraftforge/event/village/VillagerTradesEvent.java @@ -13,8 +13,10 @@ import net.minecraft.world.entity.npc.VillagerData; import net.minecraft.world.entity.npc.VillagerProfession; import net.minecraft.world.entity.npc.VillagerTrades.ItemListing; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.event.server.ServerAboutToStartEvent; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; /** * VillagerTradesEvent is fired during the {@link ServerAboutToStartEvent}. It is used to gather the trade lists for each profession. @@ -26,7 +28,9 @@ import net.minecraftforge.event.server.ServerAboutToStartEvent; *

      Levels outside of this range do nothing, as specified by {@link VillagerData#canLevelUp(int)} which is called before attempting to level up.

      *

      To add trades to the merchant, simply add new trades to the list.

      */ -public class VillagerTradesEvent extends Event { +public class VillagerTradesEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(VillagerTradesEvent.class); + protected Int2ObjectMap> trades; protected ResourceKey type; diff --git a/src/main/java/net/minecraftforge/event/village/WandererTradesEvent.java b/src/main/java/net/minecraftforge/event/village/WandererTradesEvent.java index 632e2fb0ff..d7854b4c0a 100644 --- a/src/main/java/net/minecraftforge/event/village/WandererTradesEvent.java +++ b/src/main/java/net/minecraftforge/event/village/WandererTradesEvent.java @@ -9,12 +9,14 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import org.apache.commons.lang3.tuple.Pair; import net.minecraft.Util; import net.minecraft.world.entity.npc.VillagerTrades.ItemListing; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.event.server.ServerAboutToStartEvent; /** @@ -23,7 +25,9 @@ import net.minecraftforge.event.server.ServerAboutToStartEvent; * The wandering merchant picks {@link Pool#rolls} from each {@link Pool} * To add trades to the merchant, simply add new trades to the list. {@link BasicItemListing} provides a default implementation. */ -public class WandererTradesEvent extends Event { +public class WandererTradesEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(WandererTradesEvent.class); + protected List pools; public WandererTradesEvent(List> pools) { diff --git a/src/main/java/net/minecraftforge/fluids/FluidStack.java b/src/main/java/net/minecraftforge/fluids/FluidStack.java index 5e6970e921..bcf53a7792 100644 --- a/src/main/java/net/minecraftforge/fluids/FluidStack.java +++ b/src/main/java/net/minecraftforge/fluids/FluidStack.java @@ -9,12 +9,12 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.nbt.Tag; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.item.ItemStack; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; import net.minecraftforge.registries.ForgeRegistries; @@ -24,7 +24,6 @@ import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Objects; import java.util.Optional; /** @@ -105,6 +104,25 @@ public class FluidStack { return stack; } + public static FluidStack loadFluidStackFrom(ValueInput input) { + if (input == null) + return EMPTY; + input.getStringOr("FluidName", null); + var fluidNameString = input.getString("FluidName"); + if (fluidNameString.isEmpty()) + return EMPTY; + + ResourceLocation fluidName = ResourceLocation.parse(fluidNameString.get()); + Fluid fluid = ForgeRegistries.FLUIDS.getValue(fluidName); + if (fluid == null) + return EMPTY; + + FluidStack stack = new FluidStack(fluid, input.getIntOr("Amount", 0)); + + input.read("Tag", CompoundTag.CODEC).ifPresent(tag -> stack.tag = tag); + return stack; + } + public CompoundTag writeToNBT(CompoundTag nbt) { nbt.putString("FluidName", ForgeRegistries.FLUIDS.getKey(getFluid()).toString()); nbt.putInt("Amount", amount); @@ -114,6 +132,14 @@ public class FluidStack { return nbt; } + public void writeTo(ValueOutput output) { + output.putString("FluidName", ForgeRegistries.FLUIDS.getKey(getFluid()).toString()); + output.putInt("Amount", amount); + + if (tag != null) + output.store("Tag", CompoundTag.CODEC, tag); + } + public final Fluid getFluid() { return isEmpty ? Fluids.EMPTY : fluidDelegate.get(); } diff --git a/src/main/java/net/minecraftforge/fluids/capability/FluidHandlerBlockEntity.java b/src/main/java/net/minecraftforge/fluids/capability/FluidHandlerBlockEntity.java index 5a1b13daca..ce4f633f75 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/FluidHandlerBlockEntity.java +++ b/src/main/java/net/minecraftforge/fluids/capability/FluidHandlerBlockEntity.java @@ -6,9 +6,9 @@ package net.minecraftforge.fluids.capability; import net.minecraft.core.BlockPos; -import net.minecraft.core.HolderLookup; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.core.Direction; @@ -20,29 +20,26 @@ import net.minecraftforge.fluids.capability.templates.FluidTank; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class FluidHandlerBlockEntity extends BlockEntity -{ +public class FluidHandlerBlockEntity extends BlockEntity { protected FluidTank tank = new FluidTank(FluidType.BUCKET_VOLUME); private final LazyOptional holder = LazyOptional.of(() -> tank); - public FluidHandlerBlockEntity(@NotNull BlockEntityType blockEntityType, BlockPos pos, BlockState state) - { + public FluidHandlerBlockEntity(@NotNull BlockEntityType blockEntityType, BlockPos pos, BlockState state) { super(blockEntityType, pos, state); } @Override - protected void loadAdditional(CompoundTag tag, HolderLookup.Provider provider) { - super.loadAdditional(tag, provider); - tank.readFromNBT(tag); + protected void loadAdditional(ValueInput input) { + super.loadAdditional(input); + tank.readFrom(input); } @Override - protected void saveAdditional(CompoundTag tag, HolderLookup.Provider provider) - { - super.saveAdditional(tag, provider); - tank.writeToNBT(tag); + protected void saveAdditional(ValueOutput output) { + super.saveAdditional(output); + tank.writeTo(output); } @Override diff --git a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java index 9d14f32a08..ae4057b339 100644 --- a/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java +++ b/src/main/java/net/minecraftforge/fluids/capability/templates/FluidTank.java @@ -6,6 +6,8 @@ package net.minecraftforge.fluids.capability.templates; import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -15,193 +17,166 @@ import java.util.function.Predicate; /** * Flexible implementation of a Fluid Storage object. NOT REQUIRED. - * - * @author King Lemming */ public class FluidTank implements IFluidHandler, IFluidTank { - protected Predicate validator; @NotNull protected FluidStack fluid = FluidStack.EMPTY; protected int capacity; - public FluidTank(int capacity) - { + public FluidTank(int capacity) { this(capacity, e -> true); } - public FluidTank(int capacity, Predicate validator) - { + public FluidTank(int capacity, Predicate validator) { this.capacity = capacity; this.validator = validator; } - public FluidTank setCapacity(int capacity) - { + public FluidTank setCapacity(int capacity) { this.capacity = capacity; return this; } - public FluidTank setValidator(Predicate validator) - { - if (validator != null) { + public FluidTank setValidator(Predicate validator) { + if (validator != null) this.validator = validator; - } return this; } - public boolean isFluidValid(FluidStack stack) - { + public boolean isFluidValid(FluidStack stack) { return validator.test(stack); } - public int getCapacity() - { + public int getCapacity() { return capacity; } @NotNull - public FluidStack getFluid() - { + public FluidStack getFluid() { return fluid; } - public int getFluidAmount() - { + public int getFluidAmount() { return fluid.getAmount(); } public FluidTank readFromNBT(CompoundTag nbt) { - FluidStack fluid = FluidStack.loadFluidStackFromNBT(nbt); setFluid(fluid); return this; } + public FluidTank readFrom(ValueInput nbt) { + FluidStack fluid = FluidStack.loadFluidStackFrom(nbt); + setFluid(fluid); + return this; + } + public CompoundTag writeToNBT(CompoundTag nbt) { - fluid.writeToNBT(nbt); - return nbt; } + public void writeTo(ValueOutput output) { + fluid.writeTo(output); + } + + @Override public int getTanks() { - return 1; } @NotNull @Override public FluidStack getFluidInTank(int tank) { - return getFluid(); } @Override public int getTankCapacity(int tank) { - return getCapacity(); } @Override public boolean isFluidValid(int tank, @NotNull FluidStack stack) { - return isFluidValid(stack); } @Override - public int fill(FluidStack resource, FluidAction action) - { + public int fill(FluidStack resource, FluidAction action) { if (resource.isEmpty() || !isFluidValid(resource)) - { return 0; - } - if (action.simulate()) - { + + if (action.simulate()) { if (fluid.isEmpty()) - { return Math.min(capacity, resource.getAmount()); - } if (!fluid.isFluidEqual(resource)) - { return 0; - } return Math.min(capacity - fluid.getAmount(), resource.getAmount()); } - if (fluid.isEmpty()) - { + + if (fluid.isEmpty()) { fluid = new FluidStack(resource, Math.min(capacity, resource.getAmount())); onContentsChanged(); return fluid.getAmount(); } + if (!fluid.isFluidEqual(resource)) - { return 0; - } + int filled = capacity - fluid.getAmount(); - if (resource.getAmount() < filled) - { + if (resource.getAmount() < filled) { fluid.grow(resource.getAmount()); filled = resource.getAmount(); - } - else - { + } else { fluid.setAmount(capacity); } + if (filled > 0) onContentsChanged(); + return filled; } @NotNull @Override - public FluidStack drain(FluidStack resource, FluidAction action) - { + public FluidStack drain(FluidStack resource, FluidAction action) { if (resource.isEmpty() || !resource.isFluidEqual(fluid)) - { return FluidStack.EMPTY; - } return drain(resource.getAmount(), action); } @NotNull @Override - public FluidStack drain(int maxDrain, FluidAction action) - { + public FluidStack drain(int maxDrain, FluidAction action) { int drained = maxDrain; if (fluid.getAmount() < drained) - { drained = fluid.getAmount(); - } + FluidStack stack = new FluidStack(fluid, drained); - if (action.execute() && drained > 0) - { + if (action.execute() && drained > 0) { fluid.shrink(drained); onContentsChanged(); } + return stack; } - protected void onContentsChanged() - { - + protected void onContentsChanged() { } - public void setFluid(FluidStack stack) - { + public void setFluid(FluidStack stack) { this.fluid = stack; } - public boolean isEmpty() - { + public boolean isEmpty() { return fluid.isEmpty(); } - public int getSpace() - { + public int getSpace() { return Math.max(0, capacity - fluid.getAmount()); } - } diff --git a/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java b/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java index 321fc05f2b..48fc552dd9 100644 --- a/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java +++ b/src/main/java/net/minecraftforge/fml/core/ModStateProvider.java @@ -6,6 +6,7 @@ package net.minecraftforge.fml.core; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.IModLoadingState; import net.minecraftforge.fml.IModStateProvider; import net.minecraftforge.fml.ModContainer; @@ -135,7 +136,8 @@ public class ModStateProvider implements IModStateProvider { * * @see ModLoadingStage#DONE */ - public static final ModLoadingState DONE = ModLoadingState.of("DONE", ModLoadingPhase.DONE).empty(); + public static final ModLoadingState DONE = ModLoadingState.of("DONE", ModLoadingPhase.DONE) + .withInline(ml -> BusGroup.DEFAULT.trim()); @Override public List getAllStates() { diff --git a/src/main/java/net/minecraftforge/fml/core/ParallelTransition.java b/src/main/java/net/minecraftforge/fml/core/ParallelTransition.java index ecfc718c84..28e4f38f01 100644 --- a/src/main/java/net/minecraftforge/fml/core/ParallelTransition.java +++ b/src/main/java/net/minecraftforge/fml/core/ParallelTransition.java @@ -5,7 +5,6 @@ package net.minecraftforge.fml.core; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.IModStateTransition; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; @@ -17,10 +16,10 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; import java.util.function.BiFunction; -record ParallelTransition(ModLoadingStage stage, BiFunction event) implements IModStateTransition { +record ParallelTransition(ModLoadingStage stage, BiFunction event) implements IModStateTransition { @SuppressWarnings("unchecked") @Override - public EventGenerator eventFunction() { + public EventGenerator eventFunction() { return EventGenerator.fromFunction(mod -> (T)event.apply(mod, stage)); } diff --git a/src/main/java/net/minecraftforge/fml/event/config/ModConfigEvent.java b/src/main/java/net/minecraftforge/fml/event/config/ModConfigEvent.java index 67ede54410..203ec3e422 100644 --- a/src/main/java/net/minecraftforge/fml/event/config/ModConfigEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/config/ModConfigEvent.java @@ -5,12 +5,13 @@ package net.minecraftforge.fml.event.config; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.config.IConfigEvent; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.IModBusEvent; -public sealed class ModConfigEvent extends Event implements IModBusEvent, IConfigEvent { +public sealed class ModConfigEvent implements IModBusEvent, IConfigEvent { private final ModConfig config; ModConfigEvent(final ModConfig config) { @@ -27,6 +28,10 @@ public sealed class ModConfigEvent extends Event implements IModBusEvent, IConfi * Any Config objects associated with this will be valid and can be queried directly. */ public static final class Loading extends ModConfigEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, Loading.class); + } + public Loading(final ModConfig config) { super(config); } @@ -39,6 +44,10 @@ public sealed class ModConfigEvent extends Event implements IModBusEvent, IConfi * any resultant changes. */ public static final class Reloading extends ModConfigEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, Reloading.class); + } + public Reloading(final ModConfig config) { super(config); } @@ -51,6 +60,10 @@ public sealed class ModConfigEvent extends Event implements IModBusEvent, IConfi * The config file will be saved after this event has fired. */ public static final class Unloading extends ModConfigEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, Unloading.class); + } + public Unloading(final ModConfig config) { super(config); } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLClientSetupEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLClientSetupEvent.java index f13e416de8..7fed0785d6 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLClientSetupEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLClientSetupEvent.java @@ -5,9 +5,12 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.SelfDestructing; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; - +import net.minecraftforge.fml.event.IModBusEvent; /** * This is the second of four commonly called events during mod lifecycle startup. @@ -23,7 +26,11 @@ import net.minecraftforge.fml.ModLoadingStage; * * This is a parallel dispatch event. */ -public final class FMLClientSetupEvent extends ParallelDispatchEvent { +public final class FMLClientSetupEvent extends ParallelDispatchEvent implements SelfDestructing { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, FMLClientSetupEvent.class); + } + public FMLClientSetupEvent(ModContainer container, ModLoadingStage stage) { super(container, stage); } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLCommonSetupEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLCommonSetupEvent.java index 65a4abaa25..fbeac65c72 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLCommonSetupEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLCommonSetupEvent.java @@ -5,9 +5,13 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.SelfDestructing; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.DeferredWorkQueue; import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.function.Consumer; @@ -27,10 +31,12 @@ import java.util.function.Consumer; * @see DeferredWorkQueue to enqueue work to run on the main game thread after this event has * completed dispatch */ -public final class FMLCommonSetupEvent extends ParallelDispatchEvent -{ - public FMLCommonSetupEvent(final ModContainer container, final ModLoadingStage stage) - { +public final class FMLCommonSetupEvent extends ParallelDispatchEvent implements SelfDestructing { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, FMLCommonSetupEvent.class); + } + + public FMLCommonSetupEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLConstructModEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLConstructModEvent.java index 139c546862..be12fbfb07 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLConstructModEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLConstructModEvent.java @@ -5,14 +5,21 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.event.IModBusEvent; /** * Supplied as a param to your mod's constructor to get access * to the mod EventBus and various mod-specific objects. */ public final class FMLConstructModEvent extends ParallelDispatchEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, FMLConstructModEvent.class); + } + public FMLConstructModEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java index e8e7b3648f..819bdf3a72 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLDedicatedServerSetupEvent.java @@ -5,8 +5,12 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.SelfDestructing; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.event.IModBusEvent; /** * This is the second of four commonly called events during mod core startup. @@ -26,10 +30,12 @@ import net.minecraftforge.fml.ModLoadingStage; * * This is a parallel dispatch event. */ -public final class FMLDedicatedServerSetupEvent extends ParallelDispatchEvent -{ - public FMLDedicatedServerSetupEvent(ModContainer container, ModLoadingStage stage) - { +public final class FMLDedicatedServerSetupEvent extends ParallelDispatchEvent implements SelfDestructing { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, FMLDedicatedServerSetupEvent.class); + } + + public FMLDedicatedServerSetupEvent(ModContainer container, ModLoadingStage stage) { super(container, stage); } } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLLoadCompleteEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLLoadCompleteEvent.java index 02f0e10bb3..97d16a03e5 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLLoadCompleteEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/FMLLoadCompleteEvent.java @@ -5,8 +5,12 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.characteristic.SelfDestructing; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.event.IModBusEvent; /** * This is a mostly internal event fired to mod containers that indicates that loading is complete. Mods should not @@ -14,10 +18,12 @@ import net.minecraftforge.fml.ModLoadingStage; * * @author cpw */ -public final class FMLLoadCompleteEvent extends ParallelDispatchEvent -{ - public FMLLoadCompleteEvent(final ModContainer container, final ModLoadingStage stage) - { +public final class FMLLoadCompleteEvent extends ParallelDispatchEvent implements SelfDestructing { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, FMLLoadCompleteEvent.class); + } + + public FMLLoadCompleteEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModEnqueueEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModEnqueueEvent.java index 9e9eef0385..b27a8765af 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModEnqueueEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModEnqueueEvent.java @@ -5,8 +5,11 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.event.IModBusEvent; /** * This is the third of four commonly called events during mod core startup. @@ -19,11 +22,12 @@ import net.minecraftforge.fml.ModLoadingStage; * * This is a parallel dispatch event. */ -public final class InterModEnqueueEvent extends ParallelDispatchEvent -{ +public final class InterModEnqueueEvent extends ParallelDispatchEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, InterModEnqueueEvent.class); + } - public InterModEnqueueEvent(final ModContainer container, final ModLoadingStage stage) - { + public InterModEnqueueEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModProcessEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModProcessEvent.java index 803b97faeb..c490cd2ce2 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModProcessEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/InterModProcessEvent.java @@ -5,8 +5,11 @@ package net.minecraftforge.fml.event.lifecycle; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModLoadingStage; +import net.minecraftforge.fml.event.IModBusEvent; import java.util.function.Predicate; @@ -23,10 +26,12 @@ import java.util.function.Predicate; * @see #getIMCStream() * @see #getIMCStream(Predicate) */ -public final class InterModProcessEvent extends ParallelDispatchEvent -{ - public InterModProcessEvent(final ModContainer container, final ModLoadingStage stage) - { +public final class InterModProcessEvent extends ParallelDispatchEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, InterModProcessEvent.class); + } + + public InterModProcessEvent(final ModContainer container, final ModLoadingStage stage) { super(container, stage); } } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/ModLifecycleEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/ModLifecycleEvent.java index 58c882316f..3a4507a629 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/ModLifecycleEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/ModLifecycleEvent.java @@ -5,7 +5,6 @@ package net.minecraftforge.fml.event.lifecycle; -import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.event.IModBusEvent; @@ -17,17 +16,14 @@ import java.util.stream.Stream; * Parent type to all ModLifecycle events. This is based on Forge EventBus. They fire through the * ModContainer's eventbus instance. */ -public class ModLifecycleEvent extends Event implements IModBusEvent -{ +public class ModLifecycleEvent implements IModBusEvent { private final ModContainer container; - public ModLifecycleEvent(ModContainer container) - { + public ModLifecycleEvent(ModContainer container) { this.container = container; } - public final String description() - { + public final String description() { String cn = getClass().getName(); return cn.substring(cn.lastIndexOf('.')+1); } diff --git a/src/main/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java b/src/main/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java index fc9e0a0297..8023c9ec2c 100644 --- a/src/main/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java +++ b/src/main/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java @@ -32,4 +32,4 @@ public class ParallelDispatchEvent extends ModLifecycleEvent { public CompletableFuture enqueueWork(Supplier work) { return getQueue().map(q->q.enqueueWork(getContainer(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); } -} \ No newline at end of file +} diff --git a/src/main/java/net/minecraftforge/internal/ForgeBindings.java b/src/main/java/net/minecraftforge/internal/ForgeBindings.java index 9eb184a05f..8006863f3c 100644 --- a/src/main/java/net/minecraftforge/internal/ForgeBindings.java +++ b/src/main/java/net/minecraftforge/internal/ForgeBindings.java @@ -6,8 +6,7 @@ package net.minecraftforge.internal; import net.minecraftforge.common.ForgeI18n; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.fml.I18NParser; import net.minecraftforge.fml.IBindingsProvider; import net.minecraftforge.fml.config.IConfigEvent; @@ -33,8 +32,8 @@ public final class ForgeBindings implements IBindingsProvider { } @Override - public Supplier getForgeBusSupplier() { - return () -> MinecraftForge.EVENT_BUS; + public Supplier getForgeBusSupplier() { + return () -> BusGroup.DEFAULT; } @Override diff --git a/src/main/java/net/minecraftforge/items/ItemStackHandler.java b/src/main/java/net/minecraftforge/items/ItemStackHandler.java index 9593960d55..0884b2496e 100644 --- a/src/main/java/net/minecraftforge/items/ItemStackHandler.java +++ b/src/main/java/net/minecraftforge/items/ItemStackHandler.java @@ -7,13 +7,20 @@ package net.minecraftforge.items; import net.minecraft.world.ContainerHelper; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.TagValueInput; +import net.minecraft.world.level.storage.TagValueOutput; import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.ProblemReporter; import net.minecraft.core.HolderLookup; import net.minecraft.core.NonNullList; import net.minecraftforge.common.util.INBTSerializable; import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; + +import com.mojang.logging.LogUtils; public class ItemStackHandler implements IItemHandler, IItemHandlerModifiable, INBTSerializable { + private static final Logger LOGGER = LogUtils.getLogger(); protected NonNullList stacks; public ItemStackHandler() { @@ -139,14 +146,18 @@ public class ItemStackHandler implements IItemHandler, IItemHandlerModifiable, I @Override public CompoundTag serializeNBT(HolderLookup.Provider lookup) { - var tag = new CompoundTag(); - ContainerHelper.saveAllItems(tag, this.stacks, lookup); - return tag; + try (var problems = new ProblemReporter.ScopedCollector(LOGGER)) { + var output = TagValueOutput.createWithContext(problems, lookup); + ContainerHelper.saveAllItems(output, this.stacks); + return output.buildResult(); + } } @Override public void deserializeNBT(HolderLookup.Provider lookup, CompoundTag nbt) { - ContainerHelper.loadAllItems(nbt, stacks, lookup); + try (var problems = new ProblemReporter.ScopedCollector(LOGGER)) { + ContainerHelper.loadAllItems(TagValueInput.create(problems, lookup, nbt), stacks); + } onLoad(); } diff --git a/src/main/java/net/minecraftforge/network/EventNetworkChannel.java b/src/main/java/net/minecraftforge/network/EventNetworkChannel.java index 0dff5f4d29..f50bcd2c69 100644 --- a/src/main/java/net/minecraftforge/network/EventNetworkChannel.java +++ b/src/main/java/net/minecraftforge/network/EventNetworkChannel.java @@ -27,20 +27,11 @@ public class EventNetworkChannel extends Channel { super(instance); } - public EventNetworkChannel addListener(Consumer eventListener) { + public EventNetworkChannel addListener(Consumer eventListener) { instance.addListener(eventListener); return this; } - public EventNetworkChannel registerObject(Object object) { - instance.registerObject(object); - return this; - } - - public void unregisterObject(Object object) { - instance.unregisterObject(object); - } - @Override public void encode(FriendlyByteBuf out, FriendlyByteBuf message) { out.writeBytes(message.slice()); diff --git a/src/main/java/net/minecraftforge/network/NetworkInstance.java b/src/main/java/net/minecraftforge/network/NetworkInstance.java index c58ca899c4..d63a512d3c 100644 --- a/src/main/java/net/minecraftforge/network/NetworkInstance.java +++ b/src/main/java/net/minecraftforge/network/NetworkInstance.java @@ -8,12 +8,10 @@ package net.minecraftforge.network; import net.minecraft.network.Connection; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.event.network.CustomPayloadEvent; -import net.minecraftforge.eventbus.api.BusBuilder; -import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.IEventListener; import net.minecraftforge.network.Channel.VersionTest; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -32,7 +30,8 @@ import io.netty.util.AttributeKey; public final class NetworkInstance { // We use an event bus here so that we don't have to have a handle(event) public function on Channel. // Should this be changed so that modders can fire other channel's handlers? - private final IEventBus networkEventBus; + + private Collection> listeners = new ArrayList<>(); private final ResourceLocation channelName; private final int networkProtocolVersion; final VersionTest clientAcceptedVersions; @@ -52,27 +51,16 @@ public final class NetworkInstance { this.serverAcceptedVersions = serverAcceptedVersions; this.attributes = attributes; this.channelHandler = channelHandler; - this.networkEventBus = BusBuilder.builder().setExceptionHandler(this::handleError).useModLauncher().build(); this.pingData = new ServerStatusPing.ChannelData(channelName, networkProtocolVersion, this.clientAcceptedVersions.accepts(VersionTest.Status.MISSING, -1)); } - private void handleError(IEventBus iEventBus, Event event, IEventListener[] iEventListeners, int i, Throwable throwable) { - } - - public void addListener(Consumer eventListener) { - this.networkEventBus.addListener(eventListener); - } - - public void registerObject(final Object object) { - this.networkEventBus.register(object); - } - - public void unregisterObject(final Object object) { - this.networkEventBus.unregister(object); + public void addListener(Consumer eventListener) { + this.listeners.add(eventListener); } public boolean dispatch(CustomPayloadEvent event) { - this.networkEventBus.post(event); + for (var listener : listeners) + listener.accept(event); return event.getSource().getPacketHandled(); } diff --git a/src/main/java/net/minecraftforge/network/PacketDistributor.java b/src/main/java/net/minecraftforge/network/PacketDistributor.java index b05604ef31..db98731b77 100644 --- a/src/main/java/net/minecraftforge/network/PacketDistributor.java +++ b/src/main/java/net/minecraftforge/network/PacketDistributor.java @@ -158,11 +158,11 @@ public record PacketDistributor(BiFunction, T, Consumer< } private Consumer> trackingEntity(Entity entity) { - return p -> ((ServerChunkCache)entity.getCommandSenderWorld().getChunkSource()).broadcast(entity, p); + return p -> ((ServerChunkCache)entity.level().getChunkSource()).broadcast(entity, p); } private Consumer> trackingEntityAndSelf(Entity entity) { - return p -> ((ServerChunkCache)entity.getCommandSenderWorld().getChunkSource()).broadcastAndSend(entity, p); + return p -> ((ServerChunkCache)entity.level().getChunkSource()).broadcastAndSend(entity, p); } @SuppressWarnings("resource") diff --git a/src/main/java/net/minecraftforge/network/filters/VanillaConnectionNetworkFilter.java b/src/main/java/net/minecraftforge/network/filters/VanillaConnectionNetworkFilter.java index af7945f255..e6cc463086 100644 --- a/src/main/java/net/minecraftforge/network/filters/VanillaConnectionNetworkFilter.java +++ b/src/main/java/net/minecraftforge/network/filters/VanillaConnectionNetworkFilter.java @@ -9,16 +9,8 @@ import java.util.Collections; import java.util.List; import java.util.function.BiConsumer; import io.netty.channel.ChannelHandler; -import net.minecraft.commands.CommandBuildContext; -import net.minecraft.commands.Commands; -import net.minecraft.commands.SharedSuggestionProvider; -import net.minecraft.commands.synchronization.ArgumentTypeInfo; -import net.minecraft.commands.synchronization.ArgumentTypeInfos; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.data.registries.VanillaRegistries; import net.minecraft.network.protocol.Packet; import net.minecraft.network.Connection; -import net.minecraft.network.protocol.game.ClientboundCommandsPacket; import net.minecraft.network.protocol.game.ClientboundUpdateAttributesPacket; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.ConnectionType; @@ -27,7 +19,6 @@ import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.NotNull; import com.google.common.collect.ImmutableMap; -import com.mojang.brigadier.tree.RootCommandNode; /** * A filter for impl packets, used to filter/modify parts of vanilla impl messages that @@ -39,7 +30,6 @@ public class VanillaConnectionNetworkFilter extends VanillaPacketFilter { super( ImmutableMap.>, BiConsumer, List>>>builder() .put(handler(ClientboundUpdateAttributesPacket.class, VanillaConnectionNetworkFilter::filterEntityProperties)) - .put(handler(ClientboundCommandsPacket.class, VanillaConnectionNetworkFilter::filterCommandList)) // TODO Filter tags //.put(handler(ClientboundUpdateTagsPacket.class, VanillaConnectionNetworkFilter::filterCustomTagTypes)) .build() @@ -67,22 +57,6 @@ public class VanillaConnectionNetworkFilter extends VanillaPacketFilter { return newPacket; } - /** - * Filter for SCommandListPacket. Uses {@link CommandTreeCleaner} to filter out any ArgumentTypes that are not in the "minecraft" or "brigadier" namespace. - * A vanilla client would fail to deserialize the packet and disconnect with an error message if these were sent. - */ - @NotNull - private static ClientboundCommandsPacket filterCommandList(ClientboundCommandsPacket packet) { - CommandBuildContext commandBuildContext = Commands.createValidationContext(VanillaRegistries.createLookup()); - RootCommandNode root = packet.getRoot(commandBuildContext); - RootCommandNode newRoot = CommandTreeCleaner.cleanArgumentTypes(root, argType -> { - ArgumentTypeInfo info = ArgumentTypeInfos.byClass(argType); - ResourceLocation id = BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(info); - return id != null && (id.getNamespace().equals("minecraft") || id.getNamespace().equals("brigadier")); - }); - return new ClientboundCommandsPacket(newRoot); - } - /** * Filters out custom tag types that the vanilla client won't recognize. * It prevents a rare error from logging and reduces the packet size diff --git a/src/main/java/net/minecraftforge/network/tasks/ForgeNetworkConfigurationHandler.java b/src/main/java/net/minecraftforge/network/tasks/ForgeNetworkConfigurationHandler.java index 125c393394..af2f92ef4a 100644 --- a/src/main/java/net/minecraftforge/network/tasks/ForgeNetworkConfigurationHandler.java +++ b/src/main/java/net/minecraftforge/network/tasks/ForgeNetworkConfigurationHandler.java @@ -8,14 +8,14 @@ package net.minecraftforge.network.tasks; import org.jetbrains.annotations.ApiStatus; import net.minecraftforge.event.network.GatherLoginConfigurationTasksEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.ConnectionType; import net.minecraftforge.network.NetworkContext; @ApiStatus.Internal -public class ForgeNetworkConfigurationHandler { - @SubscribeEvent - public void gatherInit(GatherLoginConfigurationTasksEvent event) { +public final class ForgeNetworkConfigurationHandler { + private ForgeNetworkConfigurationHandler() {} + + public static void gatherInit(GatherLoginConfigurationTasksEvent event) { var ctx = NetworkContext.get(event.getConnection()); if (ctx.getType() != ConnectionType.MODDED) return; diff --git a/src/main/java/net/minecraftforge/registries/DataPackRegistryEvent.java b/src/main/java/net/minecraftforge/registries/DataPackRegistryEvent.java index e0c0f9d04f..d31db48834 100644 --- a/src/main/java/net/minecraftforge/registries/DataPackRegistryEvent.java +++ b/src/main/java/net/minecraftforge/registries/DataPackRegistryEvent.java @@ -12,18 +12,17 @@ import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.core.Registry; import net.minecraft.resources.RegistryDataLoader; import net.minecraft.resources.ResourceKey; -import net.minecraftforge.eventbus.api.Cancelable; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.event.IModBusEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -public sealed class DataPackRegistryEvent extends Event implements IModBusEvent -{ +public sealed abstract class DataPackRegistryEvent implements IModBusEvent { @ApiStatus.Internal - public DataPackRegistryEvent() {} + protected DataPackRegistryEvent() {} /** * Fired when datapack registries can be registered. @@ -36,8 +35,11 @@ public sealed class DataPackRegistryEvent extends Event implements IModBusEvent * This event is fired on the {@linkplain FMLJavaModLoadingContext#getModEventBus() mod-specific event bus}, * on both {@linkplain LogicalSide logical sides}. */ - public static final class NewRegistry extends DataPackRegistryEvent - { + public static final class NewRegistry extends DataPackRegistryEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, NewRegistry.class); + } + private final List> registryDataList = new ArrayList<>(); @ApiStatus.Internal @@ -54,8 +56,7 @@ public sealed class DataPackRegistryEvent extends Event implements IModBusEvent * @param codec the codec to be used for loading data from datapacks on servers * @see #dataPackRegistry(ResourceKey, Codec, Codec) */ - public void dataPackRegistry(ResourceKey> registryKey, Codec codec) - { + public void dataPackRegistry(ResourceKey> registryKey, Codec codec) { this.dataPackRegistry(registryKey, codec, null); } @@ -76,15 +77,12 @@ public sealed class DataPackRegistryEvent extends Event implements IModBusEvent * The data will be synced using the network codec and accessible via {@link ClientPacketListener#registryAccess()}. * @see #dataPackRegistry(ResourceKey, Codec) */ - public void dataPackRegistry(ResourceKey> registryKey, Codec codec, @Nullable Codec networkCodec) - { + public void dataPackRegistry(ResourceKey> registryKey, Codec codec, @Nullable Codec networkCodec) { this.registryDataList.add(new DataPackRegistryData<>(new RegistryDataLoader.RegistryData<>(registryKey, codec, false), networkCodec)); } - void process() - { - for (DataPackRegistryData registryData : this.registryDataList) - { + void process() { + for (DataPackRegistryData registryData : this.registryDataList) { DataPackRegistriesHooks.addRegistryCodec(registryData); } } diff --git a/src/main/java/net/minecraftforge/registries/DeferredRegister.java b/src/main/java/net/minecraftforge/registries/DeferredRegister.java index bd274749de..67992e21a5 100644 --- a/src/main/java/net/minecraftforge/registries/DeferredRegister.java +++ b/src/main/java/net/minecraftforge/registries/DeferredRegister.java @@ -12,13 +12,15 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.fml.javafmlmod.FMLModContainer; import net.minecraftforge.registries.tags.ITagManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.lang.invoke.MethodHandles; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -316,10 +318,11 @@ public class DeferredRegister { * Adds our event handler to the specified event bus, this MUST be called in order for this class to function. * See {@link DeferredRegister the example usage}. * - * @param bus The Mod Specific event bus. + * @param modBusGroup The mod-specific event bus group, obtained from {@link FMLModContainer#getModBusGroup()} or + * your language provider's equivalent. */ - public void register(IEventBus bus) { - bus.register(new EventDispatcher()); + public void register(BusGroup modBusGroup) { + modBusGroup.register(EventDispatcher.LOOKUP, new EventDispatcher()); } /** @@ -372,7 +375,9 @@ public class DeferredRegister { return value; } - private class EventDispatcher { + private final class EventDispatcher { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + @SubscribeEvent public void handleEvent(RegisterEvent event) { if (event.getRegistryKey().equals(registryKey)) { diff --git a/src/main/java/net/minecraftforge/registries/ForgeDeferredRegistriesSetup.java b/src/main/java/net/minecraftforge/registries/ForgeDeferredRegistriesSetup.java index 090250dcf6..236e37e89b 100644 --- a/src/main/java/net/minecraftforge/registries/ForgeDeferredRegistriesSetup.java +++ b/src/main/java/net/minecraftforge/registries/ForgeDeferredRegistriesSetup.java @@ -5,10 +5,9 @@ package net.minecraftforge.registries; +import net.minecraftforge.eventbus.api.bus.BusGroup; import org.jetbrains.annotations.ApiStatus; -import net.minecraftforge.eventbus.api.IEventBus; - @ApiStatus.Internal public class ForgeDeferredRegistriesSetup { private static boolean setup = false; @@ -16,7 +15,7 @@ public class ForgeDeferredRegistriesSetup { /** * Internal forge method. Modders do not call. */ - public static void setup(IEventBus modEventBus) { + public static void setup(BusGroup modBusGroup) { synchronized (ForgeDeferredRegistriesSetup.class) { if (setup) throw new IllegalStateException("Setup has already been called!"); @@ -25,6 +24,6 @@ public class ForgeDeferredRegistriesSetup { } for (var reg : ForgeRegistries.registries) - reg.register(modEventBus); + reg.register(modBusGroup); } } diff --git a/src/main/java/net/minecraftforge/registries/GameData.java b/src/main/java/net/minecraftforge/registries/GameData.java index c5fcfbec6c..e88e65d840 100644 --- a/src/main/java/net/minecraftforge/registries/GameData.java +++ b/src/main/java/net/minecraftforge/registries/GameData.java @@ -620,7 +620,7 @@ public class GameData { ForgeRegistry reg = STAGING.getRegistry(name); Object2IntMap missingIds = m.getValue(); MissingMappingsEvent event = reg.getMissingEvent(name, missingIds); - MinecraftForge.EVENT_BUS.post(event); + MissingMappingsEvent.BUS.post(event); List> lst = event.getAllMappings(reg.getRegistryKey()).stream() .filter(e -> e.action == MissingMappingsEvent.Action.DEFAULT) @@ -700,7 +700,7 @@ public class GameData { } private static void fireRemapEvent(final Map> remaps, final boolean isFreezing) { - MinecraftForge.EVENT_BUS.post(new IdMappingEvent(remaps, isFreezing)); + IdMappingEvent.BUS.post(new IdMappingEvent(remaps, isFreezing)); } //Has to be split because of generics, Yay! diff --git a/src/main/java/net/minecraftforge/registries/IdMappingEvent.java b/src/main/java/net/minecraftforge/registries/IdMappingEvent.java index 4a956a8229..1bfbbe8e9b 100644 --- a/src/main/java/net/minecraftforge/registries/IdMappingEvent.java +++ b/src/main/java/net/minecraftforge/registries/IdMappingEvent.java @@ -10,7 +10,8 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import java.util.Comparator; import java.util.List; @@ -25,20 +26,17 @@ import java.util.Map; * Note: you cannot change the IDs that have been allocated, but you might want to use * this event to update caches or other in-mod artifacts that might be impacted by an ID * change. - *

      - * Fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS forge bus}. */ -public final class IdMappingEvent extends Event -{ - public static final class ModRemapping - { +public final class IdMappingEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(IdMappingEvent.class); + + public static final class ModRemapping { public final ResourceLocation registry; public final ResourceLocation key; public final int oldId; public final int newId; - private ModRemapping(ResourceLocation registry, ResourceLocation key, int oldId, int newId) - { + private ModRemapping(ResourceLocation registry, ResourceLocation key, int oldId, int newId) { this.registry = registry; this.key = key; this.oldId = oldId; @@ -53,12 +51,10 @@ public final class IdMappingEvent extends Event private final boolean isFrozen; - public IdMappingEvent(Map> remaps, boolean isFrozen) - { + public IdMappingEvent(Map> remaps, boolean isFrozen) { this.isFrozen = isFrozen; this.remaps = Maps.newHashMap(); - remaps.forEach((name, rm) -> - { + remaps.forEach((name, rm) -> { List tmp = Lists.newArrayList(); rm.forEach((key, value) -> tmp.add(new ModRemapping(name, key, value.currId, value.newId))); tmp.sort(Comparator.comparingInt(o -> o.newId)); @@ -67,18 +63,15 @@ public final class IdMappingEvent extends Event this.keys = ImmutableSet.copyOf(this.remaps.keySet()); } - public ImmutableSet getRegistries() - { + public ImmutableSet getRegistries() { return this.keys; } - public ImmutableList getRemaps(ResourceLocation registry) - { + public ImmutableList getRemaps(ResourceLocation registry) { return this.remaps.get(registry); } - public boolean isFrozen() - { + public boolean isFrozen() { return isFrozen; } } diff --git a/src/main/java/net/minecraftforge/registries/MissingMappingsEvent.java b/src/main/java/net/minecraftforge/registries/MissingMappingsEvent.java index 819722962d..65c4711152 100644 --- a/src/main/java/net/minecraftforge/registries/MissingMappingsEvent.java +++ b/src/main/java/net/minecraftforge/registries/MissingMappingsEvent.java @@ -8,7 +8,8 @@ package net.minecraftforge.registries; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.MutableEvent; import org.apache.commons.lang3.Validate; import java.util.Collection; @@ -18,26 +19,24 @@ import java.util.Locale; /** * Fired on the {@link net.minecraftforge.common.MinecraftForge#EVENT_BUS forge bus}. */ -public final class MissingMappingsEvent extends Event -{ +public final class MissingMappingsEvent extends MutableEvent { + public static final EventBus BUS = EventBus.create(MissingMappingsEvent.class); + private final ResourceKey> key; private final IForgeRegistry registry; private final List> mappings; - public MissingMappingsEvent(ResourceKey> key, IForgeRegistry registry, Collection> missed) - { + public MissingMappingsEvent(ResourceKey> key, IForgeRegistry registry, Collection> missed) { this.key = key; this.registry = registry; this.mappings = List.copyOf(missed); } - public ResourceKey> getKey() - { + public ResourceKey> getKey() { return this.key; } - public IForgeRegistry getRegistry() - { + public IForgeRegistry getRegistry() { return this.registry; } @@ -46,8 +45,7 @@ public final class MissingMappingsEvent extends Event * Empty if the registry key doesn't match {@link #getKey()}. */ @SuppressWarnings("unchecked") - public List> getMappings(ResourceKey> registryKey, String namespace) - { + public List> getMappings(ResourceKey> registryKey, String namespace) { return registryKey == this.key ? (List>) (List) this.mappings.stream().filter(e -> e.key.getNamespace().equals(namespace)).toList() : List.of(); @@ -58,8 +56,7 @@ public final class MissingMappingsEvent extends Event * Empty if the registry key doesn't match {@link #getKey()}. */ @SuppressWarnings("unchecked") - public List> getAllMappings(ResourceKey> registryKey) - { + public List> getAllMappings(ResourceKey> registryKey) { return registryKey == this.key ? (List>) (List) this.mappings : List.of(); } @@ -71,8 +68,7 @@ public final class MissingMappingsEvent extends Event *

    • {@link #FAIL} means this missing mapping will prevent the world from loading. *
    */ - public enum Action - { + public enum Action { /** * Take the default action */ @@ -95,8 +91,7 @@ public final class MissingMappingsEvent extends Event REMAP } - public static class Mapping implements Comparable> - { + public static class Mapping implements Comparable> { private final IForgeRegistry registry; private final IForgeRegistry pool; final ResourceLocation key; @@ -104,8 +99,7 @@ public final class MissingMappingsEvent extends Event Action action = Action.DEFAULT; T target; - public Mapping(IForgeRegistry registry, IForgeRegistry pool, ResourceLocation key, int id) - { + public Mapping(IForgeRegistry registry, IForgeRegistry pool, ResourceLocation key, int id) { this.registry = registry; this.pool = pool; this.key = key; @@ -115,24 +109,21 @@ public final class MissingMappingsEvent extends Event /** * Ignore the missing item. */ - public void ignore() - { + public void ignore() { action = Action.IGNORE; } /** * Warn the user about the missing item. */ - public void warn() - { + public void warn() { action = Action.WARN; } /** * Prevent the world from loading due to the missing item. */ - public void fail() - { + public void fail() { action = Action.FAIL; } @@ -144,8 +135,7 @@ public final class MissingMappingsEvent extends Event * * @param target Entry to remap to. */ - public void remap(T target) - { + public void remap(T target) { Validate.notNull(target, "Remap target can not be null"); Validate.isTrue(pool.getKey(target) != null, String.format(Locale.ENGLISH, "The specified entry %s hasn't been registered in registry yet.", target)); @@ -153,24 +143,20 @@ public final class MissingMappingsEvent extends Event this.target = target; } - public IForgeRegistry getRegistry() - { + public IForgeRegistry getRegistry() { return this.registry; } - public ResourceLocation getKey() - { + public ResourceLocation getKey() { return key; } - public int getId() - { + public int getId() { return this.id; } @Override - public int compareTo(Mapping o) - { + public int compareTo(Mapping o) { int ret = this.registry.getRegistryName().compareNamespaced(o.registry.getRegistryName()); if (ret == 0) ret = this.key.compareNamespaced(o.key); diff --git a/src/main/java/net/minecraftforge/registries/NewRegistryEvent.java b/src/main/java/net/minecraftforge/registries/NewRegistryEvent.java index 2bf066113f..d5a837d5b9 100644 --- a/src/main/java/net/minecraftforge/registries/NewRegistryEvent.java +++ b/src/main/java/net/minecraftforge/registries/NewRegistryEvent.java @@ -14,7 +14,8 @@ import java.util.function.Consumer; import java.util.function.Supplier; import net.minecraft.core.MappedRegistry; import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.event.IModBusEvent; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -22,7 +23,11 @@ import org.slf4j.Logger; /** * Register new registries when you receive this event through {@link RegistryBuilder} and {@link #create(RegistryBuilder)}. */ -public final class NewRegistryEvent extends Event implements IModBusEvent { +public final class NewRegistryEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, NewRegistryEvent.class); + } + private static final Logger LOGGER = LogUtils.getLogger(); private final List> registries = new ArrayList<>(); diff --git a/src/main/java/net/minecraftforge/registries/RegisterEvent.java b/src/main/java/net/minecraftforge/registries/RegisterEvent.java index 1b6c79a1c6..9096e5cdfb 100644 --- a/src/main/java/net/minecraftforge/registries/RegisterEvent.java +++ b/src/main/java/net/minecraftforge/registries/RegisterEvent.java @@ -8,7 +8,8 @@ package net.minecraftforge.registries; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.bus.EventBus; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.event.IModBusEvent; import org.jetbrains.annotations.NotNull; @@ -25,7 +26,11 @@ import java.util.function.Supplier; * @see #register(ResourceKey, ResourceLocation, Supplier) * @see #register(ResourceKey, Consumer) */ -public class RegisterEvent extends Event implements IModBusEvent { +public class RegisterEvent implements IModBusEvent { + public static EventBus getBus(BusGroup modBusGroup) { + return IModBusEvent.getBus(modBusGroup, RegisterEvent.class); + } + @NotNull private final ResourceKey> registryKey; @Nullable diff --git a/src/main/java/net/minecraftforge/resource/ResourcePackLoader.java b/src/main/java/net/minecraftforge/resource/ResourcePackLoader.java index cf92e46207..8a8632fb79 100644 --- a/src/main/java/net/minecraftforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/minecraftforge/resource/ResourcePackLoader.java @@ -79,7 +79,7 @@ public class ResourcePackLoader { private static void findPacks(Consumer packAcceptor, boolean client) { var type = client ? PackType.CLIENT_RESOURCES : PackType.SERVER_DATA; - var version = SharedConstants.getCurrentVersion().getPackVersion(type); + var version = SharedConstants.getCurrentVersion().packVersion(type); var hiddenPacks = new ArrayList(); for (var mod : ModList.get().getModFiles()) { diff --git a/src/main/java/net/minecraftforge/server/ServerLifecycleHooks.java b/src/main/java/net/minecraftforge/server/ServerLifecycleHooks.java index 652dbdee70..4823a6deef 100644 --- a/src/main/java/net/minecraftforge/server/ServerLifecycleHooks.java +++ b/src/main/java/net/minecraftforge/server/ServerLifecycleHooks.java @@ -35,7 +35,6 @@ import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import net.minecraft.server.MinecraftServer; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.config.ConfigTracker; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.event.server.ServerAboutToStartEvent; @@ -74,24 +73,23 @@ public class ServerLifecycleHooks { LogicalSidedProvider.setServer(()->server); ConfigTracker.INSTANCE.loadConfigs(ModConfig.Type.SERVER, getServerConfigPath(server)); runModifiers(server); - return !MinecraftForge.EVENT_BUS.post(new ServerAboutToStartEvent(server)); + return !ServerAboutToStartEvent.BUS.post(new ServerAboutToStartEvent(server)); } public static boolean handleServerStarting(final MinecraftServer server) { if (FMLEnvironment.dist.isDedicatedServer()) LanguageHook.loadLanguagesOnServer(server); PermissionAPI.initializePermissionAPI(); - return !MinecraftForge.EVENT_BUS.post(new ServerStartingEvent(server)); + return !ServerStartingEvent.BUS.post(new ServerStartingEvent(server)); } - public static void expectServerStopped() { exitLatch = new CountDownLatch(1); } public static void handleServerStopped(final MinecraftServer server) { if (!server.isDedicatedServer()) GameData.revertToFrozen(); - MinecraftForge.EVENT_BUS.post(new ServerStoppedEvent(server)); + ServerStoppedEvent.BUS.post(new ServerStoppedEvent(server)); currentServer = null; LogicalSidedProvider.setServer(null); CountDownLatch latch = exitLatch; @@ -142,13 +140,13 @@ public class ServerLifecycleHooks { //================================================================================================================================================================================== public static void handleServerStarted(final MinecraftServer server) { - MinecraftForge.EVENT_BUS.post(new ServerStartedEvent(server)); + ServerStartedEvent.BUS.post(new ServerStartedEvent(server)); allowLogins.set(true); } public static void handleServerStopping(final MinecraftServer server) { allowLogins.set(false); - MinecraftForge.EVENT_BUS.post(new ServerStoppingEvent(server)); + ServerStoppingEvent.BUS.post(new ServerStoppingEvent(server)); } public static boolean handleServerLogin(final ClientIntentionPacket packet, final Connection connection) { diff --git a/src/main/java/net/minecraftforge/server/command/CommandHelper.java b/src/main/java/net/minecraftforge/server/command/CommandHelper.java index c94d1f33d2..cf6dd9d3ef 100644 --- a/src/main/java/net/minecraftforge/server/command/CommandHelper.java +++ b/src/main/java/net/minecraftforge/server/command/CommandHelper.java @@ -15,6 +15,15 @@ import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; import com.mojang.brigadier.tree.RootCommandNode; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.synchronization.ArgumentTypeInfo; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.Connection; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.network.ConnectionType; +import net.minecraftforge.network.NetworkContext; + import java.util.Map; import java.util.function.Function; @@ -93,4 +102,19 @@ public final class CommandHelper { mergeCommandNode(sourceNode, resultNode, sourceToResult, canUse, execute, sourceToResultSuggestion); return resultNode; } + + /** + * Filter for SCommandListPacket. Uses {@link CommandTreeCleaner} to filter out any ArgumentTypes that are not in the "minecraft" or "brigadier" namespace. + * A vanilla client would fail to deserialize the packet and disconnect with an error message if these were sent. + */ + public static RootCommandNode filterCommandList(Connection connection, RootCommandNode root) { + if (NetworkContext.get(connection).getType() != ConnectionType.VANILLA) + return root; + + return CommandTreeCleaner.cleanArgumentTypes(root, argType -> { + ArgumentTypeInfo info = ArgumentTypeInfos.byClass(argType); + ResourceLocation id = BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(info); + return id != null && (id.getNamespace().equals("minecraft") || id.getNamespace().equals("brigadier")); + }); + } } diff --git a/src/main/java/net/minecraftforge/network/filters/CommandTreeCleaner.java b/src/main/java/net/minecraftforge/server/command/CommandTreeCleaner.java similarity index 83% rename from src/main/java/net/minecraftforge/network/filters/CommandTreeCleaner.java rename to src/main/java/net/minecraftforge/server/command/CommandTreeCleaner.java index 49905ff5b4..2181a8f576 100644 --- a/src/main/java/net/minecraftforge/network/filters/CommandTreeCleaner.java +++ b/src/main/java/net/minecraftforge/server/command/CommandTreeCleaner.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only */ -package net.minecraftforge.network.filters; +package net.minecraftforge.server.command; import java.util.HashMap; import java.util.Map; @@ -15,25 +15,20 @@ import com.mojang.brigadier.tree.ArgumentCommandNode; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.RootCommandNode; -class CommandTreeCleaner -{ - +class CommandTreeCleaner { /** * Cleans the command tree starting at the given root node from any argument types that do not match the given predicate. * Any {@code ArgumentCommandNode}s that have an unmatched argument type will be stripped from the tree. * @return A new command tree, stripped of any unmatched argument types */ - public static RootCommandNode cleanArgumentTypes(RootCommandNode root, Predicate> argumentTypeFilter) - { + public static RootCommandNode cleanArgumentTypes(RootCommandNode root, Predicate> argumentTypeFilter) { Predicate> nodeFilter = node -> !(node instanceof ArgumentCommandNode) || argumentTypeFilter.test(((ArgumentCommandNode)node).getType()); return (RootCommandNode)processCommandNode(root, nodeFilter, new HashMap<>()); } - private static CommandNode processCommandNode(CommandNode node, Predicate> nodeFilter, Map, CommandNode> newNodes) - { + private static CommandNode processCommandNode(CommandNode node, Predicate> nodeFilter, Map, CommandNode> newNodes) { CommandNode existingNode = newNodes.get(node); - if (existingNode == null) - { + if (existingNode == null) { CommandNode newNode = cloneNode(node, nodeFilter, newNodes); newNodes.put(node, newNode); node.getChildren().stream() @@ -41,32 +36,21 @@ class CommandTreeCleaner .map(child -> processCommandNode(child, nodeFilter, newNodes)) .forEach(newNode::addChild); return newNode; - } - else - { + } else { return existingNode; } } - private static CommandNode cloneNode(CommandNode node, Predicate> nodeFilter, Map, CommandNode> newNodes) - { - if (node instanceof RootCommandNode) - { + private static CommandNode cloneNode(CommandNode node, Predicate> nodeFilter, Map, CommandNode> newNodes) { + if (node instanceof RootCommandNode) { return new RootCommandNode<>(); - } - else - { + } else { ArgumentBuilder builder = node.createBuilder(); - if (node.getRedirect() != null) - { + if (node.getRedirect() != null) { if (nodeFilter.test(node.getRedirect())) - { builder.forward(processCommandNode(node.getRedirect(), nodeFilter, newNodes), node.getRedirectModifier(), node.isFork()); - } else - { builder.redirect(null); - } } return builder.build(); } diff --git a/src/main/java/net/minecraftforge/server/loading/ServerModLoader.java b/src/main/java/net/minecraftforge/server/loading/ServerModLoader.java index e3248d7fee..a13e0f723d 100644 --- a/src/main/java/net/minecraftforge/server/loading/ServerModLoader.java +++ b/src/main/java/net/minecraftforge/server/loading/ServerModLoader.java @@ -5,10 +5,10 @@ package net.minecraftforge.server.loading; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.*; import net.minecraftforge.logging.CrashReportExtender; import net.minecraftforge.common.util.LogicalSidedProvider; +import net.minecraftforge.eventbus.api.bus.BusGroup; import net.minecraftforge.server.LanguageHook; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -42,7 +42,7 @@ public class ServerModLoader LOGGER.warn(Logging.LOADING, "Mods loaded with {} warnings", warnings.size()); warnings.forEach(warning -> LOGGER.warn(Logging.LOADING, warning.formatToString())); } - MinecraftForge.EVENT_BUS.start(); + BusGroup.DEFAULT.startup(); } public static boolean hasErrors() { diff --git a/src/main/java/net/minecraftforge/server/permission/PermissionAPI.java b/src/main/java/net/minecraftforge/server/permission/PermissionAPI.java index cda1b44b27..4fbcd55461 100644 --- a/src/main/java/net/minecraftforge/server/permission/PermissionAPI.java +++ b/src/main/java/net/minecraftforge/server/permission/PermissionAPI.java @@ -104,8 +104,7 @@ public final class PermissionAPI PermissionAPI.activeHandler = null; - PermissionGatherEvent.Handler handlerEvent = new PermissionGatherEvent.Handler(); - MinecraftForge.EVENT_BUS.post(handlerEvent); + var handlerEvent = PermissionGatherEvent.Handler.BUS.fire(new PermissionGatherEvent.Handler()); Map availableHandlers = handlerEvent.getAvailablePermissionHandlerFactories(); try @@ -119,8 +118,7 @@ public final class PermissionAPI IPermissionHandlerFactory factory = availableHandlers.get(selectedPermissionHandler); - PermissionGatherEvent.Nodes nodesEvent = new PermissionGatherEvent.Nodes(); - MinecraftForge.EVENT_BUS.post(nodesEvent); + var nodesEvent = PermissionGatherEvent.Nodes.BUS.fire(new PermissionGatherEvent.Nodes()); PermissionAPI.activeHandler = factory.create(nodesEvent.getNodes()); diff --git a/src/main/java/net/minecraftforge/server/permission/events/PermissionGatherEvent.java b/src/main/java/net/minecraftforge/server/permission/events/PermissionGatherEvent.java index bc610d560c..18ca0ca2ab 100644 --- a/src/main/java/net/minecraftforge/server/permission/events/PermissionGatherEvent.java +++ b/src/main/java/net/minecraftforge/server/permission/events/PermissionGatherEvent.java @@ -7,7 +7,9 @@ package net.minecraftforge.server.permission.events; import com.google.common.base.Preconditions; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.api.bus.EventBus; +import net.minecraftforge.eventbus.api.event.InheritableEvent; +import net.minecraftforge.eventbus.api.event.MutableEvent; import net.minecraftforge.server.permission.handler.DefaultPermissionHandler; import net.minecraftforge.server.permission.handler.IPermissionHandler; import net.minecraftforge.server.permission.handler.IPermissionHandlerFactory; @@ -24,33 +26,31 @@ import java.util.*; * *

    Note: All PermissionNodes that you want to use, must be registered!

    */ -public sealed class PermissionGatherEvent extends Event -{ +public sealed class PermissionGatherEvent extends MutableEvent implements InheritableEvent { + public static final EventBus BUS = EventBus.create(PermissionGatherEvent.class); /** * Used to register a new PermissionHandler, a server config value exists to choose which one to use. *

    Note: Create a new instance when registering a PermissionHandler. * If you cache it, make sure that your PermissionHandler is actually used after this event.

    */ - public static final class Handler extends PermissionGatherEvent - { + public static final class Handler extends PermissionGatherEvent { + public static final EventBus BUS = EventBus.create(Handler.class); + private final Map availableHandlers = new HashMap<>(); - public Handler() - { + public Handler() { availableHandlers.put(DefaultPermissionHandler.IDENTIFIER, DefaultPermissionHandler::new); } - public Map getAvailablePermissionHandlerFactories() - { + public Map getAvailablePermissionHandlerFactories() { return Collections.unmodifiableMap(availableHandlers); } - public void addPermissionHandler(ResourceLocation identifier, IPermissionHandlerFactory handlerFactory) - { + public void addPermissionHandler(ResourceLocation identifier, IPermissionHandlerFactory handlerFactory) { Preconditions.checkNotNull(identifier, "Permission handler identifier cannot be null!"); Preconditions.checkNotNull(handlerFactory, "Permission handler cannot be null!"); - if(this.availableHandlers.containsKey(identifier)) + if (this.availableHandlers.containsKey(identifier)) throw new IllegalArgumentException("Attempted to overwrite permission handler " + identifier + ", this is not allowed."); this.availableHandlers.put(identifier, handlerFactory); } @@ -60,32 +60,26 @@ public sealed class PermissionGatherEvent extends Event /** * Used to register your PermissionNodes, every node that you want to use, must be registered! */ - public static final class Nodes extends PermissionGatherEvent - { + public static final class Nodes extends PermissionGatherEvent { + public static final EventBus BUS = EventBus.create(Nodes.class); + private final Set> nodes = new HashSet<>(); - public Nodes() - { - } + public Nodes() {} - public Collection> getNodes() - { + public Collection> getNodes() { return Collections.unmodifiableCollection(this.nodes); } - public void addNodes(PermissionNode... nodes) - { - for (PermissionNode node : nodes) - { + public void addNodes(PermissionNode... nodes) { + for (PermissionNode node : nodes) { if (!this.nodes.add(node)) throw new IllegalArgumentException("Tried to register duplicate PermissionNode '" + node.getNodeName() + "'"); } } - public void addNodes(Iterable> nodes) - { - for (PermissionNode node : nodes) - { + public void addNodes(Iterable> nodes) { + for (PermissionNode node : nodes) { if (!this.nodes.add(node)) throw new IllegalArgumentException("Tried to register duplicate PermissionNode '" + node.getNodeName() + "'"); } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index c473a551ba..e600050b6e 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -50,7 +50,7 @@ protected net.minecraft.client.data.models.BlockModelGenerators m_372527_(Lnet/m protected net.minecraft.client.data.models.BlockModelGenerators m_372530_(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createBarrel$23 protected net.minecraft.client.data.models.BlockModelGenerators m_372545_()V # createLightBlock protected net.minecraft.client.data.models.BlockModelGenerators m_372548_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createCoral -protected net.minecraft.client.data.models.BlockModelGenerators m_372570_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createMossyCarpet$49 +protected net.minecraft.client.data.models.BlockModelGenerators m_372570_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createMossyCarpet$51 protected net.minecraft.client.data.models.BlockModelGenerators m_372620_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # copyCopperBulbModel protected net.minecraft.client.data.models.BlockModelGenerators m_372638_(Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$static$13 protected net.minecraft.client.data.models.BlockModelGenerators m_372644_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;)V # createGrassLikeBlock @@ -182,7 +182,7 @@ protected net.minecraft.client.data.models.BlockModelGenerators m_373974_()V # c protected net.minecraft.client.data.models.BlockModelGenerators m_373984_(Lnet/minecraft/world/level/block/Block;)V # createPassiveRail protected net.minecraft.client.data.models.BlockModelGenerators m_373989_(Lnet/minecraft/world/level/block/Block;)V # createRotatableColumn protected net.minecraft.client.data.models.BlockModelGenerators m_374000_(Lnet/minecraft/world/level/block/Block;)V # createRotatedVariantBlock -protected net.minecraft.client.data.models.BlockModelGenerators m_374002_(Lnet/minecraft/data/BlockFamily;)V # lambda$run$58 +protected net.minecraft.client.data.models.BlockModelGenerators m_374002_(Lnet/minecraft/data/BlockFamily;)V # lambda$run$60 protected net.minecraft.client.data.models.BlockModelGenerators m_374004_()V # createCalibratedSculkSensor protected net.minecraft.client.data.models.BlockModelGenerators m_374006_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # createPumpkinVariant protected net.minecraft.client.data.models.BlockModelGenerators m_374030_()V # createChests @@ -205,7 +205,7 @@ protected net.minecraft.client.data.models.BlockModelGenerators m_374293_()V # c protected net.minecraft.client.data.models.BlockModelGenerators m_374299_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;)Lnet/minecraft/client/data/models/blockstates/BlockModelDefinitionGenerator; # createFence protected net.minecraft.client.data.models.BlockModelGenerators m_374303_(Lnet/minecraft/world/level/block/Block;)V # createNyliumBlock protected net.minecraft.client.data.models.BlockModelGenerators m_374308_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/world/level/block/Block;)V # createCandleAndCandleCake -protected net.minecraft.client.data.models.BlockModelGenerators m_374312_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createMossyCarpet$50 +protected net.minecraft.client.data.models.BlockModelGenerators m_374312_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createMossyCarpet$52 protected net.minecraft.client.data.models.BlockModelGenerators m_374339_()V # createRedstoneWire protected net.minecraft.client.data.models.BlockModelGenerators m_374347_()V # createBarrel protected net.minecraft.client.data.models.BlockModelGenerators m_374348_()V # createRespawnAnchor @@ -228,45 +228,45 @@ protected net.minecraft.client.data.models.BlockModelGenerators m_374498_(Lnet/m protected net.minecraft.client.data.models.BlockModelGenerators m_374511_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;Lnet/minecraft/world/level/block/state/properties/Property;[I)V # createCrossBlock protected net.minecraft.client.data.models.BlockModelGenerators m_374514_(Lnet/minecraft/world/level/block/Block;)V # createActiveRail protected net.minecraft.client.data.models.BlockModelGenerators m_374532_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/renderer/block/model/multipart/Condition;Lnet/minecraft/client/renderer/block/model/VariantMutator;Lnet/minecraft/world/level/block/state/properties/BooleanProperty;Lnet/minecraft/client/data/models/model/ModelTemplate;Z)V # addBookSlotModel -protected net.minecraft.client.data.models.BlockModelGenerators m_374541_(Lnet/minecraft/client/data/models/model/ModelTemplate;Ljava/lang/String;Lnet/minecraft/client/data/models/model/TextureMapping;Lnet/minecraft/client/data/models/BlockModelGenerators$BookSlotModelCacheKey;)Lnet/minecraft/resources/ResourceLocation; # lambda$addBookSlotModel$56 +protected net.minecraft.client.data.models.BlockModelGenerators m_374541_(Lnet/minecraft/client/data/models/model/ModelTemplate;Ljava/lang/String;Lnet/minecraft/client/data/models/model/TextureMapping;Lnet/minecraft/client/data/models/BlockModelGenerators$BookSlotModelCacheKey;)Lnet/minecraft/resources/ResourceLocation; # lambda$addBookSlotModel$58 protected net.minecraft.client.data.models.BlockModelGenerators m_374546_()V # createCakeBlock protected net.minecraft.client.data.models.BlockModelGenerators m_382772_(Ljava/lang/String;I)Lnet/minecraft/util/random/Weighted; # lambda$createBambooModels$22 protected net.minecraft.client.data.models.BlockModelGenerators m_382773_(Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSweetBerryBush$41 protected net.minecraft.client.data.models.BlockModelGenerators m_382774_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/world/level/block/entity/vault/VaultState;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createVault$34 -protected net.minecraft.client.data.models.BlockModelGenerators m_382775_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/MultiVariant;Lcom/mojang/datafixers/util/Pair;)V # lambda$createChiseledBookshelf$54 +protected net.minecraft.client.data.models.BlockModelGenerators m_382775_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/MultiVariant;Lcom/mojang/datafixers/util/Pair;)V # lambda$createChiseledBookshelf$56 protected net.minecraft.client.data.models.BlockModelGenerators m_382776_(Lnet/minecraft/world/level/block/Block;Ljava/lang/String;Lnet/minecraft/client/data/models/model/TextureMapping;)V # lambda$createCreakingHeartModel$16 -protected net.minecraft.client.data.models.BlockModelGenerators m_382777_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMultifaceBlockStates$46 +protected net.minecraft.client.data.models.BlockModelGenerators m_382777_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMultifaceBlockStates$48 protected net.minecraft.client.data.models.BlockModelGenerators m_382778_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/world/level/block/state/properties/SculkSensorPhase;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSculkSensor$35 protected net.minecraft.client.data.models.BlockModelGenerators m_382779_([ILnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/BlockModelGenerators$PlantType;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createCrossBlock$17 -protected net.minecraft.client.data.models.BlockModelGenerators m_382780_(Ljava/util/function/Function;Lnet/minecraft/world/level/block/state/StateHolder;Lcom/google/common/collect/ImmutableMap$Builder;Lnet/minecraft/core/Direction;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$selectMultifaceProperties$45 +protected net.minecraft.client.data.models.BlockModelGenerators m_382780_(Ljava/util/function/Function;Lnet/minecraft/world/level/block/state/StateHolder;Lcom/google/common/collect/ImmutableMap$Builder;Lnet/minecraft/core/Direction;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$selectMultifaceProperties$47 protected net.minecraft.client.data.models.BlockModelGenerators m_382781_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createBrushableBlock$15 protected net.minecraft.client.data.models.BlockModelGenerators m_382782_(Ljava/lang/Integer;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createRepeater$37 protected net.minecraft.client.data.models.BlockModelGenerators m_382783_(Lnet/minecraft/client/renderer/block/model/Variant;)Lnet/minecraft/util/random/Weighted; # lambda$variants$9 protected net.minecraft.client.data.models.BlockModelGenerators m_382784_(Lnet/minecraft/client/data/models/MultiVariant;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSnowBlocks$38 -protected net.minecraft.client.data.models.BlockModelGenerators m_382785_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createHangingMoss$52 +protected net.minecraft.client.data.models.BlockModelGenerators m_382785_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createHangingMoss$54 protected net.minecraft.client.data.models.BlockModelGenerators m_382786_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$3 protected net.minecraft.client.data.models.BlockModelGenerators m_382787_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$2 protected net.minecraft.client.data.models.BlockModelGenerators m_382788_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Ljava/lang/Boolean;Lnet/minecraft/world/level/block/state/properties/RailShape;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createActiveRail$20 -protected net.minecraft.client.data.models.BlockModelGenerators m_382789_([Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createRespawnAnchor$57 +protected net.minecraft.client.data.models.BlockModelGenerators m_382789_([Lnet/minecraft/resources/ResourceLocation;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createRespawnAnchor$59 protected net.minecraft.client.data.models.BlockModelGenerators m_382790_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/MultiVariant;Ljava/lang/Boolean;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createMangrovePropagule$30 -protected net.minecraft.client.data.models.BlockModelGenerators m_382791_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMossyCarpet$48 +protected net.minecraft.client.data.models.BlockModelGenerators m_382791_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMossyCarpet$50 protected net.minecraft.client.data.models.BlockModelGenerators m_382792_(Ljava/lang/Integer;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createTurtleEgg$43 -protected net.minecraft.client.data.models.BlockModelGenerators m_382793_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMossyCarpet$51 +protected net.minecraft.client.data.models.BlockModelGenerators m_382793_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMossyCarpet$53 protected net.minecraft.client.data.models.BlockModelGenerators m_382794_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$4 -protected net.minecraft.client.data.models.BlockModelGenerators m_382795_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/renderer/block/model/multipart/Condition;Lnet/minecraft/client/renderer/block/model/VariantMutator;Lcom/mojang/datafixers/util/Pair;)V # lambda$addSlotStateAndRotationVariants$55 +protected net.minecraft.client.data.models.BlockModelGenerators m_382795_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/renderer/block/model/multipart/Condition;Lnet/minecraft/client/renderer/block/model/VariantMutator;Lcom/mojang/datafixers/util/Pair;)V # lambda$addSlotStateAndRotationVariants$57 protected net.minecraft.client.data.models.BlockModelGenerators m_382796_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/world/level/block/state/properties/SculkSensorPhase;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createCalibratedSculkSensor$36 protected net.minecraft.client.data.models.BlockModelGenerators m_382797_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/model/TextureMapping;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createStems$18 protected net.minecraft.client.data.models.BlockModelGenerators m_382798_(Lnet/minecraft/world/level/block/Block;Ljava/lang/Integer;Lnet/minecraft/world/level/block/state/properties/DoubleBlockHalf;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createPitcherCrop$19 protected net.minecraft.client.data.models.BlockModelGenerators m_382799_([ILit/unimi/dsi/fastutil/ints/Int2ObjectMap;Lnet/minecraft/world/level/block/Block;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createCropBlock$26 protected net.minecraft.client.data.models.BlockModelGenerators m_382800_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$8 -protected net.minecraft.client.data.models.BlockModelGenerators m_382801_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMultifaceBlockStates$47 +protected net.minecraft.client.data.models.BlockModelGenerators m_382801_(Lnet/minecraft/client/data/models/blockstates/MultiPartGenerator;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;Lnet/minecraft/world/level/block/state/properties/Property;Lnet/minecraft/client/renderer/block/model/VariantMutator;)V # lambda$createMultifaceBlockStates$49 protected net.minecraft.client.data.models.BlockModelGenerators m_382802_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$7 protected net.minecraft.client.data.models.BlockModelGenerators m_382803_(Ljava/lang/Boolean;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createTripwireHook$42 protected net.minecraft.client.data.models.BlockModelGenerators m_382804_(Lnet/minecraft/world/level/block/state/properties/StructureMode;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createStructureBlock$39 -protected net.minecraft.client.data.models.BlockModelGenerators m_382805_(Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSnifferEgg$44 +protected net.minecraft.client.data.models.BlockModelGenerators m_382805_(Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSnifferEgg$46 protected net.minecraft.client.data.models.BlockModelGenerators m_382806_(Ljava/util/Map;Lnet/minecraft/world/level/block/state/properties/TestBlockMode;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createTestBlock$40 protected net.minecraft.client.data.models.BlockModelGenerators m_382807_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$5 -protected net.minecraft.client.data.models.BlockModelGenerators m_382808_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSculkCatalyst$53 +protected net.minecraft.client.data.models.BlockModelGenerators m_382808_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createSculkCatalyst$55 protected net.minecraft.client.data.models.BlockModelGenerators m_382809_(Lnet/minecraft/client/data/models/blockstates/ConditionBuilder;)Lnet/minecraft/client/data/models/blockstates/ConditionBuilder; # lambda$static$6 protected net.minecraft.client.data.models.BlockModelGenerators m_382810_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Ljava/lang/Boolean;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createCopperBulb$29 protected net.minecraft.client.data.models.BlockModelGenerators m_382811_(Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/client/data/models/MultiVariant;Lnet/minecraft/world/level/block/entity/trialspawner/TrialSpawnerState;Ljava/lang/Boolean;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createTrialSpawner$33 @@ -282,6 +282,9 @@ protected net.minecraft.client.data.models.BlockModelGenerators m_388125_(Lnet/m protected net.minecraft.client.data.models.BlockModelGenerators m_388369_(Lnet/minecraft/client/data/models/model/TexturedModel$Provider;Lnet/minecraft/world/level/block/Block;Ljava/lang/String;)Lnet/minecraft/resources/ResourceLocation; # createCreakingHeartModel protected net.minecraft.client.data.models.BlockModelGenerators m_388485_(Lnet/minecraft/world/level/block/Block;Lnet/minecraft/client/data/models/MultiVariant;Ljava/util/function/Function;Lnet/minecraft/client/data/models/MultiVariant;Ljava/util/function/Function;Lnet/minecraft/client/data/models/MultiVariant;Ljava/util/function/Function;Lnet/minecraft/client/data/models/MultiVariant;Ljava/util/function/Function;)V # createSegmentedBlock protected net.minecraft.client.data.models.BlockModelGenerators m_389054_(Lnet/minecraft/client/renderer/block/model/Variant;)Lnet/minecraft/client/data/models/MultiVariant; # createRotatedVariants +protected net.minecraft.client.data.models.BlockModelGenerators m_400568_(Ljava/lang/Integer;)Lnet/minecraft/resources/ResourceLocation; # lambda$createDriedGhastBlock$44 +protected net.minecraft.client.data.models.BlockModelGenerators m_400569_(Ljava/util/function/Function;Ljava/lang/Integer;)Lnet/minecraft/client/data/models/MultiVariant; # lambda$createDriedGhastBlock$45 +protected net.minecraft.client.data.models.BlockModelGenerators m_402965_()V # createDriedGhastBlock #endgroup protected net.minecraft.client.data.models.BlockModelGenerators f_371124_ # itemModelOutput protected net.minecraft.client.data.models.BlockModelGenerators f_371133_ # modelOutput @@ -326,7 +329,7 @@ protected net.minecraft.client.data.models.ItemModelGenerators m_373819_(Lnet/mi protected net.minecraft.client.data.models.ItemModelGenerators m_373839_(Lnet/minecraft/world/item/Item;)V # generateTrident protected net.minecraft.client.data.models.ItemModelGenerators m_373858_(Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModel protected net.minecraft.client.data.models.ItemModelGenerators m_373869_(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/Item;Lnet/minecraft/client/data/models/model/ModelTemplate;)Lnet/minecraft/resources/ResourceLocation; # createFlatItemModel -protected net.minecraft.client.data.models.ItemModelGenerators m_373892_(Lnet/minecraft/world/item/Item;)V # generateWolfArmor +protected net.minecraft.client.data.models.ItemModelGenerators m_373892_(Lnet/minecraft/world/item/Item;)V # generateTwoLayerDyedItem protected net.minecraft.client.data.models.ItemModelGenerators m_374089_(Lnet/minecraft/world/item/Item;)V # generateBow protected net.minecraft.client.data.models.ItemModelGenerators m_374190_(Lnet/minecraft/world/item/Item;)V # generateFishingRod protected net.minecraft.client.data.models.ItemModelGenerators m_374289_(Lnet/minecraft/world/item/Item;)V # generateBrush @@ -356,6 +359,7 @@ protected net.minecraft.client.gui.screens.inventory.AbstractContainerScreen m_3 public net.minecraft.client.model.geom.LayerDefinitions f_171106_ # OUTER_ARMOR_DEFORMATION public net.minecraft.client.model.geom.LayerDefinitions f_171107_ # INNER_ARMOR_DEFORMATION public net.minecraft.client.multiplayer.ClientPacketListener f_104899_ # commands +public net.minecraft.client.multiplayer.ClientPacketListener f_399181_ # COMMAND_NODE_BUILDER public net.minecraft.client.multiplayer.SessionSearchTrees f_336706_ # CREATIVE_TAGS public net.minecraft.client.multiplayer.SessionSearchTrees f_337599_ # CREATIVE_NAMES public net.minecraft.client.multiplayer.SessionSearchTrees$Key @@ -375,19 +379,18 @@ public net.minecraft.client.renderer.RenderPipelines f_380191_ # PARTICLE_SNIPPE public net.minecraft.client.renderer.RenderPipelines f_380221_ # FOG_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_380403_ # END_PORTAL_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_380564_ # OUTLINE_SNIPPET -public net.minecraft.client.renderer.RenderPipelines f_380734_ # MATRICES_SNIPPET -public net.minecraft.client.renderer.RenderPipelines f_380747_ # MATRICES_COLOR_FOG_OFFSET_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_381014_ # CLOUDS_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_381310_ # WEATHER_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_381389_ # PIPELINES_BY_LOCATION -public net.minecraft.client.renderer.RenderPipelines f_381438_ # MATRICES_COLOR_SNIPPET -public net.minecraft.client.renderer.RenderPipelines f_381970_ # MATRICES_COLOR_FOG_LIGHT_DIR_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_381976_ # ENTITY_SNIPPET -public net.minecraft.client.renderer.RenderPipelines f_382307_ # FOG_NO_COLOR_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_382486_ # LINES_SNIPPET -public net.minecraft.client.renderer.RenderPipelines f_382492_ # MATRICES_COLOR_FOG_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_382524_ # GUI_SNIPPET public net.minecraft.client.renderer.RenderPipelines f_382587_ # BEACON_BEAM_SNIPPET +public net.minecraft.client.renderer.RenderPipelines f_398868_ # MATRICES_PROJECTION_SNIPPET +public net.minecraft.client.renderer.RenderPipelines f_399346_ # GLOBALS_SNIPPET +public net.minecraft.client.renderer.RenderPipelines f_399373_ # ENTITY_EMISSIVE_SNIPPET +public net.minecraft.client.renderer.RenderPipelines f_400011_ # MATRICES_FOG_LIGHT_DIR_SNIPPET +public net.minecraft.client.renderer.RenderPipelines f_400219_ # MATRICES_FOG_SNIPPET #endgroup public net.minecraft.client.renderer.RenderStateShard f_110117_ # NO_LAYERING public net.minecraft.client.renderer.RenderStateShard f_110119_ # VIEW_OFFSET_Z_LAYERING @@ -420,7 +423,6 @@ public net.minecraft.client.renderer.RenderStateShard$OffsetTexturingStateShard public net.minecraft.client.renderer.RenderStateShard$OutputStateShard public net.minecraft.client.renderer.RenderStateShard$OverlayStateShard public net.minecraft.client.renderer.RenderStateShard$TextureStateShard -protected-f net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110329_ # blur protected-f net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110330_ # mipmap public net.minecraft.client.renderer.RenderStateShard$TexturingStateShard public net.minecraft.client.renderer.RenderType m_173209_(Ljava/lang/String;ILcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/client/renderer/RenderType$CompositeState;)Lnet/minecraft/client/renderer/RenderType$CompositeRenderType; # create @@ -509,10 +511,9 @@ public net.minecraft.data.recipes.packs.VanillaRecipeProvider f_244430_ # EMERAL public net.minecraft.data.recipes.packs.VanillaRecipeProvider f_244565_ # REDSTONE_SMELTABLES public net.minecraft.data.recipes.packs.VanillaRecipeProvider f_244628_ # LAPIS_SMELTABLES public-f net.minecraft.data.registries.RegistriesDatapackGenerator m_6055_()Ljava/lang/String; # getName -public net.minecraft.data.tags.IntrinsicHolderTagsProvider$IntrinsicTagAppender protected net.minecraft.data.tags.TagsProvider f_126543_ # builders public-f net.minecraft.data.tags.TagsProvider m_6055_()Ljava/lang/String; # getName -public net.minecraft.data.tags.TagsProvider$TagAppender +public net.minecraft.data.tags.VanillaItemTagsProvider$BlockToItemConverter public net.minecraft.resources.ResourceLocation m_135835_(C)Z # validNamespaceChar public net.minecraft.resources.ResourceLocation m_135841_(Ljava/lang/String;)Z # isValidPath public net.minecraft.resources.ResourceLocation m_135843_(Ljava/lang/String;)Z # isValidNamespace @@ -537,6 +538,7 @@ public net.minecraft.util.thread.BlockableEventLoop m_18689_(Ljava/lang/Runnable public net.minecraft.world.damagesource.DamageSource (Lnet/minecraft/core/Holder;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/phys/Vec3;)V # constructor #endgroup protected net.minecraft.world.entity.Entity f_19843_ # ENTITY_COUNTER +public net.minecraft.world.entity.Entity f_399955_ # LOGGER public net.minecraft.world.entity.Entity m_20078_()Ljava/lang/String; # getEncodeId public net.minecraft.world.entity.Mob f_21345_ # goalSelector public net.minecraft.world.entity.Mob f_21346_ # targetSelector diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 52cbfa8197..d863d55ca1 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -11,7 +11,7 @@ updateJSONURL="https://files.minecraftforge.net/net/minecraftforge/forge/promoti displayURL="https://minecraftforge.net/" displayName="Forge" credits="Anyone who has contributed on Github and supports our development" -authors="LexManos,cpw" +authors="LexManos and the community" description=''' Forge, a broad compatibility API. ''' diff --git a/src/test/generated/additional_model/data/forge/test_instance/additional_model/block_model.json b/src/test/generated/additional_model/data/forge/test_instance/additional_model/block_model.json new file mode 100644 index 0000000000..d89f618386 --- /dev/null +++ b/src/test/generated/additional_model/data/forge/test_instance/additional_model/block_model.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:additional_model/block_model", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/additional_model/data/forge/test_instance/additional_model/item_model.json b/src/test/generated/additional_model/data/forge/test_instance/additional_model/item_model.json new file mode 100644 index 0000000000..3acd9c330c --- /dev/null +++ b/src/test/generated/additional_model/data/forge/test_instance/additional_model/item_model.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:function", + "environment": "minecraft:default", + "function": "forge:additional_model/item_model", + "max_ticks": 100, + "structure": "forge:empty3x3x3" +} \ No newline at end of file diff --git a/src/test/generated/mdk_datagen/pack.mcmeta b/src/test/generated/mdk_datagen/pack.mcmeta index 8b20d76544..e49c14e7f8 100644 --- a/src/test/generated/mdk_datagen/pack.mcmeta +++ b/src/test/generated/mdk_datagen/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "${mod_id} resources", - "pack_format": 55 + "pack_format": 63 } } \ No newline at end of file diff --git a/src/test/generated/test_helper_mod/pack.mcmeta b/src/test/generated/test_helper_mod/pack.mcmeta index 262d049729..c551bea013 100644 --- a/src/test/generated/test_helper_mod/pack.mcmeta +++ b/src/test/generated/test_helper_mod/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Forge tests resource pack", - "pack_format": 55 + "pack_format": 63 } } \ No newline at end of file diff --git a/src/test/java/com/example/examplemod/Config.java b/src/test/java/com/example/examplemod/Config.java index e2ef787df5..a117d0a86c 100644 --- a/src/test/java/com/example/examplemod/Config.java +++ b/src/test/java/com/example/examplemod/Config.java @@ -3,7 +3,7 @@ package com.example.examplemod; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraftforge.common.ForgeConfigSpec; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.config.ModConfigEvent; import net.minecraftforge.registries.ForgeRegistries; diff --git a/src/test/java/com/example/examplemod/ExampleMod.java b/src/test/java/com/example/examplemod/ExampleMod.java index acde8c9c1c..6de1b0d2fc 100644 --- a/src/test/java/com/example/examplemod/ExampleMod.java +++ b/src/test/java/com/example/examplemod/ExampleMod.java @@ -13,11 +13,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.MapColor; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; @@ -76,23 +73,20 @@ public class ExampleMod { }).build()); public ExampleMod(FMLJavaModLoadingContext context) { - IEventBus modEventBus = context.getModEventBus(); + var modBusGroup = context.getModBusGroup(); // Register the commonSetup method for modloading - modEventBus.addListener(this::commonSetup); + FMLCommonSetupEvent.getBus(modBusGroup).addListener(this::commonSetup); // Register the Deferred Register to the mod event bus so blocks get registered - BLOCKS.register(modEventBus); + BLOCKS.register(modBusGroup); // Register the Deferred Register to the mod event bus so items get registered - ITEMS.register(modEventBus); + ITEMS.register(modBusGroup); // Register the Deferred Register to the mod event bus so tabs get registered - CREATIVE_MODE_TABS.register(modEventBus); - - // Register ourselves for server and other game events we are interested in - MinecraftForge.EVENT_BUS.register(this); + CREATIVE_MODE_TABS.register(modBusGroup); // Register the item to a creative tab - modEventBus.addListener(this::addCreative); + BuildCreativeModeTabContentsEvent.getBus(modBusGroup).addListener(ExampleMod::addCreative); // Register our mod's ForgeConfigSpec so that Forge can create and load the config file for us context.registerConfig(ModConfig.Type.COMMON, Config.SPEC); @@ -111,20 +105,13 @@ public class ExampleMod { } // Add the example block item to the building blocks tab - private void addCreative(BuildCreativeModeTabContentsEvent event) { + private static void addCreative(BuildCreativeModeTabContentsEvent event) { if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) event.accept(EXAMPLE_BLOCK_ITEM); } - // You can use SubscribeEvent and let the Event Bus discover methods to call - @SubscribeEvent - public void onServerStarting(ServerStartingEvent event) { - // Do something when the server starts - LOGGER.info("HELLO from server starting"); - } - // You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent - @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) + @Mod.EventBusSubscriber(modid = MODID, value = Dist.CLIENT) public static class ClientModEvents { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { diff --git a/src/test/java/net/minecraftforge/debug/chunk/LightingEventTest.java b/src/test/java/net/minecraftforge/debug/chunk/LightingEventTest.java index 44d1fd77ad..0f71af4cb3 100644 --- a/src/test/java/net/minecraftforge/debug/chunk/LightingEventTest.java +++ b/src/test/java/net/minecraftforge/debug/chunk/LightingEventTest.java @@ -29,13 +29,13 @@ public class LightingEventTest extends BaseTestMod { private static final int MAX_CHUNK_LOCATION_ATTEMPTS = 5; public LightingEventTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest public static void testLightingEventFires(GameTestHelper helper) { var eventFired = helper.boolFlag("eventFired"); - helper.addEventListener(event -> eventFired.set(true)); + helper.addEventListener(ChunkEvent.LightingCalculated.BUS, event -> eventFired.set(true)); var random = RandomSource.create(); var level = helper.getLevel(); diff --git a/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java b/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java index 9dba286a22..6c39ecc96b 100644 --- a/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java +++ b/src/test/java/net/minecraftforge/debug/client/AdditionalModelTest.java @@ -45,7 +45,7 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.event.ModelEvent; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.loading.FMLLoader; @@ -55,6 +55,7 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; +import java.lang.invoke.MethodHandles; import java.nio.file.Path; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -79,14 +80,8 @@ public class AdditionalModelTest extends BaseTestMod { private static final RegistryObject PIG_HEAD_ITEM = ITEMS.register("pig_head", () -> new Item(new Item.Properties().setId(ITEMS.key("pig_head")))); public AdditionalModelTest(FMLJavaModLoadingContext context) { - super(context, false); - - modBus.register(this); - - if (FMLLoader.getLaunchHandler().isData()) { - BLOCKS.register(modBus); - ITEMS.register(modBus); - } + super(context, false, FMLLoader.getLaunchHandler().isData()); + modBus.register(MethodHandles.lookup(), this); } @SubscribeEvent @@ -95,7 +90,6 @@ public class AdditionalModelTest extends BaseTestMod { event.getGenerator().addProvider(event.includeClient(), new ModelProvider(out)); } - @SubscribeEvent public void onRegisterAdditional(ModelEvent.RegisterModelStateDefinitions event) { // Our fake blocks are only created during data gen, so we have to add a fake mapper @@ -135,7 +129,8 @@ public class AdditionalModelTest extends BaseTestMod { pig.addLayer(new RenderLayer<>(pig) { @Override public void render(PoseStack stack, MultiBufferSource source, int light, PigRenderState state, float xRot, float yRot) { - this.getParentModel().getAnyDescendantWithName("head").ifPresent(part -> { + var part = this.getParentModel().root().createPartLookup().apply("head"); + if (part != null) { var manager = Minecraft.getInstance().getModelManager(); var resolver = Minecraft.getInstance().getItemModelResolver(); stack.pushPose(); @@ -148,7 +143,7 @@ public class AdditionalModelTest extends BaseTestMod { var renderState = new ItemStackRenderState(); model.update(renderState, new ItemStack(Items.STONE), resolver, ItemDisplayContext.FIXED, null, null, 0); stack.popPose(); - }); + } } }); @@ -158,7 +153,8 @@ public class AdditionalModelTest extends BaseTestMod { cow.addLayer(new RenderLayer<>(cow) { @Override public void render(PoseStack stack, MultiBufferSource source, int light, LivingEntityRenderState state, float xRot, float yRot) { - this.getParentModel().getAnyDescendantWithName("head").ifPresent(part -> { + var part = this.getParentModel().root().createPartLookup().apply("head"); + if (part != null) { var manager = Minecraft.getInstance().getModelManager(); stack.pushPose(); @@ -174,7 +170,7 @@ public class AdditionalModelTest extends BaseTestMod { var consumer = source.getBuffer(RenderType.solid()); ModelBlockRenderer.renderModel(stack.last(), consumer, model, 1.0F, 1.0F, 1.0F, light, OverlayTexture.NO_OVERLAY, ModelData.EMPTY, null); stack.popPose(); - }); + } } }); } diff --git a/src/test/java/net/minecraftforge/debug/client/CustomizeGuiOverlayEventTest.java b/src/test/java/net/minecraftforge/debug/client/CustomizeGuiOverlayEventTest.java index f30b852fc9..525c2df149 100644 --- a/src/test/java/net/minecraftforge/debug/client/CustomizeGuiOverlayEventTest.java +++ b/src/test/java/net/minecraftforge/debug/client/CustomizeGuiOverlayEventTest.java @@ -6,7 +6,6 @@ package net.minecraftforge.debug.client; import net.minecraftforge.client.event.CustomizeGuiOverlayEvent; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; @Mod(CustomizeGuiOverlayEventTest.MODID) @@ -18,8 +17,8 @@ public class CustomizeGuiOverlayEventTest public CustomizeGuiOverlayEventTest() { if(ENABLED) { - MinecraftForge.EVENT_BUS.addListener(this::onRenderOverlaychat); - MinecraftForge.EVENT_BUS.addListener(this::onRenderOverlayDebug); + CustomizeGuiOverlayEvent.Chat.BUS.addListener(this::onRenderOverlaychat); + CustomizeGuiOverlayEvent.DebugText.BUS.addListener(this::onRenderOverlayDebug); } } diff --git a/src/test/java/net/minecraftforge/debug/client/GuiLayeringTest.java b/src/test/java/net/minecraftforge/debug/client/GuiLayeringTest.java index f620ac0e9b..984de47374 100644 --- a/src/test/java/net/minecraftforge/debug/client/GuiLayeringTest.java +++ b/src/test/java/net/minecraftforge/debug/client/GuiLayeringTest.java @@ -16,7 +16,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.client.gui.widget.ExtendedButton; import net.minecraftforge.client.gui.widget.ForgeSlider; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import java.util.Random; @@ -32,7 +32,7 @@ public class GuiLayeringTest { public static class ClientEvents { @SuppressWarnings("unused") @SubscribeEvent - public static void guiOpen(ScreenEvent.Init event) { + public static void guiOpen(ScreenEvent.Init.Post event) { if (event.getScreen() instanceof AbstractContainerScreen && ENABLED) { event.addListener(Button.builder(Component.literal("Test Gui Layering"), btn -> { Minecraft.getInstance().pushGuiLayer(new TestLayer(Component.literal("LayerScreen"))); diff --git a/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java b/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java index 693c04a577..7b5cb2e13b 100644 --- a/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java +++ b/src/test/java/net/minecraftforge/debug/client/LateBoundIdMapperTest.java @@ -28,7 +28,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; @GameTestNamespace("forge") public class LateBoundIdMapperTest extends BaseTestMod { public LateBoundIdMapperTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } public static final String MODID = "late_bound_id_mapper"; diff --git a/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java b/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java index 48487e2940..ecf5b8ba4e 100644 --- a/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java +++ b/src/test/java/net/minecraftforge/debug/client/ModelRenderLayerTest.java @@ -12,7 +12,7 @@ import net.minecraft.client.data.models.model.ItemModelUtils; import net.minecraft.client.data.models.model.ModelTemplates; import net.minecraft.client.data.models.model.TextureMapping; import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.registries.Registries; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataProvider; @@ -33,7 +33,6 @@ import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.PushReaction; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -97,12 +96,12 @@ public class ModelRenderLayerTest extends BaseTestMod { public static final RegistryObject OLD_LEAVES_ITEM = ITEMS.register(OLD_LEAVES_NAME, () -> new BlockItem(OLD_LEAVES.get(), new Item.Properties().setId(ITEMS.key(OLD_LEAVES_NAME)))); public ModelRenderLayerTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); testItem(lookup -> new ItemStack(ITEM.get())); } - @SubscribeEvent - public void runData(GatherDataEvent event) { + public void gatherData(GatherDataEvent event) { var out = event.getGenerator().getPackOutput(); event.getGenerator().addProvider(event.includeClient(), new ModelProvider(out)); } @@ -121,11 +120,11 @@ public class ModelRenderLayerTest extends BaseTestMod { ItemBlockRenderTypes.setFancy(true); var layer = model.getRenderTypes(state, random, ModelData.EMPTY); - helper.assertTrue(layer.contains(RenderType.cutout()), "Block model does not contain the correct render type for fancy graphics. Expected: cutout"); + helper.assertTrue(layer.contains(ChunkSectionLayer.CUTOUT), "Block model does not contain the correct render type for fancy graphics. Expected: cutout"); ItemBlockRenderTypes.setFancy(false); layer = model.getRenderTypes(state, random, ModelData.EMPTY); - helper.assertTrue(layer.contains(RenderType.solid()), "Block model does not contain the correct render type for fast graphics. Expected: solid"); + helper.assertTrue(layer.contains(ChunkSectionLayer.SOLID), "Block model does not contain the correct render type for fast graphics. Expected: solid"); helper.succeed(); } @@ -145,11 +144,11 @@ public class ModelRenderLayerTest extends BaseTestMod { ItemBlockRenderTypes.setFancy(true); var layer = model.getRenderTypes(state, random, ModelData.EMPTY); - helper.assertTrue(layer.contains(RenderType.cutoutMipped()), "Block model does not contain the correct render type for fancy graphics. Expected: cutout_mipped"); + helper.assertTrue(layer.contains(ChunkSectionLayer.CUTOUT_MIPPED), "Block model does not contain the correct render type for fancy graphics. Expected: cutout_mipped"); ItemBlockRenderTypes.setFancy(false); layer = model.getRenderTypes(state, random, ModelData.EMPTY); - helper.assertTrue(layer.contains(RenderType.solid()), "Block model does not contain the correct render type for fast graphics. Expected: solid"); + helper.assertTrue(layer.contains(ChunkSectionLayer.SOLID), "Block model does not contain the correct render type for fast graphics. Expected: solid"); helper.succeed(); } diff --git a/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java b/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java index 21e2eb1049..e7e485acc1 100644 --- a/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java +++ b/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java @@ -20,7 +20,6 @@ import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegisterEvent; @@ -39,10 +38,10 @@ public class CreativeModeTabTest { if (!ENABLED) return; - IEventBus modEventBus = context.getModEventBus(); + var modBus = context.getModBusGroup(); - modEventBus.addListener(CreativeModeTabTest::onCreativeModeTabRegister); - modEventBus.addListener(CreativeModeTabTest::onCreativeModeTabBuildContents); + RegisterEvent.getBus(modBus).addListener(CreativeModeTabTest::onCreativeModeTabRegister); + BuildCreativeModeTabContentsEvent.getBus(modBus).addListener(CreativeModeTabTest::onCreativeModeTabBuildContents); } private static void onCreativeModeTabRegister(RegisterEvent event) { diff --git a/src/test/java/net/minecraftforge/debug/dist/DistExecutorTest.java b/src/test/java/net/minecraftforge/debug/dist/DistExecutorTest.java index 1ee9a8377c..70a8299f2a 100644 --- a/src/test/java/net/minecraftforge/debug/dist/DistExecutorTest.java +++ b/src/test/java/net/minecraftforge/debug/dist/DistExecutorTest.java @@ -21,7 +21,7 @@ public class DistExecutorTest extends BaseTestMod { static final String MOD_ID = "dist_executor"; public DistExecutorTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest diff --git a/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java b/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java index 6180f33769..f1bbd2ef06 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/biome/BiomeTestMod.java @@ -48,6 +48,6 @@ public class BiomeTestMod extends BaseTestMod { }); public BiomeTestMod(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); } } diff --git a/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java b/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java index d99c210f01..72b710caca 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/block/ChorusBlockPlacementTest.java @@ -13,7 +13,6 @@ import net.minecraft.world.level.block.Blocks; import net.minecraftforge.common.Tags; import net.minecraftforge.common.data.BlockTagsProvider; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -32,7 +31,8 @@ public class ChorusBlockPlacementTest extends BaseTestMod { private static final RegistryObject BLOCK = BLOCKS.register("placeable_on_chorus", () -> new Block(Block.Properties.of().setId(BLOCKS.key("placeable_on_chorus")))); public ChorusBlockPlacementTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } @GameTest @@ -47,8 +47,7 @@ public class ChorusBlockPlacementTest extends BaseTestMod { }); } - @SubscribeEvent - public void runData(GatherDataEvent event) { + private void gatherData(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new BlockTags(event)); } diff --git a/src/test/java/net/minecraftforge/debug/gameplay/block/PlantTypePlacementTest.java b/src/test/java/net/minecraftforge/debug/gameplay/block/PlantTypePlacementTest.java index 575f68954a..eb628c1098 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/block/PlantTypePlacementTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/block/PlantTypePlacementTest.java @@ -128,7 +128,7 @@ public class PlantTypePlacementTest extends BaseTestMod { } public PlantTypePlacementTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } // Tests to make sure that we know about all plants in vanilla diff --git a/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java b/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java index a5bee3f129..cffdc0f39b 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/crafting/ConditionalRecipeTest.java @@ -16,7 +16,7 @@ import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.data.recipes.RecipeProvider; import net.minecraft.data.recipes.SimpleCookingRecipeBuilder; import net.minecraft.data.recipes.SingleItemRecipeBuilder; -import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.data.tags.VanillaItemTagsProvider; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.tags.ItemTags; import net.minecraft.tags.TagKey; @@ -36,7 +36,7 @@ import net.minecraftforge.common.crafting.conditions.IConditionBuilder; import net.minecraftforge.common.data.BlockTagsProvider; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -49,16 +49,16 @@ public class ConditionalRecipeTest extends BaseTestMod { static final String MODID = "conditional_recipe"; public ConditionalRecipeTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } - @SubscribeEvent public void gatherData(GatherDataEvent event) { var gen = event.getGenerator(); gen.addProvider(event.includeServer(), new Recipes.Runner(gen.getPackOutput(), event.getLookupProvider())); var testBlockTags = new TestBlockTags(gen.getPackOutput(), event.getLookupProvider(), event.getExistingFileHelper()); gen.addProvider(event.includeServer(), testBlockTags); - gen.addProvider(event.includeServer(), new TestItemTags(gen.getPackOutput(), event.getLookupProvider(), testBlockTags.contentsGetter(), event.getExistingFileHelper())); + gen.addProvider(event.includeServer(), new TestItemTags(gen.getPackOutput(), event.getLookupProvider(), event.getExistingFileHelper())); } private static > void assertFalse(GameTestHelper helper, RecipeType type, C container) { @@ -183,9 +183,9 @@ public class ConditionalRecipeTest extends BaseTestMod { } } - public static class TestItemTags extends ItemTagsProvider { - public TestItemTags(PackOutput output, CompletableFuture lookupProvider, CompletableFuture> blockTagProvider, ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, blockTagProvider, MODID, existingFileHelper); + public static class TestItemTags extends VanillaItemTagsProvider { + public TestItemTags(PackOutput output, CompletableFuture lookupProvider, ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, MODID, existingFileHelper); } @Override diff --git a/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java b/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java index 547219ca14..9554e110de 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/crafting/CustomIngredientsTest.java @@ -20,7 +20,7 @@ import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.data.recipes.RecipeProvider; import net.minecraft.data.recipes.ShapedRecipeBuilder; -import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.data.tags.VanillaItemTagsProvider; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceKey; @@ -42,7 +42,6 @@ import net.minecraftforge.common.data.BlockTagsProvider; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.common.util.INBTBuilder; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.gametest.GameTest; import net.minecraftforge.gametest.GameTestNamespace; @@ -60,10 +59,10 @@ public class CustomIngredientsTest extends BaseTestMod implements INBTBuilder { private static final TagKey RIGHT = tag("right"); public CustomIngredientsTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } - @SubscribeEvent public void gatherData(GatherDataEvent event) { var gen = event.getGenerator(); var out = gen.getPackOutput(); @@ -237,9 +236,9 @@ public class CustomIngredientsTest extends BaseTestMod implements INBTBuilder { public void addTags(HolderLookup.Provider lookup) { } } - private static class ItemTagsGen extends ItemTagsProvider { + private static class ItemTagsGen extends VanillaItemTagsProvider { public ItemTagsGen(PackOutput out, CompletableFuture lookup, BlockTagsProvider blocks, ExistingFileHelper existing) { - super(out, lookup, blocks.contentsGetter(), MODID, existing); + super(out, lookup, /*blocks.contentsGetter(),*/ MODID, existing); } @Override diff --git a/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java b/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java index c52f9dcd03..251a19c25e 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/crafting/TagsTest.java @@ -22,7 +22,7 @@ public class TagsTest extends BaseTestMod { public static final String MODID = "tags_test"; public TagsTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest diff --git a/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java b/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java index 71a19e832a..79031a38f1 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/criterion/CriterionTest.java @@ -16,35 +16,29 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; -import net.minecraft.data.tags.TagsProvider; +import net.minecraft.data.tags.VanillaItemTagsProvider; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagKey; import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Blocks; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.Tags; import net.minecraftforge.common.data.ForgeAdvancementProvider; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; import net.minecraftforge.gametest.GameTestNamespace; import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; import java.util.List; -import java.util.Objects; @Mod(CriterionTest.MOD_ID) @GameTestNamespace("forge") @@ -56,8 +50,9 @@ public final class CriterionTest extends BaseTestMod { public static final ResourceLocation TEST_ADVANCEMENT_ID = ResourceLocation.fromNamespaceAndPath(MOD_ID, TEST_CRITERION_ID); public CriterionTest(FMLJavaModLoadingContext context) { - super(context); - MinecraftForge.EVENT_BUS.addListener(this::onBlockBreak); + super(context, false, true); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); + BlockEvent.BreakEvent.BUS.addListener(this::onBlockBreak); } @GameTest @@ -105,20 +100,19 @@ public final class CriterionTest extends BaseTestMod { } } - @SubscribeEvent - public void onGatherData(GatherDataEvent event) { + private void gatherData(GatherDataEvent event) { var tag = TagKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath(MOD_ID, "fish")); - event.getGenerator().addProvider(true, new TagsProvider(event.getGenerator().getPackOutput(), Registries.ITEM, event.getLookupProvider(), MOD_ID, event.getExistingFileHelper()) { + event.getGenerator().addProvider(true, new VanillaItemTagsProvider(event.getGenerator().getPackOutput(), event.getLookupProvider(), MOD_ID, event.getExistingFileHelper()) { @Override protected void addTags(HolderLookup.Provider lookup) { this.tag(tag) - .add(TagEntry.element(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(Items.COD)))) - .add(TagEntry.element(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(Items.SALMON)))) - .add(TagEntry.element(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(Items.TROPICAL_FISH)))) - .add(TagEntry.element(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(Items.PUFFERFISH)))) - .add(TagEntry.element(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(Items.COOKED_COD)))) - .add(TagEntry.element(Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(Items.COOKED_SALMON)))) + .add(Items.COD) + .add(Items.SALMON) + .add(Items.TROPICAL_FISH) + .add(Items.PUFFERFISH) + .add(Items.COOKED_COD) + .add(Items.COOKED_SALMON) ; } }); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/data/DatapackBuiltinEntriesProviderTest.java b/src/test/java/net/minecraftforge/debug/gameplay/data/DatapackBuiltinEntriesProviderTest.java index 4bfc98972d..8b39e2197c 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/data/DatapackBuiltinEntriesProviderTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/data/DatapackBuiltinEntriesProviderTest.java @@ -25,7 +25,6 @@ import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.common.world.BiomeModifier; import net.minecraftforge.common.world.ForgeBiomeModifiers; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.ForgeRegistries; @@ -52,11 +51,11 @@ public class DatapackBuiltinEntriesProviderTest extends BaseTestMod { }; public DatapackBuiltinEntriesProviderTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } - @SubscribeEvent - public void onDataGen(GatherDataEvent event) { + private void gatherData(GatherDataEvent event) { var gen = event.getGenerator(); var packOutput = gen.getPackOutput(); /* Adds the DataPackBuiltinEntriesProvider to the data generator diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java index 01783f8b76..d395ffd4ec 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/GatherComponentsEventTest.java @@ -9,9 +9,7 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.food.Foods; import net.minecraft.world.item.Items; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.GatherComponentsEvent; -import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -24,9 +22,8 @@ public class GatherComponentsEventTest extends BaseTestMod { public static final String MOD_ID = "gather_components_test_event"; public GatherComponentsEventTest(FMLJavaModLoadingContext context) { - super(context); - IEventBus bus = MinecraftForge.EVENT_BUS; - bus.addListener(this::onItem); + super(context, false, false); + GatherComponentsEvent.Item.BUS.addListener(this::onItem); } public void onItem(GatherComponentsEvent.Item itemEvent) { diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java index 9ca3f4d31a..6fc6c28112 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/ItemCapabilityTest.java @@ -25,7 +25,6 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.EnergyStorage; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.event.AttachCapabilitiesEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -52,11 +51,10 @@ public class ItemCapabilityTest extends BaseTestMod { ); public ItemCapabilityTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); } - @SubscribeEvent - public static void onEvent(AttachCapabilitiesEvent event) { + private static void onEvent(AttachCapabilitiesEvent event) { if (event.getObject().getItem() == Items.COPPER_INGOT) { event.addCapability( ResourceLocation.fromNamespaceAndPath("forge", "test"), @@ -67,8 +65,7 @@ public class ItemCapabilityTest extends BaseTestMod { @GameTest public static void item_capability(GameTestHelper helper) { - - helper.registerEventListener(ItemCapabilityTest.class); + helper.addEventListener(AttachCapabilitiesEvent.ItemStacks.BUS, ItemCapabilityTest::onEvent); ItemStack stack = new ItemStack(Items.COPPER_INGOT); AtomicReference storageAtomicReference = new AtomicReference<>(); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java index 654bd88b3b..8c491c7d16 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/PreventItemDamageTest.java @@ -49,7 +49,7 @@ public class PreventItemDamageTest extends BaseTestMod { private static final RegistryObject FAKE_SHIELD = ITEMS.register("fake_shield", FakeShieldItem::new); public PreventItemDamageTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); this.testItem(lookup -> FAKE_SHIELD.get().getDefaultInstance()); } @@ -66,7 +66,7 @@ public class PreventItemDamageTest extends BaseTestMod { // setup events var firedLivingEntityUseItem = helper.boolFlag("fired LivingEntityUseItemEvent"); var firedPlayerDestroyItem = helper.boolFlag("fired PlayerDestroyItemEvent"); - helper.addEventListener(event -> { + helper.addEventListener(LivingEntityUseItemEvent.Start.BUS, event -> { if (event.getEntity() != player) return; helper.assertTrue(event.getItem() == shield, () -> "Player is using an item, but it's not the fake shield! Check the game test impl."); @@ -76,7 +76,7 @@ public class PreventItemDamageTest extends BaseTestMod { firedLivingEntityUseItem.set(true); event.setDuration(event.getDuration() - 100); }); - helper.addEventListener(event -> { + helper.addEventListener(PlayerDestroyItemEvent.BUS, event -> { if (event.getEntity() != player) return; helper.assertTrue(event.getOriginal() == shield, () -> "Player destroyed an item, but it's not the fake shield! Check the game test impl."); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java b/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java index ad1c96ff1e..4f5547ebde 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/item/ShieldDisablingTest.java @@ -33,7 +33,7 @@ public final class ShieldDisablingTest extends BaseTestMod { public static final String MOD_ID = "shield_disabling"; public ShieldDisablingTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest @@ -54,7 +54,7 @@ public final class ShieldDisablingTest extends BaseTestMod { // setup player var player = helper.makeMockPlayer(GameType.SURVIVAL); - helper.addEventListener(event -> { + helper.addEventListener(LivingEntityUseItemEvent.Start.BUS, event -> { // Artificially pass 5 seconds from start of the shield // This is because the first 5 ticks, the player is still vulnerable if (event.getEntity() == player) { diff --git a/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java b/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java index bc403e57c2..4c1d2623a5 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/level/ForcedChunkLoadingTest.java @@ -25,7 +25,7 @@ public class ForcedChunkLoadingTest extends BaseTestMod { private static final int MAX_CHUNK_LOCATION_ATTEMPTS = 5; public ForcedChunkLoadingTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java index 1d71dce4f4..2d728d2835 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/ConditionalLootPools.java @@ -21,7 +21,6 @@ import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.test.BaseTestMod; import net.minecraftforge.fml.common.Mod; @@ -46,11 +45,11 @@ public class ConditionalLootPools extends BaseTestMod { private static final RegistryObject TEST_BLOCK = BLOCKS.register("test", () -> new Block(name(MODID, "test", BlockBehaviour.Properties.of()))); public ConditionalLootPools(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } - @SubscribeEvent - public void runData(GatherDataEvent event) { + public void gatherData(GatherDataEvent event) { event.getGenerator().addProvider(event.includeServer(), new LootProvider(event.getGenerator().getPackOutput(), event.getLookupProvider())); } diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java index dce8acae1d..104665d295 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/GlobalLootModifiersTest.java @@ -61,7 +61,7 @@ import net.minecraftforge.common.data.GlobalLootModifierProvider; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.common.loot.LootModifier; import net.minecraftforge.common.loot.LootTableIdCondition; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.test.BaseTestMod; @@ -109,8 +109,9 @@ public class GlobalLootModifiersTest extends BaseTestMod { private static final RegistryObject TEST_ITEM = ITEMS.register("test", () -> new BlockItem(TEST_BLOCK.get(), name(MODID, "test", new Item.Properties()))); public GlobalLootModifiersTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); testItem(lookup -> getSmelterAxe(lookup.lookup(Registries.ENCHANTMENT).get(), true)); + GatherDataEvent.getBus(modBus).addListener(this::runData); } private static ItemStack getSmelterAxe(HolderLookup lookup, boolean enchanted) { @@ -124,7 +125,6 @@ public class GlobalLootModifiersTest extends BaseTestMod { return item; } - @SubscribeEvent public void runData(GatherDataEvent event) { var out = event.getGenerator().getPackOutput(); var lookup = event.getLookupProvider(); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java index da3b35874d..4024814ac5 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/LootEventsTest.java @@ -28,11 +28,9 @@ import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.crafting.conditions.IConditionBuilder; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.LootTableLoadEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -53,12 +51,12 @@ public class LootEventsTest extends BaseTestMod { private static final RegistryObject TEST_BLOCK = BLOCKS.register("test", () -> new Block(name(MODID, "test", BlockBehaviour.Properties.of()))); public LootEventsTest(FMLJavaModLoadingContext context) { - super(context); - MinecraftForge.EVENT_BUS.register(ForgeEvents.class); + super(context, false, true); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); + LootTableLoadEvent.BUS.addListener(ForgeEvents::onLootTableLoad); } - @SubscribeEvent - public void runData(GatherDataEvent event) { + public void gatherData(GatherDataEvent event) { var out = event.getGenerator().getPackOutput(); var lookup = event.getLookupProvider(); event.getGenerator().addProvider(event.includeServer(), new LootProvider(out, lookup)); @@ -80,7 +78,6 @@ public class LootEventsTest extends BaseTestMod { } private class ForgeEvents { - @SubscribeEvent public static void onLootTableLoad(LootTableLoadEvent event) { if (event.getName().equals(TEST_BLOCK.get().getLootTable().orElse(null).location())) { event.getTable().removePool(0); diff --git a/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java b/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java index 96b3708f77..a4a2292147 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/loot/ShearsLootTests.java @@ -42,7 +42,7 @@ public class ShearsLootTests extends BaseTestMod { )); public ShearsLootTests(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); this.testItem(lookup -> MODDED_SHEARS.get().getDefaultInstance()); } diff --git a/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java b/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java index f4815a0567..04d06b8a82 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/redstone/UpdateOrder.java @@ -32,7 +32,7 @@ public class UpdateOrder extends BaseTestMod { private static final int PISTON_DELAY = 4; public UpdateOrder(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest(structure = "update_order:update_order") diff --git a/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java b/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java index 507aaa5c6f..222dcd7ede 100644 --- a/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java +++ b/src/test/java/net/minecraftforge/debug/gameplay/villager/VillagerTypeTestMod.java @@ -38,8 +38,8 @@ public class VillagerTypeTestMod extends BaseTestMod { private static final RegistryObject TEST_VILLAGER_TYPE = VILLAGER_TYPES.register("test_villager_type", () -> new VillagerType()); public VillagerTypeTestMod(FMLJavaModLoadingContext context) { - super(context); - context.getModEventBus().addListener(this::onCommonSetup); + super(context, false, true); + FMLCommonSetupEvent.getBus(this.modBus).addListener(this::onCommonSetup); } private void onCommonSetup(final FMLCommonSetupEvent event) { diff --git a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingAfter.java b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingAfter.java index 9e9ffd1f82..181819806b 100644 --- a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingAfter.java +++ b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingAfter.java @@ -22,7 +22,7 @@ public class ModLoadSortingAfter extends BaseTestMod { static boolean hasInit = false; public ModLoadSortingAfter(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); try { Thread.sleep(Duration.ofSeconds(1)); } catch (InterruptedException e) { diff --git a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingBefore.java b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingBefore.java index ad6492ea9e..0531464144 100644 --- a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingBefore.java +++ b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingBefore.java @@ -22,7 +22,7 @@ public class ModLoadSortingBefore extends BaseTestMod { static boolean hasInit = false; public ModLoadSortingBefore(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); try { Thread.sleep(Duration.ofSeconds(1)); } catch (InterruptedException e) { diff --git a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java index f925bcceda..846d0c68dc 100644 --- a/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java +++ b/src/test/java/net/minecraftforge/debug/loading/sort/ModLoadSortingTest.java @@ -27,7 +27,7 @@ public class ModLoadSortingTest extends BaseTestMod { private static boolean afterHasInit; public ModLoadSortingTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); afterHasInit = ModLoadSortingAfter.hasInit; beforeHasInit = ModLoadSortingBefore.hasInit; } diff --git a/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java b/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java index 222e7e3b54..a51e3137e4 100644 --- a/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java +++ b/src/test/java/net/minecraftforge/debug/modules/automatic/AutomaticModuleMod.java @@ -18,7 +18,7 @@ public class AutomaticModuleMod extends BaseTestMod { public static final String MODID = "automatic_module"; public AutomaticModuleMod(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); } @GameTest diff --git a/src/test/java/net/minecraftforge/debug/modules/closed/ClosedMod.java b/src/test/java/net/minecraftforge/debug/modules/closed/ClosedMod.java index 9f7e91c385..78c28a702c 100644 --- a/src/test/java/net/minecraftforge/debug/modules/closed/ClosedMod.java +++ b/src/test/java/net/minecraftforge/debug/modules/closed/ClosedMod.java @@ -11,7 +11,6 @@ import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.debug.modules.closed.api.PublicUtils; import net.minecraftforge.debug.modules.closed.internala.InternalA; import net.minecraftforge.debug.modules.closed.internalb.InternalB; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.test.BaseTestMod; @@ -22,11 +21,11 @@ public class ClosedMod extends BaseTestMod { public static final String MODID = "closed_module"; public ClosedMod(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } - @SubscribeEvent - public void runData(GatherDataEvent event) { + private void gatherData(GatherDataEvent event) { var out = event.getGenerator().getPackOutput(); event.getGenerator().addProvider(true, new ModuleProvider(out, module())); } diff --git a/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java b/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java index a0f1146706..70668dc031 100644 --- a/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java +++ b/src/test/java/net/minecraftforge/debug/modules/closedtest/ClosedTestsMod.java @@ -10,7 +10,6 @@ import java.util.jar.Manifest; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.debug.modules.closed.api.PublicUtils; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.GameTest; @@ -26,11 +25,11 @@ public class ClosedTestsMod extends BaseTestMod { public static final String MODID = "closed_module_test"; public ClosedTestsMod(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); + GatherDataEvent.getBus(modBus).addListener(this::gatherData); } - @SubscribeEvent - public void runData(GatherDataEvent event) { + public void gatherData(GatherDataEvent event) { var out = event.getGenerator().getPackOutput(); event.getGenerator().addProvider(true, new ModuleProvider(out, module())); event.getGenerator().addProvider(true, new ManifestProvider(out, MODID, manifest())); diff --git a/src/test/java/net/minecraftforge/debug/network/PacketTest.java b/src/test/java/net/minecraftforge/debug/network/PacketTest.java index d714b8b389..d77a8208f7 100644 --- a/src/test/java/net/minecraftforge/debug/network/PacketTest.java +++ b/src/test/java/net/minecraftforge/debug/network/PacketTest.java @@ -20,7 +20,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.CommonListenerCookie; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.network.CustomPayloadEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -41,10 +40,10 @@ public class PacketTest extends BaseTestMod { protected static final Logger LOGGER = LogUtils.getLogger(); public PacketTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, false); + FMLCommonSetupEvent.getBus(modBus).addListener(this::commonSetup); } - @SubscribeEvent public void commonSetup(final FMLCommonSetupEvent event) { TestChannel.registerMessages(); } diff --git a/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java b/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java index 36398973a3..48e0f44966 100644 --- a/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java +++ b/src/test/java/net/minecraftforge/debug/registries/NetworkDatapackRegistryTest.java @@ -18,7 +18,6 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.gametest.GameTest; @@ -41,10 +40,10 @@ public class NetworkDatapackRegistryTest extends BaseTestMod { private static final RegistryObject REGISTRY_ENTRY = REGISTRY.register("test_entry", () -> new DataObject(TEST_VALUE)); public NetworkDatapackRegistryTest(FMLJavaModLoadingContext context) { - super(context); + super(context, false, true); + DataPackRegistryEvent.NewRegistry.getBus(modBus).addListener(this::onNewDatapackRegistry); } - @SubscribeEvent public void onNewDatapackRegistry(DataPackRegistryEvent.NewRegistry event) { event.dataPackRegistry(REGISTRY_KEY, DataObject.DIRECT_CODEC, DataObject.DIRECT_CODEC); } diff --git a/src/test/java/net/minecraftforge/mdk/Datagen.java b/src/test/java/net/minecraftforge/mdk/Datagen.java index 5b699d8b95..82772ae53f 100644 --- a/src/test/java/net/minecraftforge/mdk/Datagen.java +++ b/src/test/java/net/minecraftforge/mdk/Datagen.java @@ -21,7 +21,7 @@ public class Datagen { static final String MOD_ID = "mdk_datagen"; public Datagen(FMLJavaModLoadingContext context) { - context.getModEventBus().addListener(Datagen::gatherData); + GatherDataEvent.getBus(context.getModBusGroup()).addListener(Datagen::gatherData); } private static void gatherData(GatherDataEvent event) { @@ -30,7 +30,7 @@ public class Datagen { gen.addProvider(true, new PackMetadataGenerator(packOutput) .add(PackMetadataSection.TYPE, new PackMetadataSection( Component.literal("${mod_id} resources"), - DetectedVersion.BUILT_IN.getPackVersion(PackType.CLIENT_RESOURCES), + DetectedVersion.BUILT_IN.packVersion(PackType.CLIENT_RESOURCES), Optional.empty() )) ); diff --git a/src/test/java/net/minecraftforge/test/BaseTestMod.java b/src/test/java/net/minecraftforge/test/BaseTestMod.java index 10bd1d907a..ef100ca91a 100644 --- a/src/test/java/net/minecraftforge/test/BaseTestMod.java +++ b/src/test/java/net/minecraftforge/test/BaseTestMod.java @@ -5,6 +5,7 @@ package net.minecraftforge.test; +import java.lang.invoke.MethodHandles.Lookup; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -35,18 +36,19 @@ import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.bus.BusGroup; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.ForgeGameTestHooks; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.DeferredRegisterData; import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.unsafe.UnsafeHacks; public abstract class BaseTestMod { - private List> testItems = new ArrayList<>(); - protected final IEventBus modBus; + private final List> testItems = new ArrayList<>(); + protected final BusGroup modBus; protected final List>, DeferredRegisterData>> dataRegistries = new ArrayList<>(); protected final Set> myDataRegistries = new HashSet<>(); @@ -54,51 +56,63 @@ public abstract class BaseTestMod { protected final Map tests; public BaseTestMod(FMLJavaModLoadingContext context) { - this(context, true); + this(context, true, true); } - public BaseTestMod(FMLJavaModLoadingContext context, boolean register) { - this.modBus = context.getModEventBus(); + public BaseTestMod(FMLJavaModLoadingContext context, boolean registerSelf, boolean registerDeferred) { + this.modBus = context.getModBusGroup(); - if (!register) { - this.tests = Collections.emptyMap(); - return; - } - - modBus.register(this); + if (registerSelf) + modBus.register(LookupHelper.INSTANCE.in(this.getClass()), this); tests = ForgeGameTestHooks.gatherTests(getClass(), this); - Class cls = getClass(); - while (cls != BaseTestMod.class) { - var data = new LinkedHashMap>, DeferredRegisterData>(); - for (var field : cls.getDeclaredFields()) { - if (!Modifier.isStatic(field.getModifiers())) - continue; + if (registerDeferred) { + Class cls = getClass(); + while (cls != BaseTestMod.class) { + var data = new LinkedHashMap>, DeferredRegisterData>(); + for (var field : cls.getDeclaredFields()) { + if (!Modifier.isStatic(field.getModifiers())) + continue; - if (field.getType() == DeferredRegister.class) { - DeferredRegister dr = getField(field, null); - dr.register(modBus); - } else if (field.getType() == DeferredRegisterData.class) { - DeferredRegisterData dr = getField(field, null); - data.put(dr.getRegistryKey(), dr); - if (cls == getClass()) - myDataRegistries.add(dr); + if (field.getType() == DeferredRegister.class) { + DeferredRegister dr = getField(field, null); + dr.register(modBus); + } else if (field.getType() == DeferredRegisterData.class) { + DeferredRegisterData dr = getField(field, null); + data.put(dr.getRegistryKey(), dr); + if (cls == getClass()) + myDataRegistries.add(dr); + } } + + if (!data.isEmpty()) + dataRegistries.addFirst(data); + + cls = cls.getSuperclass(); } - if (!data.isEmpty()) - dataRegistries.addFirst(data); - - cls = cls.getSuperclass(); + if (!myDataRegistries.isEmpty()) + GatherDataEvent.getBus(modBus).addListener(this::generateDataRegistries); } - if (!myDataRegistries.isEmpty()) - modBus.addListener(this::generateDataRegistries); - if (!tests.isEmpty()) { - modBus.addListener(this::registerTestFunctions); - modBus.addListener(this::generateGameTests); + RegisterEvent.getBus(modBus).addListener(this::registerTestFunctions); + GatherDataEvent.getBus(modBus).addListener(this::generateGameTests); + } + } + + + private final class LookupHelper { + private static final Lookup INSTANCE; + static { + try { + var lookupField = Lookup.class.getDeclaredField("IMPL_LOOKUP"); + UnsafeHacks.setAccessible(lookupField); + INSTANCE = (Lookup) lookupField.get(null); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } } } diff --git a/src/test/java/net/minecraftforge/test/TestHelperMod.java b/src/test/java/net/minecraftforge/test/TestHelperMod.java index ff4ee4ef86..ec848a9b8e 100644 --- a/src/test/java/net/minecraftforge/test/TestHelperMod.java +++ b/src/test/java/net/minecraftforge/test/TestHelperMod.java @@ -8,6 +8,7 @@ package net.minecraftforge.test; import java.util.Optional; import net.minecraft.DetectedVersion; +import net.minecraft.SharedConstants; import net.minecraft.core.registries.Registries; import net.minecraft.data.metadata.PackMetadataGenerator; import net.minecraft.network.chat.Component; @@ -19,7 +20,7 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegisterEvent; @@ -53,7 +54,7 @@ public class TestHelperMod extends BaseTestMod { gen.addProvider(true, new PackMetadataGenerator(packOutput) .add(PackMetadataSection.TYPE, new PackMetadataSection( Component.literal("Forge tests resource pack"), - DetectedVersion.BUILT_IN.getPackVersion(PackType.CLIENT_RESOURCES), + SharedConstants.getCurrentVersion().packVersion(PackType.CLIENT_RESOURCES), Optional.empty() //Arrays.stream(PackType.values()).collect(Collectors.toMap(Function.identity(), DetectedVersion.BUILT_IN::getPackVersion)) )) diff --git a/src/test_old/java/net/minecraftforge/debug/AddPackFinderEventTest.java b/src/test_old/java/net/minecraftforge/debug/AddPackFinderEventTest.java index d2d24272d4..6e09b20280 100644 --- a/src/test_old/java/net/minecraftforge/debug/AddPackFinderEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/AddPackFinderEventTest.java @@ -11,7 +11,7 @@ import net.minecraft.server.packs.PathPackResources.PathResourcesSupplier; import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.repository.PackSource; import net.minecraftforge.event.AddPackFindersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -21,11 +21,11 @@ public class AddPackFinderEventTest { private static final boolean ENABLE = false; public static final String MODID = "add_pack_finders_test"; - public AddPackFinderEventTest() { + public AddPackFinderEventTest(FMLJavaModLoadingContext context) { if (!ENABLE) return; - FMLJavaModLoadingContext.get().getModEventBus().register(this); + context.getModBusGroup().register(MethodHandles.lookup(), this); } @SubscribeEvent diff --git a/src/test_old/java/net/minecraftforge/debug/AlterGroundEventTest.java b/src/test_old/java/net/minecraftforge/debug/AlterGroundEventTest.java index e733b010ab..e1b668c2d4 100644 --- a/src/test_old/java/net/minecraftforge/debug/AlterGroundEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/AlterGroundEventTest.java @@ -7,7 +7,7 @@ package net.minecraftforge.debug; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.event.level.AlterGroundEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("alter_ground_event_test") diff --git a/src/test_old/java/net/minecraftforge/debug/CapabilitiesTest.java b/src/test_old/java/net/minecraftforge/debug/CapabilitiesTest.java index 798312ffaa..270724a8b7 100644 --- a/src/test_old/java/net/minecraftforge/debug/CapabilitiesTest.java +++ b/src/test_old/java/net/minecraftforge/debug/CapabilitiesTest.java @@ -25,7 +25,7 @@ import net.minecraftforge.common.capabilities.*; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.util.thread.EffectiveSide; import org.jetbrains.annotations.NotNull; @@ -122,9 +122,9 @@ public class CapabilitiesTest public static class ClientEvents { @SubscribeEvent - public static void clientTick(TickEvent.ClientTickEvent event) + public static void clientTick(TickEvent.ClientTickEvent.Post event) { - if (event.phase == TickEvent.Phase.END && Minecraft.getInstance().level != null) + if (Minecraft.getInstance().level != null) { while(messages.size() > 0) { diff --git a/src/test_old/java/net/minecraftforge/debug/DataGeneratorTest.java b/src/test_old/java/net/minecraftforge/debug/DataGeneratorTest.java index d7ef9b5283..e9536828a1 100644 --- a/src/test_old/java/net/minecraftforge/debug/DataGeneratorTest.java +++ b/src/test_old/java/net/minecraftforge/debug/DataGeneratorTest.java @@ -99,7 +99,7 @@ import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.client.model.generators.ModelFile.UncheckedModelFile; import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder; import net.minecraftforge.client.model.generators.VariantBlockStateBuilder; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.data.event.GatherDataEvent; diff --git a/src/test_old/java/net/minecraftforge/debug/DeferredWorkQueueTest.java b/src/test_old/java/net/minecraftforge/debug/DeferredWorkQueueTest.java index 13c04ea148..993698559d 100644 --- a/src/test_old/java/net/minecraftforge/debug/DeferredWorkQueueTest.java +++ b/src/test_old/java/net/minecraftforge/debug/DeferredWorkQueueTest.java @@ -6,7 +6,7 @@ package net.minecraftforge.debug; import com.mojang.logging.LogUtils; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import org.slf4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/KeyMappingTest.java b/src/test_old/java/net/minecraftforge/debug/KeyMappingTest.java index c11579b607..15aa5f206e 100644 --- a/src/test_old/java/net/minecraftforge/debug/KeyMappingTest.java +++ b/src/test_old/java/net/minecraftforge/debug/KeyMappingTest.java @@ -15,7 +15,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterKeyMappingsEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLConstructModEvent; @@ -29,17 +29,14 @@ public class KeyMappingTest // respective mod, so the user wants them on the same physical key. static KeyMapping stickKey = new KeyMapping("stick_key", InputConstants.KEY_BACKSLASH, KeyMapping.CATEGORY_MISC); static KeyMapping rockKey = new KeyMapping("rock_key", InputConstants.KEY_BACKSLASH, KeyMapping.CATEGORY_MISC); - @SubscribeEvent - public static void init(FMLConstructModEvent event) { - MinecraftForge.EVENT_BUS.addListener(ClientStuff::tick); - } + @SubscribeEvent public static void initKeys(RegisterKeyMappingsEvent event) { event.register(stickKey); event.register(rockKey); } - public static void tick(TickEvent.ClientTickEvent event) { - if(event.phase != TickEvent.Phase.START) return; + @SubscribeEvent + public static void tick(TickEvent.ClientTickEvent.Post event) { if(stickKey.consumeClick()) { Player player = Minecraft.getInstance().player; if(player != null && player.getMainHandItem().is(Items.STICK)) diff --git a/src/test_old/java/net/minecraftforge/debug/PermissionTest.java b/src/test_old/java/net/minecraftforge/debug/PermissionTest.java index 1f31cc6fa7..227f84a2dd 100644 --- a/src/test_old/java/net/minecraftforge/debug/PermissionTest.java +++ b/src/test_old/java/net/minecraftforge/debug/PermissionTest.java @@ -12,7 +12,7 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.StringRepresentable; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.server.permission.PermissionAPI; import net.minecraftforge.server.permission.events.PermissionGatherEvent; diff --git a/src/test_old/java/net/minecraftforge/debug/PotionEventTest.java b/src/test_old/java/net/minecraftforge/debug/PotionEventTest.java index e960d2842e..2dd918aac1 100644 --- a/src/test_old/java/net/minecraftforge/debug/PotionEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/PotionEventTest.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraftforge.common.brewing.BrewingRecipeRegistry; import net.minecraftforge.event.entity.living.MobEffectEvent; import net.minecraftforge.eventbus.api.Event.Result; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -25,13 +25,10 @@ public class PotionEventTest { private static Logger LOGGER = LogManager.getLogger(PotionEventTest.class); - public PotionEventTest() - { - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onSetup); - } + public PotionEventTest() {} - private void onSetup(FMLCommonSetupEvent event) - { + @SubscribeEvent + private void onSetup(FMLCommonSetupEvent event) { BrewingRecipeRegistry.addRecipe(Ingredient.of(Items.ICE), Ingredient.of(Items.LAVA_BUCKET), new ItemStack(Items.OBSIDIAN)); } diff --git a/src/test_old/java/net/minecraftforge/debug/block/BasePlaceEventTest.java b/src/test_old/java/net/minecraftforge/debug/block/BasePlaceEventTest.java index 36ff418f73..9902668b4a 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/BasePlaceEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/BasePlaceEventTest.java @@ -7,17 +7,14 @@ package net.minecraftforge.debug.block; import net.minecraft.world.entity.item.FallingBlockEntity; import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("base_block_place_event_test") @Mod.EventBusSubscriber -public class BasePlaceEventTest -{ +public final class BasePlaceEventTest { @SubscribeEvent - public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) - { - if (event.getEntity() instanceof FallingBlockEntity) - event.setCanceled(true); + public static boolean onBlockPlaced(BlockEvent.EntityPlaceEvent event) { + return event.getEntity() instanceof FallingBlockEntity; } } diff --git a/src/test_old/java/net/minecraftforge/debug/block/CustomHeadTest.java b/src/test_old/java/net/minecraftforge/debug/block/CustomHeadTest.java index 0a75f0976f..07c4c076e3 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/CustomHeadTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/CustomHeadTest.java @@ -25,7 +25,7 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.common.util.Lazy; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; diff --git a/src/test_old/java/net/minecraftforge/debug/block/CustomPlantTypeTest.java b/src/test_old/java/net/minecraftforge/debug/block/CustomPlantTypeTest.java index 7bee0b73d3..c382809996 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/CustomPlantTypeTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/CustomPlantTypeTest.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelReader; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.PlantType; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.registries.ForgeRegistries; diff --git a/src/test_old/java/net/minecraftforge/debug/block/FarmlandTrampleEventTest.java b/src/test_old/java/net/minecraftforge/debug/block/FarmlandTrampleEventTest.java index 09bcdb6ef2..b8238e20db 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/FarmlandTrampleEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/FarmlandTrampleEventTest.java @@ -6,17 +6,14 @@ package net.minecraftforge.debug.block; import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("farmland_trample_test") @Mod.EventBusSubscriber -public class FarmlandTrampleEventTest -{ +public final class FarmlandTrampleEventTest { @SubscribeEvent - public static void onFarmlandTrampled(BlockEvent.FarmlandTrampleEvent event) - { - if(event.getEntity().isCrouching()) - event.setCanceled(true); + public static void onFarmlandTrampled(BlockEvent.FarmlandTrampleEvent event) { + return event.getEntity().isCrouching(); } } diff --git a/src/test_old/java/net/minecraftforge/debug/block/FlowerPotTest.java b/src/test_old/java/net/minecraftforge/debug/block/FlowerPotTest.java index f3ccd8589f..4b4b404315 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/FlowerPotTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/FlowerPotTest.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.FlowerPotBlock; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.registries.RegisterEvent; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.fml.common.Mod; diff --git a/src/test_old/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java b/src/test_old/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java index 6ef9c5aaa5..4899c52327 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java +++ b/src/test_old/java/net/minecraftforge/debug/block/FullPotsAccessorDemo.java @@ -46,7 +46,7 @@ import net.minecraftforge.client.model.geometry.IUnbakedGeometry; import net.minecraftforge.common.util.ConcatenatedListView; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegistryObject; diff --git a/src/test_old/java/net/minecraftforge/debug/block/HideNeighborFaceTest.java b/src/test_old/java/net/minecraftforge/debug/block/HideNeighborFaceTest.java index 43678bfbb6..e4f4652881 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/HideNeighborFaceTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/HideNeighborFaceTest.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/block/NeighborNotifyEventTest.java b/src/test_old/java/net/minecraftforge/debug/block/NeighborNotifyEventTest.java index a3dce0a222..b3eb97a81b 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/NeighborNotifyEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/NeighborNotifyEventTest.java @@ -8,7 +8,7 @@ package net.minecraftforge.debug.block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.event.level.BlockEvent.NeighborNotifyEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -17,16 +17,15 @@ import org.apache.logging.log4j.Logger; @Mod("neighbor_notify_event_test") @Mod.EventBusSubscriber -public class NeighborNotifyEventTest -{ - private static Logger logger = LogManager.getLogger(NeighborNotifyEventTest.class); +public final class NeighborNotifyEventTest { + private static final Logger LOGGER = LogManager.getLogger(NeighborNotifyEventTest.class); @SubscribeEvent - public static void onNeighborNotify(NeighborNotifyEvent event) - { + public static boolean onNeighborNotify(NeighborNotifyEvent event) { if (event.getState().getBlock() == Blocks.COMPARATOR) { - logger.info("{} with face information: {}", event.getPos().toString(), event.getNotifiedSides()); - event.setCanceled(true); + LOGGER.info("{} with face information: {}", event.getPos().toString(), event.getNotifiedSides()); + return true; } + return false; } } diff --git a/src/test_old/java/net/minecraftforge/debug/block/PistonEventTest.java b/src/test_old/java/net/minecraftforge/debug/block/PistonEventTest.java index cbf3539d61..9e1859f7da 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/PistonEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/PistonEventTest.java @@ -28,8 +28,7 @@ import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.level.PistonEvent; import net.minecraftforge.event.level.PistonEvent.PistonMoveType; -import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.DeferredRegister; @@ -48,8 +47,7 @@ import java.util.Objects; */ @Mod.EventBusSubscriber(modid = PistonEventTest.MODID) @Mod(value = PistonEventTest.MODID) -public class PistonEventTest -{ +public final class PistonEventTest { static final boolean ENABLE_PISTON_EVENT_LOGGING = false; public static final String MODID = "piston_event_test"; @@ -60,23 +58,20 @@ public class PistonEventTest private static final RegistryObject SHIFT_ON_MOVE = BLOCKS.register(blockName, () -> new Block(Block.Properties.of().mapColor(MapColor.STONE))); private static final RegistryObject SHIFT_ON_MOVE_ITEM = ITEMS.register(blockName, () -> new BlockItem(SHIFT_ON_MOVE.get(), new Item.Properties())); - public PistonEventTest() - { - IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); - BLOCKS.register(modBus); - ITEMS.register(modBus); - modBus.addListener(this::gatherData); - modBus.addListener(this::addCreative); + public PistonEventTest(FMLJavaModLoadingContext context) { + var modBusGroup = context.getModBusGroup(); + BLOCKS.register(modBusGroup); + ITEMS.register(modBusGroup); } - private void addCreative(BuildCreativeModeTabContentsEvent event) - { + @SubscribeEvent + private static void addCreative(BuildCreativeModeTabContentsEvent event) { if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) event.accept(SHIFT_ON_MOVE_ITEM); } @SubscribeEvent - public static void pistonPre(PistonEvent.Pre event) + public static boolean pistonPre(PistonEvent.Pre event) { if (event.getPistonMoveType() == PistonMoveType.EXTEND) { @@ -111,7 +106,7 @@ public class PistonEventTest } // Block pushing cobblestone (directly, indirectly works) - event.setCanceled(event.getLevel().getBlockState(event.getFaceOffsetPos()).getBlock() == Blocks.COBBLESTONE); + return event.getLevel().getBlockState(event.getFaceOffsetPos()).getBlock() == Blocks.COBBLESTONE; } else { @@ -130,7 +125,7 @@ public class PistonEventTest } // Offset twice to see if retraction will pull cobblestone - event.setCanceled(event.getLevel().getBlockState(event.getFaceOffsetPos().relative(event.getDirection())).getBlock() == Blocks.COBBLESTONE && isSticky); + return event.getLevel().getBlockState(event.getFaceOffsetPos().relative(event.getDirection())).getBlock() == Blocks.COBBLESTONE && isSticky; } } @@ -144,6 +139,7 @@ public class PistonEventTest } } + @SubscribeEvent public void gatherData(GatherDataEvent event) { DataGenerator gen = event.getGenerator(); diff --git a/src/test_old/java/net/minecraftforge/debug/block/PlaceEventTest.java b/src/test_old/java/net/minecraftforge/debug/block/PlaceEventTest.java index 3246c52314..75869a5946 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/PlaceEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/PlaceEventTest.java @@ -7,17 +7,14 @@ package net.minecraftforge.debug.block; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.event.level.BlockEvent.EntityPlaceEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("block_place_event_test") @Mod.EventBusSubscriber -public class PlaceEventTest -{ +public final class PlaceEventTest { @SubscribeEvent - public static void onBlockPlaced(EntityPlaceEvent event) - { - if (event.getPlacedBlock().getBlock() == Blocks.CHEST && event.getPlacedAgainst().getBlock() != Blocks.DIAMOND_BLOCK) - event.setCanceled(true); + public static boolean onBlockPlaced(EntityPlaceEvent event) { + return event.getPlacedBlock().getBlock() == Blocks.CHEST && event.getPlacedAgainst().getBlock() != Blocks.DIAMOND_BLOCK; } } diff --git a/src/test_old/java/net/minecraftforge/debug/block/SlipperinessTest.java b/src/test_old/java/net/minecraftforge/debug/block/SlipperinessTest.java index d06e83f9d7..63f8bb9a14 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/SlipperinessTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/SlipperinessTest.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.registries.ForgeRegistries; diff --git a/src/test_old/java/net/minecraftforge/debug/block/StickyBlockTest.java b/src/test_old/java/net/minecraftforge/debug/block/StickyBlockTest.java index 4d543abd80..58dff9e690 100644 --- a/src/test_old/java/net/minecraftforge/debug/block/StickyBlockTest.java +++ b/src/test_old/java/net/minecraftforge/debug/block/StickyBlockTest.java @@ -13,7 +13,7 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/chat/ClientChatEventTest.java b/src/test_old/java/net/minecraftforge/debug/chat/ClientChatEventTest.java index 49f8a1b378..f3b1c43dc4 100644 --- a/src/test_old/java/net/minecraftforge/debug/chat/ClientChatEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/chat/ClientChatEventTest.java @@ -7,18 +7,18 @@ package net.minecraftforge.debug.chat; import net.minecraftforge.client.event.ClientChatEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; @Mod("client_chat_event_test") @Mod.EventBusSubscriber -public class ClientChatEventTest -{ +public final class ClientChatEventTest { @SubscribeEvent - public static void onPlayerAttemptChat(ClientChatEvent event) - { - if (event.getMessage().equals("Cancel")) - event.setCanceled(true); - else if (event.getMessage().equals("Replace this text")) + public static boolean onPlayerAttemptChat(ClientChatEvent event) { + if (event.getMessage().equals("Cancel")) { + return true; + } else if (event.getMessage().equals("Replace this text")) { event.setMessage("Text replaced."); + return false; + } } } diff --git a/src/test_old/java/net/minecraftforge/debug/chat/CommandEventTest.java b/src/test_old/java/net/minecraftforge/debug/chat/CommandEventTest.java index 4fbcb03c32..03237a4ca6 100644 --- a/src/test_old/java/net/minecraftforge/debug/chat/CommandEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/chat/CommandEventTest.java @@ -11,7 +11,7 @@ import net.minecraft.commands.CommandRuntimeException; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; import net.minecraftforge.event.CommandEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/client/AudioStreamTest.java b/src/test_old/java/net/minecraftforge/debug/client/AudioStreamTest.java index c9d9666e50..32f6c1e480 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/AudioStreamTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/AudioStreamTest.java @@ -31,29 +31,25 @@ import java.util.concurrent.CompletableFuture; * When the message "sine wave" is sent in chat, this should play a sine wave of 220Hz at the player's current position. */ @Mod(AudioStreamTest.MOD_ID) -public class AudioStreamTest -{ +public class AudioStreamTest { private static final boolean ENABLED = true; static final String MOD_ID = "audio_stream_test"; - public AudioStreamTest() - { - if (ENABLED && FMLLoader.getDist().isClient()) - { - MinecraftForge.EVENT_BUS.addListener(ClientHandler::onClientChatEvent); + public AudioStreamTest() { + if (ENABLED && FMLLoader.getDist().isClient()) { + ClientChatEvent.BUS.addListener(ClientHandler::onClientChatEvent); } } - public static class ClientHandler - { - public static void onClientChatEvent(ClientChatEvent event) - { - if (event.getMessage().equalsIgnoreCase("sine wave")) - { + public static class ClientHandler { + public static boolean onClientChatEvent(ClientChatEvent event) { + if (event.getMessage().equalsIgnoreCase("sine wave")) { event.setCanceled(true); var mc = Minecraft.getInstance(); mc.getSoundManager().play(new SineSound(mc.player.position())); + return true; } + return false; } } diff --git a/src/test_old/java/net/minecraftforge/debug/client/CustomColorResolverTest.java b/src/test_old/java/net/minecraftforge/debug/client/CustomColorResolverTest.java index daf9010c64..fad7736f77 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/CustomColorResolverTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/CustomColorResolverTest.java @@ -16,7 +16,7 @@ import net.minecraft.world.level.material.MapColor; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterColorHandlersEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.DeferredRegister; diff --git a/src/test_old/java/net/minecraftforge/debug/client/CustomPresetEditorTest.java b/src/test_old/java/net/minecraftforge/debug/client/CustomPresetEditorTest.java index f306e98b43..16bece12a4 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/CustomPresetEditorTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/CustomPresetEditorTest.java @@ -40,7 +40,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterPresetEditorsEvent; import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; import net.minecraftforge.data.event.GatherDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; diff --git a/src/test_old/java/net/minecraftforge/debug/client/CustomTooltipTest.java b/src/test_old/java/net/minecraftforge/debug/client/CustomTooltipTest.java index 8257a43505..b1dc5e359b 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/CustomTooltipTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/CustomTooltipTest.java @@ -30,7 +30,7 @@ import net.minecraftforge.client.event.RenderTooltipEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/client/PotionSizeEventTest.java b/src/test_old/java/net/minecraftforge/debug/client/PotionSizeEventTest.java index 7d42955860..93213dd0eb 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/PotionSizeEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/PotionSizeEventTest.java @@ -12,7 +12,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ScreenEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.loading.FMLEnvironment; diff --git a/src/test_old/java/net/minecraftforge/debug/client/model/CalculateNormalsTest.java b/src/test_old/java/net/minecraftforge/debug/client/model/CalculateNormalsTest.java index 1c5e705436..9d4c450d65 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/model/CalculateNormalsTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/model/CalculateNormalsTest.java @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; import net.minecraft.world.level.material.MapColor; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/client/model/CustomItemDisplayContextTest.java b/src/test_old/java/net/minecraftforge/debug/client/model/CustomItemDisplayContextTest.java index 872812c274..b490c629e6 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/model/CustomItemDisplayContextTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/model/CustomItemDisplayContextTest.java @@ -40,7 +40,7 @@ import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.client.model.generators.*; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.data.event.GatherDataEvent; diff --git a/src/test_old/java/net/minecraftforge/debug/client/model/MegaModelTest.java b/src/test_old/java/net/minecraftforge/debug/client/model/MegaModelTest.java index 704fec1e11..3788481f68 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/model/MegaModelTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/model/MegaModelTest.java @@ -37,7 +37,7 @@ import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelProperty; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.DeferredRegister; diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomItemDecorationsTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomItemDecorationsTest.java index a013bb5fce..3da87961d9 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomItemDecorationsTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomItemDecorationsTest.java @@ -17,7 +17,7 @@ import net.minecraft.world.item.Items; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.IItemDecorator; import net.minecraftforge.client.event.RegisterItemDecorationsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod(CustomItemDecorationsTest.MOD_ID) diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomParticleTypeTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomParticleTypeTest.java index 4aa3dbc0ec..54a4440a63 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomParticleTypeTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/CustomParticleTypeTest.java @@ -15,7 +15,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Blocks; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod(CustomParticleTypeTest.MOD_ID) diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/EntityRendererEventsTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/EntityRendererEventsTest.java index 19e32b9a48..a50ca433be 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/EntityRendererEventsTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/EntityRendererEventsTest.java @@ -26,7 +26,7 @@ import net.minecraft.world.level.Level; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.event.entity.EntityAttributeCreationEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ObjectHolder; diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/LinearTextTextureFilteringTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/LinearTextTextureFilteringTest.java index 7671e142ee..fda01f4ff6 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/LinearTextTextureFilteringTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/LinearTextTextureFilteringTest.java @@ -8,7 +8,7 @@ package net.minecraftforge.debug.client.rendering; import net.minecraft.client.gui.screens.TitleScreen; import net.minecraftforge.client.ForgeRenderTypes; import net.minecraftforge.client.event.ScreenEvent.Render; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java index b2f54a078e..6e11525d4e 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/NameplateRenderingEventTest.java @@ -11,7 +11,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.ChatFormatting; import net.minecraftforge.client.event.RenderNameTagEvent; import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.api.distmarker.Dist; diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/RenderLocalPlayerTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/RenderLocalPlayerTest.java index 84d8b2ad88..fda851173f 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/RenderLocalPlayerTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/RenderLocalPlayerTest.java @@ -10,45 +10,40 @@ import net.minecraft.world.item.Items; import net.minecraft.world.InteractionResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod(RenderLocalPlayerTest.MODID) @Mod.EventBusSubscriber(value = Dist.CLIENT) -public class RenderLocalPlayerTest -{ +public final class RenderLocalPlayerTest { public static final String MODID = "render_local_player_test"; static final boolean ENABLED = false; @SubscribeEvent - public static void onItemRightClickEntity(final PlayerInteractEvent.EntityInteract event) - { - if (ENABLED && event.getItemStack().getItem() == Items.STICK) - { + public static boolean onItemRightClickEntity(final PlayerInteractEvent.EntityInteract event) { + if (ENABLED && event.getItemStack().getItem() == Items.STICK) { Minecraft mc = Minecraft.getInstance(); - if (mc.getCameraEntity() == mc.player) - { + if (mc.getCameraEntity() == mc.player) { mc.setCameraEntity(event.getTarget()); event.setCancellationResult(InteractionResult.SUCCESS); - event.setCanceled(true); + return true; } } + return false; } @SubscribeEvent - public static void onItemRightClick(final PlayerInteractEvent.RightClickItem event) - { - if (ENABLED && event.getItemStack().getItem() == Items.STICK) - { + public static boolean onItemRightClick(final PlayerInteractEvent.RightClickItem event) { + if (ENABLED && event.getItemStack().getItem() == Items.STICK) { Minecraft mc = Minecraft.getInstance(); - if (mc.getCameraEntity() != mc.player) - { + if (mc.getCameraEntity() != mc.player) { mc.setCameraEntity(mc.player); event.setCancellationResult(InteractionResult.SUCCESS); - event.setCanceled(true); + return true; } } + return false; } } \ No newline at end of file diff --git a/src/test_old/java/net/minecraftforge/debug/client/rendering/ShaderResourcesTest.java b/src/test_old/java/net/minecraftforge/debug/client/rendering/ShaderResourcesTest.java index 8ab3bced25..7228f81d92 100644 --- a/src/test_old/java/net/minecraftforge/debug/client/rendering/ShaderResourcesTest.java +++ b/src/test_old/java/net/minecraftforge/debug/client/rendering/ShaderResourcesTest.java @@ -16,7 +16,7 @@ import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.RegisterShadersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/command/EnumArgumentTest.java b/src/test_old/java/net/minecraftforge/debug/command/EnumArgumentTest.java index 5b566927c4..f4dcb9280d 100644 --- a/src/test_old/java/net/minecraftforge/debug/command/EnumArgumentTest.java +++ b/src/test_old/java/net/minecraftforge/debug/command/EnumArgumentTest.java @@ -9,7 +9,7 @@ import net.minecraft.commands.Commands; import net.minecraft.network.chat.Component; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.server.command.EnumArgument; diff --git a/src/test_old/java/net/minecraftforge/debug/entity/AddEntityAttributeTest.java b/src/test_old/java/net/minecraftforge/debug/entity/AddEntityAttributeTest.java index 5117336935..4e1369d6ff 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/AddEntityAttributeTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/AddEntityAttributeTest.java @@ -8,7 +8,7 @@ package net.minecraftforge.debug.entity; import net.minecraft.world.entity.ai.attributes.Attribute; import net.minecraft.world.entity.ai.attributes.RangedAttribute; import net.minecraftforge.event.entity.EntityAttributeModificationEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import net.minecraftforge.fml.common.Mod; diff --git a/src/test_old/java/net/minecraftforge/debug/entity/EntityTeleportEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/EntityTeleportEventTest.java index e58f44dc4a..befd20c4cf 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/EntityTeleportEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/EntityTeleportEventTest.java @@ -7,7 +7,7 @@ package net.minecraftforge.debug.entity; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.EntityTeleportEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; diff --git a/src/test_old/java/net/minecraftforge/debug/entity/GravityAttributeTest.java b/src/test_old/java/net/minecraftforge/debug/entity/GravityAttributeTest.java index 5feda5b099..8b4fb8fd47 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/GravityAttributeTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/GravityAttributeTest.java @@ -40,7 +40,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/entity/PartEntityTest.java b/src/test_old/java/net/minecraftforge/debug/entity/PartEntityTest.java index ff84d1c88e..ffa6f65436 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/PartEntityTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/PartEntityTest.java @@ -23,7 +23,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityRenderersEvent; import net.minecraftforge.entity.PartEntity; import net.minecraftforge.event.entity.EntityAttributeCreationEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.registries.RegistryObject; diff --git a/src/test_old/java/net/minecraftforge/debug/entity/living/LivingConversionEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/living/LivingConversionEventTest.java index 55e6c9acf5..8eef6ab3dd 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/living/LivingConversionEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/living/LivingConversionEventTest.java @@ -14,25 +14,21 @@ import net.minecraftforge.event.entity.living.LivingConversionEvent; import net.minecraftforge.fml.common.Mod; @Mod("living_conversion_event_test") -public class LivingConversionEventTest -{ - public LivingConversionEventTest() - { - MinecraftForge.EVENT_BUS.addListener(this::canLivingConversion); - MinecraftForge.EVENT_BUS.addListener(this::onLivingConversion); +public class LivingConversionEventTest { + public LivingConversionEventTest() { + LivingConversionEvent.Pre.BUS.addListener(this::canLivingConversion); + LivingConversionEvent.Post.BUS.addListener(this::onLivingConversion); } - public void canLivingConversion(LivingConversionEvent.Pre event) - { - if (event.getEntity() instanceof Piglin) - { - event.setCanceled(true); + public boolean canLivingConversion(LivingConversionEvent.Pre event) { + if (event.getEntity() instanceof Piglin) { event.setConversionTimer(0); + return true; } + return false; } - public void onLivingConversion(LivingConversionEvent.Post event) - { + public void onLivingConversion(LivingConversionEvent.Post event) { if (event.getEntity() instanceof Villager) event.getEntity().addEffect(new MobEffectInstance(MobEffects.LUCK, 20)); } diff --git a/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSetAttackTargetEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSetAttackTargetEventTest.java index f7a3e12112..338eadb226 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSetAttackTargetEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSetAttackTargetEventTest.java @@ -10,29 +10,24 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Items; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingChangeTargetEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("living_set_attack_target_event_test") -public class LivingSetAttackTargetEventTest -{ +public final class LivingSetAttackTargetEventTest { public static final boolean ENABLE = true; - public LivingSetAttackTargetEventTest() - { - if(ENABLE) - { - MinecraftForge.EVENT_BUS.register(this); + public LivingSetAttackTargetEventTest() { + if (ENABLE) { + LivingChangeTargetEvent.BUS.addListener(this::onLivingChangeTargetEvent); } } - - @SubscribeEvent - public void onLivingChangeTargetEvent(LivingChangeTargetEvent event) - { + + public boolean onLivingChangeTargetEvent(LivingChangeTargetEvent event) { // Prevents the piglin from attacking the player if they hold a stick in their hands. - if(event.getNewTarget() instanceof Player player && event.getEntity() instanceof AbstractPiglin piglin && player.getMainHandItem().getItem() == Items.STICK) - { - event.setCanceled(true); + if (event.getNewTarget() instanceof Player player && event.getEntity() instanceof AbstractPiglin piglin && player.getMainHandItem().getItem() == Items.STICK) { + return true; } + return false; } } diff --git a/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSwapItemsEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSwapItemsEventTest.java index 29c1b676bf..f7e69b823b 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSwapItemsEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/living/LivingSwapItemsEventTest.java @@ -8,28 +8,22 @@ package net.minecraftforge.debug.entity.living; import net.minecraft.world.item.Items; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.living.LivingSwapItemsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @Mod("living_swap_items_event_test") -public class LivingSwapItemsEventTest -{ +public final class LivingSwapItemsEventTest { public static final boolean ENABLE = true; public static final Logger LOGGER = LogManager.getLogger(); - public LivingSwapItemsEventTest() - { + public LivingSwapItemsEventTest() { if (ENABLE) - MinecraftForge.EVENT_BUS.register(this); + LivingSwapItemsEvent.Hands.BUS.addListener(this::livingSwapItems); } - @SubscribeEvent - public void livingSwapItems(LivingSwapItemsEvent.Hands event) - { + public boolean livingSwapItems(LivingSwapItemsEvent.Hands event) { LOGGER.info("{} swapping hands. To offhand: {}, to main hand: {}", event.getEntity(), event.getItemSwappedToOffHand(), event.getItemSwappedToMainHand()); - if (event.getEntity().getMainHandItem().is(Items.DIAMOND)) - event.setCanceled(true); + return event.getEntity().getMainHandItem().is(Items.DIAMOND); } } diff --git a/src/test_old/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java index 50b8350e70..0516f84c6b 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/player/PermissionsChangedEventTest.java @@ -6,7 +6,7 @@ package net.minecraftforge.debug.entity.player; import net.minecraftforge.event.entity.player.PermissionsChangedEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java index 31009e40b2..9eb0ad1a33 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerGameModeEventTest.java @@ -9,7 +9,6 @@ import net.minecraft.world.level.GameType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.ClientPlayerChangeGameTypeEvent; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; @@ -17,34 +16,28 @@ import org.apache.logging.log4j.Logger; @Mod("player_game_mode_event_test") @Mod.EventBusSubscriber() -public class PlayerGameModeEventTest -{ +public final class PlayerGameModeEventTest { private static final boolean ENABLE = false; private static final Logger LOGGER = LogManager.getLogger(PlayerGameModeEventTest.class); @SubscribeEvent - public static void onPlayerChangeGameModeEvent(PlayerEvent.PlayerChangeGameModeEvent event) - { - if (!ENABLE) return; + public static boolean onPlayerChangeGameModeEvent(PlayerEvent.PlayerChangeGameModeEvent event) { + if (!ENABLE) return false; LOGGER.info("{} changed game mode. Current GameType: {}. New Game Type: {}", event.getEntity(), event.getCurrentGameMode(), event.getNewGameMode()); // prevent changing to SURVIVAL - if (event.getNewGameMode() == GameType.SURVIVAL) - { - event.setCanceled(true); - } - else if (event.getNewGameMode() == GameType.SPECTATOR) - { + if (event.getNewGameMode() == GameType.SURVIVAL) { + return true; + } else if (event.getNewGameMode() == GameType.SPECTATOR) { // when changing to SPECTATOR, change to SURVIVAL instead event.setNewGameMode(GameType.SURVIVAL); } + return false; } @Mod.EventBusSubscriber(modid="player_game_mode_event_test", value=Dist.CLIENT, bus=Mod.EventBusSubscriber.Bus.FORGE) - public static class PlayerGameModeEventTestClientForgeEvents - { + public static class PlayerGameModeEventTestClientForgeEvents { @SubscribeEvent - public static void onClientPlayerChangeGameModeEvent(ClientPlayerChangeGameTypeEvent event) - { + public static void onClientPlayerChangeGameModeEvent(ClientPlayerChangeGameTypeEvent event) { if (!ENABLE) return; LOGGER.info("Client notified of changed game mode from '{}'. Current GameType: {}. New Game Type: {}", event.getInfo().getProfile(), event.getCurrentGameType(), event.getNewGameType()); } diff --git a/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerNameEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerNameEventTest.java index 33ebf70837..b31740dfd6 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerNameEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerNameEventTest.java @@ -7,7 +7,7 @@ package net.minecraftforge.debug.entity.player; import net.minecraft.network.chat.Component; import net.minecraftforge.event.entity.player.PlayerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("player_name_event_test") diff --git a/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java index 73773a96c0..9e8a90449d 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/player/PlayerXpEventTest.java @@ -9,7 +9,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import net.minecraftforge.event.entity.player.PlayerXpEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("player_xp_event_test") diff --git a/src/test_old/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java b/src/test_old/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java index 2ddf31ff51..64523c3e87 100644 --- a/src/test_old/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/entity/player/TradeWithVillagerEventTest.java @@ -7,7 +7,7 @@ package net.minecraftforge.debug.entity.player; import com.mojang.logging.LogUtils; import net.minecraftforge.event.entity.player.TradeWithVillagerEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.slf4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/fluid/FiniteWaterTest.java b/src/test_old/java/net/minecraftforge/debug/fluid/FiniteWaterTest.java index 727c42ef3b..7ff8a849ad 100644 --- a/src/test_old/java/net/minecraftforge/debug/fluid/FiniteWaterTest.java +++ b/src/test_old/java/net/minecraftforge/debug/fluid/FiniteWaterTest.java @@ -10,7 +10,7 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.eventbus.api.Event; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("finite_water_test") diff --git a/src/test_old/java/net/minecraftforge/debug/item/ForgeSpawnEggItemTest.java b/src/test_old/java/net/minecraftforge/debug/item/ForgeSpawnEggItemTest.java index b565e3bc98..5f7ad7bd26 100644 --- a/src/test_old/java/net/minecraftforge/debug/item/ForgeSpawnEggItemTest.java +++ b/src/test_old/java/net/minecraftforge/debug/item/ForgeSpawnEggItemTest.java @@ -21,7 +21,7 @@ import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.ForgeSpawnEggItem; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.entity.EntityAttributeCreationEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.util.ObfuscationReflectionHelper; diff --git a/src/test_old/java/net/minecraftforge/debug/item/ItemAttributeModifierTest.java b/src/test_old/java/net/minecraftforge/debug/item/ItemAttributeModifierTest.java index 3434566a7b..1f7b4dd379 100644 --- a/src/test_old/java/net/minecraftforge/debug/item/ItemAttributeModifierTest.java +++ b/src/test_old/java/net/minecraftforge/debug/item/ItemAttributeModifierTest.java @@ -12,7 +12,7 @@ import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraftforge.event.ItemAttributeModifierEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod(ItemAttributeModifierTest.MOD_ID) diff --git a/src/test_old/java/net/minecraftforge/debug/item/ItemStackedOnOtherTest.java b/src/test_old/java/net/minecraftforge/debug/item/ItemStackedOnOtherTest.java index dc2d88d736..e9184a60c1 100644 --- a/src/test_old/java/net/minecraftforge/debug/item/ItemStackedOnOtherTest.java +++ b/src/test_old/java/net/minecraftforge/debug/item/ItemStackedOnOtherTest.java @@ -14,35 +14,30 @@ import net.minecraftforge.event.ItemStackedOnOtherEvent; import net.minecraftforge.fml.common.Mod; @Mod(ItemStackedOnOtherTest.MODID) -public class ItemStackedOnOtherTest -{ +public final class ItemStackedOnOtherTest { public static final String MODID = "item_stacked_on_other_test"; private static final boolean ENABLED = true; - public ItemStackedOnOtherTest() - { - if (ENABLED) - { - MinecraftForge.EVENT_BUS.addListener(this::onStackedOn); + public ItemStackedOnOtherTest() { + if (ENABLED) { + ItemStackedOnOtherEvent.BUS.addListener(this::onStackedOn); } } /** * When right clicking on a damageable item with a diamond sword */ - private void onStackedOn(ItemStackedOnOtherEvent event) - { + private boolean onStackedOn(ItemStackedOnOtherEvent event) { Player player = event.getPlayer(); - if (!player.isCreative() && event.getClickAction() == ClickAction.SECONDARY) - { + if (!player.isCreative() && event.getClickAction() == ClickAction.SECONDARY) { ItemStack carried = event.getCarriedItem(); ItemStack current = event.getStackedOnItem(); - if (carried.is(Items.DIAMOND_SWORD) && current.isDamageableItem()) - { + if (carried.is(Items.DIAMOND_SWORD) && current.isDamageableItem()) { current.hurtAndBreak(1, player, p -> {}); - event.setCanceled(true); + return true; } } + return false; } } diff --git a/src/test_old/java/net/minecraftforge/debug/item/ShieldBlockTest.java b/src/test_old/java/net/minecraftforge/debug/item/ShieldBlockTest.java index 5d0e23d3ab..cf9c805aab 100644 --- a/src/test_old/java/net/minecraftforge/debug/item/ShieldBlockTest.java +++ b/src/test_old/java/net/minecraftforge/debug/item/ShieldBlockTest.java @@ -10,7 +10,7 @@ import net.minecraft.world.entity.projectile.AbstractArrow; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.event.entity.living.ShieldBlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; /** diff --git a/src/test_old/java/net/minecraftforge/debug/item/StopUsingItemTest.java b/src/test_old/java/net/minecraftforge/debug/item/StopUsingItemTest.java index be5bfa9332..4466782ffb 100644 --- a/src/test_old/java/net/minecraftforge/debug/item/StopUsingItemTest.java +++ b/src/test_old/java/net/minecraftforge/debug/item/StopUsingItemTest.java @@ -21,7 +21,7 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.VanillaGameEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; diff --git a/src/test_old/java/net/minecraftforge/debug/item/TagBasedToolTypesTest.java b/src/test_old/java/net/minecraftforge/debug/item/TagBasedToolTypesTest.java index 8d025d93e8..ce360bcca4 100644 --- a/src/test_old/java/net/minecraftforge/debug/item/TagBasedToolTypesTest.java +++ b/src/test_old/java/net/minecraftforge/debug/item/TagBasedToolTypesTest.java @@ -30,7 +30,7 @@ import net.minecraftforge.common.data.BlockTagsProvider; import net.minecraftforge.common.data.ExistingFileHelper; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.data.event.GatherDataEvent; diff --git a/src/test_old/java/net/minecraftforge/debug/misc/FakePlayerTest.java b/src/test_old/java/net/minecraftforge/debug/misc/FakePlayerTest.java index 7e57b373a2..034b95fc79 100644 --- a/src/test_old/java/net/minecraftforge/debug/misc/FakePlayerTest.java +++ b/src/test_old/java/net/minecraftforge/debug/misc/FakePlayerTest.java @@ -14,7 +14,7 @@ import net.minecraft.world.item.Items; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.FakePlayerFactory; import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("fake_player_test") diff --git a/src/test_old/java/net/minecraftforge/debug/misc/GameTestTest.java b/src/test_old/java/net/minecraftforge/debug/misc/GameTestTest.java index 2dd5d5caeb..07866ca1c5 100644 --- a/src/test_old/java/net/minecraftforge/debug/misc/GameTestTest.java +++ b/src/test_old/java/net/minecraftforge/debug/misc/GameTestTest.java @@ -30,7 +30,7 @@ import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.RegisterGameTestsEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.gametest.PrefixGameTestTemplate; diff --git a/src/test_old/java/net/minecraftforge/debug/misc/GrindstoneEventTest.java b/src/test_old/java/net/minecraftforge/debug/misc/GrindstoneEventTest.java index 844c5bd07a..879eb084e1 100644 --- a/src/test_old/java/net/minecraftforge/debug/misc/GrindstoneEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/misc/GrindstoneEventTest.java @@ -9,7 +9,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.GrindstoneEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("grindstone_event_test") @@ -22,8 +22,7 @@ public class GrindstoneEventTest { } @SubscribeEvent - public void onGrindstonePlace(GrindstoneEvent.OnPlaceItem event) - { + public boolean onGrindstonePlace(GrindstoneEvent.OnPlaceItem event) { // TODO 1.20: This will not work once IForgeItem#canGrindstoneRepair is changed to have items opt-in to being able to place // rather than the current opt-out (the hook will no longer fire after the change). Fix? // all of these "recipes" are slot sensitive, the top and bottom must match exactly for the behavior to change @@ -62,15 +61,14 @@ public class GrindstoneEventTest { } // canceling the event will prevent disenchanting an iron sword in the top slot - if (topItem.is(Items.IRON_SWORD) && bottomItem.is(Items.AIR)) - { - event.setCanceled(true); + if (topItem.is(Items.IRON_SWORD) && bottomItem.is(Items.AIR)) { + return true; } + return false; } @SubscribeEvent - public void onGrindstoneTake(GrindstoneEvent.OnTakeItem event) - { + public void onGrindstoneTake(GrindstoneEvent.OnTakeItem event) { ItemStack topItem = event.getTopItem(); ItemStack bottomItem = event.getBottomItem(); // only shrink stacks by 1 for the lapis + netherite "recipe" diff --git a/src/test_old/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java b/src/test_old/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java index a09009cfc2..35bc15249a 100644 --- a/src/test_old/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/misc/OnDatapackSynctEventTest.java @@ -10,7 +10,7 @@ import org.apache.logging.log4j.Logger; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.event.OnDatapackSyncEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @Mod("send_datapacks_to_client") diff --git a/src/test_old/java/net/minecraftforge/debug/recipe/recipebook/RecipeBookExtensionTest.java b/src/test_old/java/net/minecraftforge/debug/recipe/recipebook/RecipeBookExtensionTest.java index c584701fb5..c2676b15d2 100644 --- a/src/test_old/java/net/minecraftforge/debug/recipe/recipebook/RecipeBookExtensionTest.java +++ b/src/test_old/java/net/minecraftforge/debug/recipe/recipebook/RecipeBookExtensionTest.java @@ -23,7 +23,7 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.extensions.IForgeMenuType; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.IEventBus; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; diff --git a/src/test_old/java/net/minecraftforge/debug/world/BlockGrowFeatureTest.java b/src/test_old/java/net/minecraftforge/debug/world/BlockGrowFeatureTest.java index 57dc3a5088..ed0fde5188 100644 --- a/src/test_old/java/net/minecraftforge/debug/world/BlockGrowFeatureTest.java +++ b/src/test_old/java/net/minecraftforge/debug/world/BlockGrowFeatureTest.java @@ -7,7 +7,7 @@ package net.minecraftforge.debug.world; import net.minecraft.data.worldgen.features.TreeFeatures; import net.minecraftforge.event.level.SaplingGrowTreeEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; diff --git a/src/test_old/java/net/minecraftforge/debug/world/ChunkDataEventSaveNullWorldTest.java b/src/test_old/java/net/minecraftforge/debug/world/ChunkDataEventSaveNullWorldTest.java index 58c2c1bbc4..2f6bf973b0 100644 --- a/src/test_old/java/net/minecraftforge/debug/world/ChunkDataEventSaveNullWorldTest.java +++ b/src/test_old/java/net/minecraftforge/debug/world/ChunkDataEventSaveNullWorldTest.java @@ -6,7 +6,7 @@ package net.minecraftforge.debug.world; import net.minecraftforge.event.level.ChunkDataEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/world/ChunkEventLoadNewChunkTest.java b/src/test_old/java/net/minecraftforge/debug/world/ChunkEventLoadNewChunkTest.java index 6c9b1fa297..82b5024ca2 100644 --- a/src/test_old/java/net/minecraftforge/debug/world/ChunkEventLoadNewChunkTest.java +++ b/src/test_old/java/net/minecraftforge/debug/world/ChunkEventLoadNewChunkTest.java @@ -8,7 +8,7 @@ package net.minecraftforge.debug.world; import com.mojang.logging.LogUtils; import net.minecraft.server.level.ServerLevel; import net.minecraftforge.event.level.ChunkEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.slf4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/world/ChunkWatchEventTest.java b/src/test_old/java/net/minecraftforge/debug/world/ChunkWatchEventTest.java index 15f11025af..b95ee033b3 100644 --- a/src/test_old/java/net/minecraftforge/debug/world/ChunkWatchEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/world/ChunkWatchEventTest.java @@ -11,7 +11,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.Level; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.level.ChunkWatchEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.eventbus.api.listener.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; diff --git a/src/test_old/java/net/minecraftforge/debug/world/PotentialSpawnsEventTest.java b/src/test_old/java/net/minecraftforge/debug/world/PotentialSpawnsEventTest.java index 28f2db5a37..c4a416d3c6 100644 --- a/src/test_old/java/net/minecraftforge/debug/world/PotentialSpawnsEventTest.java +++ b/src/test_old/java/net/minecraftforge/debug/world/PotentialSpawnsEventTest.java @@ -19,28 +19,21 @@ import net.minecraftforge.fml.common.Mod; * game difficulty is set to anything other than hard.

    */ @Mod("potentialspawnsevent_test") -public class PotentialSpawnsEventTest -{ +public final class PotentialSpawnsEventTest { public static final boolean ENABLED = false; - public PotentialSpawnsEventTest() - { - if (ENABLED) - { - MinecraftForge.EVENT_BUS.addListener(PotentialSpawnsEventTest::onlySpawnHostileMobs); + public PotentialSpawnsEventTest() { + if (ENABLED) { + LevelEvent.PotentialSpawns.BUS.addListener(PotentialSpawnsEventTest::onlySpawnHostileMobs); } } - public static void onlySpawnHostileMobs(LevelEvent.PotentialSpawns event) - { + public static void onlySpawnHostileMobs(LevelEvent.PotentialSpawns event) { LevelAccessor level = event.getLevel(); BlockPos pos = event.getPos(); Difficulty difficulty = level.getCurrentDifficultyAt(pos).getDifficulty(); MobCategory category = event.getMobCategory(); - if (category == MobCategory.MONSTER && difficulty != Difficulty.HARD) - { - event.setCanceled(true); - } + return category == MobCategory.MONSTER && difficulty != Difficulty.HARD; } }