From f83cf943371142b4c5aa027dece2b401ad55f0ab Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sun, 25 Jul 2021 17:47:10 +0800 Subject: [PATCH] 1.17: items, player, network, server --- arclight-common/build.gradle | 3 +- .../inventory/container/ContainerMixin.java | 418 ------ .../mixin/core/item/FilledMapItemMixin.java | 57 - ...ManagerMixin.java => ConnectionMixin.java} | 4 +- .../ServerHandshakeNetHandlerMixin.java | 4 +- .../ServerLoginNetHandlerMixin.java | 33 +- .../{play => }/ServerPlayNetHandlerMixin.java | 1223 ++++++++--------- .../ServerStatusNetHandlerMixin.java | 2 +- ...Mixin.java => SynchedEntityDataMixin.java} | 4 +- .../client/CHandshakePacketMixin.java | 51 - .../{ => protocol}/PacketThreadUtilMixin.java | 2 +- .../game}/CChatMessagePacketMixin.java | 2 +- .../game}/CCloseWindowPacketMixin.java | 2 +- .../CPlayerTryUseItemOnBlockPacketMixin.java | 4 +- .../game}/CPlayerTryUseItemPacketMixin.java | 4 +- .../game}/SChatPacketMixin.java | 2 +- .../game}/SWorldBorderPacketMixin.java | 10 +- .../handshake/CHandshakePacketMixin.java | 44 + .../core/server/MinecraftServerMixin.java | 48 +- .../ServerScoreboardMixin.java | 12 +- .../server/management/PlayerListMixin.java | 46 +- ...in.java => ServerPlayerGameModeMixin.java} | 29 +- ...Mixin.java => StatisticsCounterMixin.java} | 2 +- .../CompoundContainerMixin.java} | 12 +- .../ContainerMixin.java} | 10 +- .../SimpleContainerMixin.java} | 4 +- .../effect/MobEffectMixin.java} | 4 +- .../mixin/core/world/entity/EntityMixin.java | 2 + .../core/world/entity/LivingEntityMixin.java | 4 +- .../mixin/core/world/entity/MobMixin.java | 4 +- .../core/world/entity/player/PlayerMixin.java | 2 + ...ntityMixin.java => ServerPlayerMixin.java} | 123 +- .../inventory/AbstractContainerMenuMixin.java | 415 ++++++ .../AbstractFurnaceContainerMixin.java | 4 +- .../inventory}/BeaconContainerMixin.java | 4 +- .../BrewingStandContainerMixin.java | 4 +- .../CartographyContainer1Mixin.java | 4 +- .../CartographyContainer2Mixin.java | 4 +- .../inventory}/CartographyContainerMixin.java | 4 +- .../inventory}/ChestContainerMixin.java | 4 +- .../inventory}/ContainerTypeMixin.java | 2 +- .../inventory/CraftResultInventoryMixin.java | 2 +- .../inventory/CraftingInventoryMixin.java | 16 +- .../inventory/CraftingMenuMixin.java} | 76 +- .../inventory}/DispenserContainerMixin.java | 4 +- .../EnchantmentContainer1Mixin.java | 8 +- .../inventory}/EnchantmentContainerMixin.java | 12 +- .../inventory/EnderChestInventoryMixin.java | 5 +- .../inventory}/FurnaceResultSlotMixin.java | 18 +- .../inventory}/GrindstoneContainer1Mixin.java | 8 +- .../inventory}/GrindstoneContainerMixin.java | 6 +- .../inventory}/HopperContainerMixin.java | 4 +- .../HorseInventoryContainerMixin.java | 4 +- .../inventory/ItemCombinerMixin.java} | 4 +- .../inventory}/LecternContainerMixin.java | 4 +- .../inventory}/LoomContainer1Mixin.java | 8 +- .../inventory}/LoomContainer2Mixin.java | 8 +- .../inventory}/LoomContainerMixin.java | 4 +- .../inventory}/MerchantContainerMixin.java | 4 +- .../inventory/MerchantInventoryMixin.java | 16 +- .../inventory}/PlayerContainerMixin.java | 4 +- .../inventory}/RepairContainerMixin.java | 8 +- .../inventory}/ShulkerBoxContainerMixin.java | 4 +- .../inventory}/SlotMixin.java | 2 +- .../SmithingTableContainerMixin.java | 4 +- .../StonecutterContainer1Mixin.java | 4 +- .../inventory}/StonecutterContainerMixin.java | 4 +- .../{ => world}/item/ArmorStandItemMixin.java | 4 +- .../core/{ => world}/item/BlockItemMixin.java | 2 +- .../core/{ => world}/item/BoatItemMixin.java | 6 +- .../core/{ => world}/item/BowItemMixin.java | 16 +- .../{ => world}/item/BucketItemMixin.java | 19 +- .../item/ChorusFruitItemMixin.java | 2 +- .../{ => world}/item/CrossbowItemMixin.java | 2 +- .../core/{ => world}/item/DyeItemMixin.java | 2 +- .../core/{ => world}/item/EggItemMixin.java | 4 +- .../item/EnderCrystalItemMixin.java | 2 +- .../{ => world}/item/EnderEyeItemMixin.java | 2 +- .../{ => world}/item/EnderPearlItemMixin.java | 8 +- .../{ => world}/item/FireChargeItemMixin.java | 4 +- .../{ => world}/item/FishingRodItemMixin.java | 6 +- .../item/FlintAndSteelItemMixin.java | 2 +- .../item/HangingEntityItemMixin.java | 2 +- .../core/{ => world}/item/ItemStackMixin.java | 2 +- .../core/{ => world}/item/LeadItemMixin.java | 4 +- .../mixin/core/world/item/MapItemMixin.java | 40 + .../{ => world}/item/MerchantOfferMixin.java | 2 +- .../{ => world}/item/MilkBucketItemMixin.java | 2 +- .../{ => world}/item/MinecartItemMixin.java | 2 +- .../{ => world}/item/PotionItemMixin.java | 2 +- .../{ => world}/item/ShearsItemMixin.java | 2 +- .../{ => world}/item/SnowballItemMixin.java | 8 +- .../{ => world}/item/SpawnEggItemMixin.java | 2 +- .../{ => world}/item/TridentItemMixin.java | 18 +- .../item/crafting/BlastingRecipeMixin.java | 2 +- .../crafting/CampfireCookingRecipeMixin.java | 2 +- .../item/crafting/CustomRecipeMixin.java} | 4 +- .../item/crafting/FurnaceRecipeMixin.java | 2 +- .../item/crafting/IngredientMixin.java | 2 +- .../item/crafting/RecipeManagerMixin.java | 2 +- .../item/crafting/RecipeMixin.java} | 4 +- .../item/crafting/ServerRecipeBookMixin.java | 2 +- .../item/crafting/ShapedRecipeMixin.java | 8 +- .../item/crafting/ShapelessRecipeMixin.java | 8 +- .../item/crafting/SmithingRecipeMixin.java | 8 +- .../item/crafting/SmokingRecipeMixin.java | 2 +- .../crafting/StonecuttingRecipeMixin.java | 2 +- .../ComposterBlock_EmptyContainerMixin.java | 4 +- .../ComposterBlock_InputContainerMixin.java | 4 +- .../ComposterBlock_OutputContainerMixin.java | 4 +- .../properties}/IntegerPropertyMixin.java | 2 +- .../storage}/loot/LootTableManagerMixin.java | 2 +- .../level/storage}/loot/LootTableMixin.java | 12 +- .../entries}/LootEntry_SerializerMixin.java | 2 +- .../functions/LootingEnchantBonusMixin.java | 20 +- .../loot/parameters}/LootParametersMixin.java | 2 +- .../RandomChanceWithLootingMixin.java | 2 +- .../predicates}/SurvivesExplosionMixin.java | 8 +- .../common/mod/util/BlackholeNetHandler.java | 41 - .../resources/META-INF/accesstransformer.cfg | 3 + .../main/resources/mixins.arclight.core.json | 210 +-- arclight-forge/build.gradle | 3 +- 122 files changed, 1652 insertions(+), 1739 deletions(-) delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FilledMapItemMixin.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{NetworkManagerMixin.java => ConnectionMixin.java} (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{handshake => }/ServerHandshakeNetHandlerMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{login => }/ServerLoginNetHandlerMixin.java (91%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play => }/ServerPlayNetHandlerMixin.java (63%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{status => }/ServerStatusNetHandlerMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{datasync/EntityDataManagerMixin.java => SynchedEntityDataMixin.java} (93%) delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{ => protocol}/PacketThreadUtilMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play/client => protocol/game}/CChatMessagePacketMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play/client => protocol/game}/CCloseWindowPacketMixin.java (87%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play/client => protocol/game}/CPlayerTryUseItemOnBlockPacketMixin.java (82%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play/client => protocol/game}/CPlayerTryUseItemPacketMixin.java (82%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play/server => protocol/game}/SChatPacketMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/{play/server => protocol/game}/SWorldBorderPacketMixin.java (68%) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/handshake/CHandshakePacketMixin.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{scoreboard => server}/ServerScoreboardMixin.java (88%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/{PlayerInteractionManagerMixin.java => ServerPlayerGameModeMixin.java} (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/{StatisticsManagerMixin.java => StatisticsCounterMixin.java} (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/DoubleSidedInventoryMixin.java => world/CompoundContainerMixin.java} (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/IInventoryMixin.java => world/ContainerMixin.java} (91%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/InventoryMixin.java => world/SimpleContainerMixin.java} (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{potion/EffectMixin.java => world/effect/MobEffectMixin.java} (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/{ServerPlayerEntityMixin.java => ServerPlayerMixin.java} (93%) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/AbstractFurnaceContainerMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/BeaconContainerMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/BrewingStandContainerMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/CartographyContainer1Mixin.java (77%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/CartographyContainer2Mixin.java (77%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/CartographyContainerMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/ChestContainerMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/ContainerTypeMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/inventory/CraftResultInventoryMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/inventory/CraftingInventoryMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container/WorkbenchContainerMixin.java => world/inventory/CraftingMenuMixin.java} (62%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/DispenserContainerMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/EnchantmentContainer1Mixin.java (59%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/EnchantmentContainerMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/inventory/EnderChestInventoryMixin.java (87%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/FurnaceResultSlotMixin.java (73%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/GrindstoneContainer1Mixin.java (59%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/GrindstoneContainerMixin.java (90%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/HopperContainerMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/HorseInventoryContainerMixin.java (91%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container/AbstractRepairContainerMixin.java => world/inventory/ItemCombinerMixin.java} (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/LecternContainerMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/LoomContainer1Mixin.java (59%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/LoomContainer2Mixin.java (59%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/LoomContainerMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/MerchantContainerMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/inventory/MerchantInventoryMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/PlayerContainerMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/RepairContainerMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/ShulkerBoxContainerMixin.java (91%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/SlotMixin.java (88%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/SmithingTableContainerMixin.java (91%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/StonecutterContainer1Mixin.java (78%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{inventory/container => world/inventory}/StonecutterContainerMixin.java (92%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/ArmorStandItemMixin.java (88%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/BlockItemMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/BoatItemMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/BowItemMixin.java (85%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/BucketItemMixin.java (78%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/ChorusFruitItemMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/CrossbowItemMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/DyeItemMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/EggItemMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/EnderCrystalItemMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/EnderEyeItemMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/EnderPearlItemMixin.java (90%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/FireChargeItemMixin.java (91%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/FishingRodItemMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/FlintAndSteelItemMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/HangingEntityItemMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/ItemStackMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/LeadItemMixin.java (95%) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MapItemMixin.java rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/MerchantOfferMixin.java (97%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/MilkBucketItemMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/MinecartItemMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/PotionItemMixin.java (94%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/ShearsItemMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/SnowballItemMixin.java (89%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/SpawnEggItemMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/TridentItemMixin.java (93%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/BlastingRecipeMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/CampfireCookingRecipeMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{item/crafting/SpecialRecipeMixin.java => world/item/crafting/CustomRecipeMixin.java} (76%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/FurnaceRecipeMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/IngredientMixin.java (96%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/RecipeManagerMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{item/crafting/IRecipeMixin.java => world/item/crafting/RecipeMixin.java} (85%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/ServerRecipeBookMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/ShapedRecipeMixin.java (92%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/ShapelessRecipeMixin.java (84%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/SmithingRecipeMixin.java (85%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/SmokingRecipeMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world}/item/crafting/StonecuttingRecipeMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{state => world/level/block/state/properties}/IntegerPropertyMixin.java (87%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world/level/storage}/loot/LootTableManagerMixin.java (95%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world/level/storage}/loot/LootTableMixin.java (98%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{loot => world/level/storage/loot/entries}/LootEntry_SerializerMixin.java (92%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{ => world/level/storage}/loot/functions/LootingEnchantBonusMixin.java (80%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{loot => world/level/storage/loot/parameters}/LootParametersMixin.java (84%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{loot/conditions => world/level/storage/loot/predicates}/RandomChanceWithLootingMixin.java (92%) rename arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/{loot/conditions => world/level/storage/loot/predicates}/SurvivesExplosionMixin.java (90%) delete mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mod/util/BlackholeNetHandler.java diff --git a/arclight-common/build.gradle b/arclight-common/build.gradle index 2839d422..1fd9241a 100644 --- a/arclight-common/build.gradle +++ b/arclight-common/build.gradle @@ -8,7 +8,8 @@ buildscript { dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: "${forge_gradle_version}" classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - classpath "io.izzel.arclight:arclight-gradle-plugin:$agpVersion" + // classpath "io.izzel.arclight:arclight-gradle-plugin:$agpVersion" + classpath files("G:\\workspace\\arclight-gradle-plugin\\build\\libs\\arclight-gradle-plugin-1.18.jar") } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java deleted file mode 100644 index 8065ec0c..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerMixin.java +++ /dev/null @@ -1,418 +0,0 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; - -import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; -import io.izzel.arclight.common.bridge.inventory.container.ContainerBridge; -import io.izzel.arclight.common.bridge.inventory.container.SlotBridge; -import io.izzel.arclight.common.mod.server.ArclightContainer; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.v.inventory.CraftInventory; -import org.bukkit.craftbukkit.v.inventory.CraftItemStack; -import org.bukkit.event.Event; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.InventoryView; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ClickType; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; - -@Mixin(AbstractContainerMenu.class) -public abstract class ContainerMixin implements ContainerBridge { - - // @formatter:off - @Shadow public void broadcastChanges() {} - @Shadow private int quickcraftStatus; - @Shadow protected abstract void resetQuickCraft(); - @Shadow private int quickcraftType; - @Shadow @Final private Set quickcraftSlots; - @Shadow public List slots; - @Shadow public abstract boolean canDragTo(Slot slotIn); - @Shadow public abstract ItemStack quickMoveStack(Player playerIn, int index); - @Shadow public abstract boolean canTakeItemForPickAll(ItemStack stack, Slot slotIn); - @Shadow @Final public int containerId; - @Shadow public abstract Slot getSlot(int slotId); - @Shadow public static int getQuickcraftHeader(int clickedButton) { return 0; } - @Shadow public static int getQuickcraftType(int eventButton) { return 0; } - @Shadow public static boolean isValidQuickcraftType(int dragModeIn, Player player) { return false; } - @Shadow public static boolean canItemQuickReplace(@Nullable Slot slotIn, ItemStack stack, boolean stackSizeMatters) { return false; } - @Shadow public static void getQuickCraftSlotCount(Set dragSlotsIn, int dragModeIn, ItemStack stack, int slotStackSize) { } - @Shadow public static boolean consideredTheSameItem(ItemStack stack1, ItemStack stack2) { return false; } - @Shadow protected abstract boolean moveItemStackTo(ItemStack stack, int startIndex, int endIndex, boolean reverseDirection); - @Shadow @Final @javax.annotation.Nullable private MenuType menuType; - // @formatter:on - - public boolean checkReachable = true; - private InventoryView bukkitView; - private long bukkitViewHash = 0; - - public InventoryView getBukkitView() { - if (bukkitView != null && bukkitViewHash != bukkitViewHash()) { - ArclightContainer.updateView((AbstractContainerMenu) (Object) this, bukkitView); - bukkitViewHash = bukkitViewHash(); - } - if (bukkitView == null) { - bukkitView = ArclightContainer.createInvView((AbstractContainerMenu) (Object) this); - bukkitViewHash = bukkitViewHash(); - } - return bukkitView; - } - - private long bukkitViewHash() { - return (((long) this.slots.size()) << 32) | System.identityHashCode(this.slots); - } - - public void transferTo(AbstractContainerMenu other, CraftHumanEntity player) { - InventoryView source = this.getBukkitView(); - InventoryView destination = ((ContainerBridge) other).bridge$getBukkitView(); - ((IInventoryBridge) ((CraftInventory) source.getTopInventory()).getInventory()).onClose(player); - ((IInventoryBridge) ((CraftInventory) source.getBottomInventory()).getInventory()).onClose(player); - ((IInventoryBridge) ((CraftInventory) destination.getTopInventory()).getInventory()).onOpen(player); - ((IInventoryBridge) ((CraftInventory) destination.getBottomInventory()).getInventory()).onOpen(player); - } - - private Component title; - - public final Component getTitle() { - if (this.title == null) { - if (this.menuType != null && this.menuType.getRegistryName() != null) { - return new TextComponent(this.menuType.getRegistryName().toString()); - } else { - return new TextComponent(this.toString()); - } - } - return this.title; - } - - public final void setTitle(Component title) { - if (this.title == null) { - if (title == null) { - this.title = getTitle(); - } else { - this.title = title; - } - } - } - - @Redirect(method = "removed", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;drop(Lnet/minecraft/world/item/ItemStack;Z)Lnet/minecraft/world/entity/item/ItemEntity;")) - private ItemEntity arclight$cleanBeforeDrop(Player playerEntity, ItemStack itemStackIn, boolean unused) { - playerEntity.inventory.setCarried(ItemStack.EMPTY); - return playerEntity.drop(itemStackIn, unused); - } - - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - private ItemStack doClick(int slotId, int dragType, ClickType clickTypeIn, Player player) { - ItemStack itemstack = ItemStack.EMPTY; - Inventory playerinventory = player.inventory; - if (clickTypeIn == ClickType.QUICK_CRAFT) { - int j1 = this.quickcraftStatus; - this.quickcraftStatus = getQuickcraftHeader(dragType); - if ((j1 != 1 || this.quickcraftStatus != 2) && j1 != this.quickcraftStatus) { - this.resetQuickCraft(); - } else if (playerinventory.getCarried().isEmpty()) { - this.resetQuickCraft(); - } else if (this.quickcraftStatus == 0) { - this.quickcraftType = getQuickcraftType(dragType); - if (isValidQuickcraftType(this.quickcraftType, player)) { - this.quickcraftStatus = 1; - this.quickcraftSlots.clear(); - } else { - this.resetQuickCraft(); - } - } else if (this.quickcraftStatus == 1) { - Slot slot7 = this.slots.get(slotId); - ItemStack itemstack12 = playerinventory.getCarried(); - if (slot7 != null && canItemQuickReplace(slot7, itemstack12, true) && slot7.mayPlace(itemstack12) && (this.quickcraftType == 2 || itemstack12.getCount() > this.quickcraftSlots.size()) && this.canDragTo(slot7)) { - this.quickcraftSlots.add(slot7); - } - } else if (this.quickcraftStatus == 2) { - if (!this.quickcraftSlots.isEmpty()) { - ItemStack itemstack9 = playerinventory.getCarried().copy(); - int k1 = playerinventory.getCarried().getCount(); - - Map draggedSlots = new HashMap<>(); - - for (Slot slot8 : this.quickcraftSlots) { - ItemStack itemstack13 = playerinventory.getCarried(); - if (slot8 != null && canItemQuickReplace(slot8, itemstack13, true) && slot8.mayPlace(itemstack13) && (this.quickcraftType == 2 || itemstack13.getCount() >= this.quickcraftSlots.size()) && this.canDragTo(slot8)) { - ItemStack itemstack14 = itemstack9.copy(); - int j3 = slot8.hasItem() ? slot8.getItem().getCount() : 0; - getQuickCraftSlotCount(this.quickcraftSlots, this.quickcraftType, itemstack14, j3); - int k3 = Math.min(itemstack14.getMaxStackSize(), slot8.getMaxStackSize(itemstack14)); - if (itemstack14.getCount() > k3) { - itemstack14.setCount(k3); - } - - k1 -= itemstack14.getCount() - j3; - // slot8.putStack(itemstack14); - draggedSlots.put(slot8.index, itemstack14); - } - } - - InventoryView view = this.getBukkitView(); - org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack9); - newcursor.setAmount(k1); - Map eventmap = new HashMap<>(); - for (Map.Entry ditem : draggedSlots.entrySet()) { - eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); - } - ItemStack oldCursor = playerinventory.getCarried(); - playerinventory.setCarried(CraftItemStack.asNMSCopy(newcursor)); - InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != Material.AIR) ? newcursor : null, CraftItemStack.asBukkitCopy(oldCursor), this.quickcraftType == 1, eventmap); - Bukkit.getPluginManager().callEvent(event); - boolean needsUpdate = event.getResult() != Event.Result.DEFAULT; - if (event.getResult() != Event.Result.DENY) { - for (Map.Entry dslot : draggedSlots.entrySet()) { - view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); - } - if (playerinventory.getCarried() != null) { - playerinventory.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); - needsUpdate = true; - } - } else { - playerinventory.setCarried(oldCursor); - } - if (needsUpdate && player instanceof ServerPlayer) { - ((ServerPlayer) player).refreshContainer((AbstractContainerMenu) (Object) this); - } - } - this.resetQuickCraft(); - } else { - this.resetQuickCraft(); - } - } else if (this.quickcraftStatus != 0) { - this.resetQuickCraft(); - } else if ((clickTypeIn == ClickType.PICKUP || clickTypeIn == ClickType.QUICK_MOVE) && (dragType == 0 || dragType == 1)) { - if (slotId == -999) { - if (!playerinventory.getCarried().isEmpty()) { - if (dragType == 0) { - ItemStack carried = playerinventory.getCarried(); - playerinventory.setCarried(ItemStack.EMPTY); - player.drop(carried, true); - } - - if (dragType == 1) { - player.drop(playerinventory.getCarried().split(1), true); - } - } - } else if (clickTypeIn == ClickType.QUICK_MOVE) { - if (slotId < 0) { - return ItemStack.EMPTY; - } - - Slot slot5 = this.slots.get(slotId); - if (slot5 == null || !slot5.mayPickup(player)) { - return ItemStack.EMPTY; - } - - for (ItemStack itemstack7 = this.quickMoveStack(player, slotId); !itemstack7.isEmpty() && ItemStack.isSame(slot5.getItem(), itemstack7); itemstack7 = this.quickMoveStack(player, slotId)) { - itemstack = itemstack7.copy(); - } - } else { - if (slotId < 0) { - return ItemStack.EMPTY; - } - - Slot slot6 = this.slots.get(slotId); - if (slot6 != null) { - ItemStack itemstack8 = slot6.getItem(); - ItemStack itemstack11 = playerinventory.getCarried(); - if (!itemstack8.isEmpty()) { - itemstack = itemstack8.copy(); - } - - if (itemstack8.isEmpty()) { - if (!itemstack11.isEmpty() && slot6.mayPlace(itemstack11)) { - int j2 = dragType == 0 ? itemstack11.getCount() : 1; - if (j2 > slot6.getMaxStackSize(itemstack11)) { - j2 = slot6.getMaxStackSize(itemstack11); - } - - slot6.set(itemstack11.split(j2)); - } - } else if (slot6.mayPickup(player)) { - if (itemstack11.isEmpty()) { - if (itemstack8.isEmpty()) { - slot6.set(ItemStack.EMPTY); - playerinventory.setCarried(ItemStack.EMPTY); - } else { - int k2 = dragType == 0 ? itemstack8.getCount() : (itemstack8.getCount() + 1) / 2; - playerinventory.setCarried(slot6.remove(k2)); - if (itemstack8.isEmpty()) { - slot6.set(ItemStack.EMPTY); - } - - slot6.onTake(player, playerinventory.getCarried()); - } - } else if (slot6.mayPlace(itemstack11)) { - if (consideredTheSameItem(itemstack8, itemstack11)) { - int l2 = dragType == 0 ? itemstack11.getCount() : 1; - if (l2 > slot6.getMaxStackSize(itemstack11) - itemstack8.getCount()) { - l2 = slot6.getMaxStackSize(itemstack11) - itemstack8.getCount(); - } - - if (l2 > itemstack11.getMaxStackSize() - itemstack8.getCount()) { - l2 = itemstack11.getMaxStackSize() - itemstack8.getCount(); - } - - itemstack11.shrink(l2); - itemstack8.grow(l2); - } else if (itemstack11.getCount() <= slot6.getMaxStackSize(itemstack11)) { - slot6.set(itemstack11); - playerinventory.setCarried(itemstack8); - } - } else if (itemstack11.getMaxStackSize() > 1 && consideredTheSameItem(itemstack8, itemstack11) && !itemstack8.isEmpty()) { - int i3 = itemstack8.getCount(); - if (i3 + itemstack11.getCount() <= itemstack11.getMaxStackSize()) { - itemstack11.grow(i3); - itemstack8 = slot6.remove(i3); - if (itemstack8.isEmpty()) { - slot6.set(ItemStack.EMPTY); - } - - slot6.onTake(player, playerinventory.getCarried()); - } - } - } - - slot6.setChanged(); - - if (player instanceof ServerPlayer && slot6.getMaxStackSize() != 64) { - ((ServerPlayer) player).connection.send(new ClientboundContainerSetSlotPacket(this.containerId, slot6.index, slot6.getItem())); - if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { - ((ServerPlayer) player).connection.send(new ClientboundContainerSetSlotPacket(this.containerId, 0, this.getSlot(0).getItem())); - } - } - } - } - } else if (clickTypeIn == ClickType.SWAP && dragType >= 0 && dragType < 9) { - Slot slot4 = this.slots.get(slotId); - ItemStack itemstack6 = playerinventory.getItem(dragType); - ItemStack itemstack10 = slot4.getItem(); - if (!itemstack6.isEmpty() || !itemstack10.isEmpty()) { - if (itemstack6.isEmpty()) { - if (slot4.mayPickup(player)) { - playerinventory.setItem(dragType, itemstack10); - ((SlotBridge) slot4).bridge$onSwapCraft(itemstack10.getCount()); - slot4.set(ItemStack.EMPTY); - slot4.onTake(player, itemstack10); - } - } else if (itemstack10.isEmpty()) { - if (slot4.mayPlace(itemstack6)) { - int l1 = slot4.getMaxStackSize(itemstack6); - if (itemstack6.getCount() > l1) { - slot4.set(itemstack6.split(l1)); - } else { - slot4.set(itemstack6); - playerinventory.setItem(dragType, ItemStack.EMPTY); - } - } - } else if (slot4.mayPickup(player) && slot4.mayPlace(itemstack6)) { - int i2 = slot4.getMaxStackSize(itemstack6); - if (itemstack6.getCount() > i2) { - slot4.set(itemstack6.split(i2)); - slot4.onTake(player, itemstack10); - if (!playerinventory.add(itemstack10)) { - player.drop(itemstack10, true); - } - } else { - slot4.set(itemstack6); - playerinventory.setItem(dragType, itemstack10); - slot4.onTake(player, itemstack10); - } - } - } - } else if (clickTypeIn == ClickType.CLONE && player.abilities.instabuild && playerinventory.getCarried().isEmpty() && slotId >= 0) { - Slot slot3 = this.slots.get(slotId); - if (slot3 != null && slot3.hasItem()) { - ItemStack itemstack5 = slot3.getItem().copy(); - itemstack5.setCount(itemstack5.getMaxStackSize()); - playerinventory.setCarried(itemstack5); - } - } else if (clickTypeIn == ClickType.THROW && playerinventory.getCarried().isEmpty() && slotId >= 0) { - Slot slot2 = this.slots.get(slotId); - if (slot2 != null && slot2.hasItem() && slot2.mayPickup(player)) { - ItemStack itemstack4 = slot2.remove(dragType == 0 ? 1 : slot2.getItem().getCount()); - slot2.onTake(player, itemstack4); - player.drop(itemstack4, true); - } - } else if (clickTypeIn == ClickType.PICKUP_ALL && slotId >= 0) { - Slot slot = this.slots.get(slotId); - ItemStack itemstack1 = playerinventory.getCarried(); - if (!itemstack1.isEmpty() && (slot == null || !slot.hasItem() || !slot.mayPickup(player))) { - int i = dragType == 0 ? 0 : this.slots.size() - 1; - int j = dragType == 0 ? 1 : -1; - - for (int k = 0; k < 2; ++k) { - for (int l = i; l >= 0 && l < this.slots.size() && itemstack1.getCount() < itemstack1.getMaxStackSize(); l += j) { - Slot slot1 = this.slots.get(l); - if (slot1.hasItem() && canItemQuickReplace(slot1, itemstack1, true) && slot1.mayPickup(player) && this.canTakeItemForPickAll(itemstack1, slot1)) { - ItemStack itemstack2 = slot1.getItem(); - if (k != 0 || itemstack2.getCount() != itemstack2.getMaxStackSize()) { - int i1 = Math.min(itemstack1.getMaxStackSize() - itemstack1.getCount(), itemstack2.getCount()); - ItemStack itemstack3 = slot1.remove(i1); - itemstack1.grow(i1); - if (itemstack3.isEmpty()) { - slot1.set(ItemStack.EMPTY); - } - slot1.onTake(player, itemstack3); - } - } - } - } - } - this.broadcastChanges(); - } - return itemstack; - } - - @Override - public boolean bridge$isCheckReachable() { - return checkReachable; - } - - @Override - public InventoryView bridge$getBukkitView() { - return getBukkitView(); - } - - @Override - public void bridge$transferTo(AbstractContainerMenu other, CraftHumanEntity player) { - transferTo(other, player); - } - - @Override - public Component bridge$getTitle() { - return getTitle(); - } - - @Override - public void bridge$setTitle(Component title) { - setTitle(title); - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FilledMapItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FilledMapItemMixin.java deleted file mode 100644 index f30fb983..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FilledMapItemMixin.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.izzel.arclight.common.mixin.core.item; - -import io.izzel.arclight.common.bridge.world.storage.MapDataBridge; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceKey; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.item.MapItem; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import org.bukkit.Bukkit; -import org.bukkit.event.server.MapInitializeEvent; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; - -@Mixin(MapItem.class) -public abstract class FilledMapItemMixin { - - // @formatter:off - @Shadow private static MapItemSavedData createAndStoreSavedData(ItemStack stack, Level worldIn, int x, int z, int scale, boolean trackingPosition, boolean unlimitedTracking, ResourceKey dimensionTypeIn) { return null; } - // @formatter:on - - @Inject(method = "createAndStoreSavedData", locals = LocalCapture.CAPTURE_FAILHARD, at = @At("RETURN")) - private static void arclight$mapInit(ItemStack stack, Level worldIn, int x, int z, int scale, boolean trackingPosition, - boolean unlimitedTracking, ResourceKey dimensionTypeIn, CallbackInfoReturnable cir, - int i, MapItemSavedData mapData) { - MapInitializeEvent event = new MapInitializeEvent(((MapDataBridge) mapData).bridge$getMapView()); - Bukkit.getPluginManager().callEvent(event); - } - - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - public static int getMapId(ItemStack stack) { - CompoundTag compoundnbt = stack.getTag(); - return compoundnbt != null && compoundnbt.contains("map", 99) ? compoundnbt.getInt("map") : -1; - } - - @Inject(method = "getOrCreateSavedData", cancellable = true, at = @At("HEAD")) - private static void arclight$nonFilledMap(ItemStack stack, Level worldIn, CallbackInfoReturnable cir) { - if (stack != null && worldIn instanceof ServerLevel && stack.getItem() == Items.MAP) { - MapItemSavedData mapdata = MapItem.getSavedData(stack, worldIn); - if (mapdata == null) { - mapdata = createAndStoreSavedData(stack, worldIn, worldIn.getLevelData().getXSpawn(), worldIn.getLevelData().getZSpawn(), 3, false, false, worldIn.dimension()); - } - cir.setReturnValue(mapdata); - } - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/NetworkManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/NetworkManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java index c753aff6..687981d4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/NetworkManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ConnectionMixin.java @@ -3,15 +3,15 @@ package io.izzel.arclight.common.mixin.core.network; import com.mojang.authlib.properties.Property; import io.izzel.arclight.common.bridge.network.NetworkManagerBridge; import io.netty.channel.Channel; +import net.minecraft.network.Connection; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import java.net.SocketAddress; import java.util.UUID; -import net.minecraft.network.Connection; @Mixin(Connection.class) -public class NetworkManagerMixin implements NetworkManagerBridge { +public class ConnectionMixin implements NetworkManagerBridge { @Shadow public Channel channel; public java.util.UUID spoofedUUID; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java index 8732e2ac..8a3ca317 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/ServerHandshakeNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerHandshakeNetHandlerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.handshake; +package io.izzel.arclight.common.mixin.core.network; import com.google.gson.Gson; import com.mojang.authlib.properties.Property; @@ -16,7 +16,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.network.ServerHandshakePacketListenerImpl; import net.minecraft.server.network.ServerLoginPacketListenerImpl; import net.minecraft.server.network.ServerStatusPacketListenerImpl; -import net.minecraftforge.fml.server.ServerLifecycleHooks; +import net.minecraftforge.fmllegacy.server.ServerLifecycleHooks; import org.apache.logging.log4j.LogManager; import org.bukkit.Bukkit; import org.spigotmc.SpigotConfig; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/login/ServerLoginNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin.java similarity index 91% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/login/ServerLoginNetHandlerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin.java index b148948a..9ca3a4bc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/login/ServerLoginNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerLoginNetHandlerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.login; +package io.izzel.arclight.common.mixin.core.network; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; @@ -11,6 +11,7 @@ import net.minecraft.network.Connection; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.network.protocol.game.ClientboundDisconnectPacket; import net.minecraft.network.protocol.login.ClientboundGameProfilePacket; import net.minecraft.network.protocol.login.ClientboundHelloPacket; import net.minecraft.network.protocol.login.ClientboundLoginCompressionPacket; @@ -23,7 +24,7 @@ import net.minecraft.server.network.ServerLoginPacketListenerImpl; import net.minecraft.util.Crypt; import net.minecraft.util.CryptException; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.fml.common.thread.SidedThreadGroups; +import net.minecraftforge.fml.util.thread.SidedThreadGroups; import org.apache.commons.lang3.Validate; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; @@ -55,7 +56,6 @@ public abstract class ServerLoginNetHandlerMixin implements ServerLoginNetHandle @Shadow private ServerLoginPacketListenerImpl.State state; @Shadow @Final private MinecraftServer server; @Shadow @Final private byte[] nonce; - @Shadow private SecretKey secretKey; @Shadow @Final public Connection connection; @Shadow @Final private static AtomicInteger UNIQUE_THREAD_ID; @Shadow private GameProfile gameProfile; @@ -108,17 +108,24 @@ public abstract class ServerLoginNetHandlerMixin implements ServerLoginNetHandle this.state = ServerLoginPacketListenerImpl.State.ACCEPTED; if (this.server.getCompressionThreshold() >= 0 && !this.connection.isMemoryConnection()) { this.connection.send(new ClientboundLoginCompressionPacket(this.server.getCompressionThreshold()), (p_210149_1_) -> { - this.connection.setupCompression(this.server.getCompressionThreshold()); + this.connection.setupCompression(this.server.getCompressionThreshold(), true); }); } this.connection.send(new ClientboundGameProfilePacket(this.gameProfile)); ServerPlayer serverplayerentity = this.server.getPlayerList().getPlayer(this.gameProfile.getId()); - if (serverplayerentity != null) { - this.state = ServerLoginPacketListenerImpl.State.DELAY_ACCEPT; - this.delayedAcceptPlayer = entity; - } else { - this.server.getPlayerList().placeNewPlayer(this.connection, entity); + try { + if (serverplayerentity != null) { + this.state = ServerLoginPacketListenerImpl.State.DELAY_ACCEPT; + this.delayedAcceptPlayer = entity; + } else { + this.server.getPlayerList().placeNewPlayer(this.connection, entity); + } + } catch (Exception exception) { + TranslatableComponent chatmessage = new TranslatableComponent("multiplayer.disconnect.invalid_player_data"); + + this.connection.send(new ClientboundDisconnectPacket(chatmessage)); + this.connection.disconnect(chatmessage); } } } @@ -189,10 +196,10 @@ public abstract class ServerLoginNetHandlerMixin implements ServerLoginNetHandle throw new IllegalStateException("Protocol error"); } - this.secretKey = packetIn.getSecretKey(privatekey); - Cipher cipher = Crypt.getCipher(2, this.secretKey); - Cipher cipher1 = Crypt.getCipher(1, this.secretKey); - s = (new BigInteger(Crypt.digestData("", this.server.getKeyPair().getPublic(), this.secretKey))).toString(16); + SecretKey secretKey = packetIn.getSecretKey(privatekey); + Cipher cipher = Crypt.getCipher(2, secretKey); + Cipher cipher1 = Crypt.getCipher(1, secretKey); + s = (new BigInteger(Crypt.digestData("", this.server.getKeyPair().getPublic(), secretKey))).toString(16); this.state = ServerLoginPacketListenerImpl.State.AUTHENTICATING; this.connection.setEncryptionKey(cipher, cipher1); } catch (CryptException cryptexception) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java similarity index 63% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java index 8500f47a..d7b574db 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/ServerPlayNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.play; +package io.izzel.arclight.common.mixin.core.network; import com.google.common.base.Charsets; import io.izzel.arclight.common.bridge.entity.EntityBridge; @@ -11,69 +11,32 @@ import io.izzel.arclight.common.bridge.server.management.PlayerInteractionManage import io.izzel.arclight.common.bridge.server.management.PlayerListBridge; import io.izzel.arclight.common.bridge.tileentity.SignTileEntityBridge; import io.izzel.arclight.common.mod.ArclightConstants; -import io.izzel.arclight.common.mod.compat.AstralSorceryHooks; import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; -import it.unimi.dsi.fastutil.ints.Int2ShortMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import net.minecraft.ChatFormatting; import net.minecraft.SharedConstants; import net.minecraft.Util; import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.commands.CommandRuntimeException; import net.minecraft.core.BlockPos; -import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.network.Connection; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.network.play.client.*; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketUtils; -import net.minecraft.network.protocol.game.ClientboundAddMobPacket; -import net.minecraft.network.protocol.game.ClientboundChatPacket; -import net.minecraft.network.protocol.game.ClientboundContainerAckPacket; -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; -import net.minecraft.network.protocol.game.ClientboundDisconnectPacket; -import net.minecraft.network.protocol.game.ClientboundMoveVehiclePacket; -import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket; -import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket; -import net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket; -import net.minecraft.network.protocol.game.ClientboundSetEntityDataPacket; -import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket; -import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket; -import net.minecraft.network.protocol.game.ServerboundChatPacket; -import net.minecraft.network.protocol.game.ServerboundContainerAckPacket; -import net.minecraft.network.protocol.game.ServerboundContainerButtonClickPacket; -import net.minecraft.network.protocol.game.ServerboundContainerClickPacket; -import net.minecraft.network.protocol.game.ServerboundContainerClosePacket; -import net.minecraft.network.protocol.game.ServerboundCustomPayloadPacket; -import net.minecraft.network.protocol.game.ServerboundEditBookPacket; -import net.minecraft.network.protocol.game.ServerboundInteractPacket; -import net.minecraft.network.protocol.game.ServerboundKeepAlivePacket; -import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; -import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket; -import net.minecraft.network.protocol.game.ServerboundPlayerAbilitiesPacket; -import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket; -import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket; -import net.minecraft.network.protocol.game.ServerboundResourcePackPacket; -import net.minecraft.network.protocol.game.ServerboundSelectTradePacket; -import net.minecraft.network.protocol.game.ServerboundSetCarriedItemPacket; -import net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket; -import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket; -import net.minecraft.network.protocol.game.ServerboundSwingPacket; -import net.minecraft.network.protocol.game.ServerboundTeleportToEntityPacket; -import net.minecraft.network.protocol.game.ServerboundUseItemOnPacket; -import net.minecraft.network.protocol.game.ServerboundUseItemPacket; +import net.minecraft.network.protocol.game.*; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.server.network.TextFilter; import net.minecraft.server.players.PlayerList; import net.minecraft.util.Mth; import net.minecraft.util.StringUtil; @@ -82,7 +45,6 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ExperienceOrb; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.animal.AbstractFish; @@ -107,6 +69,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.ForgeHooks; +import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -148,12 +111,10 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; import org.bukkit.event.player.PlayerToggleSneakEvent; import org.bukkit.event.player.PlayerToggleSprintEvent; +import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; -import org.bukkit.inventory.Recipe; import org.bukkit.inventory.SmithingInventory; -import org.bukkit.util.Vector; import org.spigotmc.SpigotConfig; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -169,21 +130,20 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutionException; +import java.util.function.UnaryOperator; import java.util.logging.Level; @Mixin(ServerGamePacketListenerImpl.class) public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerBridge { // @formatter:off - @Shadow(aliases = {"server", "field_147367_d"}, remap = false) @Final private MinecraftServer minecraftServer; + @Shadow @Final private MinecraftServer server; @Shadow public ServerPlayer player; @Shadow @Final public Connection connection; @Shadow public abstract void onDisconnect(Component reason); - @Shadow private static boolean containsInvalidValues(ServerboundMoveVehiclePacket packetIn) { return false; } @Shadow private Entity lastVehicle; @Shadow private double vehicleFirstGoodX; @Shadow private double vehicleFirstGoodY; @@ -196,7 +156,6 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Shadow private int receivedMovePacketCount; @Shadow private int knownMovePacketCount; @Shadow private Vec3 awaitingPositionFromClient; - @Shadow private static boolean containsInvalidValues(ServerboundMovePlayerPacket packetIn) { return false; } @Shadow private int tickCount; @Shadow public abstract void resetPosition(); @Shadow private int awaitingTeleportTime; @@ -212,15 +171,18 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Shadow private int awaitingTeleport; @Shadow public abstract void send(Packet packetIn); @Shadow private int chatSpamTickCount; - @Shadow @Final private Int2ShortMap expectedAcks; @Shadow private int dropSpamTickCount; @Shadow protected abstract boolean noBlocksAround(Entity p_241162_1_); @Shadow protected abstract boolean isPlayerCollidingWithAnythingNew(LevelReader p_241163_1_, AABB p_241163_2_); + @Shadow protected abstract void updateBookPages(List p_143635_, UnaryOperator p_143636_, ItemStack p_143637_); + @Shadow private static double clampHorizontal(double p_143610_) { return 0; } + @Shadow private static double clampVertical(double p_143654_) { return 0; } + @Shadow private static boolean containsInvalidValues(double p_143664_, double p_143665_, double p_143666_, float p_143667_, float p_143668_) { return false; } // @formatter:on private static final int SURVIVAL_PLACE_DISTANCE_SQUARED = 6 * 6; private static final int CREATIVE_PLACE_DISTANCE_SQUARED = 7 * 7; - private CraftServer server; + private CraftServer cserver; public boolean processedDisconnect; private int allowedPlayerTicks; private int dropCount; @@ -247,7 +209,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Inject(method = "", at = @At("RETURN")) private void arclight$init(MinecraftServer server, Connection networkManagerIn, ServerPlayer playerIn, CallbackInfo ci) { - this.server = ((CraftServer) Bukkit.getServer()); + this.cserver = ((CraftServer) Bukkit.getServer()); allowedPlayerTicks = 1; dropCount = 0; lastPosX = Double.MAX_VALUE; @@ -272,9 +234,9 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return; } String leaveMessage = ChatFormatting.YELLOW + this.player.getScoreboardName() + " left the game."; - PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage); - if (this.server.getServer().isRunning()) { - this.server.getPluginManager().callEvent(event); + PlayerKickEvent event = new PlayerKickEvent(getPlayer(), s, leaveMessage); + if (this.cserver.getServer().isRunning()) { + this.cserver.getPluginManager().callEvent(event); } if (event.isCancelled()) { return; @@ -284,7 +246,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.connection.send(new ClientboundDisconnectPacket(textComponent), future -> this.connection.disconnect(textComponent)); this.onDisconnect(textComponent); this.connection.setReadOnly(); - this.minecraftServer.executeBlocking(this.connection::handleDisconnection); + this.server.executeBlocking(this.connection::handleDisconnection); } @Override @@ -299,7 +261,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Overwrite public void handleMoveVehicle(final ServerboundMoveVehiclePacket packetplayinvehiclemove) { PacketUtils.ensureRunningOnSameThread(packetplayinvehiclemove, (ServerGamePacketListenerImpl) (Object) this, this.player.getLevel()); - if (containsInvalidValues(packetplayinvehiclemove)) { + if (containsInvalidValues(packetplayinvehiclemove.getX(), packetplayinvehiclemove.getY(), packetplayinvehiclemove.getZ(), packetplayinvehiclemove.getYRot(), packetplayinvehiclemove.getXRot())) { this.disconnect(new TranslatableComponent("multiplayer.disconnect.invalid_vehicle_movement")); } else { Entity entity = this.player.getRootVehicle(); @@ -333,10 +295,10 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.allowedPlayerTicks = 20; } double speed; - if (this.player.abilities.flying) { - speed = this.player.abilities.flyingSpeed * 20.0f; + if (this.player.getAbilities().flying) { + speed = this.player.getAbilities().flyingSpeed * 20.0f; } else { - speed = this.player.abilities.walkingSpeed * 10.0f; + speed = this.player.getAbilities().walkingSpeed * 10.0f; } speed *= 2.0; if (d11 - d10 > Math.max(100.0, Math.pow(10.0f * i * speed, 2.0)) && !this.isSingleplayerOwner()) { @@ -362,16 +324,25 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB flag2 = true; LOGGER.warn("{} (vehicle of {}) moved wrongly! {}", entity.getName().getString(), this.player.getName().getString(), Math.sqrt(d11)); } + Location curPos = this.getPlayer().getLocation(); entity.absMoveTo(d4, d5, d6, f, f2); - this.player.absMoveTo(d4, d5, d6, this.player.yRot, this.player.xRot); + this.player.absMoveTo(d4, d5, d6, this.player.getYRot(), this.player.getXRot()); boolean flag3 = worldserver.noCollision(entity, entity.getBoundingBox().deflate(0.0625)); if (flag && (flag2 || !flag3)) { entity.absMoveTo(d0, d2, d3, f, f2); - this.player.absMoveTo(d0, d2, d3, this.player.yRot, this.player.xRot); + this.player.absMoveTo(d0, d2, d3, this.player.getYRot(), this.player.getXRot()); this.connection.send(new ClientboundMoveVehiclePacket(entity)); return; } Player player = this.getPlayer(); + if (!hasMoved) { + lastPosX = curPos.getX(); + lastPosY = curPos.getY(); + lastPosZ = curPos.getZ(); + lastYaw = curPos.getYaw(); + lastPitch = curPos.getPitch(); + hasMoved = true; + } Location from = new Location(player.getWorld(), this.lastPosX, this.lastPosY, this.lastPosZ, this.lastYaw, this.lastPitch); Location to = player.getLocation().clone(); to.setX(packetplayinvehiclemove.getX()); @@ -387,10 +358,10 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.lastPosZ = to.getZ(); this.lastYaw = to.getYaw(); this.lastPitch = to.getPitch(); - if (from.getX() != Double.MAX_VALUE) { + if (true) { Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); - this.server.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { this.bridge$teleport(from); return; @@ -407,7 +378,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } this.player.getLevel().getChunkSource().move(this.player); this.player.checkMovementStatistics(this.player.getX() - d0, this.player.getY() - d2, this.player.getZ() - d3); - this.clientVehicleIsFloating = d12 >= -0.03125 && !this.minecraftServer.isFlightAllowed() && this.noBlocksAround(entity); + this.clientVehicleIsFloating = d12 >= -0.03125 && !this.server.isFlightAllowed() && this.noBlocksAround(entity); this.vehicleLastGoodX = entity.getX(); this.vehicleLastGoodY = entity.getY(); this.vehicleLastGoodZ = entity.getZ(); @@ -442,7 +413,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.lastBookTick = ArclightConstants.currentTick - 20; } if (this.lastBookTick + 20 > ArclightConstants.currentTick) { - PacketUtils.ensureRunningOnSameThread(packetIn, (ServerGamePacketListenerImpl) (Object) this, this.minecraftServer); + PacketUtils.ensureRunningOnSameThread(packetIn, (ServerGamePacketListenerImpl) (Object) this, this.server); this.disconnect("Book edited too quickly!"); return; } @@ -454,14 +425,12 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB * @reason */ @Overwrite - private void updateBookContents(List p_244536_1_, int p_244536_2_) { - ItemStack itemstack = this.player.inventory.getItem(p_244536_2_); - if (itemstack.getItem() == Items.WRITABLE_BOOK) { - ListTag listnbt = new ListTag(); - p_244536_1_.stream().map(StringTag::valueOf).forEach(listnbt::add); - ItemStack old = itemstack.copy(); - itemstack.addTagElement("pages", listnbt); - CraftEventFactory.handleEditBookEvent(player, p_244536_2_, old, itemstack); + private void updateBookContents(List list, int slot) { + ItemStack old = this.player.getInventory().getItem(slot); + if (old.is(Items.WRITABLE_BOOK)) { + ItemStack itemstack = old.copy(); + this.updateBookPages(list, UnaryOperator.identity(), itemstack); + CraftEventFactory.handleEditBookEvent(player, slot, old, itemstack); } } @@ -470,27 +439,25 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB * @reason */ @Overwrite - private void signBook(String p_244534_1_, List p_244534_2_, int p_244534_3_) { - ItemStack itemstack = this.player.inventory.getItem(p_244534_3_); - if (itemstack.getItem() == Items.WRITABLE_BOOK) { - ItemStack itemstack1 = new ItemStack(Items.WRITTEN_BOOK); - CompoundTag compoundnbt = itemstack.getTag(); - if (compoundnbt != null) { - itemstack1.setTag(compoundnbt.copy()); + private void signBook(TextFilter.FilteredText text, List list, int slot) { + ItemStack old = this.player.getInventory().getItem(slot); + if (old.is(Items.WRITABLE_BOOK)) { + ItemStack itemStack = new ItemStack(Items.WRITTEN_BOOK); + CompoundTag compoundtag = old.getTag(); + if (compoundtag != null) { + itemStack.setTag(compoundtag.copy()); } - itemstack1.addTagElement("author", StringTag.valueOf(this.player.getName().getString())); - itemstack1.addTagElement("title", StringTag.valueOf(p_244534_1_)); - ListTag listnbt = new ListTag(); - - for (String s : p_244534_2_) { - Component itextcomponent = new TextComponent(s); - String s1 = Component.Serializer.toJson(itextcomponent); - listnbt.add(StringTag.valueOf(s1)); + itemStack.addTagElement("author", StringTag.valueOf(this.player.getName().getString())); + if (this.player.isTextFilteringEnabled()) { + itemStack.addTagElement("title", StringTag.valueOf(text.getFiltered())); + } else { + itemStack.addTagElement("filtered_title", StringTag.valueOf(text.getFiltered())); + itemStack.addTagElement("title", StringTag.valueOf(text.getRaw())); } - itemstack1.addTagElement("pages", listnbt); - this.player.inventory.setItem(p_244534_3_, CraftEventFactory.handleEditBookEvent(player, p_244534_3_, itemstack, itemstack1)); + this.updateBookPages(list, (p_143659_) -> Component.Serializer.toJson(new TextComponent(p_143659_)), itemStack); + this.player.getInventory().setItem(slot, CraftEventFactory.handleEditBookEvent(this.player, slot, old, itemStack)); } } @@ -501,7 +468,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Overwrite public void handleMovePlayer(ServerboundMovePlayerPacket packetplayinflying) { PacketUtils.ensureRunningOnSameThread(packetplayinflying, (ServerGamePacketListenerImpl) (Object) this, this.player.getLevel()); - if (containsInvalidValues(packetplayinflying)) { + if (containsInvalidValues(packetplayinflying.getX(0.0D), packetplayinflying.getY(0.0D), packetplayinflying.getZ(0.0D), packetplayinflying.getYRot(0.0F), packetplayinflying.getXRot(0.0F))) { this.disconnect(new TranslatableComponent("multiplayer.disconnect.invalid_player_movement")); } else { ServerLevel worldserver = this.player.getLevel(); @@ -512,87 +479,114 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (this.awaitingPositionFromClient != null) { if (this.tickCount - this.awaitingTeleportTime > 20) { this.awaitingTeleportTime = this.tickCount; - this.teleport(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.yRot, this.player.xRot); + this.teleport(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot()); } this.allowedPlayerTicks = 20; } else { this.awaitingTeleportTime = this.tickCount; + double d0 = clampHorizontal(packetplayinflying.getX(this.player.getX())); + double d1 = clampVertical(packetplayinflying.getY(this.player.getY())); + double d2 = clampHorizontal(packetplayinflying.getZ(this.player.getZ())); + float f = Mth.wrapDegrees(packetplayinflying.getYRot(this.player.getYRot())); + float f1 = Mth.wrapDegrees(packetplayinflying.getXRot(this.player.getXRot())); + if (this.player.isPassenger()) { - this.player.absMoveTo(this.player.getX(), this.player.getY(), this.player.getZ(), packetplayinflying.getYRot(this.player.yRot), packetplayinflying.getXRot(this.player.xRot)); + this.player.absMoveTo(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1); this.player.getLevel().getChunkSource().move(this.player); - this.allowedPlayerTicks = 20; + this.allowedPlayerTicks = 20; // CraftBukkit } else { - double prevX = this.player.getX(); - double prevY = this.player.getY(); - double prevZ = this.player.getZ(); - float prevYaw = this.player.yRot; - float prevPitch = this.player.xRot; - double d0 = this.player.getX(); - double d1 = this.player.getY(); - double d2 = this.player.getZ(); - double d3 = this.player.getY(); - double d4 = packetplayinflying.getX(this.player.getX()); - double d5 = packetplayinflying.getY(this.player.getY()); - double d6 = packetplayinflying.getZ(this.player.getZ()); - float f = packetplayinflying.getYRot(this.player.yRot); - float f1 = packetplayinflying.getXRot(this.player.xRot); - double d7 = d4 - this.firstGoodX; - double d8 = d5 - this.firstGoodY; - double d9 = d6 - this.firstGoodZ; + // CraftBukkit - Make sure the move is valid but then reset it for plugins to modify + double prevX = player.getX(); + double prevY = player.getY(); + double prevZ = player.getZ(); + float prevYaw = player.getYRot(); + float prevPitch = player.getXRot(); + // CraftBukkit end + double d3 = this.player.getX(); + double d4 = this.player.getY(); + double d5 = this.player.getZ(); + double d6 = this.player.getY(); + double d7 = d0 - this.firstGoodX; + double d8 = d1 - this.firstGoodY; + double d9 = d2 - this.firstGoodZ; double d10 = this.player.getDeltaMovement().lengthSqr(); double d11 = d7 * d7 + d8 * d8 + d9 * d9; + if (this.player.isSleeping()) { - if (d11 > 1.0) { - this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), packetplayinflying.getYRot(this.player.yRot), packetplayinflying.getXRot(this.player.xRot)); + if (d11 > 1.0D) { + this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), f, f1); } + } else { - boolean flag; ++this.receivedMovePacketCount; int i = this.receivedMovePacketCount - this.knownMovePacketCount; - this.allowedPlayerTicks = (int) ((long) this.allowedPlayerTicks + (System.currentTimeMillis() / 50L - (long) this.lastTick)); + + // CraftBukkit start - handle custom speeds and skipped ticks + this.allowedPlayerTicks += (System.currentTimeMillis() / 50) - this.lastTick; this.allowedPlayerTicks = Math.max(this.allowedPlayerTicks, 1); - this.lastTick = (int) (System.currentTimeMillis() / 50L); + this.lastTick = (int) (System.currentTimeMillis() / 50); + if (i > Math.max(this.allowedPlayerTicks, 5)) { LOGGER.debug("{} is sending move packets too frequently ({} packets since last tick)", this.player.getName().getString(), i); i = 1; } - this.allowedPlayerTicks = packetplayinflying.hasRot || d11 > 0.0 ? --this.allowedPlayerTicks : 20; - double speed = this.player.abilities.flying ? (double) (this.player.abilities.flyingSpeed * 20.0f) : (double) (this.player.abilities.walkingSpeed * 10.0f); - if (!(this.player.isChangingDimension() || this.player.getLevel().getGameRules().getBoolean(GameRules.RULE_DISABLE_ELYTRA_MOVEMENT_CHECK) && this.player.isFallFlying())) { - float f2; - float f3 = f2 = this.player.isFallFlying() ? 300.0f : 100.0f; - if (d11 - d10 > Math.max(f2, Math.pow(SpigotConfig.movedTooQuicklyMultiplier * (double) i * speed, 2.0)) && !this.isSingleplayerOwner()) { + + if (packetplayinflying.hasRot || d11 > 0) { + allowedPlayerTicks -= 1; + } else { + allowedPlayerTicks = 20; + } + double speed; + if (player.getAbilities().flying) { + speed = player.getAbilities().flyingSpeed * 20f; + } else { + speed = player.getAbilities().walkingSpeed * 10f; + } + + if (!this.player.isChangingDimension() && (!this.player.getLevel().getGameRules().getBoolean(GameRules.RULE_DISABLE_ELYTRA_MOVEMENT_CHECK) || !this.player.isFallFlying())) { + float f2 = this.player.isFallFlying() ? 300.0F : 100.0F; + + if (d11 - d10 > Math.max(f2, Math.pow((double) (org.spigotmc.SpigotConfig.movedTooQuicklyMultiplier * (float) i * speed), 2)) && !this.isSingleplayerOwner()) { + // CraftBukkit end LOGGER.warn("{} moved too quickly! {},{},{}", this.player.getName().getString(), d7, d8, d9); - this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.yRot, this.player.xRot); + this.teleport(this.player.getX(), this.player.getY(), this.player.getZ(), this.player.getYRot(), this.player.getXRot()); return; } } + AABB axisalignedbb = this.player.getBoundingBox(); - d7 = d4 - this.lastGoodX; - d8 = d5 - this.lastGoodY; - d9 = d6 - this.lastGoodZ; - boolean bl = flag = d8 > 0.0; + + d7 = d0 - this.lastGoodX; + d8 = d1 - this.lastGoodY; + d9 = d2 - this.lastGoodZ; + boolean flag = d8 > 0.0D; + if (this.player.isOnGround() && !packetplayinflying.isOnGround() && flag) { this.player.jumpFromGround(); } + this.player.move(MoverType.PLAYER, new Vec3(d7, d8, d9)); - this.player.setOnGround(packetplayinflying.isOnGround()); + this.player.setOnGround(packetplayinflying.isOnGround()); // CraftBukkit - SPIGOT-5810, SPIGOT-5835: reset by this.player.move double d12 = d8; - d7 = d4 - this.player.getX(); - d8 = d5 - this.player.getY(); - if (d8 > -0.5 || d8 < 0.5) { - d8 = 0.0; + + d7 = d0 - this.player.getX(); + d8 = d1 - this.player.getY(); + if (d8 > -0.5D || d8 < 0.5D) { + d8 = 0.0D; } - d9 = d6 - this.player.getZ(); + + d9 = d2 - this.player.getZ(); d11 = d7 * d7 + d8 * d8 + d9 * d9; boolean flag1 = false; - if (!this.player.isChangingDimension() && d11 > SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { + + if (!this.player.isChangingDimension() && d11 > org.spigotmc.SpigotConfig.movedWronglyThreshold && !this.player.isSleeping() && !this.player.gameMode.isCreative() && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR) { // Spigot flag1 = true; LOGGER.warn("{} moved wrongly!", this.player.getName().getString()); } - this.player.absMoveTo(d4, d5, d6, f, f1); - if (!this.player.noPhysics && !this.player.isSleeping() && (flag1 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew(worldserver, axisalignedbb))) { - this.teleport(d0, d1, d2, f, f1); + + this.player.absMoveTo(d0, d1, d2, f, f1); + if (!this.player.noPhysics && !this.player.isSleeping() && (flag1 && worldserver.noCollision(this.player, axisalignedbb) || this.isPlayerCollidingWithAnythingNew((LevelReader) worldserver, axisalignedbb))) { + this.teleport(d3, d4, d5, f, f1); } else { this.player.absMoveTo(prevX, prevY, prevZ, prevYaw, prevPitch); CraftPlayer player = this.getPlayer(); @@ -609,7 +603,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } double delta = Math.pow(this.lastPosX - to.getX(), 2.0) + Math.pow(this.lastPosY - to.getY(), 2.0) + Math.pow(this.lastPosZ - to.getZ(), 2.0); float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); - if ((delta > 0.00390625 || deltaAngle > 10.0f) && !((ServerPlayerEntityBridge) this.player).bridge$isMovementBlocked()) { + if ((delta > 1f / 256 || deltaAngle > 10f) && !((ServerPlayerEntityBridge) this.player).bridge$isMovementBlocked()) { this.lastPosX = to.getX(); this.lastPosY = to.getY(); this.lastPosZ = to.getZ(); @@ -618,13 +612,13 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (from.getX() != Double.MAX_VALUE) { Location oldTo = to.clone(); PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); - this.server.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { this.teleport(from); return; } if (!oldTo.equals(event.getTo()) && !event.isCancelled()) { - ((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.PLUGIN); + getPlayer().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.PLUGIN); return; } if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) { @@ -633,14 +627,19 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } } } - this.player.absMoveTo(d4, d5, d6, f, f1); - this.clientIsFloating = d12 >= -0.03125 && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR && !this.minecraftServer.isFlightAllowed() && !this.player.abilities.mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && this.noBlocksAround(this.player) && !this.player.isAutoSpinAttack(); + this.player.absMoveTo(d0, d1, d2, f, f1); // Copied from above + + // MC-135989, SPIGOT-5564: isRiptiding + this.clientIsFloating = d12 >= -0.03125D && this.player.gameMode.getGameModeForPlayer() != GameType.SPECTATOR && !this.server.isFlightAllowed() && !this.player.getAbilities().mayfly && !this.player.hasEffect(MobEffects.LEVITATION) && !this.player.isFallFlying() && this.noBlocksAround((Entity) this.player) && !this.player.isAutoSpinAttack(); + // CraftBukkit end this.player.getLevel().getChunkSource().move(this.player); - this.player.doCheckFallDamage(this.player.getY() - d3, packetplayinflying.isOnGround()); + this.player.doCheckFallDamage(this.player.getY() - d6, packetplayinflying.isOnGround()); + // this.player.setOnGround(packetplayinflying.b()); // CraftBukkit - moved up if (flag) { - this.player.fallDistance = 0.0f; + this.player.fallDistance = 0.0F; } - this.player.checkMovementStatistics(this.player.getX() - d0, this.player.getY() - d1, this.player.getZ() - d2); + + this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); this.lastGoodX = this.player.getX(); this.lastGoodY = this.player.getY(); this.lastGoodZ = this.player.getZ(); @@ -672,7 +671,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB CraftItemStack mainHand = CraftItemStack.asCraftMirror(itemstack); CraftItemStack offHand = CraftItemStack.asCraftMirror(this.player.getItemInHand(InteractionHand.MAIN_HAND)); PlayerSwapHandItemsEvent swapItemsEvent = new PlayerSwapHandItemsEvent(this.getPlayer(), mainHand.clone(), offHand.clone()); - this.server.getPluginManager().callEvent(swapItemsEvent); + this.cserver.getPluginManager().callEvent(swapItemsEvent); if (swapItemsEvent.isCancelled()) { return; } @@ -720,7 +719,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB case START_DESTROY_BLOCK: case ABORT_DESTROY_BLOCK: case STOP_DESTROY_BLOCK: { - this.player.gameMode.handleBlockBreakAction(blockposition, packetplayinblockdig_enumplayerdigtype, packetplayinblockdig.getDirection(), this.minecraftServer.getMaxBuildHeight()); + this.player.gameMode.handleBlockBreakAction(blockposition, packetplayinblockdig_enumplayerdigtype, packetplayinblockdig.getDirection(), this.player.level.getMaxBuildHeight()); return; } default: { @@ -741,7 +740,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Inject(method = "handleUseItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayerGameMode;useItemOn(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/InteractionHand;Lnet/minecraft/world/phys/BlockHitResult;)Lnet/minecraft/world/InteractionResult;")) private void arclight$checkDistance(ServerboundUseItemOnPacket packetIn, CallbackInfo ci) { - this.player.releaseUsingItem(); + this.player.stopUsingItem(); } private int limitedPackets; @@ -779,8 +778,8 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB ItemStack itemstack = this.player.getItemInHand(enumhand); this.player.resetLastActionTime(); if (!itemstack.isEmpty()) { - float f1 = this.player.xRot; - float f2 = this.player.yRot; + float f1 = this.player.getXRot(); + float f2 = this.player.getYRot(); double d0 = this.player.getX(); double d2 = this.player.getY() + this.player.getEyeHeight(); double d3 = this.player.getZ(); @@ -822,10 +821,9 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB ((ServerPlayerEntityBridge) this.player).bridge$pushChangeDimensionCause(PlayerTeleportEvent.TeleportCause.SPECTATE); } - @Inject(method = "handleResourcePackResponse", at = @At("HEAD")) + @Inject(method = "handleResourcePackResponse", at = @At("RETURN")) private void arclight$handleResourcePackStatus(ServerboundResourcePackPacket packetIn, CallbackInfo ci) { - PacketUtils.ensureRunningOnSameThread(packetIn, (ServerGamePacketListenerImpl) (Object) this, this.player.getLevel()); - this.server.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getPlayer(), PlayerResourcePackStatusEvent.Status.values()[packetIn.action.ordinal()])); + this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getPlayer(), PlayerResourcePackStatusEvent.Status.values()[packetIn.action.ordinal()])); } @Inject(method = "onDisconnect", cancellable = true, at = @At("HEAD")) @@ -846,7 +844,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB public void arclight$processQuit(Component reason, CallbackInfo ci) { String quitMessage = ArclightCaptures.getQuitMessage(); if (quitMessage != null && quitMessage.length() > 0) { - ((PlayerListBridge) this.minecraftServer.getPlayerList()).bridge$sendMessage(CraftChatMessage.fromString(quitMessage)); + ((PlayerListBridge) this.server.getPlayerList()).bridge$sendMessage(CraftChatMessage.fromString(quitMessage)); } } @@ -856,8 +854,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB ci.cancel(); return; } - if (packetIn instanceof ClientboundSetDefaultSpawnPositionPacket) { - ClientboundSetDefaultSpawnPositionPacket packet6 = (ClientboundSetDefaultSpawnPositionPacket) packetIn; + if (packetIn instanceof ClientboundSetDefaultSpawnPositionPacket packet6) { ((ServerPlayerEntityBridge) this.player).bridge$setCompassTarget(new Location(this.getPlayer().getWorld(), packet6.pos.getX(), packet6.pos.getY(), packet6.pos.getZ())); } } @@ -873,17 +870,17 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return; } if (packet.getSlot() >= 0 && packet.getSlot() < net.minecraft.world.entity.player.Inventory.getSelectionSize()) { - PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.selected, packet.getSlot()); - this.server.getPluginManager().callEvent(event); + PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.getInventory().selected, packet.getSlot()); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { - this.send(new ClientboundSetCarriedItemPacket(this.player.inventory.selected)); + this.send(new ClientboundSetCarriedItemPacket(this.player.getInventory().selected)); this.player.resetLastActionTime(); return; } - if (this.player.inventory.selected != packet.getSlot() && this.player.getUsedItemHand() == InteractionHand.MAIN_HAND) { + if (this.player.getInventory().selected != packet.getSlot() && this.player.getUsedItemHand() == InteractionHand.MAIN_HAND) { this.player.stopUsingItem(); } - this.player.inventory.selected = packet.getSlot(); + this.player.getInventory().selected = packet.getSlot(); this.player.resetLastActionTime(); } else { LOGGER.warn("{} tried to set an invalid carried item", this.player.getName().getString()); @@ -897,87 +894,79 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB */ @Overwrite public void handleChat(ServerboundChatPacket packet) { - if (this.minecraftServer.isStopped()) { + if (this.server.isStopped()) { return; } - boolean isSync = packet.getMessage().startsWith("/"); - if (packet.getMessage().startsWith("/")) { + String s = StringUtils.normalizeSpace(packet.getMessage()); + for (int i = 0; i < s.length(); ++i) { + if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { + this.disconnect(new TranslatableComponent("multiplayer.disconnect.illegal_characters")); + return; + } + } + if (s.startsWith("/")) { PacketUtils.ensureRunningOnSameThread(packet, (ServerGamePacketListenerImpl) (Object) this, this.player.getLevel()); } - if (this.player.removed || this.player.getChatVisibility() == ChatVisiblity.HIDDEN) { + this.handleChat(TextFilter.FilteredText.passThrough(s)); + } + + private void handleChat(TextFilter.FilteredText text) { + if (this.player.isRemoved() || this.player.getChatVisibility() == ChatVisiblity.HIDDEN) { this.send(new ClientboundChatPacket((new TranslatableComponent("chat.cannotSend")).withStyle(ChatFormatting.RED), ChatType.SYSTEM, Util.NIL_UUID)); } else { this.player.resetLastActionTime(); - String s = org.apache.commons.lang3.StringUtils.normalizeSpace(packet.getMessage()); - for (int i = 0; i < s.length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { - if (!isSync) { - class Disconnect extends Waitable { - - @Override - protected Object evaluate() { - disconnect(new TranslatableComponent("multiplayer.disconnect.illegal_characters")); - return null; - } - } - Waitable waitable = new Disconnect(); - ((MinecraftServerBridge) this.minecraftServer).bridge$queuedProcess(waitable); - try { - waitable.get(); - return; - } catch (InterruptedException e3) { - Thread.currentThread().interrupt(); - return; - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } - this.disconnect(new TranslatableComponent("multiplayer.disconnect.illegal_characters")); - return; - } - } + String s = text.getRaw(); + boolean isSync = s.startsWith("/"); if (isSync) { try { - this.server.playerCommandState = true; + this.cserver.playerCommandState = true; this.handleCommand(s); } finally { - this.server.playerCommandState = false; + this.cserver.playerCommandState = false; } - this.server.playerCommandState = false; } else if (s.isEmpty()) { LOGGER.warn(this.player.getScoreboardName() + " tried to send an empty message"); } else if (this.getPlayer().isConversing()) { String conversationInput = s; - ((MinecraftServerBridge) this.minecraftServer).bridge$queuedProcess(() -> this.getPlayer().acceptConversationInput(conversationInput)); + ((MinecraftServerBridge) this.server).bridge$queuedProcess(() -> this.getPlayer().acceptConversationInput(conversationInput)); } else if (this.player.getChatVisibility() == ChatVisiblity.SYSTEM) { this.send(new ClientboundChatPacket((new TranslatableComponent("chat.cannotSend")).withStyle(ChatFormatting.RED), ChatType.SYSTEM, Util.NIL_UUID)); } else { this.chat(s, true); } - this.chatSpamTickCount += 20; - if (this.chatSpamTickCount > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getGameProfile())) { - if (!isSync) { - class Disconnect2 extends Waitable { + boolean counted = true; + for (String exclude : org.spigotmc.SpigotConfig.spamExclusions) { + if (exclude != null && s.startsWith(exclude)) { + counted = false; + break; + } + } + if (counted) { + this.chatSpamTickCount += 20; + if (this.chatSpamTickCount > 200 && !this.server.getPlayerList().isOp(this.player.getGameProfile())) { + if (!isSync) { + class Disconnect2 extends Waitable { - @Override - protected Object evaluate() { - disconnect(new TranslatableComponent("disconnect.spam")); - return null; + @Override + protected Object evaluate() { + disconnect(new TranslatableComponent("disconnect.spam")); + return null; + } + } + Waitable waitable2 = new Disconnect2(); + ((MinecraftServerBridge) this.server).bridge$queuedProcess(waitable2); + try { + waitable2.get(); + return; + } catch (InterruptedException e4) { + Thread.currentThread().interrupt(); + return; + } catch (ExecutionException e2) { + throw new RuntimeException(e2); } } - Waitable waitable2 = new Disconnect2(); - ((MinecraftServerBridge) this.minecraftServer).bridge$queuedProcess(waitable2); - try { - waitable2.get(); - return; - } catch (InterruptedException e4) { - Thread.currentThread().interrupt(); - return; - } catch (ExecutionException e2) { - throw new RuntimeException(e2); - } + this.disconnect(new TranslatableComponent("disconnect.spam")); } - this.disconnect(new TranslatableComponent("disconnect.spam")); } } } @@ -991,8 +980,8 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.handleCommand(s); } else if (this.player.getChatVisibility() != ChatVisiblity.SYSTEM) { Player thisPlayer = this.getPlayer(); - AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, thisPlayer, s, new LazyPlayerSet(this.minecraftServer)); - this.server.getPluginManager().callEvent(event); + AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, thisPlayer, s, new LazyPlayerSet(this.server)); + this.cserver.getPluginManager().callEvent(event); if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) { PlayerChatEvent queueEvent = new PlayerChatEvent(thisPlayer, event.getMessage(), event.getFormat(), event.getRecipients()); queueEvent.setCancelled(event.isCancelled()); @@ -1009,7 +998,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (component == null) return null; Bukkit.getConsoleSender().sendMessage(CraftChatMessage.fromComponent(component)); if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { - for (ServerPlayer player : minecraftServer.getPlayerList().players) { + for (ServerPlayer player : server.getPlayerList().players) { ((ServerPlayerEntityBridge) player).bridge$sendMessage(component, thisPlayer.getUniqueId()); } } else { @@ -1022,7 +1011,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } Waitable waitable = new SyncChat(); if (async) { - ((MinecraftServerBridge) minecraftServer).bridge$queuedProcess(waitable); + ((MinecraftServerBridge) server).bridge$queuedProcess(waitable); } else { waitable.run(); } @@ -1050,7 +1039,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (component == null) return null; Bukkit.getConsoleSender().sendMessage(CraftChatMessage.fromComponent(component)); if (((LazyPlayerSet) event.getRecipients()).isLazy()) { - for (ServerPlayer recipient : minecraftServer.getPlayerList().players) { + for (ServerPlayer recipient : server.getPlayerList().players) { ((ServerPlayerEntityBridge) recipient).bridge$sendMessage(component, thisPlayer.getUniqueId()); } } else { @@ -1063,7 +1052,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } Waitable waitable = new ForgeChat(); if (async) { - ((MinecraftServerBridge) minecraftServer).bridge$queuedProcess(waitable); + ((MinecraftServerBridge) server).bridge$queuedProcess(waitable); } else { waitable.run(); } @@ -1080,13 +1069,13 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s); } CraftPlayer player = this.getPlayer(); - PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet(this.minecraftServer)); - this.server.getPluginManager().callEvent(event); + PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet(this.server)); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { return; } try { - this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1)); + this.cserver.dispatchCommand(event.getPlayer(), event.getMessage().substring(1)); } catch (CommandRuntimeException ex) { player.sendMessage(ChatColor.RED + "An internal error occurred while attempting to perform this command"); java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(Level.SEVERE, null, ex); @@ -1104,8 +1093,8 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return; } this.player.resetLastActionTime(); - float f1 = this.player.xRot; - float f2 = this.player.yRot; + float f1 = this.player.getXRot(); + float f2 = this.player.getYRot(); double d0 = this.player.getX(); double d2 = this.player.getY() + this.player.getEyeHeight(); double d3 = this.player.getZ(); @@ -1120,10 +1109,10 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB Vec3 vec3d2 = vec3d.add(f7 * d4, f6 * d4, f8 * d4); HitResult result = this.player.level.clip(new ClipContext(vec3d, vec3d2, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, this.player)); if (result == null || result.getType() != HitResult.Type.BLOCK) { - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getSelected(), InteractionHand.MAIN_HAND); + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.getInventory().getSelected(), InteractionHand.MAIN_HAND); } PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer()); - this.server.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { return; } @@ -1132,19 +1121,19 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Inject(method = "handlePlayerCommand", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;resetLastActionTime()V")) private void arclight$toggleAction(ServerboundPlayerCommandPacket packetIn, CallbackInfo ci) { - if (this.player.removed) { + if (this.player.isRemoved()) { ci.cancel(); return; } if (packetIn.getAction() == ServerboundPlayerCommandPacket.Action.PRESS_SHIFT_KEY || packetIn.getAction() == ServerboundPlayerCommandPacket.Action.RELEASE_SHIFT_KEY) { PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetIn.getAction() == ServerboundPlayerCommandPacket.Action.PRESS_SHIFT_KEY); - this.server.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled()) { ci.cancel(); } } else if (packetIn.getAction() == ServerboundPlayerCommandPacket.Action.START_SPRINTING || packetIn.getAction() == ServerboundPlayerCommandPacket.Action.STOP_SPRINTING) { PlayerToggleSprintEvent e2 = new PlayerToggleSprintEvent(this.getPlayer(), packetIn.getAction() == ServerboundPlayerCommandPacket.Action.START_SPRINTING); - this.server.getPluginManager().callEvent(e2); + this.cserver.getPluginManager().callEvent(e2); if (e2.isCancelled()) { ci.cancel(); } @@ -1172,65 +1161,85 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (entity != null) { double d0 = 36.0D; if (this.player.distanceToSqr(entity) < 36.0D) { - InteractionHand hand = packetIn.getHand(); - ItemStack itemstack = hand != null ? this.player.getItemInHand(hand).copy() : ItemStack.EMPTY; - Optional optional = Optional.empty(); + class Handler implements ServerboundInteractPacket.Handler { + + private void performInteraction(InteractionHand hand, ServerGamePacketListenerImpl.EntityInteraction interaction, PlayerInteractEntityEvent event) { // CraftBukkit + ItemStack itemstack = player.getItemInHand(hand).copy(); + // CraftBukkit start + ItemStack itemInHand = player.getItemInHand(hand); + boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEAD && entity instanceof Mob; + Item origItem = player.getInventory().getSelected() == null ? null : player.getInventory().getSelected().getItem(); + + cserver.getPluginManager().callEvent(event); + + // Fish bucket - SPIGOT-4048 + if ((entity instanceof AbstractFish && origItem != null && origItem.asItem() == Items.WATER_BUCKET) && (event.isCancelled() || player.getInventory().getSelected() == null || player.getInventory().getSelected().getItem() != origItem)) { + send(new ClientboundAddMobPacket((AbstractFish) entity)); + player.containerMenu.sendAllDataToRemote(); + } + + if (triggerLeashUpdate && (event.isCancelled() || player.getInventory().getSelected() == null || player.getInventory().getSelected().getItem() != origItem)) { + // Refresh the current leash state + send(new ClientboundSetEntityLinkPacket(entity, ((Mob) entity).getLeashHolder())); + } + + if (event.isCancelled() || player.getInventory().getSelected() == null || player.getInventory().getSelected().getItem() != origItem) { + // Refresh the current entity metadata + send(new ClientboundSetEntityDataPacket(entity.getId(), entity.getEntityData(), true)); + } + + if (event.isCancelled()) { + return; + } + // CraftBukkit end + + InteractionResult enuminteractionresult = interaction.run(player, entity, hand); + + // CraftBukkit start + if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) { + player.containerMenu.sendAllDataToRemote(); + } + // CraftBukkit end + + if (enuminteractionresult.consumesAction()) { + CriteriaTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(player, itemstack, entity); + if (enuminteractionresult.shouldSwing()) { + player.swing(hand, true); + } + } - final ItemStack itemInHand = this.player.getItemInHand((packetIn.getHand() == null) ? InteractionHand.MAIN_HAND : packetIn.getHand()); - if (packetIn.getAction() == ServerboundInteractPacket.Action.INTERACT || packetIn.getAction() == ServerboundInteractPacket.Action.INTERACT_AT) { - final boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEAD && entity instanceof Mob; - final Item origItem = (this.player.inventory.getSelected() == null) ? null : this.player.inventory.getSelected().getItem(); - PlayerInteractEntityEvent event; - if (packetIn.getAction() == ServerboundInteractPacket.Action.INTERACT) { - event = new PlayerInteractEntityEvent(this.getPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(), (packetIn.getHand() == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND); - } else { - final Vec3 target = packetIn.getLocation(); - event = new PlayerInteractAtEntityEvent(this.getPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(), new Vector(target.x, target.y, target.z), (packetIn.getHand() == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND); } - this.server.getPluginManager().callEvent(event); - if (entity instanceof AbstractFish && origItem != null && origItem.asItem() == Items.WATER_BUCKET && (event.isCancelled() || this.player.inventory.getSelected() == null || this.player.inventory.getSelected().getItem() != origItem)) { - this.send(new ClientboundAddMobPacket((LivingEntity) entity)); - this.player.refreshContainer(this.player.containerMenu); + + @Override + public void onInteraction(InteractionHand hand) { + this.performInteraction(hand, net.minecraft.world.entity.player.Player::interactOn, + new PlayerInteractEntityEvent(getPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(), + (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND)); } - if (triggerLeashUpdate && (event.isCancelled() || this.player.inventory.getSelected() == null || this.player.inventory.getSelected().getItem() != origItem)) { - this.send(new ClientboundSetEntityLinkPacket(entity, ((Mob) entity).getLeashHolder())); + + @Override + public void onInteraction(InteractionHand hand, Vec3 vec) { + this.performInteraction(hand, (player, e, h) -> e.interactAt(player, vec, h), + new PlayerInteractAtEntityEvent(getPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(), + new org.bukkit.util.Vector(vec.x, vec.y, vec.z), (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND)); } - if (event.isCancelled() || this.player.inventory.getSelected() == null || this.player.inventory.getSelected().getItem() != origItem) { - this.send(new ClientboundSetEntityDataPacket(entity.getId(), entity.getEntityData(), true)); - } - if (event.isCancelled()) { - return; - } - } - if (packetIn.getAction() == ServerboundInteractPacket.Action.INTERACT) { - optional = Optional.of(this.player.interactOn(entity, hand)); - if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) { - this.player.refreshContainer(this.player.containerMenu); - } - } else if (packetIn.getAction() == ServerboundInteractPacket.Action.INTERACT_AT) { - if (net.minecraftforge.common.ForgeHooks.onInteractEntityAt(player, entity, packetIn.getLocation(), hand) != null) - return; - optional = Optional.of(entity.interactAt(this.player, packetIn.getLocation(), hand)); - if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) { - this.player.refreshContainer(this.player.containerMenu); - } - } else if (packetIn.getAction() == ServerboundInteractPacket.Action.ATTACK) { - if ((entity instanceof ItemEntity && AstralSorceryHooks.notInteractable(entity)) || entity instanceof ExperienceOrb || entity instanceof AbstractArrow || (entity == this.player && !this.player.isSpectator())) { - this.disconnect(new TranslatableComponent("multiplayer.disconnect.invalid_entity_attacked")); - LOGGER.warn("Player {} tried to attack an invalid entity", this.player.getName().getString()); - return; - } - this.player.attack(entity); - if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) { - this.player.refreshContainer(this.player.containerMenu); - } - } - if (optional.isPresent() && optional.get().consumesAction()) { - CriteriaTriggers.PLAYER_INTERACTED_WITH_ENTITY.trigger(this.player, itemstack, entity); - if (optional.get().shouldSwing()) { - this.player.swing(hand, true); + + @Override + public void onAttack() { + if (!(entity instanceof ItemEntity) && !(entity instanceof ExperienceOrb) && !(entity instanceof AbstractArrow) && (entity != player || player.isSpectator())) { + ItemStack itemInHand = player.getMainHandItem(); + player.attack(entity); + + if (!itemInHand.isEmpty() && itemInHand.getCount() <= -1) { + player.containerMenu.sendAllDataToRemote(); + } + } else { + disconnect(new TranslatableComponent("multiplayer.disconnect.invalid_entity_attacked")); + LOGGER.warn("Player {} tried to attack an invalid entity", player.getName().getString()); + } } } + packetIn.dispatch(new Handler()); } } } @@ -1254,315 +1263,304 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB return; } this.player.resetLastActionTime(); - if (this.player.containerMenu.containerId == packet.getContainerId() && this.player.containerMenu.isSynched(this.player) && this.player.containerMenu.stillValid(this.player)) { - boolean cancelled = this.player.isSpectator(); - if (packet.getSlotNum() < -1 && packet.getSlotNum() != -999) { - return; - } - ArclightCaptures.captureContainerOwner(this.player); - InventoryView inventory = ((ContainerBridge) this.player.containerMenu).bridge$getBukkitView(); - ArclightCaptures.resetContainerOwner(); - InventoryType.SlotType type = inventory.getSlotType(packet.getSlotNum()); - org.bukkit.event.inventory.ClickType click = org.bukkit.event.inventory.ClickType.UNKNOWN; - InventoryAction action = InventoryAction.UNKNOWN; - ItemStack itemstack = ItemStack.EMPTY; - switch (packet.getClickType()) { - case PICKUP: { - if (packet.getButtonNum() == 0) { - click = org.bukkit.event.inventory.ClickType.LEFT; - } else if (packet.getButtonNum() == 1) { - click = org.bukkit.event.inventory.ClickType.RIGHT; - } - if (packet.getButtonNum() != 0 && packet.getButtonNum() != 1) { - break; - } - action = InventoryAction.NOTHING; - if (packet.getSlotNum() == -999) { - if (!this.player.inventory.getCarried().isEmpty()) { - action = ((packet.getButtonNum() == 0) ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR); - break; - } - break; - } else { - if (packet.getSlotNum() < 0) { - action = InventoryAction.NOTHING; - break; - } - Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); - if (slot == null) { - break; - } - ItemStack clickedItem = slot.getItem(); - ItemStack cursor = this.player.inventory.getCarried(); - if (clickedItem.isEmpty()) { - if (!cursor.isEmpty()) { - action = ((packet.getButtonNum() == 0) ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE); - break; - } - break; - } else { - if (!slot.mayPickup(this.player)) { - break; - } - if (cursor.isEmpty()) { - action = ((packet.getButtonNum() == 0) ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF); - break; - } - if (slot.mayPlace(cursor)) { - if (clickedItem.sameItem(cursor) && ItemStack.tagMatches(clickedItem, cursor)) { - int toPlace = (packet.getButtonNum() == 0) ? cursor.getCount() : 1; - toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount()); - toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount()); - if (toPlace == 1) { - action = InventoryAction.PLACE_ONE; - break; - } - if (toPlace == cursor.getCount()) { - action = InventoryAction.PLACE_ALL; - break; - } - if (toPlace < 0) { - action = ((toPlace != -1) ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE); - break; - } - if (toPlace != 0) { - action = InventoryAction.PLACE_SOME; - break; - } - break; - } else { - if (cursor.getCount() <= slot.getMaxStackSize()) { - action = InventoryAction.SWAP_WITH_CURSOR; - break; - } - break; - } - } else { - if (cursor.getItem() == clickedItem.getItem() && ItemStack.tagMatches(cursor, clickedItem) && clickedItem.getCount() >= 0 && clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) { - action = InventoryAction.PICKUP_ALL; - break; - } - break; - } - } - } - } - case QUICK_MOVE: { - if (packet.getButtonNum() == 0) { - click = org.bukkit.event.inventory.ClickType.SHIFT_LEFT; - } else if (packet.getButtonNum() == 1) { - click = org.bukkit.event.inventory.ClickType.SHIFT_RIGHT; - } - if (packet.getButtonNum() != 0 && packet.getButtonNum() != 1) { - break; - } - if (packet.getSlotNum() < 0) { - action = InventoryAction.NOTHING; - break; - } - Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); - if (slot != null && slot.mayPickup(this.player) && slot.hasItem()) { - action = InventoryAction.MOVE_TO_OTHER_INVENTORY; - break; - } - action = InventoryAction.NOTHING; - break; - } - case SWAP: { - if ((packet.getButtonNum() < 0 || packet.getButtonNum() >= 9) && packet.getButtonNum() != 40) { - break; - } - click = packet.getButtonNum() == 40 ? ClickType.SWAP_OFFHAND : ClickType.NUMBER_KEY; - Slot clickedSlot = this.player.containerMenu.getSlot(packet.getSlotNum()); - if (!clickedSlot.mayPickup(this.player)) { - action = InventoryAction.NOTHING; - break; - } - ItemStack hotbar = this.player.inventory.getItem(packet.getButtonNum()); - boolean canCleanSwap = hotbar.isEmpty() || (clickedSlot.container == this.player.inventory && clickedSlot.mayPlace(hotbar)); - if (clickedSlot.hasItem()) { - if (canCleanSwap) { - action = InventoryAction.HOTBAR_SWAP; - break; - } - action = InventoryAction.HOTBAR_MOVE_AND_READD; - break; - } else { - if (!clickedSlot.hasItem() && !hotbar.isEmpty() && clickedSlot.mayPlace(hotbar)) { - action = InventoryAction.HOTBAR_SWAP; - break; - } - action = InventoryAction.NOTHING; - break; - } - } - case CLONE: { - if (packet.getButtonNum() != 2) { - click = org.bukkit.event.inventory.ClickType.UNKNOWN; - action = InventoryAction.UNKNOWN; - break; - } - click = org.bukkit.event.inventory.ClickType.MIDDLE; - if (packet.getSlotNum() < 0) { - action = InventoryAction.NOTHING; - break; - } - Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); - if (slot != null && slot.hasItem() && this.player.abilities.instabuild && this.player.inventory.getCarried().isEmpty()) { - action = InventoryAction.CLONE_STACK; - break; - } - action = InventoryAction.NOTHING; - break; - } - case THROW: { - if (packet.getSlotNum() < 0) { - click = org.bukkit.event.inventory.ClickType.LEFT; - if (packet.getButtonNum() == 1) { - click = org.bukkit.event.inventory.ClickType.RIGHT; - } - action = InventoryAction.NOTHING; - break; - } - if (packet.getButtonNum() == 0) { - click = org.bukkit.event.inventory.ClickType.DROP; - Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); - if (slot != null && slot.hasItem() && slot.mayPickup(this.player) && !slot.getItem().isEmpty() && slot.getItem().getItem() != Item.byBlock(Blocks.AIR)) { - action = InventoryAction.DROP_ONE_SLOT; - break; - } - action = InventoryAction.NOTHING; - break; - } else { - if (packet.getButtonNum() != 1) { - break; - } - click = org.bukkit.event.inventory.ClickType.CONTROL_DROP; - Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); - if (slot != null && slot.hasItem() && slot.mayPickup(this.player) && !slot.getItem().isEmpty() && slot.getItem().getItem() != Item.byBlock(Blocks.AIR)) { - action = InventoryAction.DROP_ALL_SLOT; - break; - } - action = InventoryAction.NOTHING; - break; - } - } - case QUICK_CRAFT: { - itemstack = this.player.containerMenu.clicked(packet.getSlotNum(), packet.getButtonNum(), packet.getClickType(), this.player); - break; - } - case PICKUP_ALL: { - click = org.bukkit.event.inventory.ClickType.DOUBLE_CLICK; - action = InventoryAction.NOTHING; - if (packet.getSlotNum() < 0 || this.player.inventory.getCarried().isEmpty()) { - break; - } - ItemStack cursor2 = this.player.inventory.getCarried(); - action = InventoryAction.NOTHING; - if (inventory.getTopInventory().contains(CraftMagicNumbers.getMaterial(cursor2.getItem())) || inventory.getBottomInventory().contains(CraftMagicNumbers.getMaterial(cursor2.getItem()))) { - action = InventoryAction.COLLECT_TO_CURSOR; - break; - } - break; - } - } - if (packet.getClickType() != net.minecraft.world.inventory.ClickType.QUICK_CRAFT) { - InventoryClickEvent event; - if (click == org.bukkit.event.inventory.ClickType.NUMBER_KEY) { - event = new InventoryClickEvent(inventory, type, packet.getSlotNum(), click, action, packet.getButtonNum()); - } else { - event = new InventoryClickEvent(inventory, type, packet.getSlotNum(), click, action); - } - Inventory top = inventory.getTopInventory(); - if (packet.getSlotNum() == 0 && top instanceof org.bukkit.inventory.CraftingInventory) { - Recipe recipe = ((org.bukkit.inventory.CraftingInventory) top).getRecipe(); - if (recipe != null) { - if (click == org.bukkit.event.inventory.ClickType.NUMBER_KEY) { - event = new CraftItemEvent(recipe, inventory, type, packet.getSlotNum(), click, action, packet.getButtonNum()); - } else { - event = new CraftItemEvent(recipe, inventory, type, packet.getSlotNum(), click, action); - } - } - } - if (packet.getSlotNum() == 2 && top instanceof SmithingInventory) { - org.bukkit.inventory.ItemStack result = ((SmithingInventory) top).getResult(); - if (result != null) { - if (click == ClickType.NUMBER_KEY) { - event = new SmithItemEvent(inventory, type, packet.getSlotNum(), click, action, packet.getButtonNum()); - } else { - event = new SmithItemEvent(inventory, type, packet.getSlotNum(), click, action); - } - } - } - event.setCancelled(cancelled); - AbstractContainerMenu oldContainer = this.player.containerMenu; - this.server.getPluginManager().callEvent(event); - if (this.player.containerMenu != oldContainer) { + if (this.player.containerMenu.containerId == packet.getContainerId() && this.player.containerMenu.stillValid(this.player)) { // CraftBukkit + boolean cancelled = this.player.isSpectator(); // CraftBukkit - see below if + if (false/*this.player.isSpectator()*/) { // CraftBukkit + this.player.containerMenu.sendAllDataToRemote(); + } else { + boolean flag = packet.getStateId() != this.player.containerMenu.getStateId(); + + this.player.containerMenu.suppressRemoteUpdates(); + // CraftBukkit start - Call InventoryClickEvent + if (packet.getSlotNum() < -1 && packet.getSlotNum() != -999) { return; } - switch (event.getResult()) { - case DEFAULT: - case ALLOW: { - itemstack = this.player.containerMenu.clicked(packet.getSlotNum(), packet.getButtonNum(), packet.getClickType(), this.player); - break; - } - case DENY: { - switch (action) { - case PICKUP_ALL: - case MOVE_TO_OTHER_INVENTORY: - case HOTBAR_MOVE_AND_READD: - case HOTBAR_SWAP: - case COLLECT_TO_CURSOR: - case UNKNOWN: { - this.player.refreshContainer(this.player.containerMenu); - break; - } - case PICKUP_SOME: - case PICKUP_HALF: - case PICKUP_ONE: - case PLACE_ALL: - case PLACE_SOME: - case PLACE_ONE: - case SWAP_WITH_CURSOR: { - this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, this.player.inventory.getCarried())); - this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.containerMenu.containerId, packet.getSlotNum(), this.player.containerMenu.getSlot(packet.getSlotNum()).getItem())); - break; - } - case DROP_ALL_SLOT: - case DROP_ONE_SLOT: { - this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.containerMenu.containerId, packet.getSlotNum(), this.player.containerMenu.getSlot(packet.getSlotNum()).getItem())); - break; - } - case DROP_ALL_CURSOR: - case DROP_ONE_CURSOR: - case CLONE_STACK: { - this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, this.player.inventory.getCarried())); - break; + + InventoryView inventory = ((ContainerBridge) this.player.containerMenu).bridge$getBukkitView(); + InventoryType.SlotType type = inventory.getSlotType(packet.getSlotNum()); + + InventoryClickEvent event; + ClickType click = ClickType.UNKNOWN; + InventoryAction action = InventoryAction.UNKNOWN; + + ItemStack itemstack = ItemStack.EMPTY; + + switch (packet.getClickType()) { + case PICKUP: + if (packet.getButtonNum() == 0) { + click = ClickType.LEFT; + } else if (packet.getButtonNum() == 1) { + click = ClickType.RIGHT; + } + if (packet.getButtonNum() == 0 || packet.getButtonNum() == 1) { + action = InventoryAction.NOTHING; // Don't want to repeat ourselves + if (packet.getSlotNum() == -999) { + if (!player.containerMenu.getCarried().isEmpty()) { + action = packet.getButtonNum() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR; + } + } else if (packet.getSlotNum() < 0) { + action = InventoryAction.NOTHING; + } else { + Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); + if (slot != null) { + ItemStack clickedItem = slot.getItem(); + ItemStack cursor = player.containerMenu.getCarried(); + if (clickedItem.isEmpty()) { + if (!cursor.isEmpty()) { + action = packet.getButtonNum() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE; + } + } else if (slot.mayPickup(player)) { + if (cursor.isEmpty()) { + action = packet.getButtonNum() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; + } else if (slot.mayPlace(cursor)) { + if (clickedItem.sameItem(cursor) && ItemStack.tagMatches(clickedItem, cursor)) { + int toPlace = packet.getButtonNum() == 0 ? cursor.getCount() : 1; + toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.getCount()); + toPlace = Math.min(toPlace, slot.container.getMaxStackSize() - clickedItem.getCount()); + if (toPlace == 1) { + action = InventoryAction.PLACE_ONE; + } else if (toPlace == cursor.getCount()) { + action = InventoryAction.PLACE_ALL; + } else if (toPlace < 0) { + action = toPlace != -1 ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE; // this happens with oversized stacks + } else if (toPlace != 0) { + action = InventoryAction.PLACE_SOME; + } + } else if (cursor.getCount() <= slot.getMaxStackSize()) { + action = InventoryAction.SWAP_WITH_CURSOR; + } + } else if (cursor.getItem() == clickedItem.getItem() && ItemStack.tagMatches(cursor, clickedItem)) { + if (clickedItem.getCount() >= 0) { + if (clickedItem.getCount() + cursor.getCount() <= cursor.getMaxStackSize()) { + // As of 1.5, this is result slots only + action = InventoryAction.PICKUP_ALL; + } + } + } + } + } } } + break; + // TODO check on updates + case QUICK_MOVE: + if (packet.getButtonNum() == 0) { + click = ClickType.SHIFT_LEFT; + } else if (packet.getButtonNum() == 1) { + click = ClickType.SHIFT_RIGHT; + } + if (packet.getButtonNum() == 0 || packet.getButtonNum() == 1) { + if (packet.getSlotNum() < 0) { + action = InventoryAction.NOTHING; + } else { + Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); + if (slot != null && slot.mayPickup(this.player) && slot.hasItem()) { + action = InventoryAction.MOVE_TO_OTHER_INVENTORY; + } else { + action = InventoryAction.NOTHING; + } + } + } + break; + case SWAP: + if ((packet.getButtonNum() >= 0 && packet.getButtonNum() < 9) || packet.getButtonNum() == 40) { + click = (packet.getButtonNum() == 40) ? ClickType.SWAP_OFFHAND : ClickType.NUMBER_KEY; + Slot clickedSlot = this.player.containerMenu.getSlot(packet.getSlotNum()); + if (clickedSlot.mayPickup(player)) { + ItemStack hotbar = this.player.getInventory().getItem(packet.getButtonNum()); + boolean canCleanSwap = hotbar.isEmpty() || (clickedSlot.container == player.getInventory() && clickedSlot.mayPlace(hotbar)); // the slot will accept the hotbar item + if (clickedSlot.hasItem()) { + if (canCleanSwap) { + action = InventoryAction.HOTBAR_SWAP; + } else { + action = InventoryAction.HOTBAR_MOVE_AND_READD; + } + } else if (!clickedSlot.hasItem() && !hotbar.isEmpty() && clickedSlot.mayPlace(hotbar)) { + action = InventoryAction.HOTBAR_SWAP; + } else { + action = InventoryAction.NOTHING; + } + } else { + action = InventoryAction.NOTHING; + } + } + break; + case CLONE: + if (packet.getButtonNum() == 2) { + click = ClickType.MIDDLE; + if (packet.getSlotNum() < 0) { + action = InventoryAction.NOTHING; + } else { + Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); + if (slot != null && slot.hasItem() && player.getAbilities().instabuild && player.containerMenu.getCarried().isEmpty()) { + action = InventoryAction.CLONE_STACK; + } else { + action = InventoryAction.NOTHING; + } + } + } else { + click = ClickType.UNKNOWN; + action = InventoryAction.UNKNOWN; + } + break; + case THROW: + if (packet.getSlotNum() >= 0) { + if (packet.getButtonNum() == 0) { + click = ClickType.DROP; + Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); + if (slot != null && slot.hasItem() && slot.mayPickup(player) && !slot.getItem().isEmpty() && slot.getItem().getItem() != Item.byBlock(Blocks.AIR)) { + action = InventoryAction.DROP_ONE_SLOT; + } else { + action = InventoryAction.NOTHING; + } + } else if (packet.getButtonNum() == 1) { + click = ClickType.CONTROL_DROP; + Slot slot = this.player.containerMenu.getSlot(packet.getSlotNum()); + if (slot != null && slot.hasItem() && slot.mayPickup(player) && !slot.getItem().isEmpty() && slot.getItem().getItem() != Item.byBlock(Blocks.AIR)) { + action = InventoryAction.DROP_ALL_SLOT; + } else { + action = InventoryAction.NOTHING; + } + } + } else { + // Sane default (because this happens when they are holding nothing. Don't ask why.) + click = ClickType.LEFT; + if (packet.getButtonNum() == 1) { + click = ClickType.RIGHT; + } + action = InventoryAction.NOTHING; + } + break; + case QUICK_CRAFT: + this.player.containerMenu.clicked(packet.getSlotNum(), packet.getButtonNum(), packet.getClickType(), this.player); + break; + case PICKUP_ALL: + click = ClickType.DOUBLE_CLICK; + action = InventoryAction.NOTHING; + if (packet.getSlotNum() >= 0 && !this.player.containerMenu.getCarried().isEmpty()) { + ItemStack cursor = this.player.containerMenu.getCarried(); + action = InventoryAction.NOTHING; + // Quick check for if we have any of the item + if (inventory.getTopInventory().contains(CraftMagicNumbers.getMaterial(cursor.getItem())) || inventory.getBottomInventory().contains(CraftMagicNumbers.getMaterial(cursor.getItem()))) { + action = InventoryAction.COLLECT_TO_CURSOR; + } + } + break; + default: + break; + } + + if (packet.getClickType() != net.minecraft.world.inventory.ClickType.QUICK_CRAFT) { + if (click == ClickType.NUMBER_KEY) { + event = new InventoryClickEvent(inventory, type, packet.getSlotNum(), click, action, packet.getButtonNum()); + } else { + event = new InventoryClickEvent(inventory, type, packet.getSlotNum(), click, action); + } + + org.bukkit.inventory.Inventory top = inventory.getTopInventory(); + if (packet.getSlotNum() == 0 && top instanceof CraftingInventory) { + org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); + if (recipe != null) { + if (click == ClickType.NUMBER_KEY) { + event = new CraftItemEvent(recipe, inventory, type, packet.getSlotNum(), click, action, packet.getButtonNum()); + } else { + event = new CraftItemEvent(recipe, inventory, type, packet.getSlotNum(), click, action); + } + } + } + + if (packet.getSlotNum() == 2 && top instanceof SmithingInventory) { + org.bukkit.inventory.ItemStack result = ((SmithingInventory) top).getResult(); + if (result != null) { + if (click == ClickType.NUMBER_KEY) { + event = new SmithItemEvent(inventory, type, packet.getSlotNum(), click, action, packet.getButtonNum()); + } else { + event = new SmithItemEvent(inventory, type, packet.getSlotNum(), click, action); + } + } + } + + event.setCancelled(cancelled); + AbstractContainerMenu oldContainer = this.player.containerMenu; // SPIGOT-1224 + cserver.getPluginManager().callEvent(event); + if (this.player.containerMenu != oldContainer) { return; } + + switch (event.getResult()) { + case ALLOW: + case DEFAULT: + this.player.containerMenu.clicked(packet.getSlotNum(), packet.getButtonNum(), packet.getClickType(), this.player); + break; + case DENY: + /* Needs enum constructor in InventoryAction + if (action.modifiesOtherSlots()) { + + } else { + if (action.modifiesCursor()) { + this.player.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.player.inventory.getCarried())); + } + if (action.modifiesClicked()) { + this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, packet102windowclick.slot, this.player.activeContainer.getSlot(packet102windowclick.slot).getItem())); + } + }*/ + switch (action) { + // Modified other slots + case PICKUP_ALL: + case MOVE_TO_OTHER_INVENTORY: + case HOTBAR_MOVE_AND_READD: + case HOTBAR_SWAP: + case COLLECT_TO_CURSOR: + case UNKNOWN: + this.player.containerMenu.sendAllDataToRemote(); + break; + // Modified cursor and clicked + case PICKUP_SOME: + case PICKUP_HALF: + case PICKUP_ONE: + case PLACE_ALL: + case PLACE_SOME: + case PLACE_ONE: + case SWAP_WITH_CURSOR: + this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, this.player.inventoryMenu.incrementStateId(), this.player.containerMenu.getCarried())); + this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.containerMenu.containerId, this.player.inventoryMenu.incrementStateId(), packet.getSlotNum(), this.player.containerMenu.getSlot(packet.getSlotNum()).getItem())); + break; + // Modified clicked only + case DROP_ALL_SLOT: + case DROP_ONE_SLOT: + this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.containerMenu.containerId, this.player.inventoryMenu.incrementStateId(), packet.getSlotNum(), this.player.containerMenu.getSlot(packet.getSlotNum()).getItem())); + break; + // Modified cursor only + case DROP_ALL_CURSOR: + case DROP_ONE_CURSOR: + case CLONE_STACK: + this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, this.player.inventoryMenu.incrementStateId(), this.player.containerMenu.getCarried())); + break; + // Nothing + case NOTHING: + break; + } + } + + if (event instanceof CraftItemEvent || event instanceof SmithItemEvent) { + // Need to update the inventory on crafting to + // correctly support custom recipes + player.containerMenu.sendAllDataToRemote(); + } } - if (event instanceof CraftItemEvent || event instanceof SmithItemEvent) { - this.player.refreshContainer(this.player.containerMenu); + // CraftBukkit end + + for (var entry : Int2ObjectMaps.fastIterable(packet.getChangedSlots())) { + this.player.containerMenu.setRemoteSlotNoCopy(entry.getIntKey(), entry.getValue()); } - } - if (ItemStack.matches(packet.getItem(), itemstack)) { - this.player.connection.send(new ClientboundContainerAckPacket(packet.getContainerId(), packet.getUid(), true)); - this.player.ignoreSlotUpdateHack = true; - this.player.containerMenu.broadcastChanges(); - this.player.broadcastCarriedItem(); - this.player.ignoreSlotUpdateHack = false; - } else { - this.expectedAcks.put(this.player.containerMenu.containerId, packet.getUid()); - this.player.connection.send(new ClientboundContainerAckPacket(packet.getContainerId(), packet.getUid(), false)); - this.player.containerMenu.setSynched(this.player, false); - NonNullList nonnulllist1 = NonNullList.create(); - for (int j = 0; j < this.player.containerMenu.slots.size(); ++j) { - ItemStack itemstack2 = this.player.containerMenu.slots.get(j).getItem(); - nonnulllist1.add(itemstack2.isEmpty() ? ItemStack.EMPTY : itemstack2); + + this.player.containerMenu.setRemoteCarried(packet.getCarriedItem()); + this.player.containerMenu.resumeRemoteUpdates(); + if (flag) { + this.player.containerMenu.broadcastFullState(); + } else { + this.player.containerMenu.broadcastChanges(); } - this.player.refreshContainer(this.player.containerMenu, nonnulllist1); } } } @@ -1612,28 +1610,26 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } } final InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.getSlotNum(), item); - this.server.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event); itemstack = CraftItemStack.asNMSCopy(event.getCursor()); switch (event.getResult()) { case ALLOW: { flag3 = true; + break; } + case DEFAULT: + break; case DENY: { if (packetplayinsetcreativeslot.getSlotNum() >= 0) { - this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.inventoryMenu.containerId, packetplayinsetcreativeslot.getSlotNum(), this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).getItem())); - this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, -1, ItemStack.EMPTY)); + this.player.connection.send(new ClientboundContainerSetSlotPacket(this.player.inventoryMenu.containerId, this.player.inventoryMenu.incrementStateId(), packetplayinsetcreativeslot.getSlotNum(), this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).getItem())); + this.player.connection.send(new ClientboundContainerSetSlotPacket(-1, this.player.inventoryMenu.incrementStateId(), -1, ItemStack.EMPTY)); } return; } } } if (flag2 && flag3) { - if (itemstack.isEmpty()) { - this.player.inventoryMenu.setItem(packetplayinsetcreativeslot.getSlotNum(), ItemStack.EMPTY); - } else { - this.player.inventoryMenu.setItem(packetplayinsetcreativeslot.getSlotNum(), itemstack); - } - this.player.inventoryMenu.setSynched(this.player, true); + this.player.inventoryMenu.getSlot(packetplayinsetcreativeslot.getSlotNum()).set(itemstack); this.player.inventoryMenu.broadcastChanges(); } else if (flag && flag3 && this.dropSpamTickCount < 200) { this.dropSpamTickCount += 20; @@ -1642,13 +1638,6 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } } - @Inject(method = "handleContainerAck", cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/network/protocol/PacketUtils;ensureRunningOnSameThread(Lnet/minecraft/network/protocol/Packet;Lnet/minecraft/network/PacketListener;Lnet/minecraft/server/level/ServerLevel;)V")) - private void arclight$noTransaction(ServerboundContainerAckPacket packetIn, CallbackInfo ci) { - if (((ServerPlayerEntityBridge) player).bridge$isMovementBlocked()) { - ci.cancel(); - } - } - @Inject(method = "updateSignText", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;resetLastActionTime()V")) private void arclight$noSignEdit(ServerboundSignUpdatePacket p_244542_1_, List p_244542_2_, CallbackInfo ci) { if (((ServerPlayerEntityBridge) player).bridge$isMovementBlocked()) { @@ -1661,7 +1650,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Inject(method = "updateSignText", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/SignBlockEntity;isEditable()Z")) public void arclight$onSignChangePre(ServerboundSignUpdatePacket p_244542_1_, List p_244542_2_, CallbackInfo ci) { String[] lines = p_244542_2_.toArray(new String[0]); - Player player = ((CraftServer) Bukkit.getServer()).getPlayer(this.player); + Player player = getPlayer(); CraftBlock block = CraftBlock.at(this.player.level, p_244542_1_.getPos()); String[] bukkitLines = new String[lines.length]; for (int i = 0; i < lines.length; i++) { @@ -1705,11 +1694,11 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB @Overwrite public void handlePlayerAbilities(ServerboundPlayerAbilitiesPacket packet) { PacketUtils.ensureRunningOnSameThread(packet, (ServerGamePacketListenerImpl) (Object) this, this.player.getLevel()); - if (this.player.abilities.mayfly && this.player.abilities.flying != packet.isFlying()) { - PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packet.isFlying()); - this.server.getPluginManager().callEvent(event); + if (this.player.getAbilities().mayfly && this.player.getAbilities().flying != packet.isFlying()) { + PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(getPlayer(), packet.isFlying()); + this.cserver.getPluginManager().callEvent(event); if (!event.isCancelled()) { - this.player.abilities.flying = packet.isFlying(); + this.player.getAbilities().flying = packet.isFlying(); } else { this.player.onUpdateAbilities(); } @@ -1719,7 +1708,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB private static final ResourceLocation CUSTOM_REGISTER = new ResourceLocation("register"); private static final ResourceLocation CUSTOM_UNREGISTER = new ResourceLocation("unregister"); - @Inject(method = "handleCustomPayload", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/fml/network/NetworkHooks;onCustomPayload(Lnet/minecraftforge/fml/network/ICustomPacket;Lnet/minecraft/network/Connection;)Z")) + @Inject(method = "handleCustomPayload", cancellable = true, at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/fmllegacy/network/NetworkHooks;onCustomPayload(Lnet/minecraftforge/fmllegacy/network/ICustomPacket;Lnet/minecraft/network/Connection;)Z")) private void arclight$customPayload(ServerboundCustomPayloadPacket packet, CallbackInfo ci) { if (packet.identifier.equals(CUSTOM_REGISTER)) { try { @@ -1752,7 +1741,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB int readerIndex = packet.data.readerIndex(); final byte[] data = new byte[packet.data.readableBytes()]; packet.data.readBytes(data); - this.server.getMessenger().dispatchIncomingMessage(((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity(), packet.identifier.toString(), data); + this.cserver.getMessenger().dispatchIncomingMessage(((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity(), packet.identifier.toString(), data); packet.data.readerIndex(readerIndex); } catch (Exception ex) { LOGGER.error("Couldn't dispatch custom payload", ex); @@ -1784,7 +1773,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB Location to = new Location(this.getPlayer().getWorld(), x, y, z, yaw, pitch); if (!from.equals(to)) { PlayerTeleportEvent event = new PlayerTeleportEvent(player, from.clone(), to.clone(), cause); - this.server.getPluginManager().callEvent(event); + this.cserver.getPluginManager().callEvent(event); if (event.isCancelled() || !to.equals(event.getTo())) { relativeSet.clear(); to = (event.isCancelled() ? event.getFrom() : event.getTo()); @@ -1802,7 +1791,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB if (Float.isNaN(pitch)) { pitch = 0.0f; } - this.internalTeleport(x, y, z, yaw, pitch, relativeSet); + this.internalTeleport(x, y, z, yaw, pitch, relativeSet, false); } public void a(double d0, double d1, double d2, float f, float f1, PlayerTeleportEvent.TeleportCause cause) { @@ -1814,7 +1803,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.teleport(d0, d1, d2, f, f1, set); } - private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set set) { + private void internalTeleport(double d0, double d1, double d2, float f, float f1, Set set, boolean flag) { if (Float.isNaN(f)) { f = 0.0f; } @@ -1825,8 +1814,8 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB double d3 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.X) ? this.player.getX() : 0.0; double d4 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.Y) ? this.player.getY() : 0.0; double d5 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.Z) ? this.player.getZ() : 0.0; - float f2 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.Y_ROT) ? this.player.yRot : 0.0f; - float f3 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.X_ROT) ? this.player.xRot : 0.0f; + float f2 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.Y_ROT) ? this.player.getYRot() : 0.0f; + float f3 = set.contains(ClientboundPlayerPositionPacket.RelativeArgument.X_ROT) ? this.player.getXRot() : 0.0f; this.awaitingPositionFromClient = new Vec3(d0, d1, d2); if (++this.awaitingTeleport == Integer.MAX_VALUE) { this.awaitingTeleport = 0; @@ -1838,11 +1827,11 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB this.lastPitch = f1; this.awaitingTeleportTime = this.tickCount; this.player.absMoveTo(d0, d1, d2, f, f1); - this.player.connection.send(new ClientboundPlayerPositionPacket(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.awaitingTeleport)); + this.player.connection.send(new ClientboundPlayerPositionPacket(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.awaitingTeleport, flag)); } public void teleport(Location dest) { - this.internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet()); + this.internalTeleport(dest.getX(), dest.getY(), dest.getZ(), dest.getYaw(), dest.getPitch(), Collections.emptySet(), true); } private transient PlayerTeleportEvent.TeleportCause arclight$cause; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/status/ServerStatusNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerStatusNetHandlerMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/status/ServerStatusNetHandlerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerStatusNetHandlerMixin.java index 077a5e84..f983eb3d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/status/ServerStatusNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerStatusNetHandlerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.status; +package io.izzel.arclight.common.mixin.core.network; import com.mojang.authlib.GameProfile; import io.izzel.arclight.common.mod.util.ArclightPingEvent; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/datasync/EntityDataManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/SynchedEntityDataMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/datasync/EntityDataManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/SynchedEntityDataMixin.java index 6b0b8d35..62974bc7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/datasync/EntityDataManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/SynchedEntityDataMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.datasync; +package io.izzel.arclight.common.mixin.core.network; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.network.datasync.EntityDataManagerBridge; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(SynchedEntityData.class) -public abstract class EntityDataManagerMixin implements EntityDataManagerBridge { +public abstract class SynchedEntityDataMixin implements EntityDataManagerBridge { // @formatter:off @Shadow protected abstract SynchedEntityData.DataItem getItem(EntityDataAccessor key); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java deleted file mode 100644 index f9033b89..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/handshake/client/CHandshakePacketMixin.java +++ /dev/null @@ -1,51 +0,0 @@ -package io.izzel.arclight.common.mixin.core.network.handshake.client; - -import com.google.gson.Gson; -import com.mojang.authlib.properties.Property; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.protocol.handshake.ClientIntentionPacket; -import net.minecraftforge.fml.network.FMLNetworkConstants; -import net.minecraftforge.fml.network.NetworkHooks; -import org.spigotmc.SpigotConfig; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Objects; - -@Mixin(ClientIntentionPacket.class) -public class CHandshakePacketMixin { - - // @formatter:off - @Shadow(remap = false) private String fmlVersion; - @Shadow public String hostName; - // @formatter:on - - private static final String EXTRA_DATA = "extraData"; - private static final Gson GSON = new Gson(); - - @Redirect(method = "read", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/FriendlyByteBuf;readUtf(I)Ljava/lang/String;")) - private String arclight$bungeeHostname(FriendlyByteBuf packetBuffer, int maxLength) { - return packetBuffer.readUtf(Short.MAX_VALUE); - } - - @Inject(method = "read", cancellable = true, at = @At(value = "FIELD", shift = At.Shift.AFTER, remap = false, target = "Lnet/minecraft/network/protocol/handshake/ClientIntentionPacket;fmlVersion:Ljava/lang/String;")) - private void arclight$readFromProfile(FriendlyByteBuf buf, CallbackInfo ci) { - if (SpigotConfig.bungee && !Objects.equals(this.fmlVersion, FMLNetworkConstants.NETVERSION)) { - String[] split = this.hostName.split("\0"); - if (split.length == 4) { - Property[] properties = GSON.fromJson(split[3], Property[].class); - for (Property property : properties) { - if (Objects.equals(property.getName(), EXTRA_DATA)) { - String extraData = property.getValue().replace("\1", "\0"); - this.fmlVersion = NetworkHooks.getFMLVersion(split[0] + extraData); - } - } - } - } - ci.cancel(); - } -} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/PacketThreadUtilMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/PacketThreadUtilMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/PacketThreadUtilMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/PacketThreadUtilMixin.java index 96854234..7936a889 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/PacketThreadUtilMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/PacketThreadUtilMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network; +package io.izzel.arclight.common.mixin.core.network.protocol; import io.izzel.arclight.common.bridge.network.play.ServerPlayNetHandlerBridge; import io.izzel.arclight.common.bridge.server.MinecraftServerBridge; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CChatMessagePacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CChatMessagePacketMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CChatMessagePacketMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CChatMessagePacketMixin.java index 641e03ac..916442f8 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CChatMessagePacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CChatMessagePacketMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.play.client; +package io.izzel.arclight.common.mixin.core.network.protocol.game; import com.google.common.util.concurrent.ThreadFactoryBuilder; import org.spongepowered.asm.mixin.Mixin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CCloseWindowPacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CCloseWindowPacketMixin.java similarity index 87% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CCloseWindowPacketMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CCloseWindowPacketMixin.java index 1a2ab7fa..fa60383b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CCloseWindowPacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CCloseWindowPacketMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.play.client; +package io.izzel.arclight.common.mixin.core.network.protocol.game; import net.minecraft.network.protocol.game.ServerboundContainerClosePacket; import org.spongepowered.asm.mixin.Mixin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CPlayerTryUseItemOnBlockPacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemOnBlockPacketMixin.java similarity index 82% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CPlayerTryUseItemOnBlockPacketMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemOnBlockPacketMixin.java index 457fa0d7..abf2db25 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CPlayerTryUseItemOnBlockPacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemOnBlockPacketMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.play.client; +package io.izzel.arclight.common.mixin.core.network.protocol.game; import io.izzel.arclight.common.bridge.network.play.TimestampedPacket; import net.minecraft.network.FriendlyByteBuf; @@ -13,7 +13,7 @@ public class CPlayerTryUseItemOnBlockPacketMixin implements TimestampedPacket { public long timestamp; - @Inject(method = "read", at = @At("HEAD")) + @Inject(method = "(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN")) private void arclight$read(FriendlyByteBuf buf, CallbackInfo ci) { this.timestamp = System.currentTimeMillis(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CPlayerTryUseItemPacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemPacketMixin.java similarity index 82% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CPlayerTryUseItemPacketMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemPacketMixin.java index 115b386d..487b9719 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/client/CPlayerTryUseItemPacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/CPlayerTryUseItemPacketMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.play.client; +package io.izzel.arclight.common.mixin.core.network.protocol.game; import io.izzel.arclight.common.bridge.network.play.TimestampedPacket; import net.minecraft.network.FriendlyByteBuf; @@ -13,7 +13,7 @@ public class CPlayerTryUseItemPacketMixin implements TimestampedPacket { public long timestamp; - @Inject(method = "read", at = @At("HEAD")) + @Inject(method = "(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At("RETURN")) private void arclight$read(FriendlyByteBuf buf, CallbackInfo ci) { this.timestamp = System.currentTimeMillis(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/server/SChatPacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/SChatPacketMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/server/SChatPacketMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/SChatPacketMixin.java index 0f710237..c654b7e6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/server/SChatPacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/SChatPacketMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.network.play.server; +package io.izzel.arclight.common.mixin.core.network.protocol.game; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.chat.ComponentSerializer; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/server/SWorldBorderPacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/SWorldBorderPacketMixin.java similarity index 68% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/server/SWorldBorderPacketMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/SWorldBorderPacketMixin.java index 5ef941a3..bd881a5f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/play/server/SWorldBorderPacketMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/game/SWorldBorderPacketMixin.java @@ -1,7 +1,7 @@ -package io.izzel.arclight.common.mixin.core.network.play.server; +package io.izzel.arclight.common.mixin.core.network.protocol.game; import io.izzel.arclight.common.bridge.world.border.WorldBorderBridge; -import net.minecraft.network.protocol.game.ClientboundSetBorderPacket; +import net.minecraft.network.protocol.game.ClientboundSetBorderCenterPacket; import net.minecraft.world.level.border.WorldBorder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(ClientboundSetBorderPacket.class) +@Mixin(ClientboundSetBorderCenterPacket.class) public class SWorldBorderPacketMixin { // @formatter:off @@ -17,8 +17,8 @@ public class SWorldBorderPacketMixin { @Shadow private double newCenterZ; // @formatter:on - @Inject(method = "(Lnet/minecraft/world/level/border/WorldBorder;Lnet/minecraft/network/protocol/game/ClientboundSetBorderPacket$Type;)V", at = @At("RETURN")) - private void arclight$nether(WorldBorder border, ClientboundSetBorderPacket.Type actionIn, CallbackInfo ci) { + @Inject(method = "(Lnet/minecraft/world/level/border/WorldBorder;)V", at = @At("RETURN")) + private void arclight$nether(WorldBorder border, CallbackInfo ci) { this.newCenterX = border.getCenterX() * (((WorldBorderBridge) border).bridge$getWorld().dimensionType().coordinateScale()); this.newCenterZ = border.getCenterZ() * (((WorldBorderBridge) border).bridge$getWorld().dimensionType().coordinateScale()); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/handshake/CHandshakePacketMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/handshake/CHandshakePacketMixin.java new file mode 100644 index 00000000..1a9e1205 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/protocol/handshake/CHandshakePacketMixin.java @@ -0,0 +1,44 @@ +package io.izzel.arclight.common.mixin.core.network.protocol.handshake; + +import com.google.gson.Gson; +import com.mojang.authlib.properties.Property; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.handshake.ClientIntentionPacket; +import net.minecraftforge.fmllegacy.network.FMLNetworkConstants; +import net.minecraftforge.fmllegacy.network.NetworkHooks; +import org.spigotmc.SpigotConfig; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Objects; + +@Mixin(ClientIntentionPacket.class) +public class CHandshakePacketMixin { + + private static final String EXTRA_DATA = "extraData"; + private static final Gson GSON = new Gson(); + + @Redirect(method = "(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/FriendlyByteBuf;readUtf(I)Ljava/lang/String;")) + private String arclight$bungeeHostname(FriendlyByteBuf packetBuffer, int maxLength) { + return packetBuffer.readUtf(Short.MAX_VALUE); + } + + @Redirect(method = "(Lnet/minecraft/network/FriendlyByteBuf;)V", at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraftforge/fmllegacy/network/NetworkHooks;getFMLVersion(Ljava/lang/String;)Ljava/lang/String;")) + private String arclight$readFromProfile(String ip) { + String fmlVersion = NetworkHooks.getFMLVersion(ip); + if (SpigotConfig.bungee && !Objects.equals(fmlVersion, FMLNetworkConstants.NETVERSION)) { + String[] split = ip.split("\0"); + if (split.length == 4) { + Property[] properties = GSON.fromJson(split[3], Property[].class); + for (Property property : properties) { + if (Objects.equals(property.getName(), EXTRA_DATA)) { + String extraData = property.getValue().replace("\1", "\0"); + return NetworkHooks.getFMLVersion(split[0] + extraData); + } + } + } + } + return fmlVersion; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index d8ecc7a4..0b0f2a33 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -16,6 +16,7 @@ import joptsimple.OptionSet; import net.minecraft.CrashReport; import net.minecraft.ReportedException; import net.minecraft.SharedConstants; +import net.minecraft.SystemReport; import net.minecraft.Util; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -23,6 +24,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.protocol.status.ServerStatus; +import net.minecraft.obfuscate.DontObfuscate; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerResources; @@ -36,7 +38,6 @@ import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.players.GameProfileCache; import net.minecraft.util.Unit; import net.minecraft.util.profiling.ProfilerFiller; -import net.minecraft.util.profiling.SingleTickProfiler; import net.minecraft.util.thread.ReentrantBlockableEventLoop; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.DataPackConfig; @@ -49,8 +50,8 @@ import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WorldData; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.world.StructureSpawnManager; -import net.minecraftforge.fml.BrandingControl; -import net.minecraftforge.fml.server.ServerLifecycleHooks; +import net.minecraftforge.fmllegacy.BrandingControl; +import net.minecraftforge.fmllegacy.server.ServerLifecycleHooks; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; @@ -97,31 +98,32 @@ public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop, ServerLevel> levels; @Shadow protected abstract void setupDebugLevel(WorldData p_240778_1_); @Shadow protected WorldData worldData; - @Shadow private static void setInitialSpawn(ServerLevel p_240786_0_, ServerLevelData p_240786_1_, boolean hasBonusChest, boolean p_240786_3_, boolean p_240786_4_) { } @Shadow(remap = false) @Deprecated public abstract void markWorldsDirty(); + @Shadow private static void setInitialSpawn(ServerLevel p_177897_, ServerLevelData p_177898_, boolean p_177899_, boolean p_177900_) { } + @Shadow public abstract boolean isSpawningMonsters(); + @Shadow public abstract boolean isSpawningAnimals(); + @Shadow protected abstract void startMetricsRecordingTick(); + @Shadow protected abstract void endMetricsRecordingTick(); + @Shadow public abstract SystemReport fillSystemReport(SystemReport p_177936_); // @formatter:on public MinecraftServerMixin(String name) { @@ -211,9 +213,7 @@ public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop arclight$filterAdd(PlayerList playerList) { return filterPlayer(playerList.getPlayers()); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java index a23b9d40..13fb04fc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerListMixin.java @@ -35,10 +35,8 @@ import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.server.level.DemoMode; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.level.ServerPlayerGameMode; import net.minecraft.server.network.ServerLoginPacketListenerImpl; import net.minecraft.server.players.IpBanList; import net.minecraft.server.players.IpBanListEntry; @@ -61,6 +59,7 @@ import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.level.storage.LevelResource; import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.phys.Vec3; +import net.minecraftforge.fmllegacy.hooks.BasicEventHooks; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.craftbukkit.v.CraftServer; @@ -123,7 +122,6 @@ public abstract class PlayerListMixin implements PlayerListBridge { @Shadow public abstract void sendAllPlayerInfo(ServerPlayer playerIn); @Shadow public abstract void broadcastMessage(Component p_232641_1_, ChatType p_232641_2_, UUID p_232641_3_); @Shadow @Nullable public abstract ServerPlayer getPlayer(UUID playerUUID); - @Shadow protected abstract void updatePlayerGameMode(ServerPlayer target, @org.jetbrains.annotations.Nullable ServerPlayer source, ServerLevel worldIn); // @formatter:on private CraftServer cserver; @@ -155,9 +153,9 @@ public abstract class PlayerListMixin implements PlayerListBridge { return ((WorldBridge) playerIn.getLevel()).bridge$spigotConfig().viewDistance; } - @Eject(method = "initializeConnectionToPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/management/PlayerList;func_232641_a_(Lnet/minecraft/util/text/ITextComponent;Lnet/minecraft/util/text/ChatType;Ljava/util/UUID;)V")) + @Eject(method = "placeNewPlayer", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/players/PlayerList;broadcastMessage(Lnet/minecraft/network/chat/Component;Lnet/minecraft/network/chat/ChatType;Ljava/util/UUID;)V")) private void arclight$playerJoin(PlayerList playerList, Component component, ChatType chatType, UUID uuid, CallbackInfo ci, Connection netManager, ServerPlayer playerIn) { - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(playerIn), CraftChatMessage.fromComponent(component)); + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(), CraftChatMessage.fromComponent(component)); this.players.add(playerIn); this.playersByUUID.put(playerIn.getUUID(), playerIn); this.cserver.getPluginManager().callEvent(playerJoinEvent); @@ -193,7 +191,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { if (playerIn.inventoryMenu != playerIn.containerMenu) { ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().closeInventory(); } - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(playerIn), "\u00A7e" + playerIn.getScoreboardName() + " left the game"); + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(), "\u00A7e" + playerIn.getScoreboardName() + " left the game"); cserver.getPluginManager().callEvent(playerQuitEvent); ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); playerIn.doTick(); @@ -214,7 +212,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { this.save(entityplayer); entityplayer.connection.disconnect(new TranslatableComponent("multiplayer.disconnect.duplicate_login")); } - ServerPlayer entity = new ServerPlayer(this.server, this.server.getLevel(Level.OVERWORLD), gameProfile, new ServerPlayerGameMode(this.server.getLevel(Level.OVERWORLD))); + ServerPlayer entity = new ServerPlayer(this.server, this.server.getLevel(Level.OVERWORLD), gameProfile); Player player = ((ServerPlayerEntityBridge) entity).bridge$getBukkitEntity(); String hostname = handler == null ? "" : ((ServerLoginNetHandlerBridge) handler).bridge$getHostname(); @@ -305,7 +303,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { pos = ((ServerPlayerEntityBridge) playerIn).bridge$getSpawnPoint(spawnWorld); location = new Location(((WorldBridge) spawnWorld).bridge$getWorld(), pos.getX() + 0.5f, pos.getY() + 0.1f, pos.getZ() + 0.5f); } - Player respawnPlayer = this.cserver.getPlayer(playerIn); + Player respawnPlayer = ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !flag3, flag3); this.cserver.getPluginManager().callEvent(respawnEvent); if (((ServerPlayNetHandlerBridge) playerIn.connection).bridge$isDisconnected()) { @@ -328,7 +326,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { playerIn.connection.send(new ClientboundRespawnPacket(serverWorld.dimensionType(), serverWorld.dimension(), BiomeManager.obfuscateSeed(serverWorld.getSeed()), playerIn.gameMode.getGameModeForPlayer(), playerIn.gameMode.getPreviousGameModeForPlayer(), serverWorld.isDebug(), serverWorld.isFlat(), flag)); playerIn.connection.send(new ClientboundSetChunkCacheRadiusPacket(((WorldBridge) serverWorld).bridge$spigotConfig().viewDistance)); playerIn.setLevel(serverWorld); - ((ServerPlayNetHandlerBridge) playerIn.connection).bridge$teleport(new Location(((WorldBridge) serverWorld).bridge$getWorld(), playerIn.getX(), playerIn.getY(), playerIn.getZ(), playerIn.yRot, playerIn.xRot)); + ((ServerPlayNetHandlerBridge) playerIn.connection).bridge$teleport(new Location(((WorldBridge) serverWorld).bridge$getWorld(), playerIn.getX(), playerIn.getY(), playerIn.getZ(), playerIn.getYRot(), playerIn.getXRot())); playerIn.setShiftKeyDown(false); playerIn.connection.send(new ClientboundSetDefaultSpawnPositionPacket(serverWorld.getSharedSpawnPos(), serverWorld.getSharedSpawnAngle())); playerIn.connection.send(new ClientboundChangeDifficultyPacket(worlddata.getDifficulty(), worlddata.isDifficultyLocked())); @@ -341,7 +339,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { this.playersByUUID.put(playerIn.getUUID(), playerIn); } playerIn.setHealth(playerIn.getHealth()); - net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerChangedDimensionEvent(playerIn, ((CraftWorld) fromWorld).getHandle().dimension, serverWorld.dimension); + BasicEventHooks.firePlayerChangedDimensionEvent(playerIn, ((CraftWorld) fromWorld).getHandle().dimension, serverWorld.dimension); if (flag3) { playerIn.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, pos.getX(), pos.getY(), pos.getZ(), 1.0f, 1.0f)); } @@ -421,7 +419,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { pos = ((ServerPlayerEntityBridge) playerIn).bridge$getSpawnPoint(spawnWorld); location = new Location(((WorldBridge) spawnWorld).bridge$getWorld(), pos.getX() + 0.5f, pos.getY() + 0.1f, pos.getZ() + 0.5f); } - Player respawnPlayer = this.cserver.getPlayer(playerIn); + Player respawnPlayer = ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity(); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn && !flag3, flag3); this.cserver.getPluginManager().callEvent(respawnEvent); if (((ServerPlayNetHandlerBridge) playerIn.connection).bridge$isDisconnected()) { @@ -436,14 +434,8 @@ public abstract class PlayerListMixin implements PlayerListBridge { } ServerLevel serverWorld = ((CraftWorld) location.getWorld()).getHandle(); - ServerPlayerGameMode playerinteractionmanager; - if (this.server.isDemo()) { - playerinteractionmanager = new DemoMode(serverWorld); - } else { - playerinteractionmanager = new ServerPlayerGameMode(serverWorld); - } - ServerPlayer serverplayerentity = new ServerPlayer(this.server, serverWorld, playerIn.getGameProfile(), playerinteractionmanager); + ServerPlayer serverplayerentity = new ServerPlayer(this.server, serverWorld, playerIn.getGameProfile()); // Forward to new player instance ((InternalEntityBridge) playerIn).internal$getBukkitEntity().setHandle(serverplayerentity); @@ -455,7 +447,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { serverplayerentity.connection = playerIn.connection; serverplayerentity.restoreFrom(playerIn, conqueredEnd); if (!conqueredEnd) { // keep inventory here since inventory dropped at ServerPlayerEntity#onDeath - serverplayerentity.inventory.replaceWith(playerIn.inventory); + serverplayerentity.getInventory().replaceWith(playerIn.getInventory()); } playerIn.remove(false); // Forge: clone event had a chance to see old data, now discard it serverplayerentity.setId(playerIn.getId()); @@ -468,8 +460,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { serverplayerentity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); serverplayerentity.connection.resetPosition(); - this.updatePlayerGameMode(serverplayerentity, playerIn, serverWorld); - while (avoidSuffocation && !serverWorld.noCollision(serverplayerentity) && serverplayerentity.getY() < 256.0D) { + while (avoidSuffocation && !serverWorld.noCollision(serverplayerentity) && serverplayerentity.getY() < serverWorld.getMaxBuildHeight()) { serverplayerentity.setPos(serverplayerentity.getX(), serverplayerentity.getY() + 1.0D, serverplayerentity.getZ()); } @@ -477,7 +468,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { serverplayerentity.connection.send(new ClientboundRespawnPacket(serverplayerentity.level.dimensionType(), serverplayerentity.level.dimension(), BiomeManager.obfuscateSeed(serverplayerentity.getLevel().getSeed()), serverplayerentity.gameMode.getGameModeForPlayer(), serverplayerentity.gameMode.getPreviousGameModeForPlayer(), serverplayerentity.getLevel().isDebug(), serverplayerentity.getLevel().isFlat(), conqueredEnd)); serverplayerentity.connection.send(new ClientboundSetChunkCacheRadiusPacket(((WorldBridge) serverWorld).bridge$spigotConfig().viewDistance)); serverplayerentity.setLevel(serverWorld); - ((ServerPlayNetHandlerBridge) serverplayerentity.connection).bridge$teleport(new Location(((WorldBridge) serverWorld).bridge$getWorld(), serverplayerentity.getX(), serverplayerentity.getY(), serverplayerentity.getZ(), serverplayerentity.yRot, serverplayerentity.xRot)); + ((ServerPlayNetHandlerBridge) serverplayerentity.connection).bridge$teleport(new Location(((WorldBridge) serverWorld).bridge$getWorld(), serverplayerentity.getX(), serverplayerentity.getY(), serverplayerentity.getZ(), serverplayerentity.getYRot(), serverplayerentity.getXRot())); serverplayerentity.setShiftKeyDown(false); serverplayerentity.connection.send(new ClientboundSetDefaultSpawnPositionPacket(serverWorld.getSharedSpawnPos(), serverWorld.getSharedSpawnAngle())); serverplayerentity.connection.send(new ClientboundChangeDifficultyPacket(iworldinfo.getDifficulty(), iworldinfo.isDifficultyLocked())); @@ -489,9 +480,9 @@ public abstract class PlayerListMixin implements PlayerListBridge { this.addPlayer(serverplayerentity); this.playersByUUID.put(serverplayerentity.getUUID(), serverplayerentity); } - serverplayerentity.initMenu(); + serverplayerentity.initInventoryMenu(); serverplayerentity.setHealth(serverplayerentity.getHealth()); - net.minecraftforge.fml.hooks.BasicEventHooks.firePlayerRespawnEvent(serverplayerentity, conqueredEnd); + BasicEventHooks.firePlayerRespawnEvent(serverplayerentity, conqueredEnd); if (flag2) { serverplayerentity.connection.send(new ClientboundSoundPacket(SoundEvents.RESPAWN_ANCHOR_DEPLETE, SoundSource.BLOCKS, (double) pos.getX(), (double) pos.getY(), (double) pos.getZ(), 1.0F, 1.0F)); } @@ -526,7 +517,7 @@ public abstract class PlayerListMixin implements PlayerListBridge { } } - @Inject(method = "sendPlayerPermissionLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getCommands()Lnet/minecraft/commands/Commands;")) + @Inject(method = "sendPlayerPermissionLevel(Lnet/minecraft/server/level/ServerPlayer;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/MinecraftServer;getCommands()Lnet/minecraft/commands/Commands;")) private void arclight$calculatePerms(ServerPlayer player, int permLevel, CallbackInfo ci) { ((ServerPlayerEntityBridge) player).bridge$getBukkitEntity().recalculatePermissions(); } @@ -553,11 +544,6 @@ public abstract class PlayerListMixin implements PlayerListBridge { this.sendMessage(components); } - @Redirect(method = "broadcastMessage", at = @At(value = "NEW", target = "net/minecraft/network/protocol/game/ClientboundChatPacket")) - private ClientboundChatPacket arclight$addWebLinks(Component message, ChatType type, UUID uuid) { - return new ClientboundChatPacket(CraftChatMessage.fixComponent(message), type, uuid); - } - public ServerStatsCounter getStatisticManager(ServerPlayer entityhuman) { ServerStatsCounter serverstatisticmanager = entityhuman.getStats(); return serverstatisticmanager == null ? this.getStatisticManager(entityhuman.getUUID(), entityhuman.getName().getString()) : serverstatisticmanager; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerInteractionManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerInteractionManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java index 80590707..0ec2e62d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/PlayerInteractionManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/management/ServerPlayerGameModeMixin.java @@ -30,13 +30,17 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.common.ForgeHooks; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.event.Event; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockDamageEvent; +import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerInteractEvent; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; @@ -48,11 +52,11 @@ import java.util.List; import java.util.Objects; @Mixin(ServerPlayerGameMode.class) -public abstract class PlayerInteractionManagerMixin implements PlayerInteractionManagerBridge { +public abstract class ServerPlayerGameModeMixin implements PlayerInteractionManagerBridge { // @formatter:off - @Shadow public ServerLevel level; - @Shadow public ServerPlayer player; + @Shadow protected ServerLevel level; + @Shadow @Final protected ServerPlayer player; @Shadow public abstract boolean isCreative(); @Shadow private GameType gameModeForPlayer; @Shadow private int destroyProgressStart; @@ -69,6 +73,15 @@ public abstract class PlayerInteractionManagerMixin implements PlayerInteraction public boolean interactResult = false; public boolean firedInteract = false; + @Inject(method = "changeGameModeForPlayer", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayerGameMode;setGameModeForPlayer(Lnet/minecraft/world/level/GameType;Lnet/minecraft/world/level/GameType;)V")) + private void arclight$gameModeEvent(GameType gameType, CallbackInfoReturnable cir) { + PlayerGameModeChangeEvent event = new PlayerGameModeChangeEvent(((ServerPlayerEntityBridge) player).bridge$getBukkitEntity(), GameMode.getByValue(gameType.getId())); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + cir.setReturnValue(false); + } + } + /** * @author IzzelAliz * @reason @@ -93,7 +106,7 @@ public abstract class PlayerInteractionManagerMixin implements PlayerInteraction this.player.connection.send(new ClientboundBlockBreakAckPacket(blockPos, this.level.getBlockState(blockPos), action, false, "too high")); } else if (action == ServerboundPlayerActionPacket.Action.START_DESTROY_BLOCK) { if (!this.level.mayInteract(this.player, blockPos)) { - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockPos, direction, this.player.inventory.getSelected(), InteractionHand.MAIN_HAND); + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockPos, direction, this.player.getInventory().getSelected(), InteractionHand.MAIN_HAND); this.player.connection.send(new ClientboundBlockBreakAckPacket(blockPos, this.level.getBlockState(blockPos), action, false, "may not interact")); BlockEntity tileentity = this.level.getBlockEntity(blockPos); if (tileentity != null) { @@ -101,7 +114,7 @@ public abstract class PlayerInteractionManagerMixin implements PlayerInteraction } return; } - PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockPos, direction, this.player.inventory.getSelected(), InteractionHand.MAIN_HAND); + PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockPos, direction, this.player.getInventory().getSelected(), InteractionHand.MAIN_HAND); if (event.isCancelled()) { this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, blockPos)); BlockEntity tileentity2 = this.level.getBlockEntity(blockPos); @@ -130,7 +143,7 @@ public abstract class PlayerInteractionManagerMixin implements PlayerInteraction } else if (data.getBlock() instanceof TrapDoorBlock) { this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, blockPos)); } - } else if (!iblockdata.isAir(level, blockPos)) { + } else if (!iblockdata.isAir()) { if (forgeEvent.getUseBlock() != net.minecraftforge.eventbus.api.Event.Result.DENY) { iblockdata.attack(this.level, blockPos, this.player); } @@ -142,7 +155,7 @@ public abstract class PlayerInteractionManagerMixin implements PlayerInteraction } return; } - BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, blockPos.getX(), blockPos.getY(), blockPos.getZ(), this.player.inventory.getSelected(), f >= 1.0f); + BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, blockPos.getX(), blockPos.getY(), blockPos.getZ(), this.player.getInventory().getSelected(), f >= 1.0f); if (blockEvent.isCancelled()) { this.player.connection.send(new ClientboundBlockUpdatePacket(this.level, blockPos)); return; @@ -150,7 +163,7 @@ public abstract class PlayerInteractionManagerMixin implements PlayerInteraction if (blockEvent.getInstaBreak()) { f = 2.0f; } - if (!iblockdata.isAir(level, blockPos) && f >= 1.0f) { + if (!iblockdata.isAir() && f >= 1.0f) { this.destroyAndAck(blockPos, action, "insta mine"); } else { if (this.isDestroyingBlock) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/StatisticsManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/StatisticsCounterMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/StatisticsManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/StatisticsCounterMixin.java index 89fa8f16..08b8aa5a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/StatisticsManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/stats/StatisticsCounterMixin.java @@ -13,7 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(StatsCounter.class) -public abstract class StatisticsManagerMixin { +public abstract class StatisticsCounterMixin { // @formatter:off @Shadow public abstract int getValue(Stat stat); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/DoubleSidedInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/CompoundContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/DoubleSidedInventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/CompoundContainerMixin.java index 288743cf..04651bac 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/DoubleSidedInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/CompoundContainerMixin.java @@ -1,6 +1,10 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; +import net.minecraft.world.CompoundContainer; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; import org.bukkit.Location; import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; import org.bukkit.entity.HumanEntity; @@ -11,13 +15,9 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.ArrayList; import java.util.List; -import net.minecraft.world.CompoundContainer; -import net.minecraft.world.Container; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; @Mixin(CompoundContainer.class) -public abstract class DoubleSidedInventoryMixin implements IInventoryBridge, Container { +public abstract class CompoundContainerMixin implements IInventoryBridge, Container { @Shadow @Final public Container container1; @Shadow @Final public Container container2; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/IInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ContainerMixin.java similarity index 91% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/IInventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ContainerMixin.java index fed2ff4b..3ce933c5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/IInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/ContainerMixin.java @@ -1,6 +1,9 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; import org.bukkit.Location; import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; import org.bukkit.entity.HumanEntity; @@ -9,12 +12,9 @@ import org.spongepowered.asm.mixin.Mixin; import java.util.ArrayList; import java.util.List; -import net.minecraft.world.Container; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; @Mixin(Container.class) -public interface IInventoryMixin extends IInventoryBridge { +public interface ContainerMixin extends IInventoryBridge { @Override default List getContents() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/InventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/SimpleContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/InventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/SimpleContainerMixin.java index 0db7b96e..a18ce9b3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/InventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/SimpleContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import net.minecraft.core.NonNullList; @@ -18,7 +18,7 @@ import java.util.ArrayList; import java.util.List; @Mixin(SimpleContainer.class) -public abstract class InventoryMixin implements Container, IInventoryBridge { +public abstract class SimpleContainerMixin implements Container, IInventoryBridge { // @formatter:off @Shadow @Final public NonNullList items; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/potion/EffectMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/effect/MobEffectMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/potion/EffectMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/effect/MobEffectMixin.java index 5e3e3198..0b06d1d9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/potion/EffectMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/effect/MobEffectMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.potion; +package io.izzel.arclight.common.mixin.core.world.effect; import io.izzel.arclight.common.bridge.entity.LivingEntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MobEffect.class) -public class EffectMixin { +public class MobEffectMixin { @Inject(method = "applyEffectTick", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/entity/LivingEntity;heal(F)V")) public void arclight$healReason1(LivingEntity livingEntity, int amplifier, CallbackInfo ci) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java index 82957819..eb9b056e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java @@ -203,6 +203,8 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, @Shadow protected abstract void unsetRemoved(); @Shadow public abstract double getY(double p_20228_); @Shadow public abstract void gameEvent(GameEvent p_146853_, @org.jetbrains.annotations.Nullable Entity p_146854_); + @Shadow public abstract void setTicksFrozen(int p_146918_); + @Shadow public abstract void setSharedFlagOnFire(boolean p_146869_); // @formatter:on private static final int CURRENT_LEVEL = 2; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java index 7bcb2651..15753e01 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java @@ -187,7 +187,7 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt public boolean forceDrops; public CraftAttributeMap craftAttributes; public boolean collides; - public boolean canPickUpLoot; + public boolean bukkitPickUpLoot; public Set collidableExemptions = new HashSet<>(); @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;setHealth(F)V")) @@ -396,7 +396,7 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt @Override public boolean bridge$canPickUpLoot() { - return canPickUpLoot; + return bukkitPickUpLoot; } @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java index 45ec2227..046f74f7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/MobMixin.java @@ -78,7 +78,7 @@ public abstract class MobMixin extends LivingEntityMixin implements MobEntityBri @Inject(method = "setCanPickUpLoot", at = @At("HEAD")) public void arclight$setPickupLoot(boolean canPickup, CallbackInfo ci) { - super.canPickUpLoot = canPickup; + super.bukkitPickUpLoot = canPickup; } /** @@ -87,7 +87,7 @@ public abstract class MobMixin extends LivingEntityMixin implements MobEntityBri */ @Overwrite public boolean canPickUpLoot() { - return super.canPickUpLoot; + return super.bukkitPickUpLoot; } @Inject(method = "", at = @At("RETURN")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java index 8ad16221..ec02582b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/PlayerMixin.java @@ -124,6 +124,8 @@ public abstract class PlayerMixin extends LivingEntityMixin implements PlayerEnt @Shadow public abstract Either startSleepInBed(BlockPos at); @Shadow public int sleepCounter; @Shadow public abstract GameProfile getGameProfile(); + @Shadow public abstract Inventory getInventory(); + @Shadow public abstract Abilities getAbilities(); // @formatter:on public boolean fauxSleeping; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerEntityMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java index 38dfb8d1..9e76d11c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java @@ -10,15 +10,13 @@ import io.izzel.arclight.common.bridge.network.play.ServerPlayNetHandlerBridge; import io.izzel.arclight.common.bridge.util.FoodStatsBridge; import io.izzel.arclight.common.bridge.world.TeleporterBridge; import io.izzel.arclight.common.bridge.world.WorldBridge; -import io.izzel.arclight.common.mod.util.ArclightCaptures; -import io.izzel.arclight.common.mod.util.BlackholeNetHandler; import io.izzel.arclight.common.mod.server.block.ChestBlockDoubleInventoryHacks; +import io.izzel.arclight.common.mod.util.ArclightCaptures; import net.minecraft.BlockUtil; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.ChatType; import net.minecraft.network.chat.Component; @@ -26,12 +24,11 @@ import net.minecraft.network.chat.HoverEvent; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.network.protocol.game.ClientboundChangeDifficultyPacket; -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; import net.minecraft.network.protocol.game.ClientboundGameEventPacket; import net.minecraft.network.protocol.game.ClientboundHorseScreenOpenPacket; import net.minecraft.network.protocol.game.ClientboundLevelEventPacket; import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; -import net.minecraft.network.protocol.game.ClientboundPlayerCombatPacket; +import net.minecraft.network.protocol.game.ClientboundPlayerCombatKillPacket; import net.minecraft.network.protocol.game.ClientboundRespawnPacket; import net.minecraft.network.protocol.game.ClientboundSetHealthPacket; import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket; @@ -64,7 +61,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.food.FoodData; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.HorseInventoryMenu; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.GameType; import net.minecraft.world.level.Level; @@ -80,17 +76,16 @@ import net.minecraft.world.scores.Scoreboard; import net.minecraft.world.scores.Team; import net.minecraft.world.scores.criteria.ObjectiveCriteria; import net.minecraftforge.common.ForgeHooks; -import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.ITeleporter; -import net.minecraftforge.fml.hooks.BasicEventHooks; -import net.minecraftforge.fml.server.ServerLifecycleHooks; +import net.minecraftforge.fmllegacy.hooks.BasicEventHooks; +import net.minecraftforge.fmllegacy.server.ServerLifecycleHooks; import org.apache.logging.log4j.Logger; import org.bukkit.Bukkit; -import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.WeatherType; import org.bukkit.craftbukkit.v.CraftServer; import org.bukkit.craftbukkit.v.CraftWorld; +import org.bukkit.craftbukkit.v.block.CraftBlock; import org.bukkit.craftbukkit.v.entity.CraftPlayer; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.craftbukkit.v.event.CraftPortalEvent; @@ -99,10 +94,9 @@ import org.bukkit.craftbukkit.v.scoreboard.CraftScoreboardManager; import org.bukkit.craftbukkit.v.util.CraftChatMessage; import org.bukkit.event.entity.EntityPotionEffectEvent; import org.bukkit.event.entity.PlayerDeathEvent; -import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerBedLeaveEvent; import org.bukkit.event.player.PlayerChangedMainHandEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerLocaleChangeEvent; import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerTeleportEvent; @@ -121,7 +115,6 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collection; -import java.util.EnumSet; import java.util.List; import java.util.Optional; import java.util.OptionalInt; @@ -130,7 +123,7 @@ import java.util.UUID; import java.util.function.Consumer; @Mixin(ServerPlayer.class) -public abstract class ServerPlayerEntityMixin extends PlayerMixin implements ServerPlayerEntityBridge { +public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPlayerEntityBridge { // @formatter:off @Shadow @Final public MinecraftServer server; @@ -165,6 +158,9 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser @Shadow protected abstract boolean bedBlocked(BlockPos p_241156_1_, Direction p_241156_2_); @Shadow protected abstract boolean bedInRange(BlockPos p_241147_1_, Direction p_241147_2_); @Shadow public abstract void sendMessage(Component component, UUID senderUUID); + @Shadow public abstract void setLevel(ServerLevel p_143426_); + @Shadow(remap = false) private boolean hasTabListName; + @Shadow(remap = false) private Component tabListDisplayName; // @formatter:on public String displayName; @@ -189,12 +185,9 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser @Inject(method = "", at = @At("RETURN")) public void arclight$init(CallbackInfo ci) { this.displayName = this.getGameProfile() != null ? getScoreboardName() : "~FakePlayer~"; - this.canPickUpLoot = true; + this.bukkitPickUpLoot = true; this.maxHealthCache = this.getMaxHealth(); this.arclight$initialized = true; - if ((Object) this instanceof FakePlayer) { - this.connection = new BlackholeNetHandler(this.getServer(), (ServerPlayer) (Object) this); - } } @Override @@ -245,7 +238,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser } } - @Redirect(method = "addAdditionalSaveData", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hasOnePlayerPassenger()Z")) + @Redirect(method = "addAdditionalSaveData", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hasExactlyOnePlayerPassenger()Z")) private boolean arclight$nonPersistVehicle(Entity entity) { Entity entity1 = this.getVehicle(); boolean persistVehicle = true; @@ -258,7 +251,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser } } } - return persistVehicle && entity.hasOnePlayerPassenger(); + return persistVehicle && entity.hasExactlyOnePlayerPassenger(); } @Inject(method = "addAdditionalSaveData", at = @At("RETURN")) @@ -266,9 +259,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser this.getBukkitEntity().setExtraData(compound); } - @Override - public void setLevel(Level world) { - super.setLevel(world); + public void spawnIn(Level world) { + this.level = world; if (world == null) { this.revive(); Vec3 position = null; @@ -320,16 +312,16 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser if (net.minecraftforge.common.ForgeHooks.onLivingDeath((ServerPlayer) (Object) this, damagesource)) return; boolean flag = this.level.getGameRules().getBoolean(GameRules.RULE_SHOWDEATHMESSAGES); - if (this.removed) { + if (this.isRemoved()) { return; } boolean keepInventory = this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) || this.isSpectator(); Inventory copyInv; if (keepInventory) { - copyInv = this.inventory; + copyInv = this.getInventory(); } else { copyInv = new Inventory((ServerPlayer) (Object) this); - copyInv.replaceWith(this.inventory); + copyInv.replaceWith(this.getInventory()); } this.dropAllDeathLoot(damagesource); @@ -344,7 +336,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser } } if (!keepInventory) { - this.inventory.replaceWith(copyInv); + this.getInventory().replaceWith(copyInv); } PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent((ServerPlayer) (Object) this, loot, deathmessage, keepInventory); if (this.containerMenu != this.inventoryMenu) { @@ -358,15 +350,15 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser } else { itextcomponent = CraftChatMessage.fromStringOrNull(deathMessage); } - this.connection.send(new ClientboundPlayerCombatPacket(this.getCombatTracker(), ClientboundPlayerCombatPacket.Event.ENTITY_DIED, itextcomponent), (p_212356_2_) -> { - if (!p_212356_2_.isSuccess()) { + this.connection.send(new ClientboundPlayerCombatKillPacket(this.getCombatTracker(), itextcomponent), (future) -> { + if (!future.isSuccess()) { int i = 256; String s = itextcomponent.getString(256); Component itextcomponent1 = new TranslatableComponent("death.attack.message_too_long", (new TextComponent(s)).withStyle(ChatFormatting.YELLOW)); Component itextcomponent2 = (new TranslatableComponent("death.attack.even_more_magic", this.getDisplayName())).withStyle((p_212357_1_) -> { return p_212357_1_.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, itextcomponent1)); }); - this.connection.send(new ClientboundPlayerCombatPacket(this.getCombatTracker(), ClientboundPlayerCombatPacket.Event.ENTITY_DIED, itextcomponent2)); + this.connection.send(new ClientboundPlayerCombatKillPacket(this.getCombatTracker(), itextcomponent2)); } }); @@ -381,7 +373,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser this.server.getPlayerList().broadcastMessage(itextcomponent, ChatType.SYSTEM, Util.NIL_UUID); } } else { - this.connection.send(new ClientboundPlayerCombatPacket(this.getCombatTracker(), ClientboundPlayerCombatPacket.Event.ENTITY_DIED)); + this.connection.send(new ClientboundPlayerCombatKillPacket(this.getCombatTracker(), TextComponent.EMPTY)); } this.removeEntitiesOnShoulder(); @@ -392,7 +384,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser this.dropExperience(); if (!event.getKeepInventory()) { - this.inventory.clearContent(); + this.getInventory().clearContent(); } this.setCamera((ServerPlayer) (Object) this); ((CraftScoreboardManager) Bukkit.getScoreboardManager()).getScoreboardScores(ObjectiveCriteria.DEATH_COUNT, this.getScoreboardName(), Score::increment); @@ -409,7 +401,8 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser this.resetStat(Stats.CUSTOM.get(Stats.TIME_SINCE_DEATH)); this.resetStat(Stats.CUSTOM.get(Stats.TIME_SINCE_REST)); this.clearFire(); - this.setSharedFlag(0, false); + this.setTicksFrozen(0); + this.setSharedFlagOnFire(false); this.getCombatTracker().recheckStatus(); } @@ -549,7 +542,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser } this.gameMode.setLevel(exitWorld[0]); - this.connection.send(new ClientboundPlayerAbilitiesPacket(this.abilities)); + this.connection.send(new ClientboundPlayerAbilitiesPacket(this.getAbilities())); playerlist.sendLevelInfo((ServerPlayer) (Object) this, exitWorld[0]); playerlist.sendAllPlayerInfo((ServerPlayer) (Object) this); @@ -593,7 +586,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser Direction.Axis enumdirection_enumaxis = this.level.getBlockState(this.portalEntrancePos).getOptionalValue(NetherPortalBlock.AXIS).orElse(Direction.Axis.X); Optional optional1 = ((TeleporterBridge) worldserver.getPortalForcer()).bridge$createPortal(blockposition, enumdirection_enumaxis, (ServerPlayer) (Object) this, createRadius); if (!optional1.isPresent()) { - LOGGER.error("Unable to create a portal, likely target out of worldborder"); + // LOGGER.error("Unable to create a portal, likely target out of worldborder"); } return optional1; } @@ -652,8 +645,26 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser } @Inject(method = "stopSleepInBed", cancellable = true, at = @At(value = "HEAD")) - private void arclight$wakeupOutBed(boolean p_225652_1_, boolean p_225652_2_, CallbackInfo ci) { - if (!this.isSleeping()) ci.cancel(); + private void arclight$wakeupOutBed(boolean flag, boolean flag1, CallbackInfo ci) { + if (!this.isSleeping()) { + ci.cancel(); + return; + } + CraftPlayer player = this.getBukkitEntity(); + BlockPos bedPosition = this.getSleepingPos().orElse(null); + + org.bukkit.block.Block bed; + if (bedPosition != null) { + bed = CraftBlock.at(this.level, bedPosition); + } else { + bed = player.getLocation().getBlock(); + } + + PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed, true); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + ci.cancel(); + } } public int nextContainerCounter() { @@ -687,7 +698,7 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser @Overwrite public void openHorseInventory(final AbstractHorse entityhorseabstract, final Container iinventory) { this.nextContainerCounter(); - AbstractContainerMenu container = new HorseInventoryMenu(this.containerCounter, this.inventory, iinventory, entityhorseabstract); + AbstractContainerMenu container = new HorseInventoryMenu(this.containerCounter, this.getInventory(), iinventory, entityhorseabstract); ((ContainerBridge) container).bridge$setTitle(entityhorseabstract.getDisplayName()); container = CraftEventFactory.callInventoryOpenEvent((ServerPlayer) (Object) this, container); if (container == null) { @@ -698,19 +709,10 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser this.closeContainer(); } this.connection.send(new ClientboundHorseScreenOpenPacket(this.containerCounter, iinventory.getContainerSize(), entityhorseabstract.getId())); - (this.containerMenu = container).addSlotListener((ServerPlayer) (Object) this); + this.containerMenu = container; net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.entity.player.PlayerContainerEvent.Open((ServerPlayer) (Object) this, this.containerMenu)); } - @Inject(method = "refreshContainer", at = @At("RETURN")) - private void arclight$sendExtra(AbstractContainerMenu container, NonNullList itemsList, CallbackInfo ci) { - ArclightCaptures.captureContainerOwner((ServerPlayer) (Object) this); - if (EnumSet.of(InventoryType.CRAFTING, InventoryType.WORKBENCH).contains(((ContainerBridge) container).bridge$getBukkitView().getType())) { - this.connection.send(new ClientboundContainerSetSlotPacket(container.containerId, 0, container.getSlot(0).getItem())); - } - ArclightCaptures.resetContainerOwner(); - } - @Inject(method = "doCloseContainer", at = @At("HEAD")) private void arclight$invClose(CallbackInfo ci) { if (this.containerMenu != this.inventoryMenu) { @@ -749,20 +751,6 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser this.sendMessage(component, uuid == null ? Util.NIL_UUID : uuid); } - @Inject(method = "setGameMode", cancellable = true, at = @At("HEAD")) - private void arclight$gameModeChange(GameType gameType, CallbackInfo ci) { - if (gameType == this.gameMode.getGameModeForPlayer()) { - ci.cancel(); - return; - } - - PlayerGameModeChangeEvent event = new PlayerGameModeChangeEvent(getBukkitEntity(), GameMode.getByValue(gameType.getId())); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - ci.cancel(); - } - } - @Inject(method = "updateOptions", at = @At("HEAD")) private void arclight$settingChange(ServerboundClientInformationPacket packetIn, CallbackInfo ci) { if (this.getMainArm() != packetIn.getMainHand()) { @@ -789,10 +777,17 @@ public abstract class ServerPlayerEntityMixin extends PlayerMixin implements Ser @Overwrite @Nullable public Component getTabListDisplayName() { - return listName; + if (this.listName != null) { + return this.listName; + } + if (!this.hasTabListName) { + this.tabListDisplayName = net.minecraftforge.event.ForgeEventFactory.getPlayerTabListDisplayName((ServerPlayer) (Object) this); + this.hasTabListName = true; + } + return tabListDisplayName; } - @Inject(method = "teleportTo", cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/level/ServerPlayer;stopRiding()V")) + @Inject(method = "teleportTo(Lnet/minecraft/server/level/ServerLevel;DDDFF)V", cancellable = true, at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/level/ServerPlayer;stopRiding()V")) private void arclight$handleBy(ServerLevel world, double x, double y, double z, float yaw, float pitch, CallbackInfo ci) { PlayerTeleportEvent.TeleportCause cause = arclight$cause == null ? PlayerTeleportEvent.TeleportCause.UNKNOWN : arclight$cause; arclight$cause = null; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java new file mode 100644 index 00000000..6204fccc --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractContainerMenuMixin.java @@ -0,0 +1,415 @@ +package io.izzel.arclight.common.mixin.core.world.inventory; + +import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; +import io.izzel.arclight.common.bridge.inventory.container.ContainerBridge; +import io.izzel.arclight.common.bridge.inventory.container.SlotBridge; +import io.izzel.arclight.common.mod.server.ArclightContainer; +import net.minecraft.core.NonNullList; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.SlotAccess; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.ContainerSynchronizer; +import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.v.inventory.CraftInventory; +import org.bukkit.craftbukkit.v.inventory.CraftItemStack; +import org.bukkit.event.Event; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.InventoryView; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +@Mixin(AbstractContainerMenu.class) +public abstract class AbstractContainerMenuMixin implements ContainerBridge { + + // @formatter:off + @Shadow public void broadcastChanges() {} + @Shadow private int quickcraftStatus; + @Shadow protected abstract void resetQuickCraft(); + @Shadow private int quickcraftType; + @Shadow @Final private Set quickcraftSlots; + @Shadow public abstract boolean canDragTo(Slot slotIn); + @Shadow public abstract ItemStack quickMoveStack(Player playerIn, int index); + @Shadow public abstract boolean canTakeItemForPickAll(ItemStack stack, Slot slotIn); + @Shadow @Final public int containerId; + @Shadow public abstract Slot getSlot(int slotId); + @Shadow public static int getQuickcraftHeader(int clickedButton) { return 0; } + @Shadow public static int getQuickcraftType(int eventButton) { return 0; } + @Shadow public static boolean isValidQuickcraftType(int dragModeIn, Player player) { return false; } + @Shadow public static boolean canItemQuickReplace(@Nullable Slot slotIn, ItemStack stack, boolean stackSizeMatters) { return false; } + @Shadow public static void getQuickCraftSlotCount(Set dragSlotsIn, int dragModeIn, ItemStack stack, int slotStackSize) { } + @Shadow protected abstract boolean moveItemStackTo(ItemStack stack, int startIndex, int endIndex, boolean reverseDirection); + @Shadow @Final @javax.annotation.Nullable private MenuType menuType; + @Shadow private ItemStack remoteCarried; + @Shadow public abstract ItemStack getCarried(); + @Shadow @javax.annotation.Nullable private ContainerSynchronizer synchronizer; + @Shadow public abstract void setCarried(ItemStack p_150439_); + @Shadow public NonNullList slots; + @Shadow protected abstract SlotAccess createCarriedSlotAccess(); + @Shadow public abstract void sendAllDataToRemote(); + @Shadow public abstract int incrementStateId(); + // @formatter:on + + public boolean checkReachable = true; + private InventoryView bukkitView; + private long bukkitViewHash = 0; + + public InventoryView getBukkitView() { + if (bukkitView != null && bukkitViewHash != bukkitViewHash()) { + ArclightContainer.updateView((AbstractContainerMenu) (Object) this, bukkitView); + bukkitViewHash = bukkitViewHash(); + } + if (bukkitView == null) { + bukkitView = ArclightContainer.createInvView((AbstractContainerMenu) (Object) this); + bukkitViewHash = bukkitViewHash(); + } + return bukkitView; + } + + private long bukkitViewHash() { + return (((long) this.slots.size()) << 32) | System.identityHashCode(this.slots); + } + + public void transferTo(AbstractContainerMenu other, CraftHumanEntity player) { + InventoryView source = this.getBukkitView(); + InventoryView destination = ((ContainerBridge) other).bridge$getBukkitView(); + ((IInventoryBridge) ((CraftInventory) source.getTopInventory()).getInventory()).onClose(player); + ((IInventoryBridge) ((CraftInventory) source.getBottomInventory()).getInventory()).onClose(player); + ((IInventoryBridge) ((CraftInventory) destination.getTopInventory()).getInventory()).onOpen(player); + ((IInventoryBridge) ((CraftInventory) destination.getBottomInventory()).getInventory()).onOpen(player); + } + + private Component title; + + public final Component getTitle() { + if (this.title == null) { + if (this.menuType != null && this.menuType.getRegistryName() != null) { + return new TextComponent(this.menuType.getRegistryName().toString()); + } else { + return new TextComponent(this.toString()); + } + } + return this.title; + } + + public final void setTitle(Component title) { + if (this.title == null) { + if (title == null) { + this.title = getTitle(); + } else { + this.title = title; + } + } + } + + public void broadcastCarriedItem() { + this.remoteCarried = this.getCarried().copy(); + if (this.synchronizer != null) { + this.synchronizer.sendCarriedChange((AbstractContainerMenu) (Object) this, this.remoteCarried); + } + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + private void doClick(int slotId, int dragType, ClickType clickType, Player player) { + Inventory inventory = player.getInventory(); + if (clickType == ClickType.QUICK_CRAFT) { + int j1 = this.quickcraftStatus; + this.quickcraftStatus = getQuickcraftHeader(dragType); + if ((j1 != 1 || this.quickcraftStatus != 2) && j1 != this.quickcraftStatus) { + this.resetQuickCraft(); + } else if (this.getCarried().isEmpty()) { + this.resetQuickCraft(); + } else if (this.quickcraftStatus == 0) { + this.quickcraftType = getQuickcraftType(dragType); + if (isValidQuickcraftType(this.quickcraftType, player)) { + this.quickcraftStatus = 1; + this.quickcraftSlots.clear(); + } else { + this.resetQuickCraft(); + } + } else if (this.quickcraftStatus == 1) { + Slot slot7 = this.slots.get(slotId); + ItemStack itemstack12 = this.getCarried(); + if (canItemQuickReplace(slot7, itemstack12, true) && slot7.mayPlace(itemstack12) && (this.quickcraftType == 2 || itemstack12.getCount() > this.quickcraftSlots.size()) && this.canDragTo(slot7)) { + this.quickcraftSlots.add(slot7); + } + } else if (this.quickcraftStatus == 2) { + if (!this.quickcraftSlots.isEmpty()) { + if (false && this.quickcraftSlots.size() == 1) { + int l = (this.quickcraftSlots.iterator().next()).index; + this.resetQuickCraft(); + this.doClick(l, this.quickcraftType, ClickType.PICKUP, player); + return; + } + ItemStack itemstack9 = this.getCarried().copy(); + int k1 = this.getCarried().getCount(); + + Map draggedSlots = new HashMap<>(); + + for (Slot slot8 : this.quickcraftSlots) { + ItemStack itemstack13 = this.getCarried(); + if (slot8 != null && canItemQuickReplace(slot8, itemstack13, true) && slot8.mayPlace(itemstack13) && (this.quickcraftType == 2 || itemstack13.getCount() >= this.quickcraftSlots.size()) && this.canDragTo(slot8)) { + ItemStack itemstack14 = itemstack9.copy(); + int j3 = slot8.hasItem() ? slot8.getItem().getCount() : 0; + getQuickCraftSlotCount(this.quickcraftSlots, this.quickcraftType, itemstack14, j3); + int k3 = Math.min(itemstack14.getMaxStackSize(), slot8.getMaxStackSize(itemstack14)); + if (itemstack14.getCount() > k3) { + itemstack14.setCount(k3); + } + + k1 -= itemstack14.getCount() - j3; + // slot8.set(itemstack14); + draggedSlots.put(slot8.index, itemstack14); + } + } + + InventoryView view = this.getBukkitView(); + org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack9); + newcursor.setAmount(k1); + Map eventmap = new HashMap<>(); + for (Map.Entry ditem : draggedSlots.entrySet()) { + eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); + } + ItemStack oldCursor = this.getCarried(); + this.setCarried(CraftItemStack.asNMSCopy(newcursor)); + InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.quickcraftType == 1, eventmap); + Bukkit.getPluginManager().callEvent(event); + boolean needsUpdate = event.getResult() != Event.Result.DEFAULT; + if (event.getResult() != Event.Result.DENY) { + for (Map.Entry dslot : draggedSlots.entrySet()) { + view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); + } + if (this.getCarried() != null) { + this.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); + needsUpdate = true; + } + } else { + this.setCarried(oldCursor); + } + if (needsUpdate && player instanceof ServerPlayer) { + this.sendAllDataToRemote(); + } + } + this.resetQuickCraft(); + } else { + this.resetQuickCraft(); + } + } else if (this.quickcraftStatus != 0) { + this.resetQuickCraft(); + } else if ((clickType == ClickType.PICKUP || clickType == ClickType.QUICK_MOVE) && (dragType == 0 || dragType == 1)) { + ClickAction clickaction = dragType == 0 ? ClickAction.PRIMARY : ClickAction.SECONDARY; + if (slotId == -999) { + if (!this.getCarried().isEmpty()) { + if (clickaction == ClickAction.PRIMARY) { + ItemStack carried = this.getCarried(); + this.setCarried(ItemStack.EMPTY); + player.drop(carried, true); + } else { + player.drop(this.getCarried().split(1), true); + } + } + } else if (clickType == ClickType.QUICK_MOVE) { + if (slotId < 0) { + return; + } + + Slot slot6 = this.slots.get(slotId); + if (!slot6.mayPickup(player)) { + return; + } + + for (ItemStack itemstack9 = this.quickMoveStack(player, slotId); !itemstack9.isEmpty() && ItemStack.isSame(slot6.getItem(), itemstack9); itemstack9 = this.quickMoveStack(player, slotId)) { + } + } else { + if (slotId < 0) { + return; + } + + Slot slot7 = this.slots.get(slotId); + ItemStack itemstack10 = slot7.getItem(); + ItemStack itemstack11 = this.getCarried(); + player.updateTutorialInventoryAction(itemstack11, slot7.getItem(), clickaction); + if (!itemstack11.overrideStackedOnOther(slot7, clickaction, player) && !itemstack10.overrideOtherStackedOnMe(itemstack11, slot7, clickaction, player, this.createCarriedSlotAccess())) { + if (itemstack10.isEmpty()) { + if (!itemstack11.isEmpty()) { + int l2 = clickaction == ClickAction.PRIMARY ? itemstack11.getCount() : 1; + this.setCarried(slot7.safeInsert(itemstack11, l2)); + } + } else if (slot7.mayPickup(player)) { + if (itemstack11.isEmpty()) { + int i3 = clickaction == ClickAction.PRIMARY ? itemstack10.getCount() : (itemstack10.getCount() + 1) / 2; + Optional optional1 = slot7.tryRemove(i3, Integer.MAX_VALUE, player); + optional1.ifPresent((p_150421_) -> { + this.setCarried(p_150421_); + slot7.onTake(player, p_150421_); + }); + } else if (slot7.mayPlace(itemstack11)) { + if (ItemStack.isSameItemSameTags(itemstack10, itemstack11)) { + int j3 = clickaction == ClickAction.PRIMARY ? itemstack11.getCount() : 1; + this.setCarried(slot7.safeInsert(itemstack11, j3)); + } else if (itemstack11.getCount() <= slot7.getMaxStackSize(itemstack11)) { + slot7.set(itemstack11); + this.setCarried(itemstack10); + } + } else if (ItemStack.isSameItemSameTags(itemstack10, itemstack11)) { + Optional optional = slot7.tryRemove(itemstack10.getCount(), itemstack11.getMaxStackSize() - itemstack11.getCount(), player); + optional.ifPresent((p_150428_) -> { + itemstack11.grow(p_150428_.getCount()); + slot7.onTake(player, p_150428_); + }); + } + } + } + + slot7.setChanged(); + + if (player instanceof ServerPlayer && slot7.getMaxStackSize() != 64) { + ((ServerPlayer) player).connection.send(new ClientboundContainerSetSlotPacket(this.containerId, this.incrementStateId(), slot7.index, slot7.getItem())); + // Updating a crafting inventory makes the client reset the result slot, have to send it again + if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { + ((ServerPlayer) player).connection.send(new ClientboundContainerSetSlotPacket(this.containerId, this.incrementStateId(), 0, this.getSlot(0).getItem())); + } + } + } + } else if (clickType == ClickType.SWAP) { + Slot slot2 = this.slots.get(slotId); + ItemStack itemstack4 = inventory.getItem(dragType); + ItemStack itemstack7 = slot2.getItem(); + if (!itemstack4.isEmpty() || !itemstack7.isEmpty()) { + if (itemstack4.isEmpty()) { + if (slot2.mayPickup(player)) { + inventory.setItem(dragType, itemstack7); + ((SlotBridge) slot2).bridge$onSwapCraft(itemstack7.getCount()); + slot2.set(ItemStack.EMPTY); + slot2.onTake(player, itemstack7); + } + } else if (itemstack7.isEmpty()) { + if (slot2.mayPlace(itemstack4)) { + int l1 = slot2.getMaxStackSize(itemstack4); + if (itemstack4.getCount() > l1) { + slot2.set(itemstack4.split(l1)); + } else { + slot2.set(itemstack4); + inventory.setItem(dragType, ItemStack.EMPTY); + } + } + } else if (slot2.mayPickup(player) && slot2.mayPlace(itemstack4)) { + int i2 = slot2.getMaxStackSize(itemstack4); + if (itemstack4.getCount() > i2) { + slot2.set(itemstack4.split(i2)); + slot2.onTake(player, itemstack7); + if (!inventory.add(itemstack7)) { + player.drop(itemstack7, true); + } + } else { + slot2.set(itemstack4); + inventory.setItem(dragType, itemstack7); + slot2.onTake(player, itemstack7); + } + } + } + } else if (clickType == ClickType.CLONE && player.getAbilities().instabuild && this.getCarried().isEmpty() && slotId >= 0) { + Slot slot5 = this.slots.get(slotId); + if (slot5.hasItem()) { + ItemStack itemstack6 = slot5.getItem().copy(); + itemstack6.setCount(itemstack6.getMaxStackSize()); + this.setCarried(itemstack6); + } + } else if (clickType == ClickType.THROW && this.getCarried().isEmpty() && slotId >= 0) { + Slot slot4 = this.slots.get(slotId); + int i1 = dragType == 0 ? 1 : slot4.getItem().getCount(); + ItemStack itemstack8 = slot4.safeTake(i1, Integer.MAX_VALUE, player); + player.drop(itemstack8, true); + } else if (clickType == ClickType.PICKUP_ALL && slotId >= 0) { + Slot slot3 = this.slots.get(slotId); + ItemStack itemstack5 = this.getCarried(); + if (!itemstack5.isEmpty() && (!slot3.hasItem() || !slot3.mayPickup(player))) { + int k1 = dragType == 0 ? 0 : this.slots.size() - 1; + int j2 = dragType == 0 ? 1 : -1; + + for (int k2 = 0; k2 < 2; ++k2) { + for (int k3 = k1; k3 >= 0 && k3 < this.slots.size() && itemstack5.getCount() < itemstack5.getMaxStackSize(); k3 += j2) { + Slot slot8 = this.slots.get(k3); + if (slot8.hasItem() && canItemQuickReplace(slot8, itemstack5, true) && slot8.mayPickup(player) && this.canTakeItemForPickAll(itemstack5, slot8)) { + ItemStack itemstack12 = slot8.getItem(); + if (k2 != 0 || itemstack12.getCount() != itemstack12.getMaxStackSize()) { + ItemStack itemstack13 = slot8.safeTake(itemstack12.getCount(), itemstack5.getMaxStackSize() - itemstack5.getCount(), player); + itemstack5.grow(itemstack13.getCount()); + } + } + } + } + } + } + + } + + /** + * @author IzzelAliz + * @reason + */ + @Overwrite + public void removed(Player player) { + if (player instanceof ServerPlayer) { + ItemStack itemstack = this.getCarried(); + + if (!itemstack.isEmpty()) { + this.setCarried(ItemStack.EMPTY); // CraftBukkit - SPIGOT-4556 - from below + if (player.isAlive() && !((ServerPlayer) player).hasDisconnected()) { + player.getInventory().placeItemBackInInventory(itemstack); + } else { + player.drop(itemstack, false); + } + // this.setCarried(ItemStack.EMPTY); // CraftBukkit - moved up + } + } + } + + @Override + public boolean bridge$isCheckReachable() { + return checkReachable; + } + + @Override + public InventoryView bridge$getBukkitView() { + return getBukkitView(); + } + + @Override + public void bridge$transferTo(AbstractContainerMenu other, CraftHumanEntity player) { + transferTo(other, player); + } + + @Override + public Component bridge$getTitle() { + return getTitle(); + } + + @Override + public void bridge$setTitle(Component title) { + setTitle(title); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractFurnaceContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractFurnaceContainerMixin.java index d917de25..23c83439 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractFurnaceContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/AbstractFurnaceContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.Container; @@ -23,7 +23,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(AbstractFurnaceMenu.class) -public abstract class AbstractFurnaceContainerMixin extends ContainerMixin { +public abstract class AbstractFurnaceContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container container; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/BeaconContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/BeaconContainerMixin.java index 4edaf0ab..63fd1964 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BeaconContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/BeaconContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.Container; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BeaconMenu.class) -public abstract class BeaconContainerMixin extends ContainerMixin { +public abstract class BeaconContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container beacon; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/BrewingStandContainerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/BrewingStandContainerMixin.java index 599c4213..ec3900fb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/BrewingStandContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/BrewingStandContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.Container; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(BrewingStandMenu.class) -public abstract class BrewingStandContainerMixin extends ContainerMixin { +public abstract class BrewingStandContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container brewingStand; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainer1Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainer1Mixin.java similarity index 77% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainer1Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainer1Mixin.java index bae2e7ed..8973b6cc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainer1Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainer1Mixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/CartographyTableMenu$1") public abstract class CartographyContainer1Mixin implements IInventoryBridge { - @Shadow(aliases = {"this$0", "field_213911_a"}, remap = false) private CartographyTableMenu outerThis; + @Shadow(aliases = {"this$0", "f_39177_"}, remap = false) private CartographyTableMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainer2Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainer2Mixin.java similarity index 77% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainer2Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainer2Mixin.java index 736aad9a..1dacaae6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainer2Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainer2Mixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/CartographyTableMenu$2") public abstract class CartographyContainer2Mixin implements IInventoryBridge { - @Shadow(aliases = {"this$0", "field_213924_a"}, remap = false) private CartographyTableMenu outerThis; + @Shadow(aliases = {"this$0", "f_39182_"}, remap = false) private CartographyTableMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainerMixin.java index 13cf50cf..fb2ee764 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/CartographyContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CartographyContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(CartographyTableMenu.class) -public abstract class CartographyContainerMixin extends ContainerMixin implements PosContainerBridge { +public abstract class CartographyContainerMixin extends AbstractContainerMenuMixin implements PosContainerBridge { // @formatter:off @Shadow @Final private ContainerLevelAccess access; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ChestContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ChestContainerMixin.java index 74a2dab8..44c136e1 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ChestContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ChestContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.CompoundContainer; @@ -21,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ChestMenu.class) -public abstract class ChestContainerMixin extends ContainerMixin { +public abstract class ChestContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container container; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerTypeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ContainerTypeMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerTypeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ContainerTypeMixin.java index 9f0b2285..957e9bdd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ContainerTypeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ContainerTypeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.container.LecternContainerBridge; import net.minecraft.core.Registry; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/CraftResultInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftResultInventoryMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/CraftResultInventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftResultInventoryMixin.java index 2e67a63c..fc0a652a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/CraftResultInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftResultInventoryMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import org.bukkit.Location; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/CraftingInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftingInventoryMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/CraftingInventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftingInventoryMixin.java index aa5eff46..26c5249e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/CraftingInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftingInventoryMixin.java @@ -1,9 +1,16 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.CraftingInventoryBridge; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; +import net.minecraft.core.NonNullList; +import net.minecraft.world.Container; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.CraftingContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; import org.bukkit.Location; import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; import org.bukkit.entity.HumanEntity; @@ -15,13 +22,6 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.ArrayList; import java.util.List; -import net.minecraft.core.NonNullList; -import net.minecraft.world.Container; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.CraftingContainer; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; @Mixin(CraftingContainer.class) public abstract class CraftingInventoryMixin implements CraftingInventoryBridge, Container { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftingMenuMixin.java similarity index 62% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftingMenuMixin.java index 83c9295b..65efed49 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/WorkbenchContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/CraftingMenuMixin.java @@ -1,27 +1,10 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.CraftingInventoryBridge; import io.izzel.arclight.common.bridge.inventory.container.ContainerBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; import io.izzel.arclight.common.mod.util.ArclightCaptures; -import org.bukkit.craftbukkit.v.event.CraftEventFactory; -import org.bukkit.craftbukkit.v.inventory.CraftInventoryCrafting; -import org.bukkit.craftbukkit.v.inventory.CraftInventoryView; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.gen.Accessor; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.Optional; -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -31,13 +14,27 @@ import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.inventory.CraftingMenu; import net.minecraft.world.inventory.ResultContainer; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.CraftingRecipe; -import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.crafting.RepairItemRecipe; import net.minecraft.world.level.Level; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.craftbukkit.v.inventory.CraftInventoryCrafting; +import org.bukkit.craftbukkit.v.inventory.CraftInventoryView; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Optional; -// todo 实现 @Mixin(CraftingMenu.class) -public abstract class WorkbenchContainerMixin extends ContainerMixin implements PosContainerBridge { +public abstract class CraftingMenuMixin extends AbstractContainerMenuMixin implements PosContainerBridge { // @formatter:off @Mutable @Shadow @Final private CraftingContainer craftSlots; @@ -53,39 +50,22 @@ public abstract class WorkbenchContainerMixin extends ContainerMixin implements if (!bridge$isCheckReachable()) cir.setReturnValue(true); } - private static void a(int id, Level world, Player player, CraftingContainer inventory, ResultContainer inventoryResult, AbstractContainerMenu container) { - ArclightCaptures.captureWorkbenchContainer(container); - slotChangedCraftingGrid(id, world, player, inventory, inventoryResult); - } - @Inject(method = "slotsChanged", at = @At("HEAD")) public void arclight$capture(Container inventoryIn, CallbackInfo ci) { ArclightCaptures.captureWorkbenchContainer((CraftingMenu) (Object) this); } - /** - * @author IzzelAliz - * @reason - */ - @Overwrite - public static void slotChangedCraftingGrid(int i, Level world, Player playerEntity, CraftingContainer inventory, ResultContainer resultInventory) { - AbstractContainerMenu container = ArclightCaptures.getWorkbenchContainer(); - if (!world.isClientSide) { - ServerPlayer serverplayerentity = (ServerPlayer) playerEntity; - ItemStack itemstack = ItemStack.EMPTY; - Optional optional = world.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, inventory, world); - if (optional.isPresent()) { - CraftingRecipe icraftingrecipe = optional.get(); - if (resultInventory.setRecipeUsed(world, serverplayerentity, icraftingrecipe)) { - itemstack = icraftingrecipe.assemble(inventory); - } - } + private static transient boolean arclight$isRepair; - itemstack = CraftEventFactory.callPreCraftEvent(inventory, resultInventory, itemstack, ((ContainerBridge) container).bridge$getBukkitView(), false); + @Redirect(method = "slotChangedCraftingGrid", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Optional;isPresent()Z")) + private static boolean arclight$testRepair(Optional optional) { + arclight$isRepair = optional.orElse(null) instanceof RepairItemRecipe; + return optional.isPresent(); + } - resultInventory.setItem(0, itemstack); - serverplayerentity.connection.send(new ClientboundContainerSetSlotPacket(i, 0, itemstack)); - } + @ModifyVariable(method = "slotChangedCraftingGrid", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/inventory/ResultContainer;setItem(ILnet/minecraft/world/item/ItemStack;)V")) + private static ItemStack arclight$preCraft(ItemStack stack, AbstractContainerMenu container, Level level, Player player, CraftingContainer craftingContainer, ResultContainer resultContainer) { + return CraftEventFactory.callPreCraftEvent(craftingContainer, resultContainer, stack, ((ContainerBridge) container).bridge$getBukkitView(), arclight$isRepair); } @Inject(method = "(ILnet/minecraft/world/entity/player/Inventory;Lnet/minecraft/world/inventory/ContainerLevelAccess;)V", at = @At("RETURN")) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/DispenserContainerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/DispenserContainerMixin.java index 5307c3ae..86c3ec9e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/DispenserContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/DispenserContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.Container; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(DispenserMenu.class) -public abstract class DispenserContainerMixin extends ContainerMixin { +public abstract class DispenserContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final public Container dispenser; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainer1Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainer1Mixin.java similarity index 59% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainer1Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainer1Mixin.java index 7adc8122..1691a02e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainer1Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainer1Mixin.java @@ -1,16 +1,16 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.world.inventory.EnchantmentMenu; import org.bukkit.Location; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/EnchantmentMenu$1") -public abstract class EnchantmentContainer1Mixin extends InventoryMixin { +public abstract class EnchantmentContainer1Mixin extends SimpleContainerMixin { - @Shadow(aliases = {"this$0", "field_70484_a"}, remap = false) private EnchantmentMenu outerThis; + @Shadow(aliases = {"this$0", "f_39494_"}, remap = false) private EnchantmentMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainerMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainerMixin.java index c4db62ca..e606cf84 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/EnchantmentContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnchantmentContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; @@ -51,7 +51,7 @@ import java.util.Map; import java.util.Random; @Mixin(EnchantmentMenu.class) -public abstract class EnchantmentContainerMixin extends ContainerMixin implements PosContainerBridge { +public abstract class EnchantmentContainerMixin extends AbstractContainerMenuMixin implements PosContainerBridge { // @formatter:off @Shadow @Final private Container enchantSlots; @@ -185,9 +185,9 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement ItemStack itemstack = this.enchantSlots.getItem(0); ItemStack itemstack1 = this.enchantSlots.getItem(1); int i = id + 1; - if ((itemstack1.isEmpty() || itemstack1.getCount() < i) && !playerIn.abilities.instabuild) { + if ((itemstack1.isEmpty() || itemstack1.getCount() < i) && !playerIn.getAbilities().instabuild) { return false; - } else if (this.costs[id] <= 0 || itemstack.isEmpty() || (playerIn.experienceLevel < i || playerIn.experienceLevel < this.costs[id]) && !playerIn.abilities.instabuild) { + } else if (this.costs[id] <= 0 || itemstack.isEmpty() || (playerIn.experienceLevel < i || playerIn.experienceLevel < this.costs[id]) && !playerIn.getAbilities().instabuild) { return false; } else { this.access.execute((p_217003_6_, p_217003_7_) -> { @@ -207,7 +207,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement Bukkit.getPluginManager().callEvent(event); int level = event.getExpLevelCost(); - if (event.isCancelled() || (level > playerIn.experienceLevel && !playerIn.abilities.instabuild) || event.getEnchantsToAdd().isEmpty()) { + if (event.isCancelled() || (level > playerIn.experienceLevel && !playerIn.getAbilities().instabuild) || event.getEnchantsToAdd().isEmpty()) { return; } @@ -242,7 +242,7 @@ public abstract class EnchantmentContainerMixin extends ContainerMixin implement } playerIn.onEnchantmentPerformed(itemstack, i); - if (!playerIn.abilities.instabuild) { + if (!playerIn.getAbilities().instabuild) { itemstack1.shrink(i); if (itemstack1.isEmpty()) { this.enchantSlots.setItem(1, ItemStack.EMPTY); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/EnderChestInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnderChestInventoryMixin.java similarity index 87% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/EnderChestInventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnderChestInventoryMixin.java index 929688c9..9ec033cb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/EnderChestInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/EnderChestInventoryMixin.java @@ -1,7 +1,8 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.PlayerEnderChestContainer; @@ -15,7 +16,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(PlayerEnderChestContainer.class) -public abstract class EnderChestInventoryMixin extends InventoryMixin implements IInventoryBridge, Container { +public abstract class EnderChestInventoryMixin extends SimpleContainerMixin implements IInventoryBridge, Container { // @formatter:off @Shadow private EnderChestBlockEntity activeChest; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/FurnaceResultSlotMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/FurnaceResultSlotMixin.java similarity index 73% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/FurnaceResultSlotMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/FurnaceResultSlotMixin.java index c87d37a3..3c422732 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/FurnaceResultSlotMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/FurnaceResultSlotMixin.java @@ -1,14 +1,14 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; +import io.izzel.arclight.common.bridge.tileentity.AbstractFurnaceTileEntityBridge; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.inventory.FurnaceResultSlot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import io.izzel.arclight.common.bridge.tileentity.AbstractFurnaceTileEntityBridge; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.FurnaceResultSlot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.entity.AbstractFurnaceBlockEntity; @Mixin(FurnaceResultSlot.class) public class FurnaceResultSlotMixin { @@ -17,8 +17,8 @@ public class FurnaceResultSlotMixin { @Shadow private int removeCount; // @formatter:on - @Redirect(method = "checkTakeAchievements(Lnet/minecraft/world/item/ItemStack;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;awardUsedRecipesAndPopExperience(Lnet/minecraft/world/entity/player/Player;)V")) - public void arclight$furnaceDropExp(AbstractFurnaceBlockEntity furnace, Player playerEntity, ItemStack stack) { - ((AbstractFurnaceTileEntityBridge) furnace).bridge$dropExp(playerEntity.level, playerEntity.position(), playerEntity, stack, this.removeCount); + @Redirect(method = "checkTakeAchievements(Lnet/minecraft/world/item/ItemStack;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity;awardUsedRecipesAndPopExperience(Lnet/minecraft/server/level/ServerPlayer;)V")) + public void arclight$furnaceDropExp(AbstractFurnaceBlockEntity furnace, ServerPlayer player, ItemStack stack) { + ((AbstractFurnaceTileEntityBridge) furnace).bridge$dropExp(player.level, player.position(), player, stack, this.removeCount); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainer1Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainer1Mixin.java similarity index 59% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainer1Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainer1Mixin.java index 2b88f7b2..a62e116d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainer1Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainer1Mixin.java @@ -1,16 +1,16 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.world.inventory.GrindstoneMenu; import org.bukkit.Location; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/GrindstoneMenu$1") -public abstract class GrindstoneContainer1Mixin extends InventoryMixin { +public abstract class GrindstoneContainer1Mixin extends SimpleContainerMixin { - @Shadow(aliases = {"this$0", "field_213912_a"}, remap = false) private GrindstoneMenu outerThis; + @Shadow(aliases = {"this$0", "f_39594_"}, remap = false) private GrindstoneMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainerMixin.java similarity index 90% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainerMixin.java index 10e53f2b..cca98f19 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/GrindstoneContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/GrindstoneContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -17,9 +17,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GrindstoneMenu.class) -public abstract class GrindstoneContainerMixin extends ContainerMixin implements PosContainerBridge { +public abstract class GrindstoneContainerMixin extends AbstractContainerMenuMixin implements PosContainerBridge { - @Shadow @Final private Container repairSlots; + @Shadow @Final Container repairSlots; @Shadow @Final private Container resultSlots; @Shadow @Final private ContainerLevelAccess access; private CraftInventoryView bukkitEntity = null; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/HopperContainerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/HopperContainerMixin.java index 4d4407dc..742f6ac5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HopperContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/HopperContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.Container; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(HopperMenu.class) -public abstract class HopperContainerMixin extends ContainerMixin { +public abstract class HopperContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container hopper; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/HorseInventoryContainerMixin.java similarity index 91% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/HorseInventoryContainerMixin.java index 4979acda..71885bd6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/HorseInventoryContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/HorseInventoryContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(HorseInventoryMenu.class) -public abstract class HorseInventoryContainerMixin extends ContainerMixin { +public abstract class HorseInventoryContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container horseContainer; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractRepairContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ItemCombinerMixin.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractRepairContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ItemCombinerMixin.java index 38563023..52dd5046 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/AbstractRepairContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ItemCombinerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import net.minecraft.world.Container; import net.minecraft.world.entity.player.Player; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ItemCombinerMenu.class) -public abstract class AbstractRepairContainerMixin extends ContainerMixin { +public abstract class ItemCombinerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final protected ContainerLevelAccess access; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LecternContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LecternContainerMixin.java index bc3ab437..1423a9c5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LecternContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LecternContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.container.LecternContainerBridge; @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LecternMenu.class) -public abstract class LecternContainerMixin extends ContainerMixin implements LecternContainerBridge { +public abstract class LecternContainerMixin extends AbstractContainerMenuMixin implements LecternContainerBridge { // @formatter:off @Shadow @Final private Container lectern; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainer1Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainer1Mixin.java similarity index 59% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainer1Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainer1Mixin.java index 2bca216d..7ae1bee4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainer1Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainer1Mixin.java @@ -1,16 +1,16 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.world.inventory.LoomMenu; import org.bukkit.Location; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/LoomMenu$1") -public abstract class LoomContainer1Mixin extends InventoryMixin { +public abstract class LoomContainer1Mixin extends SimpleContainerMixin { - @Shadow(aliases = {"this$0", "field_213913_a"}, remap = false) private LoomMenu outerThis; + @Shadow(aliases = {"this$0", "f_39900_"}, remap = false) private LoomMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainer2Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainer2Mixin.java similarity index 59% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainer2Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainer2Mixin.java index fa8b9e7f..65038936 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainer2Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainer2Mixin.java @@ -1,16 +1,16 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.world.inventory.LoomMenu; import org.bukkit.Location; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/LoomMenu$2") -public abstract class LoomContainer2Mixin extends InventoryMixin { +public abstract class LoomContainer2Mixin extends SimpleContainerMixin { - @Shadow(aliases = {"this$0", "field_213914_a"}, remap = false) private LoomMenu outerThis; + @Shadow(aliases = {"this$0", "f_39905_"}, remap = false) private LoomMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainerMixin.java index d730f2ce..4818998d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/LoomContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/LoomContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(LoomMenu.class) -public abstract class LoomContainerMixin extends ContainerMixin implements PosContainerBridge { +public abstract class LoomContainerMixin extends AbstractContainerMenuMixin implements PosContainerBridge { // @formatter:off @Shadow @Final private Container inputContainer; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/MerchantContainerMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/MerchantContainerMixin.java index 8c8f3ebb..ab812a89 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/MerchantContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/MerchantContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.entity.Entity; @@ -17,7 +17,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(MerchantMenu.class) -public abstract class MerchantContainerMixin extends ContainerMixin { +public abstract class MerchantContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Merchant trader; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/MerchantInventoryMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/MerchantInventoryMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/MerchantInventoryMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/MerchantInventoryMixin.java index d8889cb3..e4dfcaaf 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/MerchantInventoryMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/MerchantInventoryMixin.java @@ -1,7 +1,14 @@ -package io.izzel.arclight.common.mixin.core.inventory; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; +import net.minecraft.core.NonNullList; +import net.minecraft.world.Container; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.inventory.MerchantContainer; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.trading.Merchant; import org.bukkit.Location; import org.bukkit.craftbukkit.v.entity.CraftAbstractVillager; import org.bukkit.craftbukkit.v.entity.CraftHumanEntity; @@ -13,13 +20,6 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.ArrayList; import java.util.List; -import net.minecraft.core.NonNullList; -import net.minecraft.world.Container; -import net.minecraft.world.entity.npc.AbstractVillager; -import net.minecraft.world.inventory.MerchantContainer; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.trading.Merchant; @Mixin(MerchantContainer.class) public abstract class MerchantInventoryMixin implements IInventoryBridge, Container { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/PlayerContainerMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/PlayerContainerMixin.java index a947bc72..a61773ec 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/PlayerContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/PlayerContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.CraftingInventoryBridge; @@ -21,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(InventoryMenu.class) -public abstract class PlayerContainerMixin extends ContainerMixin { +public abstract class PlayerContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private CraftingContainer craftSlots; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/RepairContainerMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/RepairContainerMixin.java index f0899a09..a90163b9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/RepairContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/RepairContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.util.IWorldPosCallableBridge; @@ -25,7 +25,7 @@ import org.spongepowered.asm.mixin.Shadow; import java.util.Map; @Mixin(AnvilMenu.class) -public abstract class RepairContainerMixin extends AbstractRepairContainerMixin { +public abstract class RepairContainerMixin extends ItemCombinerMixin { // @formatter:off @Shadow @Final public DataSlot cost; @@ -116,7 +116,7 @@ public abstract class RepairContainerMixin extends AbstractRepairContainerMixin int j2 = map1.get(enchantment1); j2 = i2 == j2 ? j2 + 1 : Math.max(j2, i2); boolean flag1 = enchantment1.canEnchant(itemstack); - if (this.player.abilities.instabuild || itemstack.getItem() == Items.ENCHANTED_BOOK) { + if (this.player.getAbilities().instabuild || itemstack.getItem() == Items.ENCHANTED_BOOK) { flag1 = true; } @@ -194,7 +194,7 @@ public abstract class RepairContainerMixin extends AbstractRepairContainerMixin this.cost.set(maximumRepairCost - 1); } - if (this.cost.get() >= maximumRepairCost && !this.player.abilities.instabuild) { + if (this.cost.get() >= maximumRepairCost && !this.player.getAbilities().instabuild) { itemstack1 = ItemStack.EMPTY; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ShulkerBoxContainerMixin.java similarity index 91% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ShulkerBoxContainerMixin.java index 6f9f3a58..7763e56d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/ShulkerBoxContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/ShulkerBoxContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import net.minecraft.world.Container; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ShulkerBoxMenu.class) -public abstract class ShulkerBoxContainerMixin extends ContainerMixin { +public abstract class ShulkerBoxContainerMixin extends AbstractContainerMenuMixin { // @formatter:off @Shadow @Final private Container container; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SlotMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/SlotMixin.java similarity index 88% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SlotMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/SlotMixin.java index 4e893e82..31957abd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SlotMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/SlotMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.container.SlotBridge; import net.minecraft.world.inventory.Slot; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SmithingTableContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/SmithingTableContainerMixin.java similarity index 91% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SmithingTableContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/SmithingTableContainerMixin.java index 10cd39ab..2d8ba321 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/SmithingTableContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/SmithingTableContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.util.IWorldPosCallableBridge; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(SmithingMenu.class) -public abstract class SmithingTableContainerMixin extends AbstractRepairContainerMixin { +public abstract class SmithingTableContainerMixin extends ItemCombinerMixin { private CraftInventoryView bukkitEntity; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainer1Mixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainer1Mixin.java similarity index 78% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainer1Mixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainer1Mixin.java index 31b5cb2e..c1fcd54e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainer1Mixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainer1Mixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.inventory.IInventoryBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.Shadow; @Mixin(targets = "net/minecraft/world/inventory/StonecutterMenu$1") public abstract class StonecutterContainer1Mixin implements IInventoryBridge { - @Shadow(aliases = {"this$0", "field_213915_a"}, remap = false) private StonecutterMenu outerThis; + @Shadow(aliases = {"this$0", "f_40344_"}, remap = false) private StonecutterMenu outerThis; @Override public Location getLocation() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainerMixin.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainerMixin.java index 1e42cae2..25e2a76d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/inventory/container/StonecutterContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/inventory/StonecutterContainerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.inventory.container; +package io.izzel.arclight.common.mixin.core.world.inventory; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; import io.izzel.arclight.common.bridge.inventory.container.PosContainerBridge; @@ -18,7 +18,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(StonecutterMenu.class) -public abstract class StonecutterContainerMixin extends ContainerMixin implements PosContainerBridge { +public abstract class StonecutterContainerMixin extends AbstractContainerMenuMixin implements PosContainerBridge { // @formatter:off @Shadow @Final public Container container; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ArmorStandItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ArmorStandItemMixin.java similarity index 88% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ArmorStandItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ArmorStandItemMixin.java index ba8c142d..f0973eea 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ArmorStandItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ArmorStandItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.decoration.ArmorStand; @@ -22,7 +22,7 @@ public class ArmorStandItemMixin { arclight$entity = armorStandEntity; } - @Inject(method = "useOn", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;addFreshEntity(Lnet/minecraft/world/entity/Entity;)Z")) + @Inject(method = "useOn", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerLevel;addFreshEntityWithPassengers(Lnet/minecraft/world/entity/Entity;)V")) public void arclight$entityPlace(UseOnContext context, CallbackInfoReturnable cir) { if (CraftEventFactory.callEntityPlaceEvent(context, arclight$entity).isCancelled()) { cir.setReturnValue(InteractionResult.FAIL); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BlockItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BlockItemMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BlockItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BlockItemMixin.java index d9ead635..71422d38 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BlockItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BlockItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.core.BlockPos; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BoatItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BoatItemMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BoatItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BoatItemMixin.java index e33d4b8d..1daaba92 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BoatItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BoatItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import net.minecraft.stats.Stats; import net.minecraft.world.InteractionHand; @@ -74,7 +74,7 @@ public class BoatItemMixin extends Item { Boat boatentity = new Boat(worldIn, result.getLocation().x, result.getLocation().y, result.getLocation().z); boatentity.setType(this.type); - boatentity.yRot = playerIn.yRot; + boatentity.setYRot(playerIn.getYRot()); if (!worldIn.noCollision(boatentity, boatentity.getBoundingBox().inflate(-0.1D))) { return new InteractionResultHolder<>(InteractionResult.FAIL, itemstack); } else { @@ -86,7 +86,7 @@ public class BoatItemMixin extends Item { return new InteractionResultHolder<>(InteractionResult.PASS, itemstack); } - if (!playerIn.abilities.instabuild) { + if (!playerIn.getAbilities().instabuild) { itemstack.shrink(1); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BowItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BowItemMixin.java similarity index 85% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BowItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BowItemMixin.java index f5d7e1f3..9ffd4ab4 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BowItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BowItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; @@ -44,7 +44,7 @@ public abstract class BowItemMixin extends ProjectileWeaponItem { public void releaseUsing(ItemStack stack, Level worldIn, LivingEntity entityLiving, int timeLeft) { if (entityLiving instanceof Player) { Player playerentity = (Player) entityLiving; - boolean flag = playerentity.abilities.instabuild || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.INFINITY_ARROWS, stack) > 0; + boolean flag = playerentity.getAbilities().instabuild || EnchantmentHelper.getItemEnchantmentLevel(Enchantments.INFINITY_ARROWS, stack) > 0; ItemStack itemstack = playerentity.getProjectile(stack); int i = this.getUseDuration(stack) - timeLeft; @@ -58,12 +58,12 @@ public abstract class BowItemMixin extends ProjectileWeaponItem { float f = getPowerForTime(i); if (!((double) f < 0.1D)) { - boolean flag1 = playerentity.abilities.instabuild || (itemstack.getItem() instanceof ArrowItem && ((ArrowItem) itemstack.getItem()).isInfinite(itemstack, stack, playerentity)); + boolean flag1 = playerentity.getAbilities().instabuild || (itemstack.getItem() instanceof ArrowItem && ((ArrowItem) itemstack.getItem()).isInfinite(itemstack, stack, playerentity)); if (!worldIn.isClientSide) { ArrowItem arrowitem = (ArrowItem) (itemstack.getItem() instanceof ArrowItem ? itemstack.getItem() : Items.ARROW); AbstractArrow abstractarrowentity = arrowitem.createArrow(worldIn, itemstack, playerentity); abstractarrowentity = customArrow(abstractarrowentity); - abstractarrowentity.shootFromRotation(playerentity, playerentity.xRot, playerentity.yRot, 0.0F, f * 3.0F, 1.0F); + abstractarrowentity.shootFromRotation(playerentity, playerentity.getXRot(), playerentity.getYRot(), 0.0F, f * 3.0F, 1.0F); if (f == 1.0F) { abstractarrowentity.setCritArrow(true); } @@ -92,7 +92,7 @@ public abstract class BowItemMixin extends ProjectileWeaponItem { stack.hurtAndBreak(1, playerentity, (player) -> { player.broadcastBreakEvent(playerentity.getUsedItemHand()); }); - if (flag1 || playerentity.abilities.instabuild && (itemstack.getItem() == Items.SPECTRAL_ARROW || itemstack.getItem() == Items.TIPPED_ARROW)) { + if (flag1 || playerentity.getAbilities().instabuild && (itemstack.getItem() == Items.SPECTRAL_ARROW || itemstack.getItem() == Items.TIPPED_ARROW)) { abstractarrowentity.pickup = AbstractArrow.Pickup.CREATIVE_ONLY; } @@ -106,11 +106,11 @@ public abstract class BowItemMixin extends ProjectileWeaponItem { } } - worldIn.playSound(null, playerentity.getX(), playerentity.getY(), playerentity.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, 1.0F / (random.nextFloat() * 0.4F + 1.2F) + f * 0.5F); - if (!flag1 && !playerentity.abilities.instabuild) { + worldIn.playSound(null, playerentity.getX(), playerentity.getY(), playerentity.getZ(), SoundEvents.ARROW_SHOOT, SoundSource.PLAYERS, 1.0F, 1.0F / (worldIn.getRandom().nextFloat() * 0.4F + 1.2F) + f * 0.5F); + if (!flag1 && !playerentity.getAbilities().instabuild) { itemstack.shrink(1); if (itemstack.isEmpty()) { - playerentity.inventory.removeItem(itemstack); + playerentity.getInventory().removeItem(itemstack); } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BucketItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java similarity index 78% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BucketItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java index fd037238..8de111d6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/BucketItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/BucketItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.core.BlockPos; @@ -15,7 +15,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BucketPickup; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.HitResult; import org.bukkit.craftbukkit.v.event.CraftEventFactory; @@ -36,15 +35,15 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; public abstract class BucketItemMixin { // @formatter:off - @Shadow public abstract boolean emptyBucket(@javax.annotation.Nullable Player player, Level worldIn, BlockPos posIn, @javax.annotation.Nullable BlockHitResult rayTrace); + @Shadow public abstract boolean emptyContents(@javax.annotation.Nullable Player player, Level worldIn, BlockPos posIn, @javax.annotation.Nullable BlockHitResult rayTrace); // @formatter:on - @Inject(method = "use", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/BucketPickup;takeLiquid(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/level/material/Fluid;")) + @Inject(method = "use", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/BucketPickup;pickupBlock(Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/world/item/ItemStack;")) private void arclight$bucketFill(Level worldIn, Player playerIn, InteractionHand handIn, CallbackInfoReturnable> cir, ItemStack stack, HitResult result) { BlockPos pos = ((BlockHitResult) result).getBlockPos(); BlockState state = worldIn.getBlockState(pos); - Fluid dummyFluid = ((BucketPickup) state.getBlock()).takeLiquid(DummyGeneratorAccess.INSTANCE, pos, state); - PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) worldIn, playerIn, pos, pos, ((BlockHitResult) result).getDirection(), stack, dummyFluid.getBucket()); + ItemStack dummyFluid = ((BucketPickup) state.getBlock()).pickupBlock(DummyGeneratorAccess.INSTANCE, pos, state); + PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent((ServerLevel) worldIn, playerIn, pos, pos, ((BlockHitResult) result).getDirection(), stack, dummyFluid.getItem()); if (event.isCancelled()) { ((ServerPlayer) playerIn).connection.send(new ClientboundBlockUpdatePacket(worldIn, pos)); ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().updateInventory(); @@ -54,7 +53,7 @@ public abstract class BucketItemMixin { } } - @Inject(method = "use", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BucketItem;emptyBucket(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;)Z")) + @Inject(method = "use", locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/BucketItem;emptyContents(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/phys/BlockHitResult;)Z")) private void arclight$capture(Level worldIn, Player playerIn, InteractionHand handIn, CallbackInfoReturnable> cir, ItemStack stack, HitResult result) { BlockHitResult blockRayTraceResult = (BlockHitResult) result; arclight$direction = blockRayTraceResult.getDirection(); @@ -72,7 +71,7 @@ public abstract class BucketItemMixin { private transient org.bukkit.inventory.@Nullable ItemStack arclight$captureItem; - @ModifyArg(method = "onItemRightClick", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/util/DrinkHelper;fill(Lnet/minecraft/item/ItemStack;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;)Lnet/minecraft/item/ItemStack;")) + @ModifyArg(method = "use", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemUtils;createFilledResult(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/world/item/ItemStack;")) private ItemStack arclight$useEventItem(ItemStack itemStack) { return arclight$captureItem == null ? itemStack : CraftItemStack.asNMSCopy(arclight$captureItem); } @@ -82,7 +81,7 @@ public abstract class BucketItemMixin { arclight$click = clicked; arclight$stack = itemstack; try { - return this.emptyBucket(entity, world, pos, result); + return this.emptyContents(entity, world, pos, result); } finally { arclight$direction = null; arclight$click = null; @@ -94,7 +93,7 @@ public abstract class BucketItemMixin { private transient BlockPos arclight$click; private transient ItemStack arclight$stack; - @Inject(method = "emptyBucket", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z")) + @Inject(method = "emptyContents", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/dimension/DimensionType;ultraWarm()Z")) private void arclight$bucketEmpty(Player player, Level worldIn, BlockPos posIn, BlockHitResult rayTrace, CallbackInfoReturnable cir) { if (player != null) { PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent((ServerLevel) worldIn, player, posIn, arclight$click, arclight$direction, arclight$stack); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ChorusFruitItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ChorusFruitItemMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ChorusFruitItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ChorusFruitItemMixin.java index d7b23706..36c02c31 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ChorusFruitItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ChorusFruitItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.server.level.ServerPlayer; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/CrossbowItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/CrossbowItemMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/CrossbowItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/CrossbowItemMixin.java index 36a08f8b..e3a65f11 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/CrossbowItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/CrossbowItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/DyeItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/DyeItemMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/DyeItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/DyeItemMixin.java index bdd39337..dcf649ac 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/DyeItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/DyeItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.LivingEntityBridge; import io.izzel.arclight.mixin.Eject; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EggItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EggItemMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EggItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EggItemMixin.java index 85c1d34a..a87a50a7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EggItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EggItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.mixin.Eject; @@ -39,7 +39,7 @@ public abstract class EggItemMixin extends Item { cir.setReturnValue(InteractionResultHolder.fail(playerIn.getItemInHand(handIn))); return false; } else { - worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.EGG_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (random.nextFloat() * 0.4F + 0.8F)); + worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.EGG_THROW, SoundSource.PLAYERS, 0.5F, 0.4F / (world.getRandom().nextFloat() * 0.4F + 0.8F)); return true; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderCrystalItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderCrystalItemMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderCrystalItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderCrystalItemMixin.java index d9e2b950..0c200c65 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderCrystalItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderCrystalItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.boss.enderdragon.EndCrystal; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderEyeItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderEyeItemMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderEyeItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderEyeItemMixin.java index fed0f3d0..5c04138d 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderEyeItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderEyeItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.mixin.Eject; import net.minecraft.world.InteractionHand; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderPearlItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderPearlItemMixin.java similarity index 90% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderPearlItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderPearlItemMixin.java index 97b7eb3b..351df50b 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/EnderPearlItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/EnderPearlItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.sounds.SoundEvents; @@ -34,7 +34,7 @@ public class EnderPearlItemMixin extends Item { if (!worldIn.isClientSide) { ThrownEnderpearl enderpearlentity = new ThrownEnderpearl(worldIn, playerIn); enderpearlentity.setItem(itemstack); - enderpearlentity.shootFromRotation(playerIn, playerIn.xRot, playerIn.yRot, 0.0F, 1.5F, 1.0F); + enderpearlentity.shootFromRotation(playerIn, playerIn.getXRot(), playerIn.getYRot(), 0.0F, 1.5F, 1.0F); if (!worldIn.addFreshEntity(enderpearlentity)) { if (playerIn instanceof ServerPlayerEntityBridge) { ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().updateInventory(); @@ -43,11 +43,11 @@ public class EnderPearlItemMixin extends Item { } } - worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (random.nextFloat() * 0.4F + 0.8F)); + worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.ENDER_PEARL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (worldIn.getRandom().nextFloat() * 0.4F + 0.8F)); playerIn.getCooldowns().addCooldown(this, 20); playerIn.awardStat(Stats.ITEM_USED.get(this)); - if (!playerIn.abilities.instabuild) { + if (!playerIn.getAbilities().instabuild) { itemstack.shrink(1); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FireChargeItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FireChargeItemMixin.java similarity index 91% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FireChargeItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FireChargeItemMixin.java index 6bead674..3abe6924 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FireChargeItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FireChargeItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; @@ -20,7 +20,7 @@ public class FireChargeItemMixin { at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/FireChargeItem;playSound(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)V")) public void arclight$blockIgnite(UseOnContext context, CallbackInfoReturnable cir, Level world, BlockPos blockPos) { if (CraftEventFactory.callBlockIgniteEvent(world, blockPos, BlockIgniteEvent.IgniteCause.FIREBALL, context.getPlayer()).isCancelled()) { - if (!context.getPlayer().abilities.instabuild) { + if (!context.getPlayer().getAbilities().instabuild) { context.getItemInHand().shrink(1); } cir.setReturnValue(InteractionResult.PASS); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FishingRodItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FishingRodItemMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FishingRodItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FishingRodItemMixin.java index 176f8d42..75fc91d9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FishingRodItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FishingRodItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; @@ -44,7 +44,7 @@ public class FishingRodItemMixin extends Item { } playerIn.swing(handIn); - worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.FISHING_BOBBER_RETRIEVE, SoundSource.NEUTRAL, 1.0F, 0.4F / (random.nextFloat() * 0.4F + 0.8F)); + worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.FISHING_BOBBER_RETRIEVE, SoundSource.NEUTRAL, 1.0F, 0.4F / (worldIn.getRandom().nextFloat() * 0.4F + 0.8F)); } else { if (!worldIn.isClientSide) { int k = EnchantmentHelper.getFishingSpeedBonus(itemstack); @@ -58,7 +58,7 @@ public class FishingRodItemMixin extends Item { playerIn.fishing = null; return new InteractionResultHolder<>(InteractionResult.PASS, itemstack); } - worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.FISHING_BOBBER_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (random.nextFloat() * 0.4F + 0.8F)); + worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.FISHING_BOBBER_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (worldIn.getRandom().nextFloat() * 0.4F + 0.8F)); worldIn.addFreshEntity(new FishingHook(playerIn, worldIn, j, k)); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FlintAndSteelItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FlintAndSteelItemMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FlintAndSteelItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FlintAndSteelItemMixin.java index 88794499..91ae4075 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/FlintAndSteelItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/FlintAndSteelItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import net.minecraft.core.BlockPos; import net.minecraft.world.InteractionResult; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/HangingEntityItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/HangingEntityItemMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/HangingEntityItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/HangingEntityItemMixin.java index 60d87bd2..a5df135e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/HangingEntityItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/HangingEntityItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ItemStackMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ItemStackMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java index 342a94b7..4d30b6df 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ItemStackMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ItemStackMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.item.ItemStackBridge; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/LeadItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/LeadItemMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/LeadItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/LeadItemMixin.java index e4de9e22..b6fadbb8 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/LeadItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/LeadItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.EntityBridge; import io.izzel.arclight.common.bridge.entity.player.PlayerEntityBridge; @@ -43,7 +43,7 @@ public class LeadItemMixin { Bukkit.getPluginManager().callEvent(event); if (event.isCancelled()) { - leashknotentity.remove(); + leashknotentity.discard(); return InteractionResult.PASS; } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MapItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MapItemMixin.java new file mode 100644 index 00000000..d54ef671 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MapItemMixin.java @@ -0,0 +1,40 @@ +package io.izzel.arclight.common.mixin.core.world.item; + +import io.izzel.arclight.common.bridge.world.storage.MapDataBridge; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.MapItem; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import org.bukkit.Bukkit; +import org.bukkit.event.server.MapInitializeEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import javax.annotation.Nullable; + +@Mixin(MapItem.class) +public abstract class MapItemMixin { + + @Inject(method = "createNewSavedData", locals = LocalCapture.CAPTURE_FAILHARD, at = @At("RETURN")) + private static void arclight$mapInit(Level p_151121_, int p_151122_, int p_151123_, int p_151124_, boolean p_151125_, boolean p_151126_, ResourceKey p_151127_, CallbackInfoReturnable cir, MapItemSavedData mapData) { + MapInitializeEvent event = new MapInitializeEvent(((MapDataBridge) mapData).bridge$getMapView()); + Bukkit.getPluginManager().callEvent(event); + } + + /** + * @author IzzelAliz + * @reason + */ + @Nullable + @Overwrite + public static Integer getMapId(ItemStack stack) { + CompoundTag compoundnbt = stack.getTag(); + return compoundnbt != null && compoundnbt.contains("map", 99) ? compoundnbt.getInt("map") : -1; + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MerchantOfferMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MerchantOfferMixin.java similarity index 97% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MerchantOfferMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MerchantOfferMixin.java index d0aa804b..665af863 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MerchantOfferMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MerchantOfferMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.item.MerchantOfferBridge; import net.minecraft.world.item.ItemStack; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MilkBucketItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MilkBucketItemMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MilkBucketItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MilkBucketItemMixin.java index 71c57b88..e3799447 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MilkBucketItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MilkBucketItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.LivingEntityBridge; import net.minecraft.world.entity.LivingEntity; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MinecartItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MinecartItemMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MinecartItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MinecartItemMixin.java index aaa71877..f8c1d2c0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/MinecartItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/MinecartItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.mixin.Eject; import net.minecraft.world.InteractionResult; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/PotionItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/PotionItemMixin.java similarity index 94% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/PotionItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/PotionItemMixin.java index 0edecd02..4e2bc615 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/PotionItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/PotionItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.LivingEntityBridge; import net.minecraft.world.entity.LivingEntity; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ShearsItemMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ShearsItemMixin.java index 17e0be1e..485cfad3 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/ShearsItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/ShearsItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/SnowballItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/SnowballItemMixin.java similarity index 89% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/SnowballItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/SnowballItemMixin.java index 2cbe680e..bd8547fc 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/SnowballItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/SnowballItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import net.minecraft.server.level.ServerPlayer; @@ -36,11 +36,11 @@ public class SnowballItemMixin extends Item { Snowball snowballentity = new Snowball(worldIn, playerIn); snowballentity.setItem(itemstack); if (worldIn.addFreshEntity(snowballentity)) { - if (!playerIn.abilities.instabuild) { + if (!playerIn.getAbilities().instabuild) { itemstack.shrink(1); } - worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (random.nextFloat() * 0.4F + 0.8F)); - snowballentity.shootFromRotation(playerIn, playerIn.xRot, playerIn.yRot, 0.0F, 1.5F, 1.0F); + worldIn.playSound(null, playerIn.getX(), playerIn.getY(), playerIn.getZ(), SoundEvents.SNOWBALL_THROW, SoundSource.NEUTRAL, 0.5F, 0.4F / (worldIn.getRandom().nextFloat() * 0.4F + 0.8F)); + snowballentity.shootFromRotation(playerIn, playerIn.getXRot(), playerIn.getYRot(), 0.0F, 1.5F, 1.0F); } else if (playerIn instanceof ServerPlayer) { ((ServerPlayerEntityBridge) playerIn).bridge$getBukkitEntity().updateInventory(); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/SpawnEggItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/SpawnEggItemMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/SpawnEggItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/SpawnEggItemMixin.java index 15653a56..35ebf5e0 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/SpawnEggItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/SpawnEggItemMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.world.WorldBridge; import org.bukkit.event.entity.CreatureSpawnEvent; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/TridentItemMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/TridentItemMixin.java similarity index 93% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/TridentItemMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/TridentItemMixin.java index 3a996fd7..6ba12071 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/TridentItemMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/TridentItemMixin.java @@ -1,8 +1,15 @@ -package io.izzel.arclight.common.mixin.core.item; +package io.izzel.arclight.common.mixin.core.world.item; import io.izzel.arclight.common.bridge.entity.player.ServerPlayerEntityBridge; import io.izzel.arclight.common.bridge.entity.projectile.TridentEntityBridge; import io.izzel.arclight.mixin.Eject; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TridentItem; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.level.Level; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.inventory.CraftItemStack; import org.bukkit.event.player.PlayerRiptideEvent; @@ -13,13 +20,6 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.function.Consumer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TridentItem; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.level.Level; @Mixin(TridentItem.class) public class TridentItemMixin { @@ -45,7 +45,7 @@ public class TridentItemMixin { return true; } - @Inject(method = "releaseUsing", at = @At(value = "FIELD", ordinal = 1, target = "Lnet/minecraft/world/entity/player/Player;yRot:F")) + @Inject(method = "releaseUsing", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/entity/player/Player;getYRot()F")) public void arclight$riptide(ItemStack stack, Level worldIn, LivingEntity entityLiving, int timeLeft, CallbackInfo ci) { PlayerRiptideEvent event = new PlayerRiptideEvent(((ServerPlayerEntityBridge) entityLiving).bridge$getBukkitEntity(), CraftItemStack.asCraftMirror(stack)); Bukkit.getPluginManager().callEvent(event); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/BlastingRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/BlastingRecipeMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/BlastingRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/BlastingRecipeMixin.java index 01a78151..1803dbca 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/BlastingRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/BlastingRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.resources.ResourceLocation; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/CampfireCookingRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/CampfireCookingRecipeMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/CampfireCookingRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/CampfireCookingRecipeMixin.java index e6d8c7ec..185da05e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/CampfireCookingRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/CampfireCookingRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.resources.ResourceLocation; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SpecialRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/CustomRecipeMixin.java similarity index 76% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SpecialRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/CustomRecipeMixin.java index 0ea80686..d939a4d6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SpecialRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/CustomRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.world.item.crafting.CustomRecipe; @@ -6,7 +6,7 @@ import org.bukkit.inventory.Recipe; import org.spongepowered.asm.mixin.Mixin; @Mixin(CustomRecipe.class) -public class SpecialRecipeMixin implements IRecipeBridge { +public class CustomRecipeMixin implements IRecipeBridge { @Override public Recipe bridge$toBukkitRecipe() { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/FurnaceRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/FurnaceRecipeMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/FurnaceRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/FurnaceRecipeMixin.java index b5f60da2..30baed7f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/FurnaceRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/FurnaceRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.resources.ResourceLocation; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/IngredientMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/IngredientMixin.java similarity index 96% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/IngredientMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/IngredientMixin.java index 67e2547c..3b5fe8b7 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/IngredientMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/IngredientMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IngredientBridge; import org.spongepowered.asm.mixin.Mixin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeManagerMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeManagerMixin.java index 1bb408af..95624cab 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/RecipeManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeManagerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/IRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeMixin.java similarity index 85% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/IRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeMixin.java index 8c321eef..e583b3ee 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/IRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/RecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import io.izzel.arclight.common.mod.util.ArclightSpecialRecipe; @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @Mixin(net.minecraft.world.item.crafting.Recipe.class) -public interface IRecipeMixin extends IRecipeBridge { +public interface RecipeMixin extends IRecipeBridge { // @formatter:off @Shadow ItemStack getResultItem(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ServerRecipeBookMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ServerRecipeBookMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ServerRecipeBookMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ServerRecipeBookMixin.java index 0c86400d..9b1a5f87 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ServerRecipeBookMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ServerRecipeBookMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.spongepowered.asm.mixin.Mixin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ShapedRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ShapedRecipeMixin.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ShapedRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ShapedRecipeMixin.java index 98142a6e..ba5da788 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ShapedRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ShapedRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.core.NonNullList; @@ -18,9 +18,9 @@ import org.spongepowered.asm.mixin.Shadow; public abstract class ShapedRecipeMixin implements IRecipeBridge { // @formatter:off - @Shadow @Final private ItemStack result; - @Shadow @Final private String group; - @Shadow @Final private NonNullList recipeItems; + @Shadow @Final ItemStack result; + @Shadow @Final String group; + @Shadow @Final NonNullList recipeItems; @Shadow public abstract int getHeight(); @Shadow public abstract int getWidth(); // @formatter:on diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ShapelessRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ShapelessRecipeMixin.java similarity index 84% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ShapelessRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ShapelessRecipeMixin.java index 8e293b57..94019393 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/ShapelessRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/ShapelessRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.core.NonNullList; @@ -17,9 +17,9 @@ import org.spongepowered.asm.mixin.Shadow; public class ShapelessRecipeMixin implements IRecipeBridge { // @formatter:off - @Shadow @Final private ItemStack result; - @Shadow @Final private String group; - @Shadow @Final private NonNullList ingredients; + @Shadow @Final ItemStack result; + @Shadow @Final String group; + @Shadow @Final NonNullList ingredients; // @formatter:off @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SmithingRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/SmithingRecipeMixin.java similarity index 85% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SmithingRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/SmithingRecipeMixin.java index 8d57be52..5260102f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SmithingRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/SmithingRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.resources.ResourceLocation; @@ -18,10 +18,10 @@ import org.spongepowered.asm.mixin.Shadow; public class SmithingRecipeMixin implements IRecipeBridge { // @formatter:off - @Shadow @Final private ItemStack result; + @Shadow @Final ItemStack result; @Shadow @Final private ResourceLocation id; - @Shadow @Final private Ingredient base; - @Shadow @Final private Ingredient addition; + @Shadow @Final Ingredient base; + @Shadow @Final Ingredient addition; // @formatter:on @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SmokingRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/SmokingRecipeMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SmokingRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/SmokingRecipeMixin.java index 3f3ef498..bb85b686 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/SmokingRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/SmokingRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.resources.ResourceLocation; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/StonecuttingRecipeMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/StonecuttingRecipeMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/StonecuttingRecipeMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/StonecuttingRecipeMixin.java index b274393e..9a23f4cd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/item/crafting/StonecuttingRecipeMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/item/crafting/StonecuttingRecipeMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.item.crafting; +package io.izzel.arclight.common.mixin.core.world.item.crafting; import io.izzel.arclight.common.bridge.item.crafting.IRecipeBridge; import net.minecraft.resources.ResourceLocation; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_EmptyContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_EmptyContainerMixin.java index 27d99a7c..c0ab3d6c 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_EmptyContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_EmptyContainerMixin.java @@ -1,6 +1,6 @@ package io.izzel.arclight.common.mixin.core.world.level.block; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.ComposterBlock; @@ -8,7 +8,7 @@ import org.bukkit.craftbukkit.v.inventory.CraftBlockInventoryHolder; import org.spongepowered.asm.mixin.Mixin; @Mixin(ComposterBlock.EmptyContainer.class) -public abstract class ComposterBlock_EmptyContainerMixin extends InventoryMixin { +public abstract class ComposterBlock_EmptyContainerMixin extends SimpleContainerMixin { public void arclight$constructor() { throw new RuntimeException(); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_InputContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_InputContainerMixin.java index 1550a983..c6494eec 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_InputContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_InputContainerMixin.java @@ -1,6 +1,6 @@ package io.izzel.arclight.common.mixin.core.world.level.block; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.state.BlockState; @@ -11,7 +11,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.minecraft.world.level.block.ComposterBlock$InputContainer") -public abstract class ComposterBlock_InputContainerMixin extends InventoryMixin { +public abstract class ComposterBlock_InputContainerMixin extends SimpleContainerMixin { @Inject(method = "(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/LevelAccessor;Lnet/minecraft/core/BlockPos;)V", at = @At("RETURN")) public void arclight$setOwner(BlockState blockState, LevelAccessor world, BlockPos blockPos, CallbackInfo ci) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_OutputContainerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_OutputContainerMixin.java index f2622673..2e7a8e2a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_OutputContainerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/ComposterBlock_OutputContainerMixin.java @@ -1,6 +1,6 @@ package io.izzel.arclight.common.mixin.core.world.level.block; -import io.izzel.arclight.common.mixin.core.inventory.InventoryMixin; +import io.izzel.arclight.common.mixin.core.world.SimpleContainerMixin; import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.LevelAccessor; @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(targets = "net.minecraft.world.level.block.ComposterBlock$OutputContainer") -public abstract class ComposterBlock_OutputContainerMixin extends InventoryMixin { +public abstract class ComposterBlock_OutputContainerMixin extends SimpleContainerMixin { // @formatter:off @Shadow @Final private BlockState state; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/state/IntegerPropertyMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/state/properties/IntegerPropertyMixin.java similarity index 87% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/state/IntegerPropertyMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/state/properties/IntegerPropertyMixin.java index 0d2d619e..9a894202 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/state/IntegerPropertyMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/state/properties/IntegerPropertyMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.state; +package io.izzel.arclight.common.mixin.core.world.level.block.state.properties; import net.minecraft.world.level.block.state.properties.IntegerProperty; import org.spongepowered.asm.mixin.Mixin; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableManagerMixin.java similarity index 95% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableManagerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableManagerMixin.java index 6ee96e1f..a86bb4d2 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableManagerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.loot; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonObject; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableMixin.java similarity index 98% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableMixin.java index 850c758c..a3045c31 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootTableMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/LootTableMixin.java @@ -1,7 +1,12 @@ -package io.izzel.arclight.common.mixin.core.loot; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot; import io.izzel.arclight.common.bridge.world.storage.loot.LootTableBridge; import io.izzel.arclight.mixin.Eject; +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import org.apache.logging.log4j.Logger; import org.bukkit.craftbukkit.v.event.CraftEventFactory; import org.bukkit.craftbukkit.v.inventory.CraftItemStack; @@ -15,11 +20,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.List; import java.util.Random; import java.util.stream.Collectors; -import net.minecraft.world.Container; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @Mixin(LootTable.class) public abstract class LootTableMixin implements LootTableBridge { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/entries/LootEntry_SerializerMixin.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/entries/LootEntry_SerializerMixin.java index 7da610e7..47d5e9aa 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootEntry_SerializerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/entries/LootEntry_SerializerMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.loot; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot.entries; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonObject; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/functions/LootingEnchantBonusMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/functions/LootingEnchantBonusMixin.java similarity index 80% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/functions/LootingEnchantBonusMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/functions/LootingEnchantBonusMixin.java index 9d323c72..45422ed6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/functions/LootingEnchantBonusMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/functions/LootingEnchantBonusMixin.java @@ -1,25 +1,25 @@ -package io.izzel.arclight.common.mixin.core.loot.functions; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot.functions; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; import io.izzel.arclight.common.mod.ArclightConstants; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.RandomValueBounds; import net.minecraft.world.level.storage.loot.functions.LootingEnchantFunction; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; @Mixin(LootingEnchantFunction.class) public abstract class LootingEnchantBonusMixin { // @formatter:off - @Shadow @Final private RandomValueBounds value; - @Shadow @Final private int limit; - @Shadow protected abstract boolean hasLimit(); + @Shadow @Final NumberProvider value; + @Shadow @Final int limit; + @Shadow abstract boolean hasLimit(); // @formatter:on /** @@ -38,7 +38,7 @@ public abstract class LootingEnchantBonusMixin { return stack; } - float f = (float) i * this.value.getFloat(context.getRandom()); + float f = (float) i * this.value.getFloat(context); stack.grow(Math.round(f)); if (this.hasLimit() && stack.getCount() > this.limit) { stack.setCount(this.limit); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootParametersMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java similarity index 84% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootParametersMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java index 96fb7834..89d147ca 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/LootParametersMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/parameters/LootParametersMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.loot; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot.parameters; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.storage.loot.parameters.LootContextParam; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/RandomChanceWithLootingMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/predicates/RandomChanceWithLootingMixin.java similarity index 92% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/RandomChanceWithLootingMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/predicates/RandomChanceWithLootingMixin.java index cc993fdf..fa2fd38a 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/RandomChanceWithLootingMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/predicates/RandomChanceWithLootingMixin.java @@ -1,4 +1,4 @@ -package io.izzel.arclight.common.mixin.core.loot.conditions; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot.predicates; import io.izzel.arclight.common.mod.ArclightConstants; import net.minecraft.world.level.storage.loot.LootContext; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/SurvivesExplosionMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/predicates/SurvivesExplosionMixin.java similarity index 90% rename from arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/SurvivesExplosionMixin.java rename to arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/predicates/SurvivesExplosionMixin.java index abb65c07..d855b8b8 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/loot/conditions/SurvivesExplosionMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/storage/loot/predicates/SurvivesExplosionMixin.java @@ -1,12 +1,12 @@ -package io.izzel.arclight.common.mixin.core.loot.conditions; +package io.izzel.arclight.common.mixin.core.world.level.storage.loot.predicates; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import java.util.Random; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.level.storage.loot.predicates.ExplosionCondition; @Mixin(ExplosionCondition.class) public class SurvivesExplosionMixin { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/BlackholeNetHandler.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/BlackholeNetHandler.java deleted file mode 100644 index 45f0ffd2..00000000 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mod/util/BlackholeNetHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -package io.izzel.arclight.common.mod.util; - -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.network.Connection; -import net.minecraft.network.protocol.Packet; -import net.minecraft.network.protocol.PacketFlow; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.server.network.ServerGamePacketListenerImpl; -import org.jetbrains.annotations.Nullable; - -public class BlackholeNetHandler extends ServerGamePacketListenerImpl { - - public BlackholeNetHandler(MinecraftServer server, ServerPlayer playerIn) { - super(server, new BlackholeNetworkManager(), playerIn); - } - - @Override - public void send(Packet packetIn) { - } - - @Override - public void send(Packet packetIn, @Nullable GenericFutureListener> futureListeners) { - } - - private static class BlackholeNetworkManager extends Connection { - - public BlackholeNetworkManager() { - super(PacketFlow.SERVERBOUND); - } - - @Override - public void send(Packet packetIn) { - } - - @Override - public void send(Packet packetIn, @Nullable GenericFutureListener> p_201058_2_) { - } - } -} diff --git a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg index 3e692df9..e49c2cd5 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -3,6 +3,9 @@ public net.minecraft.world.entity.Entity f_19851_ public net.minecraft.world.entity.raid.Raider$HoldGroundAttackGoal public net.minecraft.world.entity.monster.SpellcasterIllager$SpellcasterUseSpellGoal public net.minecraft.world.entity.monster.SpellcasterIllager$IllagerSpell +public-f net.minecraft.network.protocol.handshake.ClientIntentionPacket f_134721_ # hostName +public net.minecraft.server.network.ServerGamePacketListenerImpl$EntityInteraction +public net.minecraft.server.MinecraftServer$TimeProfiler # Misc public net.minecraft.server.PlayerAdvancements f_135964_ public net.minecraft.server.level.PlayerRespawnLogic m_8264_(Lnet/minecraft/server/level/ServerLevel;IIZ)Lnet/minecraft/core/BlockPos; diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 0c0566a1..90fc4451 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -27,108 +27,108 @@ "commands.synchronization.ArgumentTypesMixin", "fluid.FlowingFluidMixin", "fluid.LavaFluidMixin", - "inventory.CraftingInventoryMixin", - "inventory.CraftResultInventoryMixin", - "inventory.DoubleSidedInventoryMixin", - "inventory.EnderChestInventoryMixin", - "inventory.IInventoryMixin", - "inventory.InventoryMixin", - "inventory.MerchantInventoryMixin", - "inventory.container.AbstractFurnaceContainerMixin", - "inventory.container.AbstractRepairContainerMixin", - "inventory.container.BeaconContainerMixin", - "inventory.container.BrewingStandContainerMixin", - "inventory.container.CartographyContainer1Mixin", - "inventory.container.CartographyContainer2Mixin", - "inventory.container.CartographyContainerMixin", - "inventory.container.ChestContainerMixin", - "inventory.container.ContainerMixin", - "inventory.container.ContainerTypeMixin", - "inventory.container.DispenserContainerMixin", - "inventory.container.EnchantmentContainer1Mixin", - "inventory.container.EnchantmentContainerMixin", - "inventory.container.FurnaceResultSlotMixin", - "inventory.container.GrindstoneContainer1Mixin", - "inventory.container.GrindstoneContainerMixin", - "inventory.container.HopperContainerMixin", - "inventory.container.HorseInventoryContainerMixin", - "inventory.container.LecternContainerMixin", - "inventory.container.LoomContainer1Mixin", - "inventory.container.LoomContainer2Mixin", - "inventory.container.LoomContainerMixin", - "inventory.container.MerchantContainerMixin", - "inventory.container.PlayerContainerMixin", - "inventory.container.RepairContainerMixin", - "inventory.container.ShulkerBoxContainerMixin", - "inventory.container.SlotMixin", - "inventory.container.SmithingTableContainerMixin", - "inventory.container.StonecutterContainer1Mixin", - "inventory.container.StonecutterContainerMixin", - "inventory.container.WorkbenchContainerMixin", - "item.ArmorStandItemMixin", - "item.BlockItemMixin", - "item.BoatItemMixin", - "item.BowItemMixin", - "item.BucketItemMixin", - "item.ChorusFruitItemMixin", - "item.CrossbowItemMixin", - "item.DyeItemMixin", - "item.EggItemMixin", - "item.EnderCrystalItemMixin", - "item.EnderEyeItemMixin", - "item.EnderPearlItemMixin", - "item.FilledMapItemMixin", - "item.FireChargeItemMixin", - "item.FishingRodItemMixin", - "item.FlintAndSteelItemMixin", - "item.HangingEntityItemMixin", - "item.ItemStackMixin", - "item.LeadItemMixin", - "item.MerchantOfferMixin", - "item.MilkBucketItemMixin", - "item.MinecartItemMixin", - "item.PotionItemMixin", - "item.ShearsItemMixin", - "item.SnowballItemMixin", - "item.SpawnEggItemMixin", - "item.TridentItemMixin", - "item.crafting.BlastingRecipeMixin", - "item.crafting.CampfireCookingRecipeMixin", - "item.crafting.FurnaceRecipeMixin", - "item.crafting.IngredientMixin", - "item.crafting.IRecipeMixin", - "item.crafting.RecipeManagerMixin", - "item.crafting.ServerRecipeBookMixin", - "item.crafting.ShapedRecipeMixin", - "item.crafting.ShapelessRecipeMixin", - "item.crafting.SmithingRecipeMixin", - "item.crafting.SmokingRecipeMixin", - "item.crafting.SpecialRecipeMixin", - "item.crafting.StonecuttingRecipeMixin", - "loot.LootEntry_SerializerMixin", - "loot.LootParametersMixin", - "loot.LootTableManagerMixin", - "loot.LootTableMixin", - "loot.conditions.RandomChanceWithLootingMixin", - "loot.conditions.SurvivesExplosionMixin", - "loot.functions.LootingEnchantBonusMixin", - "network.NetworkManagerMixin", - "network.PacketThreadUtilMixin", - "network.datasync.EntityDataManagerMixin", - "network.handshake.ServerHandshakeNetHandlerMixin", - "network.handshake.client.CHandshakePacketMixin", - "network.login.ServerLoginNetHandlerMixin", - "network.play.ServerPlayNetHandlerMixin", - "network.play.client.CChatMessagePacketMixin", - "network.play.client.CCloseWindowPacketMixin", - "network.play.client.CPlayerTryUseItemOnBlockPacketMixin", - "network.play.client.CPlayerTryUseItemPacketMixin", - "network.play.server.SChatPacketMixin", - "network.play.server.SWorldBorderPacketMixin", + "world.inventory.CraftingInventoryMixin", + "world.inventory.CraftResultInventoryMixin", + "world.CompoundContainerMixin", + "world.inventory.EnderChestInventoryMixin", + "world.ContainerMixin", + "world.SimpleContainerMixin", + "world.inventory.MerchantInventoryMixin", + "world.inventory.AbstractFurnaceContainerMixin", + "world.inventory.ItemCombinerMixin", + "world.inventory.BeaconContainerMixin", + "world.inventory.BrewingStandContainerMixin", + "world.inventory.CartographyContainer1Mixin", + "world.inventory.CartographyContainer2Mixin", + "world.inventory.CartographyContainerMixin", + "world.inventory.ChestContainerMixin", + "world.inventory.AbstractContainerMenuMixin", + "world.inventory.ContainerTypeMixin", + "world.inventory.DispenserContainerMixin", + "world.inventory.EnchantmentContainer1Mixin", + "world.inventory.EnchantmentContainerMixin", + "world.inventory.FurnaceResultSlotMixin", + "world.inventory.GrindstoneContainer1Mixin", + "world.inventory.GrindstoneContainerMixin", + "world.inventory.HopperContainerMixin", + "world.inventory.HorseInventoryContainerMixin", + "world.inventory.LecternContainerMixin", + "world.inventory.LoomContainer1Mixin", + "world.inventory.LoomContainer2Mixin", + "world.inventory.LoomContainerMixin", + "world.inventory.MerchantContainerMixin", + "world.inventory.PlayerContainerMixin", + "world.inventory.RepairContainerMixin", + "world.inventory.ShulkerBoxContainerMixin", + "world.inventory.SlotMixin", + "world.inventory.SmithingTableContainerMixin", + "world.inventory.StonecutterContainer1Mixin", + "world.inventory.StonecutterContainerMixin", + "world.inventory.CraftingMenuMixin", + "world.item.ArmorStandItemMixin", + "world.item.BlockItemMixin", + "world.item.BoatItemMixin", + "world.item.BowItemMixin", + "world.item.BucketItemMixin", + "world.item.ChorusFruitItemMixin", + "world.item.CrossbowItemMixin", + "world.item.DyeItemMixin", + "world.item.EggItemMixin", + "world.item.EnderCrystalItemMixin", + "world.item.EnderEyeItemMixin", + "world.item.EnderPearlItemMixin", + "world.item.MapItemMixin", + "world.item.FireChargeItemMixin", + "world.item.FishingRodItemMixin", + "world.item.FlintAndSteelItemMixin", + "world.item.HangingEntityItemMixin", + "world.item.ItemStackMixin", + "world.item.LeadItemMixin", + "world.item.MerchantOfferMixin", + "world.item.MilkBucketItemMixin", + "world.item.MinecartItemMixin", + "world.item.PotionItemMixin", + "world.item.ShearsItemMixin", + "world.item.SnowballItemMixin", + "world.item.SpawnEggItemMixin", + "world.item.TridentItemMixin", + "world.item.crafting.BlastingRecipeMixin", + "world.item.crafting.CampfireCookingRecipeMixin", + "world.item.crafting.FurnaceRecipeMixin", + "world.item.crafting.IngredientMixin", + "world.item.crafting.RecipeMixin", + "world.item.crafting.RecipeManagerMixin", + "world.item.crafting.ServerRecipeBookMixin", + "world.item.crafting.ShapedRecipeMixin", + "world.item.crafting.ShapelessRecipeMixin", + "world.item.crafting.SmithingRecipeMixin", + "world.item.crafting.SmokingRecipeMixin", + "world.item.crafting.CustomRecipeMixin", + "world.item.crafting.StonecuttingRecipeMixin", + "world.level.storage.loot.entries.LootEntry_SerializerMixin", + "world.level.storage.loot.parameters.LootParametersMixin", + "world.level.storage.loot.LootTableManagerMixin", + "world.level.storage.loot.LootTableMixin", + "world.level.storage.loot.predicates.RandomChanceWithLootingMixin", + "world.level.storage.loot.predicates.SurvivesExplosionMixin", + "world.level.storage.loot.functions.LootingEnchantBonusMixin", + "network.ConnectionMixin", + "network.protocol.PacketThreadUtilMixin", + "network.SynchedEntityDataMixin", + "network.ServerHandshakeNetHandlerMixin", + "network.protocol.handshake.CHandshakePacketMixin", + "network.ServerLoginNetHandlerMixin", + "network.ServerPlayNetHandlerMixin", + "network.protocol.game.CChatMessagePacketMixin", + "network.protocol.game.CCloseWindowPacketMixin", + "network.protocol.game.CPlayerTryUseItemOnBlockPacketMixin", + "network.protocol.game.CPlayerTryUseItemPacketMixin", + "network.protocol.game.SChatPacketMixin", + "network.protocol.game.SWorldBorderPacketMixin", "network.rcon.RConConsoleSourceMixin", - "network.status.ServerStatusNetHandlerMixin", - "potion.EffectMixin", - "scoreboard.ServerScoreboardMixin", + "network.ServerStatusNetHandlerMixin", + "world.effect.MobEffectMixin", + "server.ServerScoreboardMixin", "server.CustomServerBossInfoMixin", "server.MainMixin", "server.MinecraftServerMixin", @@ -142,11 +142,11 @@ "server.commands.TimeCommandMixin", "server.dedicated.DedicatedServerMixin", "server.management.BanEntryMixin", - "server.management.PlayerInteractionManagerMixin", + "server.management.ServerPlayerGameModeMixin", "server.management.PlayerListMixin", "server.management.UserListMixin", - "state.IntegerPropertyMixin", - "stats.StatisticsManagerMixin", + "world.level.block.state.properties.IntegerPropertyMixin", + "stats.StatisticsCounterMixin", "tileentity.AbstractFurnaceTileEntityMixin", "tileentity.BarrelTileEntityMixin", "tileentity.BeaconTileEntityMixin", @@ -301,7 +301,7 @@ "world.entity.animal.WolfMixin", "world.entity.player.PlayerMixin", "world.entity.player.InventoryMixin", - "world.entity.player.ServerPlayerEntityMixin", + "world.entity.player.ServerPlayerMixin", "world.entity.projectile.AbstractArrowMixin", "world.entity.projectile.FireballMixin", "world.entity.projectile.ArrowEntityMixin", diff --git a/arclight-forge/build.gradle b/arclight-forge/build.gradle index 1d01995c..80958cf7 100644 --- a/arclight-forge/build.gradle +++ b/arclight-forge/build.gradle @@ -8,7 +8,8 @@ buildscript { dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: "${forge_gradle_version}" classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' - classpath "io.izzel.arclight:arclight-gradle-plugin:$agpVersion" + // classpath "io.izzel.arclight:arclight-gradle-plugin:$agpVersion" + classpath files("G:\\workspace\\arclight-gradle-plugin\\build\\libs\\arclight-gradle-plugin-1.18.jar") } }