├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs ├── Dev-Lib-1.0-SNAPSHOT.jar └── yarrnbukkit-1.15.2.jar ├── settings.gradle └── src ├── main ├── java │ └── com │ │ └── github │ │ └── fukkitmc │ │ └── fukkit │ │ ├── FukkitInit.java │ │ ├── access │ │ ├── CraftHandled.java │ │ └── net │ │ │ └── minecraft │ │ │ ├── block │ │ │ ├── BlockAccess.java │ │ │ ├── NetherPortalBlock$AreaHelperAccess.java │ │ │ └── entity │ │ │ │ ├── AbstractFurnaceBlockEntityAccess.java │ │ │ │ ├── BeaconBlockEntityAccess.java │ │ │ │ └── BlockEntityAccess.java │ │ │ ├── command │ │ │ └── arguments │ │ │ │ ├── EntityArgumentTypeAccess.java │ │ │ │ └── EntitySelectorReaderAccess.java │ │ │ ├── container │ │ │ ├── AnvilContainerAccess.java │ │ │ ├── BlockContextAccess.java │ │ │ ├── BlockContextContainerAccess.java │ │ │ ├── ContainerAccess.java │ │ │ └── LecternContainerAccess.java │ │ │ ├── entity │ │ │ ├── EntityAccess.java │ │ │ ├── EntityTypeAccess.java │ │ │ ├── LivingEntityAccess.java │ │ │ ├── damage │ │ │ │ └── DamageSourceAccess.java │ │ │ ├── mob │ │ │ │ └── MobEntityAccess.java │ │ │ └── player │ │ │ │ ├── HungerManagerAccess.java │ │ │ │ └── PlayerEntityAccess.java │ │ │ ├── inventory │ │ │ ├── BasicInventoryAccess.java │ │ │ ├── CraftingInventoryAccess.java │ │ │ └── InventoryAccess.java │ │ │ ├── item │ │ │ └── map │ │ │ │ └── MapStateAccess.java │ │ │ ├── server │ │ │ ├── MinecraftServerAccess.java │ │ │ ├── PlayerManagerAccess.java │ │ │ ├── ServerNetworkIoAccess.java │ │ │ ├── command │ │ │ │ ├── CommandOutputAccess.java │ │ │ │ └── ServerCommandSourceAccess.java │ │ │ ├── network │ │ │ │ ├── ServerLoginNetworkHandlerAccess.java │ │ │ │ ├── ServerPlayNetworkHandlerAccess.java │ │ │ │ └── ServerPlayerEntityAccess.java │ │ │ └── world │ │ │ │ ├── ServerWorldAccess.java │ │ │ │ └── ThreadedAnvilChunkStorageAccess.java │ │ │ └── world │ │ │ ├── BlockViewAccess.java │ │ │ ├── ChunkRegionAccess.java │ │ │ ├── PortalForcerAccess.java │ │ │ ├── WorldAccess.java │ │ │ ├── WorldSaveHandlerAccess.java │ │ │ ├── biome │ │ │ └── source │ │ │ │ └── BiomeArrayAccess.java │ │ │ ├── border │ │ │ └── WorldBorderAccess.java │ │ │ ├── chunk │ │ │ └── WorldChunkAccess.java │ │ │ ├── dimension │ │ │ ├── DimensionAccess.java │ │ │ └── DimensionTypeAccess.java │ │ │ ├── explosion │ │ │ └── ExplosionAccess.java │ │ │ └── level │ │ │ └── LevelPropertiesAccess.java │ │ ├── injectors │ │ └── GenericOpcode.java │ │ ├── mixin │ │ └── net │ │ │ └── minecraft │ │ │ ├── advancement │ │ │ ├── AdvancementManagerMixin.java │ │ │ ├── AdvancementMixin.java │ │ │ └── PlayerAdvancementTrackerMixin.java │ │ │ ├── block │ │ │ ├── AbstractButtonBlockMixin.java │ │ │ ├── AbstractPressurePlateBlockMixin.java │ │ │ ├── AbstractRedstoneGateBlockMixin.java │ │ │ ├── BambooBlockMixin.java │ │ │ ├── BambooSaplingBlockMixin.java │ │ │ ├── BedBlockMixin.java │ │ │ ├── BlockMixin.java │ │ │ ├── CactusBlockMixin.java │ │ │ ├── CakeBlockMixin.java │ │ │ ├── CampfireBlockMixin.java │ │ │ ├── CarvedPumpkinBlockMixin.java │ │ │ ├── CauldronBlockMixin.java │ │ │ ├── ChestBlock$2Mixin.java │ │ │ ├── ChorusFlowerBlockMixin.java │ │ │ ├── CocoaBlockMixin.java │ │ │ ├── CommandBlockMixin.java │ │ │ ├── ComparatorBlockMixin.java │ │ │ ├── ComposterBlock$ComposterInventoryMixin.java │ │ │ ├── ComposterBlock$FullComposterInventoryMixin.java │ │ │ ├── ComposterBlockMixin.java │ │ │ ├── ConcretePowderBlockMixin.java │ │ │ ├── CoralBlockBlockMixin.java │ │ │ ├── CoralBlockMixin.java │ │ │ ├── CoralFanBlockMixin.java │ │ │ ├── CoralWallFanBlockMixin.java │ │ │ ├── CropBlockMixin.java │ │ │ ├── DaylightDetectorBlockMixin.java │ │ │ ├── DetectorRailBlockMixin.java │ │ │ ├── DispenserBlockAccessor.java │ │ │ ├── DispenserBlockMixin.java │ │ │ ├── DoorBlockMixin.java │ │ │ ├── DragonEggBlockMixin.java │ │ │ ├── DropperBlockMixin.java │ │ │ ├── EndPortalBlockMixin.java │ │ │ ├── FarmlandBlockMixin.java │ │ │ ├── FireBlockMixin.java │ │ │ ├── FluidBlockMixin.java │ │ │ ├── GrassBlockMixin.java │ │ │ ├── IceBlockMixin.java │ │ │ ├── InfestedBlockMixin.java │ │ │ ├── JukeboxBlockMixin.java │ │ │ ├── KelpBlockMixin.java │ │ │ ├── LeavesBlockMixin.java │ │ │ ├── LecternBlockMixin.java │ │ │ ├── LeverBlockMixin.java │ │ │ ├── LilyPadBlockMixin.java │ │ │ ├── MagmaBlockMixin.java │ │ │ ├── MushroomPlantBlockMixin.java │ │ │ ├── NetherPortalBlock$AreaHelperMixin.java │ │ │ ├── NetherPortalBlockMixin.java │ │ │ ├── NetherWartBlockMixin.java │ │ │ ├── NoteBlockMixin.java │ │ │ ├── ObserverBlockMixin.java │ │ │ ├── OreBlockMixin.java │ │ │ ├── PistonBlockMixin.java │ │ │ ├── PlantBlockMixin.java │ │ │ ├── PoweredRailBlockMixin.java │ │ │ ├── PressurePlateBlockMixin.java │ │ │ ├── RedstoneLampBlockMixin.java │ │ │ ├── RedstoneOreBlockMixin.java │ │ │ ├── RedstoneTorchBlockMixin.java │ │ │ ├── RedstoneWireBlockMixin.java │ │ │ ├── SaplingBlockMixin.java │ │ │ ├── ScaffoldingBlockMixin.java │ │ │ ├── SnowBlockMixin.java │ │ │ ├── SpawnerBlockMixin.java │ │ │ ├── SpongeBlockMixin.java │ │ │ ├── SpreadableBlockMixin.java │ │ │ ├── StemBlockMixin.java │ │ │ ├── SugarCaneBlockMixin.java │ │ │ ├── SweetBerryBushBlockMixin.java │ │ │ ├── TallPlantBlockMixin.java │ │ │ ├── TntBlockMixin.java │ │ │ ├── TrapdoorBlockMixin.java │ │ │ ├── TripwireBlockMixin.java │ │ │ ├── TripwireHookBlockMixin.java │ │ │ ├── TurtleEggBlockMixin.java │ │ │ ├── VineBlockMixin.java │ │ │ ├── WeightedPressurePlateBlockMixin.java │ │ │ ├── WitherSkullBlockMixin.java │ │ │ ├── dispenser │ │ │ │ ├── BlockPlacementDispenserBehaviorMixin.java │ │ │ │ └── BoatDispenserBehaviorMixin.java │ │ │ ├── entity │ │ │ │ ├── AbstractFurnaceBlockEntityMixin.java │ │ │ │ ├── BannerBlockEntityMixin.java │ │ │ │ ├── BarrelBlockEntityMixin.java │ │ │ │ ├── BeaconBlockEntityMixin.java │ │ │ │ ├── BeehiveBlockEntity$BeeAccess.java │ │ │ │ ├── BeehiveBlockEntityMixin.java │ │ │ │ ├── BlockEntityMixin.java │ │ │ │ ├── BrewingStandBlockEntityMixin.java │ │ │ │ ├── CampfireBlockEntityMixin.java │ │ │ │ ├── ChestBlockEntityMixin.java │ │ │ │ ├── CommandBlockBlockEntity$1.java │ │ │ │ ├── ConduitBlockEntityMixin.java │ │ │ │ ├── DispenserBlockEntityMixin.java │ │ │ │ ├── EndGatewayBlockEntityMixin.java │ │ │ │ ├── HopperBlockEntityAccess.java │ │ │ │ ├── HopperBlockEntityMixin.java │ │ │ │ ├── LecternBlockEntityAccess.java │ │ │ │ ├── LecternBlockEntityMixin.java │ │ │ │ ├── LockableContainerBlockEntityMixin.java │ │ │ │ ├── ShulkerBoxBlockEntityMixin.java │ │ │ │ └── SignBlockEntityMixin.java │ │ │ └── sapling │ │ │ │ ├── LargeTreeSaplingGeneratorMixin.java │ │ │ │ └── SaplingGeneratorMixin.java │ │ │ ├── command │ │ │ ├── EntitySelectorMixin.java │ │ │ ├── EntitySelectorReaderMixin.java │ │ │ └── arguments │ │ │ │ ├── BlockArgumentParserMixin.java │ │ │ │ └── EntityArgumentTypeMixin.java │ │ │ ├── container │ │ │ ├── AbstractFurnaceContainerMixin.java │ │ │ ├── AnvilContainerMixin.java │ │ │ ├── BeaconContainerMixin.java │ │ │ ├── BlockContext$2Mixin.java │ │ │ ├── BlockContextMixin.java │ │ │ ├── BrewingStandContainerMixin.java │ │ │ ├── CartographyTableContainer$2Mixin.java │ │ │ ├── CartographyTableContainerMixin.java │ │ │ ├── ContainerMixin.java │ │ │ ├── ContainerTypeMixin.java │ │ │ ├── CraftingTableContainerMixin.java │ │ │ ├── EnchantingTableContainer$1Mixin.java │ │ │ ├── EnchantingTableContainerMixin.java │ │ │ ├── FurnaceOutputSlotMixin.java │ │ │ ├── Generic3x3ContainerMixin.java │ │ │ ├── GenericContainerMixin.java │ │ │ ├── GrindstoneContainer$1Mixin.java │ │ │ ├── GrindstoneContainerMixin.java │ │ │ ├── HopperContainerMixin.java │ │ │ ├── HorseContainerMixin.java │ │ │ ├── LecternContainerMixin.java │ │ │ ├── LoomContainerMixin.java │ │ │ ├── MerchantContainerMixin.java │ │ │ ├── PlayerContainerMixin.java │ │ │ ├── ShulkerBoxContainerMixin.java │ │ │ └── StonecutterContainerMixin.java │ │ │ ├── datafixer │ │ │ ├── SchemasMixin.java │ │ │ └── fix │ │ │ │ ├── ItemInstanceMapIdFixMixin.java │ │ │ │ └── ItemInstanceTheFlatteningFixMixin.java │ │ │ ├── enchantment │ │ │ ├── DamageEnchantmentMixin.java │ │ │ ├── EnchantmentsMixin.java │ │ │ └── FrostWalkerEnchantmentMixin.java │ │ │ ├── entity │ │ │ ├── EntityMixin.java │ │ │ ├── EntityTypeMixin.java │ │ │ ├── LivingEntityMixin.java │ │ │ ├── ai │ │ │ │ ├── brain │ │ │ │ │ └── task │ │ │ │ │ │ ├── FarmerVillagerTaskMixin.java │ │ │ │ │ │ ├── GoToWorkTaskMixin.java │ │ │ │ │ │ ├── LookTargetUtilMixin.java │ │ │ │ │ │ ├── LoseJobOnSiteLossTaskMixin.java │ │ │ │ │ │ ├── OpenDoorsTaskMixin.java │ │ │ │ │ │ └── VillagerBreedTaskMixin.java │ │ │ │ └── goal │ │ │ │ │ └── AnimalMateGoalMixin.java │ │ │ ├── damage │ │ │ │ └── DamageSourceMixin.java │ │ │ ├── decoration │ │ │ │ └── AbstractDecorationEntityMixin.java │ │ │ ├── mob │ │ │ │ ├── DrownedEntityAccess.java │ │ │ │ └── MobEntityMixin.java │ │ │ ├── player │ │ │ │ ├── HungerManagerMixin.java │ │ │ │ └── PlayerEntityMixin.java │ │ │ └── projectile │ │ │ │ └── AbstractFireBallEntityMixin.java │ │ │ ├── fluid │ │ │ ├── BaseFluidMixin.java │ │ │ └── LavaFluidMixin.java │ │ │ ├── inventory │ │ │ ├── BasicInventoryMixin.java │ │ │ ├── CraftingInventoryMixin.java │ │ │ ├── CraftingResultInventoryMixin.java │ │ │ ├── DoubleInventoryMixin.java │ │ │ └── EnderChestInventoryMixin.java │ │ │ ├── item │ │ │ └── map │ │ │ │ ├── MapState$PlayerUpdateTrackerMixin.java │ │ │ │ └── MapStateMixin.java │ │ │ ├── network │ │ │ └── packet │ │ │ │ └── c2s │ │ │ │ └── play │ │ │ │ └── ClientSettingsC2SPacketAccess.java │ │ │ ├── server │ │ │ ├── MinecraftServerMixin.java │ │ │ ├── PlayerManagerMixin.java │ │ │ ├── ServerNetworkIoMixin.java │ │ │ ├── command │ │ │ │ ├── CommandOutput$1Mixin.java │ │ │ │ ├── CommandOutputMixin.java │ │ │ │ └── ServerCommandSourceMixin.java │ │ │ ├── network │ │ │ │ ├── ServerLoginNetworkHandler$1Mixin.java │ │ │ │ ├── ServerLoginNetworkHandlerMixin.java │ │ │ │ └── ServerPlayerEntityMixin.java │ │ │ └── world │ │ │ │ ├── SecondaryServerWorldMixin.java │ │ │ │ ├── ServerWorldMixin.java │ │ │ │ └── ThreadedAnvilChunkStorageMixin.java │ │ │ ├── util │ │ │ └── math │ │ │ │ └── Vec3iAccess.java │ │ │ └── world │ │ │ ├── BlockViewMixin.java │ │ │ ├── ChunkRegionMixin.java │ │ │ ├── PortalForcerMixin.java │ │ │ ├── WorldMixin.java │ │ │ ├── WorldSaveHandlerMixin.java │ │ │ ├── biome │ │ │ └── source │ │ │ │ └── BiomeArrayMixin.java │ │ │ ├── border │ │ │ └── WorldBorderMixin.java │ │ │ ├── chunk │ │ │ └── WorldChunkMixin.java │ │ │ ├── dimension │ │ │ ├── DimensionMixin.java │ │ │ ├── DimensionTypeMixin.java │ │ │ ├── OverworldDimensionMixin.java │ │ │ ├── TheEndDimensionMixin.java │ │ │ └── TheNetherDimensionMixin.java │ │ │ ├── explosion │ │ │ └── ExplosionMixin.java │ │ │ └── level │ │ │ └── LevelPropertiesMixin.java │ │ ├── plugin │ │ └── PublicPlugin.java │ │ └── util │ │ ├── Constants.java │ │ ├── Constructors.java │ │ ├── LocalVariable.java │ │ └── craftbukkit │ │ ├── BlockStateArrayList.java │ │ ├── CraftWorldBorderListener.java │ │ └── net │ │ └── minecraft │ │ ├── block │ │ ├── BukkitChestDoubleInventory.java │ │ ├── DualBlockList.java │ │ └── LecternInventory.java │ │ ├── container │ │ └── CraftingUtil.java │ │ ├── datafix │ │ └── PlayerNameFix.java │ │ ├── entity │ │ └── EntityUtil.java │ │ └── server │ │ ├── BanEntryUtil.java │ │ └── ResultWaitable.java └── resources │ ├── assets │ └── fukkit │ │ └── icon.png │ ├── configurations │ ├── bukkit.yml │ ├── commands.yml │ └── help.yml │ ├── fabric.mod.json │ └── net │ └── minecraft │ ├── fukkit.access.mixins.json │ ├── fukkit.block.mixins.json │ ├── fukkit.nms.mixins.json │ ├── fukkit.server.mixins.json │ └── fukkit.world.mixins.json └── test └── java └── net └── devtech └── bruh └── Accessor.java /.gitignore: -------------------------------------------------------------------------------- 1 | #Gradle 2 | .gradle/ 3 | build/ 4 | out/ 5 | classes/ 6 | gradlew.bat 7 | gradlew 8 | logs.txt 9 | 10 | #IDEA 11 | .idea/ 12 | *.iml 13 | *.ipr 14 | *.iws 15 | 16 | #vscode 17 | .settings/ 18 | .vscode/ 19 | bin/ 20 | .classpath 21 | .project 22 | 23 | #fabric 24 | run/ 25 | 26 | #Yeoman 27 | .yo-rc.json 28 | 29 | # fukkit 30 | patches/ 31 | 32 | # patches 33 | *.patch 34 | 35 | temp 36 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs = -Xmx1G 2 | 3 | #Fabric properties 4 | minecraft_version = 1.15.2 5 | yarn_mappings = 1.15.2+build.14 6 | loader_version = 0.7.8+build.184 7 | 8 | #Mod properties 9 | mod_version = 0.0.0 10 | maven_group = com.github.fukkitmc.fukkit 11 | archives_base_name = fukkit 12 | 13 | #Dependencies 14 | fabric_api_version = 0.4.32+build.292-1.15 -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FukkitMC/CraftFukkit/eaabdcdebd270def4a72c10a4ebfe43665ef4700/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Jan 18 16:09:10 CST 2020 2 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip 3 | distributionBase=GRADLE_USER_HOME 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /libs/Dev-Lib-1.0-SNAPSHOT.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FukkitMC/CraftFukkit/eaabdcdebd270def4a72c10a4ebfe43665ef4700/libs/Dev-Lib-1.0-SNAPSHOT.jar -------------------------------------------------------------------------------- /libs/yarrnbukkit-1.15.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FukkitMC/CraftFukkit/eaabdcdebd270def4a72c10a4ebfe43665ef4700/libs/yarrnbukkit-1.15.2.jar -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | jcenter() 4 | maven { 5 | name = 'Fabric' 6 | url = 'https://maven.fabricmc.net/' 7 | } 8 | gradlePluginPortal() 9 | } 10 | } -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/FukkitInit.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit; 2 | 3 | import net.fabricmc.api.EnvType; 4 | import net.fabricmc.api.ModInitializer; 5 | import net.fabricmc.loader.api.FabricLoader; 6 | import net.minecraft.entity.ai.brain.task.*; 7 | import net.minecraft.entity.ai.goal.AnimalMateGoal; 8 | import org.apache.logging.log4j.Level; 9 | import org.apache.logging.log4j.LogManager; 10 | import org.apache.logging.log4j.Logger; 11 | 12 | // prior to contributing to fukkit 13 | // watch this gif for 1 hr straight 14 | // https://tenor.com/view/weird-face-lick-nose-gif-11424629 15 | public class FukkitInit implements ModInitializer { 16 | // TODO mixin verification 17 | // check your TAIL/RETURN, tail is the last return and return is all returns, make sure u did it right 18 | // ensure all my injects aren't accidentally injecting into multiple places 19 | // make sure I've fully implemented the patch 20 | // remove overwrites if possible 21 | // make all captures LocalCapture#FAIL_HARD 22 | // remove dependency on fabric api (but keep it for testing for conflicts) 23 | // make sure remPassenger gets an inject 24 | // replace field locals with thread locals or assert main thread 25 | // replace thread locals with a FIFO queue or assert main thread 26 | // comment all :notvanilla: methods with something, and add constraints or use mixin plugin to disable, or just 27 | // move them to CrapFukkit if they aren't used for anything 28 | // replace ordinals with slices 29 | // remove unessesary overwrites 30 | 31 | public static final String MOD_ID = "fukkit"; 32 | public static final String MOD_NAME = "fukkit"; 33 | public static boolean useJLine = false; 34 | public static final Logger LOGGER = LogManager.getLogger(); 35 | 36 | @Override 37 | public void onInitialize() { 38 | // a 39 | Object o = AnimalMateGoal.class.getName(); 40 | log(Level.WARN, "Initializing" + o); 41 | if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { 42 | LOGGER.warn("Warning, clients are not supported, loading multiple worlds at once might cause issues!"); 43 | } 44 | } 45 | public static void log(Level level, String message) { 46 | LOGGER.log(level, "[" + MOD_NAME + "] " + message); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/CraftHandled.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access; 2 | 3 | /** 4 | * for nms objects that hold a CraftBukkit object with them 5 | * 6 | * @param 7 | */ 8 | public interface CraftHandled { 9 | T getBukkit(); 10 | 11 | void setBukkit(T obj); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/block/BlockAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.item.ItemStack; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.World; 7 | 8 | public interface BlockAccess { 9 | int getExpDrop(BlockState state, World world, BlockPos pos, ItemStack stack); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/block/NetherPortalBlock$AreaHelperAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.block; 2 | 3 | public interface NetherPortalBlock$AreaHelperAccess { 4 | boolean createPortal(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/block/entity/AbstractFurnaceBlockEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.block.entity; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 4 | import net.minecraft.entity.player.PlayerEntity; 5 | import net.minecraft.inventory.Inventory; 6 | import net.minecraft.item.ItemStack; 7 | 8 | public interface AbstractFurnaceBlockEntityAccess extends InventoryAccess { 9 | void dropExperience(PlayerEntity entityhuman, ItemStack itemstack, int amount); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/block/entity/BeaconBlockEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.block.entity; 2 | 3 | import net.minecraft.entity.player.PlayerEntity; 4 | import org.bukkit.potion.PotionEffect; 5 | import java.util.List; 6 | 7 | public interface BeaconBlockEntityAccess { 8 | PotionEffect getPrimaryEffect(); 9 | PotionEffect getSecondaryEffect(); 10 | List getHumansInRange(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/block/entity/BlockEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.block.entity; 2 | 3 | import net.minecraft.world.World; 4 | import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer; 5 | import org.bukkit.inventory.InventoryHolder; 6 | 7 | public interface BlockEntityAccess { 8 | CraftPersistentDataContainer getContainer(); 9 | 10 | void setContainer(CraftPersistentDataContainer container); 11 | 12 | void setWorld(World world); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/command/arguments/EntityArgumentTypeAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.command.arguments; 2 | 3 | import com.mojang.brigadier.StringReader; 4 | import com.mojang.brigadier.exceptions.CommandSyntaxException; 5 | import net.minecraft.command.EntitySelector; 6 | 7 | public interface EntityArgumentTypeAccess { 8 | EntitySelector parse(StringReader reader, boolean overridePermissions) throws CommandSyntaxException; 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/command/arguments/EntitySelectorReaderAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.command.arguments; 2 | 3 | import com.mojang.brigadier.exceptions.CommandSyntaxException; 4 | import net.minecraft.command.EntitySelector; 5 | 6 | public interface EntitySelectorReaderAccess { 7 | EntitySelector parse(boolean overridePermissions) throws CommandSyntaxException; 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/container/AnvilContainerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.container; 2 | 3 | public interface AnvilContainerAccess extends ContainerAccess { 4 | int getMaximumRepairCosts(); 5 | void setMaximumRepairCosts(int repairCosts); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/container/BlockContextAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.util.math.BlockPos; 5 | import net.minecraft.world.World; 6 | import org.bukkit.Location; 7 | 8 | public interface BlockContextAccess { 9 | World getWorld(); 10 | 11 | BlockPos getPosition(); 12 | 13 | Location getLocation(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/container/BlockContextContainerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.container; 2 | 3 | import net.minecraft.container.BlockContext; 4 | 5 | public interface BlockContextContainerAccess { 6 | BlockContext getContext(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/container/ContainerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 4 | import net.minecraft.container.Container; 5 | import net.minecraft.text.Text; 6 | import org.bukkit.craftbukkit.inventory.CraftInventory; 7 | import org.bukkit.inventory.InventoryView; 8 | 9 | public interface ContainerAccess { 10 | boolean getCheckReachable(); 11 | 12 | void setCheckReachable(boolean check); 13 | 14 | default void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player) { 15 | InventoryView source = this.getBukkitView(), destination = ((ContainerAccess) other).getBukkitView(); 16 | ((InventoryAccess) ((CraftInventory) source.getTopInventory()).getInventory()).onClose(player); 17 | ((InventoryAccess) ((CraftInventory) source.getBottomInventory()).getInventory()).onClose(player); 18 | ((InventoryAccess) ((CraftInventory) destination.getTopInventory()).getInventory()).onOpen(player); 19 | ((InventoryAccess) ((CraftInventory) destination.getBottomInventory()).getInventory()).onOpen(player); 20 | } 21 | 22 | InventoryView getBukkitView(); 23 | 24 | Text getTitle(); 25 | 26 | void setTitle(Text text); 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/container/LecternContainerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.container; 2 | 3 | import net.minecraft.entity.player.PlayerInventory; 4 | 5 | public interface LecternContainerAccess extends ContainerAccess { 6 | void setPlayerInv(PlayerInventory inv); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/EntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity; 2 | 3 | import com.github.fukkitmc.fukkit.access.CraftHandled; 4 | import net.minecraft.entity.Entity; 5 | import net.minecraft.server.command.ServerCommandSource; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.dimension.DimensionType; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.craftbukkit.entity.CraftEntity; 10 | import org.bukkit.projectiles.ProjectileSource; 11 | 12 | public interface EntityAccess extends CraftHandled { 13 | float getYaw(); 14 | 15 | boolean willPersist(); 16 | 17 | void shouldPersist(boolean persist); 18 | 19 | boolean isValid(); 20 | 21 | void setValid(boolean isValid); 22 | 23 | ProjectileSource getProjectileSource(); 24 | 25 | void setProjectileSource(ProjectileSource source); 26 | 27 | boolean shouldForceExplosionKnockback(); 28 | 29 | void setForceExplosionKnockback(boolean knockback); 30 | 31 | boolean isChunkLoaded(); 32 | 33 | default CommandSender getBukkitSender(ServerCommandSource wrapper) { 34 | return this.getBukkit(); 35 | } 36 | 37 | void setOnFireFor(int seconds, boolean callEvent); 38 | 39 | void postTick(); 40 | 41 | int getRidingCooldown(); 42 | 43 | void setRidingCooldown(int cooldown); 44 | 45 | Entity teleportTo(DimensionType type, BlockPos pos); 46 | } 47 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/EntityTypeAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity; 2 | 3 | import net.minecraft.entity.Entity; 4 | import net.minecraft.entity.SpawnType; 5 | import net.minecraft.entity.player.PlayerEntity; 6 | import net.minecraft.nbt.CompoundTag; 7 | import net.minecraft.text.Text; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.World; 10 | import org.bukkit.event.entity.CreatureSpawnEvent; 11 | 12 | public interface EntityTypeAccess { 13 | T spawnCreature(World world, CompoundTag tag, Text text, PlayerEntity player, BlockPos pos, SpawnType type, 14 | boolean alignPosition, boolean invertY, CreatureSpawnEvent.SpawnReason spawnReason); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/LivingEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity; 2 | 3 | import net.minecraft.entity.damage.DamageSource; 4 | import net.minecraft.entity.effect.StatusEffect; 5 | import net.minecraft.entity.effect.StatusEffectInstance; 6 | import org.bukkit.craftbukkit.attribute.CraftAttributeMap; 7 | import org.bukkit.craftbukkit.entity.CraftLivingEntity; 8 | import org.bukkit.event.entity.EntityPotionEffectEvent; 9 | import org.bukkit.event.entity.EntityRegainHealthEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | import java.util.ArrayList; 12 | 13 | public interface LivingEntityAccess extends EntityAccess { 14 | int getExpToDrop(); 15 | 16 | void setExpToDrop(int exp); 17 | 18 | int getMaxAirTicks(); 19 | 20 | void setMaxAirTicks(int ticks); 21 | 22 | boolean shouldForceDrops(); 23 | 24 | ArrayList getDrops(); 25 | 26 | CraftAttributeMap getCraftAttributes(); 27 | 28 | void setCraftAttributes(CraftAttributeMap map); 29 | 30 | boolean collides(); 31 | 32 | boolean canPickUpLoot(); 33 | 34 | void setForceDrops(boolean forceDrops); 35 | 36 | void setCollides(boolean collides); 37 | 38 | void setCanPickUpLoot(boolean canPickUpLoot); 39 | 40 | boolean removeAllEffects(EntityPotionEffectEvent.Cause cause); 41 | 42 | boolean addEffect(StatusEffectInstance instance, EntityPotionEffectEvent.Cause cause); 43 | 44 | StatusEffectInstance removeStatusEffectInternal(StatusEffect statusEffect, EntityPotionEffectEvent.Cause cause); 45 | 46 | boolean removeEffect(StatusEffect effect, EntityPotionEffectEvent.Cause cause); 47 | 48 | void heal(float f, EntityRegainHealthEvent.RegainReason regainReason); 49 | 50 | int getExpReward(); 51 | 52 | boolean damage0(DamageSource source, float damage); 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/damage/DamageSourceAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity.damage; 2 | 3 | import net.minecraft.entity.damage.DamageSource; 4 | 5 | public interface DamageSourceAccess { 6 | boolean isSweep(); 7 | 8 | DamageSource sweep(); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/mob/MobEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity.mob; 2 | 3 | public interface MobEntityAccess { 4 | void setPersistent(boolean persistent); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/player/HungerManagerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity.player; 2 | 3 | import net.minecraft.entity.player.PlayerEntity; 4 | 5 | public interface HungerManagerAccess { 6 | void setPlayer(PlayerEntity entity); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/entity/player/PlayerEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.entity.player; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.LivingEntityAccess; 4 | import com.mojang.datafixers.util.Either; 5 | import net.minecraft.entity.player.PlayerEntity; 6 | import net.minecraft.util.Unit; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 9 | 10 | public interface PlayerEntityAccess extends LivingEntityAccess { 11 | boolean isFauxSleeping(); 12 | 13 | void setFauxSleeping(boolean fauxSleeping); 14 | 15 | String getSpawnWorld(); 16 | 17 | void setSpawnWorld(String world); 18 | 19 | int getOldLevel(); 20 | 21 | void setOldLevel(int level); 22 | 23 | Either sleep(BlockPos blockposition, boolean force); 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/inventory/BasicInventoryAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.inventory; 2 | 3 | import org.bukkit.inventory.InventoryHolder; 4 | 5 | public interface BasicInventoryAccess extends InventoryAccess { 6 | void setOwner(InventoryHolder holder); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/inventory/CraftingInventoryAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.inventory; 2 | 3 | import net.minecraft.inventory.Inventory; 4 | import org.bukkit.event.inventory.InventoryType; 5 | import org.bukkit.inventory.InventoryHolder; 6 | 7 | public interface CraftingInventoryAccess extends InventoryAccess { 8 | InventoryType getInvType(); 9 | 10 | Inventory getResultInventory(); 11 | 12 | void setResultInventory(Inventory inventory); 13 | 14 | void setOwner(InventoryHolder holder); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/inventory/InventoryAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.inventory; 2 | 3 | import net.minecraft.item.ItemStack; 4 | import net.minecraft.recipe.Recipe; 5 | import org.bukkit.Location; 6 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 7 | import org.bukkit.entity.HumanEntity; 8 | import org.bukkit.inventory.InventoryHolder; 9 | import java.util.List; 10 | 11 | public interface InventoryAccess { 12 | Location getLocation(); 13 | 14 | List getContents(); 15 | 16 | void onOpen(CraftHumanEntity who); 17 | 18 | void onClose(CraftHumanEntity who); 19 | 20 | List getViewers(); 21 | 22 | InventoryHolder getOwner(); 23 | 24 | void setMaxStackSize(int size); 25 | 26 | default Recipe getCurrentRecipe() { return null; } 27 | 28 | default void setCurrentRecipe(Recipe recipe) {} 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/item/map/MapStateAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.item.map; 2 | 3 | import org.bukkit.craftbukkit.map.CraftMapView; 4 | 5 | public interface MapStateAccess { 6 | CraftMapView getMapView(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/MinecraftServerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server; 2 | 3 | import com.github.fukkitmc.fukkit.access.CraftHandled; 4 | import net.minecraft.server.MinecraftServer; 5 | import org.bukkit.command.ConsoleCommandSender; 6 | import org.bukkit.craftbukkit.CraftServer; 7 | import org.bukkit.craftbukkit.libs.jline.console.ConsoleReader; 8 | 9 | public interface MinecraftServerAccess extends CraftHandled { 10 | ConsoleCommandSender getConsoleCommandSender(); 11 | 12 | void setConsoleCommandSender(ConsoleCommandSender sender); 13 | 14 | ConsoleReader getReader(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/PlayerManagerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server; 2 | 3 | import com.mojang.authlib.GameProfile; 4 | import net.minecraft.entity.player.PlayerEntity; 5 | import net.minecraft.network.Packet; 6 | import net.minecraft.server.network.ServerLoginNetworkHandler; 7 | import net.minecraft.server.network.ServerPlayerEntity; 8 | import net.minecraft.text.Text; 9 | import net.minecraft.world.World; 10 | import net.minecraft.world.dimension.DimensionType; 11 | import org.bukkit.Location; 12 | 13 | public interface PlayerManagerAccess { 14 | String disconnect(ServerPlayerEntity entity); 15 | 16 | ServerPlayerEntity attemptLogin(ServerLoginNetworkHandler networkHandler, GameProfile profile, String host); 17 | 18 | ServerPlayerEntity processLogin(GameProfile profile, ServerPlayerEntity entity); 19 | 20 | ServerPlayerEntity moveToWorld(ServerPlayerEntity entityplayer, DimensionType dimensionmanager, boolean alive, 21 | Location location, boolean avoidSuffocation); 22 | 23 | void sendAll(Packet packet, PlayerEntity entity); 24 | 25 | void sendAll(Packet packet, World world); 26 | 27 | void sendMessage(Text[] lines); 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/ServerNetworkIoAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server; 2 | 3 | public interface ServerNetworkIoAccess { 4 | void acceptConnections(); 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/command/CommandOutputAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server.command; 2 | 3 | import net.minecraft.server.command.ServerCommandSource; 4 | import org.bukkit.command.CommandSender; 5 | 6 | public interface CommandOutputAccess { 7 | CommandSender getBukkitSender(ServerCommandSource wrapper); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/command/ServerCommandSourceAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server.command; 2 | 3 | import com.mojang.brigadier.tree.CommandNode; 4 | import net.minecraft.server.command.ServerCommandSource; 5 | import org.bukkit.command.CommandSender; 6 | 7 | public interface ServerCommandSourceAccess { 8 | void setCurrentCommand(CommandNode currentCommand); 9 | CommandNode getCurrentCommand(); 10 | boolean hasPermission(int level, String bukkitPermission); 11 | CommandSender getBukkitSender(); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/network/ServerLoginNetworkHandlerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server.network; 2 | 3 | import net.minecraft.server.MinecraftServer; 4 | 5 | public interface ServerLoginNetworkHandlerAccess { 6 | @Deprecated 7 | void disconnect(String text); 8 | 9 | MinecraftServer getServer(); 10 | 11 | String getHostName(); 12 | 13 | void setHostName(String name); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/network/ServerPlayNetworkHandlerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server.network; 2 | 3 | import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket; 4 | import org.bukkit.Location; 5 | import org.bukkit.craftbukkit.entity.CraftPlayer; 6 | import org.bukkit.event.player.PlayerTeleportEvent; 7 | import java.util.Set; 8 | 9 | public interface ServerPlayNetworkHandlerAccess { 10 | boolean hasProcessedDisconnect(); 11 | 12 | void setProcessedDisconnect(boolean processed); 13 | 14 | CraftPlayer getPlayer(); 15 | 16 | void disconnect(String string); 17 | 18 | void teleportRequest(double x, double y, double z, float yaw, float pitch, 19 | Set set, PlayerTeleportEvent.TeleportCause cause); 20 | 21 | void teleportRequest(double x, double y, double z, float yaw, float pitch, 22 | PlayerTeleportEvent.TeleportCause cause); 23 | 24 | void teleport(Location dest); 25 | 26 | void chat(String msg, boolean async); 27 | 28 | boolean isDisconnected(); 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/world/ServerWorldAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server.world; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.Block; 5 | import net.minecraft.block.entity.BlockEntity; 6 | import net.minecraft.entity.Entity; 7 | import net.minecraft.entity.LightningEntity; 8 | import net.minecraft.particle.ParticleEffect; 9 | import net.minecraft.server.network.ServerPlayerEntity; 10 | import net.minecraft.util.math.BlockPos; 11 | import org.bukkit.event.entity.CreatureSpawnEvent; 12 | import org.bukkit.event.weather.LightningStrikeEvent; 13 | 14 | public interface ServerWorldAccess extends WorldAccess { 15 | @Override 16 | BlockEntity getBlockEntity(BlockPos pos, boolean validate); 17 | 18 | BlockEntity fixBlockEntity(BlockPos pos, Block type, BlockEntity found); 19 | 20 | boolean spawnEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason); 21 | 22 | boolean addEntitySerialized(Entity entity, CreatureSpawnEvent.SpawnReason reason); 23 | 24 | boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason); 25 | 26 | void strikeLightning(LightningEntity entitylightning, LightningStrikeEvent.Cause cause); 27 | 28 | int spawnParticles(ServerPlayerEntity entity, T particle, double x, double y, double z, 29 | int count, double deltaX, double deltaY, double deltaZ, double speed 30 | , boolean force); 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/server/world/ThreadedAnvilChunkStorageAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.server.world; 2 | 3 | import net.minecraft.server.WorldGenerationProgressListener; 4 | 5 | public interface ThreadedAnvilChunkStorageAccess { 6 | WorldGenerationProgressListener getListener(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/BlockViewAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world; 2 | 3 | import net.minecraft.util.hit.BlockHitResult; 4 | import net.minecraft.util.math.BlockPos; 5 | import net.minecraft.world.RayTraceContext; 6 | 7 | public interface BlockViewAccess { 8 | BlockHitResult rayTraceBlock(RayTraceContext raytrace1, BlockPos blockposition); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/ChunkRegionAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world; 2 | 3 | import net.minecraft.entity.Entity; 4 | import org.bukkit.event.entity.CreatureSpawnEvent; 5 | 6 | public interface ChunkRegionAccess { 7 | boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/PortalForcerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world; 2 | 3 | import net.minecraft.block.pattern.BlockPattern; 4 | import net.minecraft.entity.Entity; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.util.math.Direction; 7 | import net.minecraft.util.math.Vec3d; 8 | 9 | public interface PortalForcerAccess { 10 | BlockPattern.TeleportTarget findAndTeleport(Entity entity, BlockPos pos, float yawOffset, int searchRadius, 11 | boolean searchOnly); 12 | 13 | BlockPattern.TeleportTarget findPortal(BlockPos pos, Vec3d vec3d, Direction direction, double portalOffsetX, 14 | double portalOffsetZ, boolean isHuman, int searchRadius); 15 | 16 | boolean createPortal(Entity entity, BlockPos createPos, int createRadius); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/WorldAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world; 2 | 3 | import com.github.fukkitmc.fukkit.access.CraftHandled; 4 | import com.github.fukkitmc.fukkit.util.craftbukkit.BlockStateArrayList; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.entity.BlockEntity; 7 | import net.minecraft.entity.ItemEntity; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.chunk.ChunkManager; 10 | import net.minecraft.world.chunk.WorldChunk; 11 | import org.bukkit.craftbukkit.CraftServer; 12 | import org.bukkit.craftbukkit.CraftWorld; 13 | import org.bukkit.generator.ChunkGenerator; 14 | import java.util.List; 15 | 16 | public interface WorldAccess extends CraftHandled { 17 | CraftServer getBukkitServer(); 18 | 19 | WorldChunk getChunkIfLoaded(int x, int z); 20 | 21 | ChunkGenerator getGenerator(); 22 | 23 | void setGenerator(ChunkGenerator generator); 24 | 25 | boolean keepSpawnInMemory(); 26 | 27 | void setKeepSpawnInMemory(boolean keepSpawnInMemory); 28 | 29 | long getTicksPerAnimalSpawns(); 30 | 31 | void setTicksPerAnimalSpawns(long ticks); 32 | 33 | long getTicksPerMonsterSpawns(); 34 | 35 | void setTicksSpawnMonsterSpawns(long ticks); 36 | 37 | List getCaptureDrops(); 38 | 39 | ChunkManager getChunkManager(); 40 | 41 | void setChunkManager(ChunkManager manager); 42 | 43 | boolean hasPvp(); 44 | 45 | void setPvp(boolean pvp); 46 | 47 | boolean capturesBlockStates(); 48 | 49 | void setCaptureBlockStates(boolean captureBlockStates); 50 | 51 | boolean capturesTreeGen(); 52 | 53 | void setCaptureTreeGen(boolean captureTreeGen); 54 | 55 | BlockStateArrayList getCapturedStates(); 56 | 57 | boolean isPopulating(); 58 | 59 | void setPopulating(boolean populating); 60 | 61 | boolean initialized(); 62 | 63 | void setInitialized(boolean init); 64 | 65 | void notifyAndUpdatePhysics(BlockPos blockposition, WorldChunk chunk, BlockState oldBlock, BlockState newBlock, 66 | BlockState actualBlock, int i); 67 | 68 | BlockEntity getBlockEntity(BlockPos pos, boolean validate); 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/WorldSaveHandlerAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world; 2 | 3 | import net.minecraft.nbt.CompoundTag; 4 | import java.io.File; 5 | import java.util.UUID; 6 | 7 | public interface WorldSaveHandlerAccess { 8 | CompoundTag getPlayerData(String uuid); 9 | 10 | UUID getUUID(); 11 | 12 | File getPlayerDir(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/biome/source/BiomeArrayAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.biome.source; 2 | 3 | import net.minecraft.world.biome.Biome; 4 | 5 | public interface BiomeArrayAccess { 6 | void setBiome(int x, int y, int z, Biome biome); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/border/WorldBorderAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.border; 2 | 3 | import net.minecraft.server.world.ServerWorld; 4 | 5 | public interface WorldBorderAccess { 6 | ServerWorld getServerWorld(); 7 | 8 | void setServerWorld(ServerWorld world); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/chunk/WorldChunkAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.chunk; 2 | 3 | import com.github.fukkitmc.fukkit.access.CraftHandled; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.util.math.BlockPos; 6 | import org.bukkit.Chunk; 7 | 8 | public interface WorldChunkAccess extends CraftHandled { 9 | boolean getMustNotSave(); 10 | 11 | void setMustNotSave(boolean save); 12 | 13 | boolean getNeedsDecoration(); 14 | 15 | void setNeedsDecoration(boolean decoration); 16 | 17 | BlockState setType(BlockPos pos, BlockState state, boolean flag, boolean doPlace); 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/dimension/DimensionAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension; 2 | 3 | import net.minecraft.world.dimension.DimensionType; 4 | 5 | public interface DimensionAccess { 6 | DimensionType getType(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/dimension/DimensionTypeAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension; 2 | 3 | import net.minecraft.world.dimension.DimensionType; 4 | 5 | public interface DimensionTypeAccess { 6 | DimensionType getType(); 7 | 8 | void setType(DimensionType type); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/explosion/ExplosionAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.explosion; 2 | 3 | public interface ExplosionAccess { 4 | boolean wasCancelled(); 5 | 6 | void setWasCancelled(boolean bool); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/access/net/minecraft/world/level/LevelPropertiesAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.access.net.minecraft.world.level; 2 | 3 | import net.minecraft.server.world.ServerWorld; 4 | 5 | public interface LevelPropertiesAccess { 6 | void checkName(String name); 7 | 8 | ServerWorld getServerWorld(); 9 | 10 | void setServerWorld(ServerWorld world); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/advancement/AdvancementManagerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.advancement; 2 | 3 | import net.minecraft.advancement.AdvancementManager; 4 | import org.apache.logging.log4j.Logger; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Redirect; 8 | 9 | @Mixin (AdvancementManager.class) 10 | public class AdvancementManagerMixin { 11 | @Redirect (method = "load(Ljava/util/Map;)V", 12 | at = @At (target = "Lorg/apache/logging/log4j/Logger;info(Ljava/lang/String;Ljava/lang/Object;)V", 13 | value = "INVOKE", remap = false)) 14 | public void redirectUnload(Logger logger, String message, Object p0) { 15 | // CraftBukkit - moved to AdvancementDataWorld#reload 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/advancement/AdvancementMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.advancement; 2 | 3 | import com.github.fukkitmc.fukkit.access.CraftHandled; 4 | import net.minecraft.advancement.Advancement; 5 | import org.bukkit.craftbukkit.advancement.CraftAdvancement; 6 | import org.spongepowered.asm.mixin.Implements; 7 | import org.spongepowered.asm.mixin.Interface; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | 10 | @Mixin (Advancement.class) 11 | public abstract class AdvancementMixin implements CraftHandled { 12 | private org.bukkit.advancement.Advancement advancement = new CraftAdvancement((Advancement) (Object) this); 13 | 14 | @Override 15 | public org.bukkit.advancement.Advancement getBukkit() { 16 | return this.advancement; 17 | } 18 | 19 | @Override 20 | public void setBukkit(org.bukkit.advancement.Advancement object) { 21 | this.advancement = object; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/AbstractPressurePlateBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.AbstractPressurePlateBlock; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.event.block.BlockRedstoneEvent; 9 | import org.bukkit.plugin.PluginManager; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.Shadow; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Redirect; 14 | 15 | @Mixin (AbstractPressurePlateBlock.class) 16 | public abstract class AbstractPressurePlateBlockMixin { 17 | @Redirect (method = "updatePlateState", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/AbstractPressurePlateBlock;" + 19 | "getRedstoneOutput(Lnet/minecraft/world/World;" + 20 | "Lnet/minecraft/util/math/BlockPos;)I", 21 | ordinal = 0)) 22 | public int fukkit_blockRedstoneEvent(AbstractPressurePlateBlock block, World world, BlockPos pos, World world2, 23 | BlockPos pos2, BlockState blockState, int rsOut) { 24 | int i = this.getRedstoneOutput(world, pos); 25 | // this works, only in theory, I've yet to see it in practice 26 | // it's like communism :tiny_potato: 27 | org.bukkit.World bukkit = ((WorldAccess) world).getBukkit(); 28 | PluginManager manager = ((WorldAccess) world).getBukkitServer().getPluginManager(); 29 | 30 | if ((rsOut > 0) ^ (i > 0)) { 31 | BlockRedstoneEvent event = new BlockRedstoneEvent(bukkit.getBlockAt(pos.getX(), pos.getY(), pos 32 | .getZ()), rsOut, i); 33 | manager.callEvent(event); 34 | i = event.getNewCurrent(); 35 | } 36 | return i; 37 | } 38 | 39 | @Shadow protected abstract int getRedstoneOutput(World world, BlockPos pos); 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/AbstractRedstoneGateBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.AbstractRedstoneGateBlock; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 12 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 13 | import java.util.Random; 14 | 15 | @Mixin (AbstractRedstoneGateBlock.class) 16 | public class AbstractRedstoneGateBlockMixin { 17 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 19 | "(Lnet/minecraft/util/math/BlockPos;" + 20 | "Lnet/minecraft/block/BlockState;I)Z"), 21 | locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) 22 | public void fukkit_redstoneChange(BlockState state, ServerWorld world, BlockPos pos, Random random, 23 | CallbackInfo ci, boolean bl, boolean bl2) { 24 | // we inject into both because we can :yeefuckinhaw: 25 | int num = bl ? 15 : 0; 26 | int inverse = bl ? 0 : 15; 27 | if (CraftEventFactory.callRedstoneChange(world, pos, num, bl ? 0 : 15).getNewCurrent() != inverse) { 28 | ci.cancel(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/BambooSaplingBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BambooSaplingBlock; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.World; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | 12 | @Mixin (BambooSaplingBlock.class) 13 | public class BambooSaplingBlockMixin { 14 | @Redirect (method = "grow(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V", 15 | at = @At (value = "INVOKE", 16 | target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;" + 17 | "Lnet/minecraft/block/BlockState;I)Z")) 18 | private boolean fukkit_spreadEvent(World world, BlockPos pos, BlockState state, int flags) { 19 | return CraftEventFactory.handleBlockSpreadEvent(world, pos.down(), pos, state, 3); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/BlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.block.BlockAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 5 | import net.minecraft.block.Block; 6 | import net.minecraft.block.BlockState; 7 | import net.minecraft.entity.Entity; 8 | import net.minecraft.entity.ItemEntity; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.util.math.BlockPos; 11 | import net.minecraft.world.World; 12 | import org.spongepowered.asm.mixin.Implements; 13 | import org.spongepowered.asm.mixin.Interface; 14 | import org.spongepowered.asm.mixin.Mixin; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Redirect; 17 | import java.util.List; 18 | 19 | @Implements (@Interface (iface = BlockAccess.class, prefix = "fukkit$")) 20 | @Mixin (Block.class) 21 | public class BlockMixin { 22 | @Redirect (method = "dropStack", at = @At (value = "INVOKE", 23 | target = "Lnet/minecraft/world/World;spawnEntity" + 24 | "(Lnet/minecraft/entity/Entity;)Z")) 25 | private static boolean fukkit_capture(World world, Entity entity) { 26 | List access = ((WorldAccess) world).getCaptureDrops(); 27 | if (access != null && entity instanceof ItemEntity) // extra check 28 | { access.add((ItemEntity) entity); } else { world.spawnEntity(entity); } 29 | return false; 30 | } 31 | 32 | public int fukkit$getExpDrop(BlockState state, World world, BlockPos pos, ItemStack stack) { 33 | return 0; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CactusBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.CactusBlock; 6 | import net.minecraft.entity.Entity; 7 | import net.minecraft.server.world.ServerWorld; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.World; 10 | import org.bukkit.craftbukkit.event.CraftEventFactory; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.Redirect; 15 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 16 | 17 | @Mixin (CactusBlock.class) 18 | public class CactusBlockMixin { 19 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 20 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 21 | "(Lnet/minecraft/util/math/BlockPos;" + 22 | "Lnet/minecraft/block/BlockState;)Z", 23 | ordinal = 0)) 24 | private boolean fukkit_handleGrow(ServerWorld world, BlockPos pos, BlockState blockState) { 25 | return CraftEventFactory.handleBlockGrowEvent(world, pos, blockState); 26 | } 27 | 28 | @Inject (method = "onEntityCollision", at = @At ("HEAD")) 29 | private void fukkit_blockDamage(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo ci) { 30 | CraftEventFactory.blockDamage = ((WorldAccess) world).getBukkit() 31 | .getBlockAt(pos.getX(), pos.getZ(), pos.getY()); 32 | } 33 | 34 | @Inject (method = "onEntityCollision", at = @At ("TAIL")) 35 | private void fukkit_blockDamageReset(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo ci) { 36 | CraftEventFactory.blockDamage = null; // seriously bukkit? static vars instead of parameters? are you kidding me? 37 | // atleast it's easy to implement in mixin 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CakeBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.EntityAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.CakeBlock; 6 | import net.minecraft.entity.player.HungerManager; 7 | import net.minecraft.entity.player.PlayerEntity; 8 | import net.minecraft.util.ActionResult; 9 | import net.minecraft.util.math.BlockPos; 10 | import net.minecraft.world.IWorld; 11 | import org.bukkit.craftbukkit.entity.CraftPlayer; 12 | import org.bukkit.craftbukkit.event.CraftEventFactory; 13 | import org.bukkit.event.entity.FoodLevelChangeEvent; 14 | import org.spongepowered.asm.mixin.Mixin; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Inject; 17 | import org.spongepowered.asm.mixin.injection.Redirect; 18 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 19 | 20 | @Mixin (CakeBlock.class) 21 | public class CakeBlockMixin { 22 | @Inject (method = "tryEat", 23 | at = @At (target = "Lnet/minecraft/entity/player/HungerManager;add(IF)V", value = "INVOKE")) 24 | private void fukkit_foodEvent(IWorld world, BlockPos pos, BlockState state, PlayerEntity player, 25 | CallbackInfoReturnable cir) { 26 | HungerManager manager = player.getHungerManager(); 27 | int old = manager.getFoodLevel(); 28 | FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(player, 2 + old); 29 | if (!event.isCancelled()) { manager.add(event.getFoodLevel() - old, .1f); } 30 | ((CraftPlayer) ((EntityAccess) player).getBukkit()).sendHealthUpdate(); 31 | } 32 | 33 | @Redirect (method = "tryEat", 34 | at = @At (target = "Lnet/minecraft/entity/player/HungerManager;add(IF)V", value = "INVOKE")) 35 | private void fukkit_nullifyEat(HungerManager manager, int food, float f) { 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CampfireBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.CampfireBlock; 5 | import net.minecraft.entity.Entity; 6 | import net.minecraft.util.hit.BlockHitResult; 7 | import net.minecraft.util.math.BlockPos; 8 | import net.minecraft.world.World; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Inject; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 14 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 15 | 16 | @Mixin (CampfireBlock.class) 17 | public class CampfireBlockMixin { 18 | @Inject (method = "onProjectileHit", at = @At (value = "INVOKE", 19 | target = "Lnet/minecraft/world/World;setBlockState" + 20 | "(Lnet/minecraft/util/math/BlockPos;" + 21 | "Lnet/minecraft/block/BlockState;I)Z"), 22 | cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) 23 | private void fukkit_igniteEvent(World world, BlockState state, BlockHitResult hitResult, Entity entity, 24 | CallbackInfo ci, boolean bl2, BlockPos blockPos) { 25 | if (CraftEventFactory.callBlockIgniteEvent(world, blockPos, entity) 26 | .isCancelled()) // TODO verify correct entitiy 27 | { ci.cancel(); } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CarvedPumpkinBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.CarvedPumpkinBlock; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | 6 | @Mixin (CarvedPumpkinBlock.class) 7 | public class CarvedPumpkinBlockMixin { 8 | // TODO finish, figure out local variables 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ChestBlock$2Mixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.block.BukkitChestDoubleInventory; 4 | import net.minecraft.block.entity.ChestBlockEntity; 5 | import net.minecraft.container.NameableContainerFactory; 6 | import net.minecraft.inventory.Inventory; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 11 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 12 | import java.util.Optional; 13 | 14 | @Mixin (targets = "net.minecraft.block.ChestBlock$2") 15 | public class ChestBlock$2Mixin { 16 | @Inject (method = "getFromBoth", at = @At ("RETURN"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) 17 | private void fukkit_customInventory(ChestBlockEntity leftChest, ChestBlockEntity rightChest, 18 | CallbackInfoReturnable> cir, 19 | Inventory inventory) { 20 | cir.setReturnValue(Optional 21 | .of(new BukkitChestDoubleInventory(leftChest, rightChest, 22 | (net.minecraft.inventory.DoubleInventory) inventory))); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ChorusFlowerBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.ChorusFlowerBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | import java.util.Random; 14 | 15 | @Mixin (ChorusFlowerBlock.class) 16 | public class ChorusFlowerBlockMixin extends Block { 17 | public ChorusFlowerBlockMixin(Settings settings) { 18 | super(settings); 19 | } 20 | 21 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 22 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 23 | "(Lnet/minecraft/util/math/BlockPos;" + 24 | "Lnet/minecraft/block/BlockState;I)Z", 25 | ordinal = 0)) 26 | private void fukkit_spreadEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, 27 | CallbackInfo ci) { 28 | if (!CraftEventFactory.handleBlockSpreadEvent(world, pos, pos.up(), this.getDefaultState() 29 | .with(ChorusFlowerBlock.AGE, state 30 | .get(ChorusFlowerBlock.AGE)), 2)) { 31 | ci.cancel(); 32 | } 33 | } 34 | 35 | // TODO finish implementation 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CocoaBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.CocoaBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | 12 | @Mixin (CocoaBlock.class) 13 | public class CocoaBlockMixin { 14 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 15 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 16 | "(Lnet/minecraft/util/math/BlockPos;" + 17 | "Lnet/minecraft/block/BlockState;I)Z")) 18 | private boolean fukkit_grow0(ServerWorld world, BlockPos pos, BlockState state, int flags) { 19 | return CraftEventFactory.handleBlockGrowEvent(world, pos, state, flags); 20 | } 21 | 22 | @Redirect (method = "grow", at = @At (value = "INVOKE", 23 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 24 | "(Lnet/minecraft/util/math/BlockPos;" + 25 | "Lnet/minecraft/block/BlockState;I)Z")) 26 | private boolean fukkit_grow1(ServerWorld world, BlockPos pos, BlockState state, int flags) { 27 | return CraftEventFactory.handleBlockGrowEvent(world, pos, state, flags); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CommandBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.Block; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.CommandBlock; 7 | import net.minecraft.block.entity.CommandBlockBlockEntity; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.World; 10 | import org.bukkit.event.block.BlockRedstoneEvent; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 14 | import java.util.Objects; 15 | 16 | @Mixin (CommandBlock.class) 17 | public class CommandBlockMixin { 18 | @ModifyVariable (method = "neighborUpdate", at = @At (value = "INVOKE", 19 | target = "Lnet/minecraft/block/entity" + 20 | "/CommandBlockBlockEntity;setPowered(Z)V"), 21 | index = 9, ordinal = 1) 22 | private boolean fukkit_redstoneEvent(boolean bl, BlockState state, World world, BlockPos pos, Block block, 23 | BlockPos neighborPos, boolean moved) { 24 | org.bukkit.block.Block bukkit = ((WorldAccess) world).getBukkit() 25 | .getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 26 | // unfortunate redundant call 27 | boolean isPowered = ((CommandBlockBlockEntity) Objects.requireNonNull(world 28 | .getBlockEntity(pos), "ohno, something went miserably wrong.")) 29 | .isPowered(); 30 | int old = bl ? 15 : 0; 31 | int current = isPowered ? 15 : 0; 32 | BlockRedstoneEvent event = new BlockRedstoneEvent(bukkit, old, current); 33 | ((WorldAccess) world).getBukkitServer().getPluginManager().callEvent(event); 34 | return event.getNewCurrent() > 0; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ComparatorBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.ComparatorBlock; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.World; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 12 | 13 | @Mixin (ComparatorBlock.class) 14 | public class ComparatorBlockMixin { 15 | @Inject (method = "update", at = @At (value = "INVOKE", 16 | target = "Lnet/minecraft/world/World;setBlockState" + 17 | "(Lnet/minecraft/util/math/BlockPos;" + 18 | "Lnet/minecraft/block/BlockState;I)Z", 19 | ordinal = 0)) 20 | private void fukkit_depowerEvent0(World world, BlockPos pos, BlockState state, CallbackInfo ci) { 21 | if (CraftEventFactory.callRedstoneChange(world, pos, 15, 0).getNewCurrent() != 0) { ci.cancel(); } 22 | } 23 | 24 | @Inject (method = "update", at = @At (value = "INVOKE", 25 | target = "Lnet/minecraft/world/World;setBlockState" + 26 | "(Lnet/minecraft/util/math/BlockPos;" + 27 | "Lnet/minecraft/block/BlockState;I)Z", 28 | ordinal = 1)) 29 | private void fukkit_depowerEvent1(World world, BlockPos pos, BlockState state, CallbackInfo ci) { 30 | if (CraftEventFactory.callRedstoneChange(world, pos, 0, 15).getNewCurrent() != 15) { ci.cancel(); } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ComposterBlock$ComposterInventoryMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.BasicInventoryAccess; 5 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 6 | import net.minecraft.block.BlockState; 7 | import net.minecraft.inventory.Inventory; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.IWorld; 10 | import org.bukkit.craftbukkit.inventory.CraftBlockInventoryHolder; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 15 | 16 | @Mixin (targets = "net/minecraft/block/ComposterBlock$ComposterInventory") 17 | public class ComposterBlock$ComposterInventoryMixin { 18 | @Inject (method = "", at = @At ("TAIL")) 19 | private void fukkit_bukkitInventory(BlockState state, IWorld world, BlockPos pos, CallbackInfo ci) { 20 | ((BasicInventoryAccess) this).setOwner(new CraftBlockInventoryHolder(world, pos, (Inventory) this)); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ComposterBlock$FullComposterInventoryMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.BasicInventoryAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.inventory.BasicInventory; 7 | import net.minecraft.inventory.Inventory; 8 | import net.minecraft.inventory.SidedInventory; 9 | import net.minecraft.util.math.BlockPos; 10 | import net.minecraft.world.IWorld; 11 | import org.bukkit.craftbukkit.inventory.CraftBlockInventoryHolder; 12 | import org.spongepowered.asm.mixin.Final; 13 | import org.spongepowered.asm.mixin.Mixin; 14 | import org.spongepowered.asm.mixin.Shadow; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Inject; 17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 18 | 19 | @Mixin (targets = "net/minecraft/block/ComposterBlock$ComposterInventory") 20 | public abstract class ComposterBlock$FullComposterInventoryMixin extends BasicInventory implements SidedInventory { 21 | @Shadow private boolean dirty; 22 | 23 | @Shadow @Final private IWorld world; 24 | 25 | @Shadow @Final private BlockPos pos; 26 | 27 | @Shadow @Final private BlockState state; 28 | 29 | @Inject (method = "", at = @At ("TAIL")) 30 | private void onInit(BlockState state, IWorld world, BlockPos pos, CallbackInfo ci) { 31 | ((BasicInventoryAccess) this).setOwner(new CraftBlockInventoryHolder(world, pos, this)); 32 | } 33 | 34 | @Inject (method = "markDirty", at = @At ("HEAD"), cancellable = true) 35 | private void fukkit_allowPutback(CallbackInfo ci) { 36 | if (!this.isInvEmpty()) { 37 | this.dirty = false; 38 | this.world.setBlockState(this.pos, this.state, 3); 39 | ci.cancel(); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ComposterBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.util.Constructors; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.ComposterBlock; 6 | import net.minecraft.inventory.BasicInventory; 7 | import net.minecraft.util.math.BlockPos; 8 | import net.minecraft.world.IWorld; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Coerce; 12 | import org.spongepowered.asm.mixin.injection.Redirect; 13 | 14 | @Mixin (ComposterBlock.class) 15 | public class ComposterBlockMixin { 16 | @Coerce 17 | @Redirect (method = "getInventory", 18 | at = @At (value = "NEW", target = "net/minecraft/block/ComposterBlock$DummyInventory")) 19 | private BasicInventory fukkit_newInvType(BlockState state, IWorld world, BlockPos pos) { 20 | return Constructors.newComposterBlock$DummyInventory(world, pos); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CoralBlockBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.CoralBlockBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Final; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.Shadow; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | import java.util.Random; 14 | 15 | @Mixin (CoralBlockBlock.class) 16 | public class CoralBlockBlockMixin { 17 | @Shadow @Final private Block deadCoralBlock; 18 | 19 | private void fukkit_fadeEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 20 | if (CraftEventFactory.callBlockFadeEvent(world, pos, this.deadCoralBlock.getDefaultState()).isCancelled()) { 21 | ci.cancel(); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CoralBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.CoralBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Final; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.Shadow; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 15 | import java.util.Random; 16 | 17 | @Mixin (CoralBlock.class) 18 | public class CoralBlockMixin { 19 | @Shadow @Final private Block deadCoralBlock; 20 | 21 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 22 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 23 | "(Lnet/minecraft/util/math/BlockPos;" + 24 | "Lnet/minecraft/block/BlockState;I)Z")) 25 | private void fukkit_fadeEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 26 | if (CraftEventFactory 27 | .callBlockFadeEvent(world, pos, this.deadCoralBlock.getDefaultState().with(CoralBlock.WATERLOGGED, false)) 28 | .isCancelled()) { ci.cancel(); } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CoralFanBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.CoralFanBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Final; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.Shadow; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 15 | import java.util.Random; 16 | 17 | @Mixin (CoralFanBlock.class) 18 | public class CoralFanBlockMixin { 19 | @Shadow @Final private Block deadCoralBlock; 20 | 21 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 22 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 23 | "(Lnet/minecraft/util/math/BlockPos;" + 24 | "Lnet/minecraft/block/BlockState;I)Z")) 25 | private void fukkit_fadeEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 26 | if (CraftEventFactory.callBlockFadeEvent(world, pos, this.deadCoralBlock.getDefaultState() 27 | .with(CoralFanBlock.WATERLOGGED, false)) 28 | .isCancelled()) { ci.cancel(); } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/CoralWallFanBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.CoralWallFanBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Final; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.Shadow; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 15 | import java.util.Random; 16 | 17 | @Mixin (CoralWallFanBlock.class) 18 | public class CoralWallFanBlockMixin { 19 | @Shadow @Final private Block deadCoralBlock; 20 | 21 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 22 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 23 | "(Lnet/minecraft/util/math/BlockPos;" + 24 | "Lnet/minecraft/block/BlockState;I)Z")) 25 | private void fukkit_fadeEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 26 | if (CraftEventFactory.callBlockFadeEvent(world, pos, this.deadCoralBlock.getDefaultState() 27 | .with(CoralWallFanBlock.WATERLOGGED, false) 28 | .with(CoralWallFanBlock.FACING, state 29 | .get(CoralWallFanBlock.FACING))) 30 | .isCancelled()) { ci.cancel(); } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/DaylightDetectorBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.DaylightDetectorBlock; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.World; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 11 | 12 | @Mixin (DaylightDetectorBlock.class) 13 | public class DaylightDetectorBlockMixin { 14 | @ModifyVariable (method = "updateState", index = 3, ordinal = 0, at = @At (value = "INVOKE", 15 | target = "Lnet/minecraft/world/World;" + 16 | "setBlockState" + 17 | "(Lnet/minecraft/util/math" + 18 | "/BlockPos;" + 19 | "Lnet/minecraft/block" + 20 | "/BlockState;I)Z")) 21 | private static int fukkit_redstoneChange(int i, BlockState state, World world, BlockPos pos) { 22 | return CraftEventFactory.callRedstoneChange(world, pos, state.get(DaylightDetectorBlock.POWER), i) 23 | .getNewCurrent(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/DetectorRailBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.DetectorRailBlock; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.block.Block; 9 | import org.bukkit.event.block.BlockRedstoneEvent; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 13 | 14 | @Mixin (DetectorRailBlock.class) 15 | public class DetectorRailBlockMixin { 16 | @ModifyVariable (method = "updatePoweredStatus", at = @At (value = "JUMP", ordinal = 1), index = 5, ordinal = 1) 17 | private boolean fukkit_redstoneEvent(boolean bl2, World world, BlockPos pos, BlockState state) { 18 | boolean powered = state.get(DetectorRailBlock.POWERED); // unfortunate duplicate call 19 | if (powered ^ bl2) { 20 | Block bukkit = ((WorldAccess) world).getBukkit().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 21 | BlockRedstoneEvent event = new BlockRedstoneEvent(bukkit, powered ? 15 : 0, bl2 ? 15 : 0); 22 | ((WorldAccess) world).getBukkitServer().getPluginManager().callEvent(event); 23 | return event.getNewCurrent() > 0; 24 | } 25 | return bl2; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/DispenserBlockAccessor.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.DispenserBlock; 4 | import net.minecraft.block.dispenser.DispenserBehavior; 5 | import net.minecraft.item.Item; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | import java.util.Map; 9 | 10 | @Mixin (DispenserBlock.class) 11 | public interface DispenserBlockAccessor { 12 | @Accessor 13 | static Map getBEHAVIORS() { throw new UnsupportedOperationException(); } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/DispenserBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.util.Constants; 4 | import net.minecraft.block.DispenserBlock; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.World; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | 12 | @Mixin (DispenserBlock.class) 13 | public class DispenserBlockMixin { 14 | @Inject (method = "dispense", at = @At (value = "INVOKE", 15 | target = "Lnet/minecraft/block/entity/DispenserBlockEntity;getInvStack(I)" + 16 | "Lnet/minecraft/item/ItemStack;")) 17 | private void fukkit_resetEventStatus(World world, BlockPos pos, CallbackInfo ci) { 18 | Constants.DISPENSER_EVENT_FIRED = false; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/DragonEggBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.mixin.net.minecraft.util.math.Vec3iAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.DragonEggBlock; 7 | import net.minecraft.util.math.BlockPos; 8 | import net.minecraft.world.World; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.block.Block; 11 | import org.bukkit.event.block.BlockFromToEvent; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.injection.At; 14 | import org.spongepowered.asm.mixin.injection.Inject; 15 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 16 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 17 | 18 | @Mixin (DragonEggBlock.class) 19 | public class DragonEggBlockMixin { 20 | @Inject (method = "teleport", at = @At (value = "FIELD", target = "Lnet/minecraft/world/World;isClient:Z"), 21 | locals = LocalCapture.CAPTURE_FAILHARD) 22 | private void fukkit_fromToEvent(BlockState state, World world, BlockPos fromPos, CallbackInfo ci, int i, 23 | BlockPos toPos) { 24 | Block from = ((WorldAccess) world).getBukkit().getBlockAt(fromPos.getX(), fromPos.getY(), fromPos.getZ()); 25 | Block to = ((WorldAccess) world).getBukkit().getBlockAt(toPos.getX(), toPos.getY(), toPos.getZ()); 26 | BlockFromToEvent event = new BlockFromToEvent(from, to); 27 | Bukkit.getPluginManager().callEvent(event); 28 | if (!event.isCancelled()) { ci.cancel(); } else { 29 | // haha yes 30 | Vec3iAccess access = (Vec3iAccess) toPos; 31 | Block newTo = event.getToBlock(); 32 | access.setX(newTo.getX()); 33 | access.setY(newTo.getY()); 34 | access.setZ(newTo.getZ()); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/FluidBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.FluidBlock; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.IWorld; 7 | import net.minecraft.world.World; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.Shadow; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Redirect; 13 | 14 | @Mixin (FluidBlock.class) 15 | public abstract class FluidBlockMixin { 16 | // two birds 1 stone 17 | @Redirect (method = "receiveNeighborFluids", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/world/World;setBlockState" + 19 | "(Lnet/minecraft/util/math/BlockPos;" + 20 | "Lnet/minecraft/block/BlockState;)Z")) 21 | private boolean fukkit_formEvent(World world, BlockPos pos, BlockState blockState) { 22 | if (CraftEventFactory.handleBlockFormEvent(world, pos, blockState)) { 23 | this.playExtinguishSound(world, pos); 24 | } 25 | return false; 26 | } 27 | 28 | @Shadow protected abstract void playExtinguishSound(IWorld world, BlockPos pos); 29 | 30 | // two birds 1 stone 31 | @Redirect (method = "receiveNeighborFluids", at = @At (value = "INVOKE", 32 | target = "Lnet/minecraft/block/FluidBlock;" + 33 | "playExtinguishSound(Lnet/minecraft/world/IWorld;" + 34 | "Lnet/minecraft/util/math/BlockPos;)V")) 35 | private void fukkit_voidCall(FluidBlock block, IWorld world, BlockPos pos) { 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/GrassBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.GrassBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | 12 | @Mixin (GrassBlock.class) 13 | public class GrassBlockMixin { 14 | @Redirect (method = "grow", at = @At (value = "INVOKE", 15 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 16 | "(Lnet/minecraft/util/math/BlockPos;" + 17 | "Lnet/minecraft/block/BlockState;I)Z")) 18 | private boolean fukkit_growEvent(ServerWorld world, BlockPos pos, BlockState state, int flags) { 19 | return CraftEventFactory.handleBlockGrowEvent(world, pos, state, flags); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/IceBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.block.IceBlock; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin (IceBlock.class) 15 | public class IceBlockMixin { 16 | @Inject (method = "melt", at = @At (value = "HEAD"), cancellable = true) 17 | private void fukkit_fadeEvent(BlockState state, World world, BlockPos pos, CallbackInfo ci) { 18 | if (CraftEventFactory.callBlockFadeEvent(world, pos, 19 | world.dimension.doesWaterVaporize() ? Blocks.AIR.getDefaultState() : Blocks.WATER.getDefaultState()) 20 | .isCancelled()) { ci.cancel(); } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/InfestedBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.world.ServerWorldAccess; 4 | import net.minecraft.block.InfestedBlock; 5 | import net.minecraft.entity.Entity; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.world.World; 8 | import org.bukkit.event.entity.CreatureSpawnEvent; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Redirect; 12 | 13 | @Mixin (InfestedBlock.class) 14 | public class InfestedBlockMixin { 15 | @Redirect (method = "onStacksDropped", at = @At (value = "INVOKE", 16 | target = "Lnet/minecraft/world/World;spawnEntity" + 17 | "(Lnet/minecraft/entity/Entity;)Z")) 18 | private boolean fukkit_addSpawnReason(World world, Entity entity) { 19 | if (!(world instanceof ServerWorld)) { 20 | throw new IllegalStateException("World is not serverworld!"); 21 | } 22 | return ((ServerWorldAccess) world).addEntity(entity, CreatureSpawnEvent.SpawnReason.SILVERFISH_BLOCK); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/JukeboxBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.JukeboxBlock; 4 | import net.minecraft.block.entity.JukeboxBlockEntity; 5 | import net.minecraft.item.ItemStack; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Redirect; 9 | 10 | @Mixin (JukeboxBlock.class) 11 | public class JukeboxBlockMixin { 12 | // not vanilla? 13 | @Redirect (method = "setRecord", at = @At (value = "INVOKE", 14 | target = "Lnet/minecraft/block/entity/JukeboxBlockEntity;setRecord" + 15 | "(Lnet/minecraft/item/ItemStack;)V")) 16 | private void fukkit_copy(JukeboxBlockEntity entity, ItemStack itemStack) { 17 | if (!itemStack.isEmpty()) { itemStack.setCount(1); } 18 | entity.setRecord(itemStack); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/KelpBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.KelpBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | import java.util.Random; 12 | 13 | @Mixin (KelpBlock.class) 14 | public class KelpBlockMixin { 15 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 16 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 17 | "(Lnet/minecraft/util/math/BlockPos;" + 18 | "Lnet/minecraft/block/BlockState;)Z")) 19 | private boolean fukkit_spreadEvent(ServerWorld world, BlockPos up, BlockState blockState, BlockState state, 20 | ServerWorld world0, BlockPos pos, Random random) { 21 | return CraftEventFactory.handleBlockSpreadEvent(world, pos, up, state); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/LeavesBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.LeavesBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.event.block.LeavesDecayEvent; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | import java.util.Random; 14 | 15 | @Mixin (LeavesBlock.class) 16 | public class LeavesBlockMixin { 17 | @Inject (method = "randomTick", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/LeavesBlock;dropStacks" + 19 | "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;" + 20 | "Lnet/minecraft/util/math/BlockPos;)V"), 21 | cancellable = true) 22 | private void fukkit_decayEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 23 | LeavesDecayEvent event = new LeavesDecayEvent(((WorldAccess) world).getBukkit() 24 | .getBlockAt(pos.getX(), pos.getY(), pos 25 | .getZ())); 26 | ((WorldAccess) world).getBukkitServer().getPluginManager().callEvent(event); 27 | if (event.isCancelled() || world.getBlockState(pos).getBlock() != (Object) this) { 28 | ci.cancel(); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/LecternBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.LecternBlock; 6 | import net.minecraft.block.entity.BlockEntity; 7 | import net.minecraft.block.entity.LecternBlockEntity; 8 | import net.minecraft.item.ItemStack; 9 | import net.minecraft.util.math.BlockPos; 10 | import net.minecraft.util.math.Direction; 11 | import net.minecraft.world.World; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.injection.At; 14 | import org.spongepowered.asm.mixin.injection.Inject; 15 | import org.spongepowered.asm.mixin.injection.Redirect; 16 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 17 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 18 | 19 | @Mixin (LecternBlock.class) 20 | public class LecternBlockMixin { 21 | @Redirect (method = "dropBook", at = @At (value = "INVOKE", 22 | target = "Lnet/minecraft/world/World;getBlockEntity" + 23 | "(Lnet/minecraft/util/math/BlockPos;)" + 24 | "Lnet/minecraft/block/entity/BlockEntity;")) 25 | private BlockEntity fukkit_dontValidate(World world, BlockPos pos) { 26 | return ((WorldAccess) world).getBlockEntity(pos, false); 27 | } 28 | 29 | @Inject (method = "dropBook", 30 | at = @At (value = "INVOKE", target = "Lnet/minecraft/util/math/Direction;getOffsetX()I"), 31 | cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) 32 | private void fukkit_5500(BlockState state, World world, BlockPos pos, CallbackInfo ci, BlockEntity entity, 33 | LecternBlockEntity lectern, Direction facing, ItemStack current) { 34 | if (current.isEmpty()) { ci.cancel(); } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/LeverBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.LeverBlock; 6 | import net.minecraft.entity.player.PlayerEntity; 7 | import net.minecraft.util.ActionResult; 8 | import net.minecraft.util.Hand; 9 | import net.minecraft.util.hit.BlockHitResult; 10 | import net.minecraft.util.math.BlockPos; 11 | import net.minecraft.world.World; 12 | import org.bukkit.block.Block; 13 | import org.bukkit.event.block.BlockRedstoneEvent; 14 | import org.spongepowered.asm.mixin.Mixin; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Inject; 17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 18 | 19 | @Mixin (LeverBlock.class) 20 | public class LeverBlockMixin { 21 | 22 | @Inject (method = "onUse", at = @At (value = "INVOKE", 23 | target = "Lnet/minecraft/block/LeverBlock;method_21846" + 24 | "(Lnet/minecraft/block/BlockState;Lnet/minecraft/world/World;" + 25 | "Lnet/minecraft/util/math/BlockPos;)" + 26 | "Lnet/minecraft/block/BlockState;"), 27 | cancellable = true) 28 | private void fukkit_redstoneEvent(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, 29 | BlockHitResult hit, CallbackInfoReturnable cir) { 30 | boolean oldPower = state.get(LeverBlock.POWERED); 31 | Block block = ((WorldAccess) world).getBukkit().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 32 | int old = oldPower ? 15 : 0; 33 | int current = oldPower ? 0 : 15; 34 | 35 | BlockRedstoneEvent event = new BlockRedstoneEvent(block, old, current); 36 | ((WorldAccess) world).getBukkitServer().getPluginManager().callEvent(event); 37 | 38 | if ((event.getNewCurrent() > 0) == oldPower) { 39 | cir.setReturnValue(ActionResult.SUCCESS); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/LilyPadBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.block.LilyPadBlock; 6 | import net.minecraft.entity.Entity; 7 | import net.minecraft.entity.vehicle.BoatEntity; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.World; 10 | import org.bukkit.craftbukkit.event.CraftEventFactory; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Redirect; 14 | 15 | @Mixin (LilyPadBlock.class) 16 | public class LilyPadBlockMixin { 17 | @Redirect (method = "onEntityCollision", 18 | at = @At (value = "CONSTANT", args = "classValue=net/minecraft/entity/vehicle/BoatEntity")) 19 | private boolean fukkit_changeBlock(Object obj, Class type, BlockState state, World world, BlockPos pos, 20 | Entity entity) { 21 | return obj instanceof BoatEntity && !CraftEventFactory 22 | .callEntityChangeBlockEvent(entity, pos, Blocks.AIR.getDefaultState()) 23 | .isCancelled(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/MagmaBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.MagmaBlock; 5 | import net.minecraft.entity.Entity; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin (MagmaBlock.class) 15 | public class MagmaBlockMixin { 16 | @Inject (method = "onSteppedOn", at = @At (value = "INVOKE", 17 | target = "Lnet/minecraft/entity/Entity;damage" + 18 | "(Lnet/minecraft/entity/damage/DamageSource;F)Z")) 19 | private void fukkit_blockDamage(World world, BlockPos pos, Entity entity, CallbackInfo ci) { 20 | CraftEventFactory.blockDamage = ((WorldAccess) world).getBukkit() 21 | .getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 22 | } 23 | 24 | @Inject (method = "onSteppedOn", at = @At (value = "INVOKE", 25 | target = "Lnet/minecraft/entity/Entity;damage" + 26 | "(Lnet/minecraft/entity/damage/DamageSource;F)Z", 27 | shift = At.Shift.AFTER)) 28 | private void fukkit_nullify(World world, BlockPos pos, Entity entity, CallbackInfo ci) { 29 | CraftEventFactory.blockDamage = null; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/NetherWartBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.NetherWartBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | 12 | @Mixin (NetherWartBlock.class) 13 | public class NetherWartBlockMixin { 14 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 15 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 16 | "(Lnet/minecraft/util/math/BlockPos;" + 17 | "Lnet/minecraft/block/BlockState;I)Z")) 18 | private boolean fukkit_growEvent(ServerWorld world, BlockPos pos, BlockState state, int flags) { 19 | return CraftEventFactory.handleBlockGrowEvent(world, pos, state, flags); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ObserverBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.ObserverBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 12 | import java.util.Random; 13 | 14 | @Mixin (ObserverBlock.class) 15 | public class ObserverBlockMixin { 16 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 17 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 18 | "(Lnet/minecraft/util/math/BlockPos;" + 19 | "Lnet/minecraft/block/BlockState;I)Z", 20 | ordinal = 0), cancellable = true) 21 | private void fukkit_redstoneChange(BlockState state, ServerWorld world, BlockPos pos, Random random, 22 | CallbackInfo ci) { 23 | if (CraftEventFactory.callRedstoneChange(world, pos, 15, 0).getNewCurrent() != 0) { 24 | ci.cancel(); 25 | } 26 | } 27 | 28 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 29 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 30 | "(Lnet/minecraft/util/math/BlockPos;" + 31 | "Lnet/minecraft/block/BlockState;I)Z", 32 | ordinal = 1), cancellable = true) 33 | private void fukkit_redstoneChange0(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 34 | if (CraftEventFactory.callRedstoneChange(world, pos, 0, 15).getNewCurrent() != 15) { 35 | ci.cancel(); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/OreBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.block.BlockAccess; 4 | import net.minecraft.block.Block; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.OreBlock; 7 | import net.minecraft.enchantment.EnchantmentHelper; 8 | import net.minecraft.enchantment.Enchantments; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.util.math.BlockPos; 11 | import net.minecraft.world.World; 12 | import org.spongepowered.asm.mixin.*; 13 | import java.util.Random; 14 | 15 | @Implements (@Interface (iface = BlockAccess.class, prefix = "fukkit$")) 16 | @Mixin (OreBlock.class) 17 | public abstract class OreBlockMixin extends Block { 18 | public OreBlockMixin(Settings settings) { 19 | super(settings); 20 | } 21 | 22 | /** 23 | * @author HalfOf2 24 | * @reason delegated to get exp drop 25 | */ 26 | @Override 27 | @Overwrite 28 | public void onStacksDropped(BlockState state, World world, BlockPos pos, ItemStack stack) { 29 | super.onStacksDropped(state, world, pos, stack); 30 | } 31 | 32 | public int fukkit$getExpDrop(BlockState state, World world, BlockPos pos, ItemStack stack) { 33 | if (EnchantmentHelper.getLevel(Enchantments.SILK_TOUCH, stack) == 0) { 34 | int i = this.getExperienceWhenMined(world.random); 35 | 36 | if (i > 0) { 37 | return i; 38 | } 39 | } 40 | 41 | return 0; 42 | } 43 | 44 | @Shadow protected abstract int getExperienceWhenMined(Random random); 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/PlantBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.PlantBlock; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.util.math.Direction; 8 | import net.minecraft.world.IWorld; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Redirect; 13 | 14 | @Mixin (PlantBlock.class) 15 | public class PlantBlockMixin extends Block { 16 | public PlantBlockMixin(Settings settings) { 17 | super(settings); 18 | } 19 | 20 | @Redirect (method = "getStateForNeighborUpdate", at = @At (value = "INVOKE", 21 | target = "Lnet/minecraft/block/Block;getDefaultState()" + 22 | "Lnet/minecraft/block/BlockState;")) 23 | private BlockState fukkit_physicsEvent(Block air, BlockState state, Direction facing, BlockState neighborState, 24 | IWorld world, BlockPos pos, BlockPos neighborPos) { 25 | if (!CraftEventFactory.callBlockPhysicsEvent(world, pos).isCancelled()) { return air.getDefaultState(); } else { 26 | return super.getStateForNeighborUpdate(state, facing, neighborState, world, pos, neighborPos); 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/PoweredRailBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.PoweredRailBlock; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 14 | 15 | @Mixin (PoweredRailBlock.class) 16 | public class PoweredRailBlockMixin { 17 | @Inject (method = "updateBlockState", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/world/World;setBlockState" + 19 | "(Lnet/minecraft/util/math/BlockPos;" + 20 | "Lnet/minecraft/block/BlockState;I)Z"), 21 | locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) 22 | private void fukkit_redstoneChange(BlockState state, World world, BlockPos pos, Block neighbor, CallbackInfo ci, 23 | boolean powered) { 24 | int power = powered ? 15 : 0; 25 | int newPower = CraftEventFactory.callRedstoneChange(world, pos, power, 15 - power).getNewCurrent(); 26 | if (power == newPower) { ci.cancel(); } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/RedstoneLampBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.Block; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.RedstoneLampBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import net.minecraft.world.World; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Inject; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 14 | import java.util.Random; 15 | 16 | @Mixin (RedstoneLampBlock.class) 17 | public class RedstoneLampBlockMixin { 18 | @Inject (method = "neighborUpdate", at = @At (value = "INVOKE", 19 | target = "Lnet/minecraft/world/World;setBlockState" + 20 | "(Lnet/minecraft/util/math/BlockPos;" + 21 | "Lnet/minecraft/block/BlockState;I)Z"), 22 | cancellable = true) 23 | private void fukkit_redstoneChange(BlockState state, World world, BlockPos pos, Block block, BlockPos neighborPos, 24 | boolean moved, CallbackInfo ci) { 25 | if (CraftEventFactory.callRedstoneChange(world, pos, 0, 15).getNewCurrent() != 15) { 26 | ci.cancel(); 27 | } 28 | } 29 | 30 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 31 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 32 | "(Lnet/minecraft/util/math/BlockPos;" + 33 | "Lnet/minecraft/block/BlockState;I)Z"), 34 | cancellable = true) 35 | private void fukkit_redstoneChange(BlockState state, ServerWorld world, BlockPos pos, Random random, 36 | CallbackInfo ci) { 37 | if (CraftEventFactory.callRedstoneChange(world, pos, 15, 0).getNewCurrent() != 0) { 38 | ci.cancel(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/ScaffoldingBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.block.ScaffoldingBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.state.property.Property; 8 | import net.minecraft.util.math.BlockPos; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Redirect; 13 | import java.util.Random; 14 | 15 | @Mixin (ScaffoldingBlock.class) 16 | public class ScaffoldingBlockMixin { 17 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/BlockState;get" + 19 | "(Lnet/minecraft/state/property/Property;)" + 20 | "Ljava/lang/Comparable;", 21 | ordinal = 0)) 22 | private > T fukkit_fadeEvent(BlockState state, Property property, 23 | BlockState state2, ServerWorld world, BlockPos pos, 24 | Random random) { 25 | int distance = state.get(property); 26 | if (distance == 7 && !CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.getDefaultState()) 27 | .isCancelled()) { 28 | return (T) Integer.valueOf(7); // make if return true 29 | } else { 30 | return (T) Integer.valueOf(-1); // make if return false 31 | } 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/SnowBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.block.SnowBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | import java.util.Random; 14 | 15 | @Mixin (SnowBlock.class) 16 | public class SnowBlockMixin { 17 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/SnowBlock;dropStacks" + 19 | "(Lnet/minecraft/block/BlockState;" + 20 | "Lnet/minecraft/world/World;" + 21 | "Lnet/minecraft/util/math/BlockPos;)V"), 22 | cancellable = true) 23 | private void fukkit_fadeEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 24 | if (CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.AIR.getDefaultState()).isCancelled()) { 25 | ci.cancel(); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/SpawnerBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.block.BlockAccess; 4 | import net.minecraft.block.Block; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.SpawnerBlock; 7 | import net.minecraft.item.ItemStack; 8 | import net.minecraft.util.math.BlockPos; 9 | import net.minecraft.world.World; 10 | import org.spongepowered.asm.mixin.Implements; 11 | import org.spongepowered.asm.mixin.Interface; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.Overwrite; 14 | 15 | @Implements (@Interface (iface = BlockAccess.class, prefix = "fukkit$")) 16 | @Mixin (SpawnerBlock.class) 17 | public class SpawnerBlockMixin extends Block { 18 | public SpawnerBlockMixin(Settings settings) { 19 | super(settings); 20 | } 21 | 22 | /** 23 | * @author HalfOf2 24 | * @reason redirect to super, get exp handled 25 | */ 26 | @Override 27 | @Overwrite 28 | public void onStacksDropped(BlockState state, World world, BlockPos pos, ItemStack stack) { 29 | super.onStacksDropped(state, world, pos, stack); 30 | } 31 | 32 | public int fukkit$getExpDrop(BlockState state, World world, BlockPos pos, ItemStack stack) { 33 | return 15 + world.random.nextInt(15) + world.random.nextInt(15); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/SpreadableBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.block.SpreadableBlock; 6 | import net.minecraft.server.world.ServerWorld; 7 | import net.minecraft.util.math.BlockPos; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.Redirect; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 14 | import java.util.Random; 15 | 16 | @Mixin (SpreadableBlock.class) 17 | public class SpreadableBlockMixin { 18 | @Inject (method = "scheduledTick", at = @At (value = "INVOKE", 19 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 20 | "(Lnet/minecraft/util/math/BlockPos;" + 21 | "Lnet/minecraft/block/BlockState;)Z", 22 | ordinal = 0), cancellable = true) 23 | private void fukkit_fadeEvent(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { 24 | if (CraftEventFactory.callBlockFadeEvent(world, pos, Blocks.DIRT.getDefaultState()).isCancelled()) { 25 | ci.cancel(); 26 | } 27 | } 28 | 29 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 30 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 31 | "(Lnet/minecraft/util/math/BlockPos;" + 32 | "Lnet/minecraft/block/BlockState;)Z", 33 | ordinal = 1)) 34 | private boolean fukkit_fadeEvent2(ServerWorld world, BlockPos pos1, BlockState blockState, BlockState state, ServerWorld world1, BlockPos pos, Random random) { 35 | return CraftEventFactory.handleBlockSpreadEvent(world, pos, pos1, blockState); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/SugarCaneBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.SugarCaneBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | 12 | @Mixin (SugarCaneBlock.class) 13 | public class SugarCaneBlockMixin { 14 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 15 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 16 | "(Lnet/minecraft/util/math/BlockPos;" + 17 | "Lnet/minecraft/block/BlockState;)Z")) 18 | private boolean fukkit_growEvent(ServerWorld world, BlockPos pos, BlockState blockState) { 19 | return CraftEventFactory.handleBlockGrowEvent(world, pos, blockState); 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/TallPlantBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.TallPlantBlock; 5 | import net.minecraft.entity.player.PlayerEntity; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.craftbukkit.event.CraftEventFactory; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin (TallPlantBlock.class) 15 | public class TallPlantBlockMixin { 16 | @Inject (method = "onBreak", at = @At ("HEAD"), cancellable = true) 17 | private void fukkit_onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player, CallbackInfo ci) { 18 | if (CraftEventFactory.callBlockPhysicsEvent(world, pos).isCancelled()) { ci.cancel(); } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/TntBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.Blocks; 5 | import net.minecraft.block.TntBlock; 6 | import net.minecraft.entity.Entity; 7 | import net.minecraft.util.hit.BlockHitResult; 8 | import net.minecraft.world.World; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Inject; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 14 | 15 | @Mixin (TntBlock.class) 16 | public class TntBlockMixin { 17 | @Inject (method = "onProjectileHit", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/TntBlock;primeTnt" + 19 | "(Lnet/minecraft/world/World;" + 20 | "Lnet/minecraft/util/math/BlockPos;" + 21 | "Lnet/minecraft/entity/LivingEntity;)V"), 22 | cancellable = true) 23 | private void fukkit_entityChangeBlockEvent(World world, BlockState state, BlockHitResult hitResult, Entity entity, 24 | CallbackInfo ci) { 25 | if (CraftEventFactory.callEntityChangeBlockEvent(entity, hitResult.getBlockPos(), Blocks.AIR.getDefaultState()) 26 | .isCancelled()) { ci.cancel(); } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/TrapdoorBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.Block; 5 | import net.minecraft.block.BlockState; 6 | import net.minecraft.block.TrapdoorBlock; 7 | import net.minecraft.util.math.BlockPos; 8 | import net.minecraft.world.World; 9 | import org.bukkit.event.block.BlockRedstoneEvent; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.ModifyVariable; 13 | import org.spongepowered.asm.mixin.injection.Slice; 14 | 15 | @Mixin (TrapdoorBlock.class) 16 | public class TrapdoorBlockMixin { 17 | @ModifyVariable (method = "neighborUpdate", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/BlockState;get" + 19 | "(Lnet/minecraft/state/property/Property;)" + 20 | "Ljava/lang/Comparable;", 21 | ordinal = 0), index = 7, ordinal = 1, slice = @Slice ( 22 | from = @At (value = "FIELD", 23 | target = "Lnet/minecraft/block/TrapdoorBlock;OPEN:Lnet/minecraft/state/property/BooleanProperty;", 24 | ordinal = 0))) 25 | private boolean fukkit_modVar(boolean var, BlockState state, World world, BlockPos pos, Block block, 26 | BlockPos neighborPos, boolean moved) { 27 | org.bukkit.World bworld = ((WorldAccess) world).getBukkit(); 28 | org.bukkit.block.Block bblock = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 29 | 30 | int power = bblock.getBlockPower(); 31 | int oldPower = state.get(TrapdoorBlock.OPEN) ? 15 : 0; 32 | 33 | if (oldPower == 0 ^ power == 0 || block.getDefaultState().emitsRedstonePower()) { 34 | BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power); 35 | ((WorldAccess) world).getBukkitServer().getPluginManager().callEvent(eventRedstone); 36 | return eventRedstone.getNewCurrent() > 0; 37 | } 38 | return var; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/TripwireHookBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.TripwireHookBlock; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.block.Block; 9 | import org.bukkit.event.block.BlockRedstoneEvent; 10 | import org.spongepowered.asm.mixin.Mixin; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Inject; 13 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 14 | 15 | @Mixin (TripwireHookBlock.class) 16 | public class TripwireHookBlockMixin { 17 | @Inject (method = "update", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/block/TripwireHookBlock;playSound" + 19 | "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;" + 20 | "ZZZZ)V", 21 | ordinal = 1), cancellable = true) 22 | private void fukkit_redstoneEvent(World world, BlockPos pos, BlockState state, boolean beingRemoved, boolean bl, 23 | int i, BlockState blockState, CallbackInfo ci) { 24 | Block block = ((WorldAccess) world).getBukkit().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 25 | BlockRedstoneEvent event = new BlockRedstoneEvent(block, 15, 0); 26 | ((WorldAccess) world).getBukkitServer().getPluginManager().callEvent(event); 27 | if (event.getNewCurrent() > 0) { ci.cancel(); } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/VineBlockMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.VineBlock; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.util.math.BlockPos; 7 | import org.bukkit.craftbukkit.event.CraftEventFactory; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | import java.util.Random; 12 | 13 | @Mixin (VineBlock.class) 14 | public class VineBlockMixin { 15 | // not exact but 99% sure it's the same effect 16 | // 7 birds 1 stone 17 | @Redirect (method = "scheduledTick", at = @At (value = "INVOKE", 18 | target = "Lnet/minecraft/server/world/ServerWorld;setBlockState" + 19 | "(Lnet/minecraft/util/math/BlockPos;" + 20 | "Lnet/minecraft/block/BlockState;I)Z")) 21 | private boolean fukkit_spreadEvent(ServerWorld world, BlockPos dest, BlockState state, int flags, 22 | BlockState state1, ServerWorld world1, BlockPos src, Random random) { 23 | if (dest == src) { return world.setBlockState(dest, state, flags); } 24 | return CraftEventFactory.handleBlockSpreadEvent(world, src, dest, state, flags); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/BannerBlockEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import net.minecraft.block.entity.BannerBlockEntity; 4 | import net.minecraft.nbt.CompoundTag; 5 | import net.minecraft.nbt.ListTag; 6 | import org.bukkit.craftbukkit.libs.jline.internal.Nullable; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Shadow; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Inject; 11 | import org.spongepowered.asm.mixin.injection.Redirect; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | 14 | @Mixin(BannerBlockEntity.class) 15 | public class BannerBlockEntityMixin { 16 | @Shadow @Nullable private ListTag patternListTag; 17 | 18 | @Inject (method = "fromTag", at = @At(value = "FIELD", target = "Lnet/minecraft/block/entity/BannerBlockEntity;patterns:Ljava/util/List;")) 19 | private void fukkit_cleanListTag(CompoundTag tag, CallbackInfo ci) { 20 | while (this.patternListTag.size() > 20) 21 | this.patternListTag.remove(20); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/BarrelBlockEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import net.minecraft.block.entity.BarrelBlockEntity; 4 | import net.minecraft.item.ItemStack; 5 | import net.minecraft.util.DefaultedList; 6 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 7 | import org.bukkit.entity.HumanEntity; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | import static com.github.fukkitmc.fukkit.util.Constants.MAX_STACK; 14 | 15 | @Mixin(BarrelBlockEntity.class) 16 | public class BarrelBlockEntityMixin extends LockableContainerBlockEntityMixin { 17 | 18 | @Shadow private DefaultedList inventory; 19 | public List transaction = new ArrayList<>(); 20 | private int maxStack = MAX_STACK; 21 | 22 | @Override public List getContents() { 23 | return this.inventory; 24 | } 25 | 26 | @Override public void onOpen(CraftHumanEntity who) { 27 | this.transaction.add(who); 28 | } 29 | 30 | @Override public void onClose(CraftHumanEntity who) { 31 | this.transaction.remove(who); 32 | } 33 | 34 | @Override public List getViewers() { 35 | return this.transaction; 36 | } 37 | 38 | @Override public void setMaxStackSize(int size) { 39 | this.maxStack = size; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/BeehiveBlockEntity$BeeAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import org.spongepowered.asm.mixin.Mixin; 4 | import org.spongepowered.asm.mixin.gen.Accessor; 5 | 6 | @Mixin(targets = "net/minecraft/block/entity/BeehiveBlockEntity$Bee") 7 | public interface BeehiveBlockEntity$BeeAccess { 8 | @Accessor("ticksInHive") void setTicksInHive(int ticks); 9 | @Accessor("minOccupationTIcks") int getMinOccupationTicks(); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/CampfireBlockEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.entity.BlockEntity; 5 | import net.minecraft.block.entity.BlockEntityType; 6 | import net.minecraft.block.entity.CampfireBlockEntity; 7 | import net.minecraft.inventory.Inventory; 8 | import net.minecraft.item.ItemStack; 9 | import net.minecraft.util.math.BlockPos; 10 | import org.bukkit.craftbukkit.block.CraftBlock; 11 | import org.bukkit.craftbukkit.inventory.CraftItemStack; 12 | import org.bukkit.event.block.BlockCookEvent; 13 | import org.spongepowered.asm.mixin.Mixin; 14 | import org.spongepowered.asm.mixin.injection.At; 15 | import org.spongepowered.asm.mixin.injection.Inject; 16 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 17 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 18 | 19 | @Mixin (CampfireBlockEntity.class) 20 | public class CampfireBlockEntityMixin extends BlockEntity { 21 | public CampfireBlockEntityMixin(BlockEntityType type) { 22 | super(type); 23 | } 24 | 25 | @Inject (method = "updateItemsBeingCooked", 26 | at = @At (value = "INVOKE", 27 | target = "Lnet/minecraft/util/ItemScatterer;spawn(Lnet/minecraft/world/World;DDDLnet/minecraft/item/ItemStack;)V"), 28 | locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) 29 | private void fukkit_blockCookEvent(CallbackInfo ci, int i, ItemStack itemstack, Inventory inventory, ItemStack itemstack1, BlockPos blockPos) { 30 | CraftItemStack source = CraftItemStack.asCraftMirror(itemstack); 31 | org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack1); 32 | 33 | BlockCookEvent blockCookEvent = new BlockCookEvent(CraftBlock.at(this.world, this.pos), source, result); 34 | ((WorldAccess)this.world).getBukkitServer().getPluginManager().callEvent(blockCookEvent); 35 | 36 | if (blockCookEvent.isCancelled()) { 37 | ci.cancel(); 38 | } 39 | 40 | result = blockCookEvent.getResult(); 41 | itemstack1 = CraftItemStack.asNMSCopy(result); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/CommandBlockBlockEntity$1.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.command.CommandOutputAccess; 5 | import net.minecraft.block.entity.CommandBlockBlockEntity; 6 | import net.minecraft.server.command.ServerCommandSource; 7 | import net.minecraft.world.CommandBlockExecutor; 8 | import org.bukkit.command.CommandSender; 9 | import org.bukkit.craftbukkit.command.CraftBlockCommandSender; 10 | import org.spongepowered.asm.mixin.Final; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.Shadow; 13 | 14 | @Mixin (targets = "net/minecraft/block/entity/CommandBlockBlockEntity$1") 15 | public abstract class CommandBlockBlockEntity$1 extends CommandBlockExecutor implements CommandOutputAccess { 16 | @SuppressWarnings ("ShadowTarget") @Shadow @Final /*synthetic*/ CommandBlockBlockEntity field_11921; 17 | 18 | @Override 19 | public CommandSender getBukkitSender(ServerCommandSource wrapper) { 20 | return new CraftBlockCommandSender(wrapper, this.field_11921); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/DispenserBlockEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 4 | import net.minecraft.block.BlockState; 5 | import net.minecraft.block.entity.DispenserBlockEntity; 6 | import net.minecraft.item.ItemStack; 7 | import net.minecraft.util.DefaultedList; 8 | import org.bukkit.Location; 9 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 10 | import org.bukkit.entity.HumanEntity; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.Shadow; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | import static com.github.fukkitmc.fukkit.util.Constants.MAX_STACK; 17 | 18 | @Mixin(DispenserBlockEntity.class) 19 | public class DispenserBlockEntityMixin extends LockableContainerBlockEntityMixin implements InventoryAccess { 20 | @Shadow private DefaultedList inventory; 21 | public List transaction = new ArrayList<>(); 22 | private int maxStack = MAX_STACK; 23 | 24 | @Override 25 | public List getContents() { 26 | return this.inventory; 27 | } 28 | 29 | @Override 30 | public void onOpen(CraftHumanEntity who) { 31 | this.transaction.add(who); 32 | } 33 | 34 | @Override 35 | public void onClose(CraftHumanEntity who) { 36 | this.transaction.remove(who); 37 | } 38 | 39 | @Override 40 | public List getViewers() { 41 | return this.transaction; 42 | } 43 | 44 | @Override 45 | public void setMaxStackSize(int size) { 46 | this.maxStack = size; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/HopperBlockEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import net.minecraft.block.entity.HopperBlockEntity; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Invoker; 6 | 7 | @Mixin (HopperBlockEntity.class) 8 | public interface HopperBlockEntityAccess { 9 | @Invoker 10 | void callSetCooldown(int cooldown); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/LecternBlockEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import net.minecraft.block.entity.LecternBlockEntity; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Invoker; 6 | 7 | @Mixin (LecternBlockEntity.class) 8 | public interface LecternBlockEntityAccess { 9 | @Invoker 10 | void callOnBookRemoved(); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/LockableContainerBlockEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 5 | import net.minecraft.block.entity.LockableContainerBlockEntity; 6 | import org.bukkit.Location; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | 9 | @Mixin (LockableContainerBlockEntity.class) public abstract class LockableContainerBlockEntityMixin extends BlockEntityMixin implements InventoryAccess { 10 | 11 | @Override public Location getLocation() { 12 | if (this.world == null) return null; 13 | return new org.bukkit.Location(((WorldAccess) this.world).getBukkit(), this.pos.getX(), this.pos.getY(), this.pos.getZ()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/entity/ShulkerBoxBlockEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.entity; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.block.entity.BlockEntityAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 5 | import net.minecraft.block.entity.BlockEntity; 6 | import net.minecraft.block.entity.LootableContainerBlockEntity; 7 | import net.minecraft.block.entity.ShulkerBoxBlockEntity; 8 | import net.minecraft.container.ShulkerBoxContainer; 9 | import net.minecraft.item.ItemStack; 10 | import net.minecraft.util.DefaultedList; 11 | import org.bukkit.Location; 12 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 13 | import org.bukkit.entity.HumanEntity; 14 | import org.bukkit.inventory.InventoryHolder; 15 | import org.spongepowered.asm.mixin.Mixin; 16 | import org.spongepowered.asm.mixin.Shadow; 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | import static com.github.fukkitmc.fukkit.util.Constants.MAX_STACK; 21 | 22 | @Mixin(ShulkerBoxBlockEntity.class) 23 | public class ShulkerBoxBlockEntityMixin extends LockableContainerBlockEntityMixin implements InventoryAccess { 24 | 25 | @Shadow private DefaultedList inventory; 26 | public List transaction = new ArrayList<>(); 27 | private int maxStack = MAX_STACK; 28 | 29 | @Override 30 | public List getContents() { 31 | return this.inventory; 32 | } 33 | 34 | @Override 35 | public void onOpen(CraftHumanEntity who) { 36 | this.transaction.add(who); 37 | } 38 | 39 | @Override 40 | public void onClose(CraftHumanEntity who) { 41 | this.transaction.remove(who); 42 | } 43 | 44 | @Override 45 | public List getViewers() { 46 | return this.transaction; 47 | } 48 | 49 | @Override 50 | public void setMaxStackSize(int size) { 51 | this.maxStack = size; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/block/sapling/LargeTreeSaplingGeneratorMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.block.sapling; 2 | 3 | import net.minecraft.block.BlockState; 4 | import net.minecraft.block.sapling.LargeTreeSaplingGenerator; 5 | import net.minecraft.util.math.BlockPos; 6 | import net.minecraft.world.IWorld; 7 | import net.minecraft.world.gen.chunk.ChunkGenerator; 8 | import net.minecraft.world.gen.feature.ConfiguredFeature; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 13 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 14 | import java.util.Random; 15 | 16 | @Mixin(LargeTreeSaplingGenerator.class) 17 | public class LargeTreeSaplingGeneratorMixin extends SaplingGeneratorMixin { 18 | @Inject (method = "generateLargeTree", at = @At (value = "INVOKE", target = "Lnet/minecraft/block/Block;getDefaultState()Lnet/minecraft/block/BlockState;"), locals = LocalCapture.CAPTURE_FAILHARD) 19 | private void fukkit_setTreeType(IWorld iWorld, ChunkGenerator chunkGenerator, BlockPos blockPos, BlockState blockState, Random random, int i, int j, CallbackInfoReturnable cir, ConfiguredFeature configuredFeature) { 20 | this.setTreeType(configuredFeature); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/command/EntitySelectorMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.command; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.command.ServerCommandSourceAccess; 4 | import net.minecraft.command.EntitySelector; 5 | import net.minecraft.server.command.ServerCommandSource; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Redirect; 9 | 10 | @Mixin(EntitySelector.class) 11 | public class EntitySelectorMixin { 12 | @Redirect(method = "checkSourcePermission", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/command/ServerCommandSource;hasPermissionLevel(I)Z")) 13 | private boolean fukkit_checkPerm(ServerCommandSource source, int level) { 14 | return !((ServerCommandSourceAccess)source).hasPermission(2, "minecraft.command.selector"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/command/arguments/BlockArgumentParserMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.command.arguments; 2 | 3 | import com.mojang.brigadier.StringReader; 4 | import net.minecraft.command.arguments.BlockArgumentParser; 5 | import net.minecraft.state.property.Property; 6 | import org.spongepowered.asm.mixin.Final; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Mutable; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Inject; 12 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 13 | import java.util.LinkedHashMap; 14 | import java.util.Map; 15 | 16 | @Mixin (BlockArgumentParser.class) 17 | public class BlockArgumentParserMixin { 18 | @Mutable 19 | @Shadow @Final private Map, Comparable> blockProperties; 20 | 21 | @Inject (method = "", at = @At ("RETURN")) 22 | public void postInit(StringReader reader, boolean allowTag, CallbackInfo ci) { 23 | this.blockProperties = new LinkedHashMap<>(); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/command/arguments/EntityArgumentTypeMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.command.arguments; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.command.arguments.EntityArgumentTypeAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.command.arguments.EntitySelectorReaderAccess; 5 | import com.mojang.brigadier.StringReader; 6 | import com.mojang.brigadier.exceptions.CommandSyntaxException; 7 | import net.minecraft.command.EntitySelector; 8 | import net.minecraft.command.EntitySelectorReader; 9 | import net.minecraft.command.arguments.EntityArgumentType; 10 | import org.spongepowered.asm.mixin.*; 11 | import org.spongepowered.asm.mixin.injection.At; 12 | import org.spongepowered.asm.mixin.injection.Redirect; 13 | 14 | import static net.minecraft.command.arguments.EntityArgumentType.*; 15 | 16 | @Mixin (EntityArgumentType.class) 17 | public abstract class EntityArgumentTypeMixin implements EntityArgumentTypeAccess { 18 | 19 | @Shadow public abstract EntitySelector parse(StringReader stringReader) throws CommandSyntaxException; 20 | 21 | private static final ThreadLocal OVERRIDE_PERMISSIONS = ThreadLocal.withInitial(() -> false); 22 | @Redirect(method = "parse", at = @At(value = "INVOKE", target = "Lnet/minecraft/command/EntitySelectorReader;read()Lnet/minecraft/command/EntitySelector;")) 23 | private EntitySelector parse(EntitySelectorReader reader, StringReader stringReader) throws CommandSyntaxException { 24 | EntitySelector selector = ((EntitySelectorReaderAccess)reader).parse(OVERRIDE_PERMISSIONS.get()); 25 | OVERRIDE_PERMISSIONS.set(false); 26 | return selector; 27 | } 28 | 29 | @Override 30 | public EntitySelector parse(StringReader stringReader, boolean overridePermissions) throws CommandSyntaxException { 31 | OVERRIDE_PERMISSIONS.set(overridePermissions); 32 | return this.parse(stringReader); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/BlockContext$2Mixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import net.minecraft.util.math.BlockPos; 4 | import net.minecraft.world.World; 5 | import org.spongepowered.asm.mixin.Final; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.Shadow; 8 | 9 | @SuppressWarnings ("ShadowTarget") @Mixin (targets = "net/minecraft/container/BlockContext$2") 10 | public class BlockContext$2Mixin implements BlockContextMixin { 11 | @Shadow @Final /*synthetic*/ World field_17305; 12 | @Shadow @Final /*synthetic*/ BlockPos field_17306; 13 | 14 | @Override 15 | public World getWorld() { 16 | return this.field_17305; 17 | } 18 | 19 | @Override 20 | public BlockPos getPosition() { 21 | return this.field_17306; 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/BlockContextMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 5 | import net.minecraft.container.BlockContext; 6 | import net.minecraft.util.math.BlockPos; 7 | import net.minecraft.world.World; 8 | import org.bukkit.Location; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | 11 | @Mixin(BlockContext.class) 12 | public interface BlockContextMixin extends BlockContextAccess { // y a y 13 | @Override 14 | default World getWorld() { 15 | throw new UnsupportedOperationException(); 16 | } 17 | 18 | @Override 19 | default BlockPos getPosition() { 20 | throw new UnsupportedOperationException(); 21 | } 22 | 23 | @Override 24 | default Location getLocation() { 25 | BlockPos pos = this.getPosition(); 26 | return new Location(((WorldAccess) this.getWorld()).getBukkit(), pos.getX(), pos.getY(), pos.getZ()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/BrewingStandContainerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.player.PlayerEntityAccess; 5 | import net.minecraft.container.BrewingStandContainer; 6 | import net.minecraft.container.Container; 7 | import net.minecraft.container.PropertyDelegate; 8 | import net.minecraft.entity.player.PlayerInventory; 9 | import net.minecraft.inventory.Inventory; 10 | import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; 11 | import org.bukkit.craftbukkit.inventory.CraftInventoryView; 12 | import org.bukkit.inventory.InventoryView; 13 | import org.spongepowered.asm.mixin.Final; 14 | import org.spongepowered.asm.mixin.Mixin; 15 | import org.spongepowered.asm.mixin.Shadow; 16 | import org.spongepowered.asm.mixin.injection.At; 17 | import org.spongepowered.asm.mixin.injection.Inject; 18 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 19 | 20 | @Mixin (BrewingStandContainer.class) 21 | public abstract class BrewingStandContainerMixin implements ContainerAccess { 22 | @Shadow @Final private Inventory inventory; 23 | 24 | private CraftInventoryView view; 25 | public PlayerInventory playerInventory; 26 | 27 | @Inject ( 28 | method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/inventory/Inventory;Lnet/minecraft/container/PropertyDelegate;)V", 29 | at = @At ("TAIL")) 30 | private void fukkit_initPlayer(int i, PlayerInventory playerInventory, Inventory inventory, PropertyDelegate propertyDelegate, CallbackInfo ci) { 31 | this.playerInventory = (PlayerInventory) inventory; 32 | } 33 | 34 | @Override 35 | public InventoryView getBukkitView() { 36 | if (this.view != null) { return this.view; } 37 | this.view = new CraftInventoryView(((PlayerEntityAccess) this.playerInventory.player).getBukkit(), new CraftInventoryBrewer(this.inventory), 38 | (Container) (Object) this); 39 | return this.view; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/CartographyTableContainer$2Mixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextContainerAccess; 5 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 6 | import net.minecraft.container.CartographyTableContainer; 7 | import org.bukkit.Location; 8 | import org.spongepowered.asm.mixin.Final; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.Shadow; 11 | 12 | @Mixin (targets = "net/minecraft/container/CartographyTableContainer$2") 13 | public abstract class CartographyTableContainer$2Mixin implements InventoryAccess { 14 | @SuppressWarnings ("ShadowTarget") @Shadow @Final 15 | private CartographyTableContainer field_19273; 16 | 17 | @Override 18 | public Location getLocation() { 19 | return ((BlockContextAccess) ((BlockContextContainerAccess) this.field_19273).getContext()).getLocation(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/ContainerTypeMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.util.Constructors; 4 | import net.minecraft.container.ContainerType; 5 | import net.minecraft.container.LecternContainer; 6 | import net.minecraft.entity.player.PlayerInventory; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Overwrite; 9 | 10 | @Mixin(ContainerType.class) 11 | public class ContainerTypeMixin { 12 | /** 13 | * @author HalfOf2 14 | */ 15 | @SuppressWarnings ("OverwriteTarget") 16 | @Overwrite 17 | private static /*synthetic*/ LecternContainer method_17436(int i, PlayerInventory inventory) { 18 | return Constructors.newLecternContainer(i, inventory); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/EnchantingTableContainer$1Mixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextContainerAccess; 5 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 6 | import net.minecraft.container.CartographyTableContainer; 7 | import org.bukkit.Location; 8 | import org.spongepowered.asm.mixin.Final; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.Shadow; 11 | 12 | @Mixin (targets = "net/minecraft/container/EnchantingTableContainer$1") 13 | public abstract class EnchantingTableContainer$1Mixin implements InventoryAccess { 14 | @SuppressWarnings ("ShadowTarget") @Shadow @Final 15 | private CartographyTableContainer field_19273; 16 | 17 | @Override 18 | public Location getLocation() { 19 | return ((BlockContextAccess) ((BlockContextContainerAccess) this.field_19273).getContext()).getLocation(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/FurnaceOutputSlotMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.block.entity.AbstractFurnaceBlockEntityAccess; 4 | import net.minecraft.block.entity.AbstractFurnaceBlockEntity; 5 | import net.minecraft.container.FurnaceOutputSlot; 6 | import net.minecraft.entity.player.PlayerEntity; 7 | import net.minecraft.item.ItemStack; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | import org.spongepowered.asm.mixin.injection.At; 11 | import org.spongepowered.asm.mixin.injection.Redirect; 12 | 13 | @Mixin(FurnaceOutputSlot.class) 14 | public class FurnaceOutputSlotMixin { 15 | @Shadow private int amount; 16 | 17 | @Redirect(method = "onCrafted(Lnet/minecraft/item/ItemStack;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/entity/AbstractFurnaceBlockEntity;dropExperience(Lnet/minecraft/entity/player/PlayerEntity;)V")) 18 | private void fukkit_newMethod(AbstractFurnaceBlockEntity entity, PlayerEntity player, ItemStack stack) { 19 | ((AbstractFurnaceBlockEntityAccess)entity).dropExperience(player, stack, this.amount); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/Generic3x3ContainerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.player.PlayerEntityAccess; 5 | import net.minecraft.container.Container; 6 | import net.minecraft.container.Generic3x3Container; 7 | import net.minecraft.entity.player.PlayerInventory; 8 | import net.minecraft.inventory.Inventory; 9 | import org.bukkit.craftbukkit.inventory.CraftInventory; 10 | import org.bukkit.craftbukkit.inventory.CraftInventoryView; 11 | import org.bukkit.inventory.InventoryView; 12 | import org.spongepowered.asm.mixin.Final; 13 | import org.spongepowered.asm.mixin.Mixin; 14 | import org.spongepowered.asm.mixin.Shadow; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Inject; 17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 18 | 19 | @Mixin(Generic3x3Container.class) 20 | public abstract class Generic3x3ContainerMixin extends ContainerMixin implements ContainerAccess { 21 | @Shadow @Final private Inventory inventory; 22 | private CraftInventoryView view; 23 | public PlayerInventory playerInventory; 24 | 25 | @Inject ( 26 | method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/inventory/Inventory;)V", 27 | at = @At ("TAIL")) 28 | private void fukkit_initPlayer(int syncId, PlayerInventory playerInventory, Inventory inventory, CallbackInfo ci) { 29 | this.playerInventory = (PlayerInventory) inventory; 30 | } 31 | 32 | @Override 33 | public InventoryView getBukkitView() { 34 | if (this.view != null) { return this.view; } 35 | this.view = new CraftInventoryView(((PlayerEntityAccess) this.playerInventory.player).getBukkit(), new CraftInventory(this.inventory), 36 | (Container) (Object) this); 37 | return this.view; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/GrindstoneContainer$1Mixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.BlockContextContainerAccess; 5 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 6 | import net.minecraft.container.GrindstoneContainer; 7 | import org.bukkit.Location; 8 | import org.spongepowered.asm.mixin.Final; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.Shadow; 11 | 12 | @Mixin (targets = "net/minecraft/container/GrindstoneContainer$1") 13 | public abstract class GrindstoneContainer$1Mixin implements InventoryAccess { 14 | @SuppressWarnings ("ShadowTarget") @Shadow @Final GrindstoneContainer field_16776; 15 | 16 | @Override 17 | public Location getLocation() { 18 | return ((BlockContextAccess)((BlockContextContainerAccess) this.field_16776).getContext()).getLocation(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/HorseContainerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.player.PlayerEntityAccess; 5 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 6 | import net.minecraft.container.Container; 7 | import net.minecraft.container.HopperContainer; 8 | import net.minecraft.container.HorseContainer; 9 | import net.minecraft.entity.passive.HorseBaseEntity; 10 | import net.minecraft.entity.player.PlayerEntity; 11 | import net.minecraft.entity.player.PlayerInventory; 12 | import net.minecraft.inventory.Inventory; 13 | import org.bukkit.craftbukkit.inventory.CraftInventoryView; 14 | import org.bukkit.inventory.InventoryView; 15 | import org.spongepowered.asm.mixin.Mixin; 16 | import org.spongepowered.asm.mixin.injection.At; 17 | import org.spongepowered.asm.mixin.injection.Inject; 18 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 19 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 20 | 21 | @Mixin (HorseContainer.class) 22 | public abstract class HorseContainerMixin extends ContainerMixin implements ContainerAccess { 23 | private CraftInventoryView view; 24 | public PlayerInventory playerInventory; 25 | 26 | @Inject ( 27 | method = "", 28 | at = @At ("TAIL")) 29 | private void fukkit_initPlayer(int syncId, PlayerInventory playerInventory, Inventory inventory, HorseBaseEntity horseBaseEntity, CallbackInfo ci) { 30 | this.playerInventory = playerInventory; 31 | } 32 | 33 | @Override 34 | public InventoryView getBukkitView() { 35 | if (this.view != null) { return this.view; } 36 | this.view = new CraftInventoryView(((PlayerEntityAccess) this.playerInventory.player).getBukkit(), ((InventoryAccess) this.playerInventory).getOwner().getInventory(), 37 | (Container) (Object) this); 38 | return this.view; 39 | } 40 | 41 | @Inject (method = "canUse", at = @At ("HEAD")) 42 | private void fukkit_canUse(PlayerEntity player, CallbackInfoReturnable cir) { 43 | if (!this.getCheckReachable()) { cir.setReturnValue(true); } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/MerchantContainerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.player.PlayerEntityAccess; 5 | import net.minecraft.container.MerchantContainer; 6 | import net.minecraft.entity.Entity; 7 | import net.minecraft.entity.player.PlayerInventory; 8 | import net.minecraft.village.Trader; 9 | import net.minecraft.village.TraderInventory; 10 | import net.minecraft.world.World; 11 | import org.bukkit.craftbukkit.inventory.CraftInventoryView; 12 | import org.spongepowered.asm.mixin.Final; 13 | import org.spongepowered.asm.mixin.Mixin; 14 | import org.spongepowered.asm.mixin.Shadow; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Inject; 17 | import org.spongepowered.asm.mixin.injection.Redirect; 18 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 19 | 20 | @Mixin (MerchantContainer.class) 21 | public class MerchantContainerMixin extends ContainerMixin implements ContainerAccess { 22 | @Shadow @Final private Trader trader; 23 | @Shadow @Final private TraderInventory traderInventory; 24 | private CraftInventoryView bukkitEntity = null; 25 | private PlayerInventory player; 26 | 27 | @Inject (method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/village/Trader;)V", at = @At ("TAIL")) 28 | private void fukkit_savePlayer(int syncId, PlayerInventory playerInventory, Trader trader, CallbackInfo ci) { 29 | this.player = playerInventory; 30 | } 31 | 32 | @Override 33 | public CraftInventoryView getBukkitView() { 34 | if (this.bukkitEntity == null) { 35 | this.bukkitEntity = new CraftInventoryView(((PlayerEntityAccess) this.player.player).getBukkit(), new org.bukkit.craftbukkit.inventory.CraftInventoryMerchant(this.trader, this.traderInventory), (MerchantContainer) (Object) this); 36 | } 37 | return this.bukkitEntity; 38 | } 39 | 40 | @Redirect (method = "playYesSound", at = @At (value = "FIELD", target = "Lnet/minecraft/world/World;isClient:Z")) 41 | private boolean fukkit_Spigot5035(World world) { 42 | return world.isClient || !(this.trader instanceof Entity); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/ShulkerBoxContainerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.player.PlayerEntityAccess; 5 | import net.minecraft.container.Container; 6 | import net.minecraft.container.ShulkerBoxContainer; 7 | import net.minecraft.entity.player.PlayerInventory; 8 | import net.minecraft.inventory.Inventory; 9 | import org.bukkit.craftbukkit.inventory.CraftInventory; 10 | import org.bukkit.craftbukkit.inventory.CraftInventoryView; 11 | import org.bukkit.inventory.InventoryView; 12 | import org.spongepowered.asm.mixin.Final; 13 | import org.spongepowered.asm.mixin.Mixin; 14 | import org.spongepowered.asm.mixin.Shadow; 15 | import org.spongepowered.asm.mixin.injection.At; 16 | import org.spongepowered.asm.mixin.injection.Inject; 17 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 18 | 19 | @Mixin (ShulkerBoxContainer.class) 20 | public class ShulkerBoxContainerMixin extends ContainerMixin implements ContainerAccess { 21 | @Shadow @Final private Inventory inventory; 22 | private CraftInventoryView bukkitEntity; 23 | private PlayerInventory player; 24 | 25 | @Inject (method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/inventory/Inventory;)V", at = @At ("TAIL")) 26 | private void fukkit_savePlayer(int syncId, PlayerInventory playerInventory, Inventory inventory, CallbackInfo ci) { 27 | this.player = playerInventory; 28 | } 29 | 30 | @Override public InventoryView getBukkitView() { 31 | if (this.bukkitEntity != null) { 32 | return this.bukkitEntity; 33 | } 34 | 35 | this.bukkitEntity = new CraftInventoryView(((PlayerEntityAccess)this.player.player).getBukkit(), new CraftInventory(this.inventory), (Container) (Object) this); 36 | return this.bukkitEntity; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/container/StonecutterContainerMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.player.PlayerEntityAccess; 5 | import net.minecraft.container.BlockContext; 6 | import net.minecraft.container.Container; 7 | import net.minecraft.container.StonecutterContainer; 8 | import net.minecraft.entity.player.PlayerInventory; 9 | import net.minecraft.inventory.CraftingResultInventory; 10 | import net.minecraft.inventory.Inventory; 11 | import org.bukkit.craftbukkit.entity.CraftPlayer; 12 | import org.bukkit.craftbukkit.inventory.CraftInventoryStonecutter; 13 | import org.bukkit.craftbukkit.inventory.CraftInventoryView; 14 | import org.bukkit.entity.Player; 15 | import org.bukkit.inventory.InventoryView; 16 | import org.spongepowered.asm.mixin.Final; 17 | import org.spongepowered.asm.mixin.Mixin; 18 | import org.spongepowered.asm.mixin.Shadow; 19 | import org.spongepowered.asm.mixin.injection.At; 20 | import org.spongepowered.asm.mixin.injection.Inject; 21 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 22 | 23 | @Mixin (StonecutterContainer.class) 24 | public class StonecutterContainerMixin extends ContainerMixin implements ContainerAccess { 25 | @Shadow @Final public Inventory inventory; 26 | @Shadow @Final private CraftingResultInventory field_19173; 27 | private CraftInventoryView bukkitEntity = null; 28 | private Player player; 29 | 30 | @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/container/BlockContext;)V", at = @At("TAIL")) 31 | private void fukkit_savePlayer(int syncId, PlayerInventory playerInventory, BlockContext blockContext, CallbackInfo ci) { 32 | this.player = ((PlayerEntityAccess)playerInventory.player).getBukkit(); 33 | } 34 | 35 | @Override public InventoryView getBukkitView() { 36 | if (this.bukkitEntity != null) { 37 | return this.bukkitEntity; 38 | } 39 | 40 | CraftInventoryStonecutter inventory = new CraftInventoryStonecutter(this.inventory, this.field_19173); 41 | this.bukkitEntity = new CraftInventoryView(this.player, inventory, (Container) (Object) this); 42 | return this.bukkitEntity; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/datafixer/SchemasMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.datafixer; 2 | 3 | import com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.datafix.PlayerNameFix; 4 | import com.mojang.datafixers.DataFixerBuilder; 5 | import com.mojang.datafixers.schemas.Schema; 6 | import net.minecraft.datafixer.Schemas; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 12 | 13 | @Mixin (Schemas.class) 14 | public class SchemasMixin { 15 | @Inject (method = "build", 16 | at = @At (value = "INVOKE", 17 | target = "Lnet/minecraft/datafixer/fix/EntityCustomNameToComponentFix;(Lcom/mojang/datafixers/schemas/Schema;Z)V", 18 | ordinal = 0), 19 | locals = LocalCapture.CAPTURE_FAILHARD) 20 | private static void fukkit_playerName(DataFixerBuilder builder, CallbackInfo ci, Schema schema, Schema schema2, Schema schema3, Schema schema4, Schema schema5, Schema schema6, Schema schema7, Schema schema8, Schema schema9, Schema schema10, Schema schema11, Schema schema12, Schema schema13, Schema schema14, Schema schema15, Schema schema16, Schema schema17, Schema schema18, Schema schema19, Schema schema20, Schema schema21, Schema schema22, Schema schema23, Schema schema24, Schema schema25, Schema schema26, Schema schema27, Schema schema28, Schema schema29, Schema schema30, Schema schema31, Schema schema32, Schema schema33, Schema schema34, Schema schema35, Schema schema36, Schema schema37, Schema schema38, Schema schema39, Schema schema40, Schema schema41, Schema schema42, Schema schema43, Schema schema44, Schema schema45, Schema schema46, Schema schema47, Schema schema48) { 21 | builder.addFixer(new PlayerNameFix(schema48)); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/datafixer/fix/ItemInstanceMapIdFixMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.datafixer.fix; 2 | 3 | import com.mojang.datafixers.Dynamic; 4 | import net.minecraft.datafixer.fix.ItemInstanceMapIdFix; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Redirect; 8 | 9 | @SuppressWarnings ("UnresolvedMixinReference") 10 | @Mixin (ItemInstanceMapIdFix.class) 11 | public class ItemInstanceMapIdFixMixin { 12 | @Redirect ( 13 | method = "method_5032(Lcom/mojang/datafixers/OpticFinder;Lcom/mojang/datafixers/OpticFinder;" + 14 | "Lcom/mojang/datafixers/Typed;)Lcom/mojang/datafixers/Typed;", 15 | at = @At (value = "INVOKE", 16 | target = "Lcom/mojang/datafixers/Dynamic;set(Ljava/lang/String;Lcom/mojang/datafixers/Dynamic;)" + 17 | "Lcom/mojang/datafixers/Dynamic;", 18 | remap = false), remap = false) 19 | private static Dynamic set(Dynamic dynamic, String key, Dynamic value) { 20 | if (!dynamic.getElement("map").isPresent()) { 21 | return dynamic.set("map", dynamic.createInt(dynamic.get("Damage").asInt(0))); 22 | } 23 | return dynamic; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/datafixer/fix/ItemInstanceTheFlatteningFixMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.datafixer.fix; 2 | 3 | import com.mojang.datafixers.Dynamic; 4 | import net.minecraft.datafixer.fix.ItemInstanceTheFlatteningFix; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.injection.At; 7 | import org.spongepowered.asm.mixin.injection.Redirect; 8 | 9 | @Mixin (ItemInstanceTheFlatteningFix.class) 10 | public class ItemInstanceTheFlatteningFixMixin { 11 | @Redirect ( 12 | method = "method_5044(Lcom/mojang/datafixers/OpticFinder;Lcom/mojang/datafixers/OpticFinder;" + 13 | "Lcom/mojang/datafixers/Typed;)Lcom/mojang/datafixers/Typed;", 14 | at = @At (value = "INVOKE", 15 | target = "Lcom/mojang/datafixers/Dynamic;set(Ljava/lang/String;Lcom/mojang/datafixers/Dynamic;)" + 16 | "Lcom/mojang/datafixers/Dynamic;"), 17 | remap = false) 18 | private static Dynamic set(Dynamic dynamic, String value, Dynamic intVal) { 19 | if (intVal.asInt(0) != 0) { return dynamic.set(value, intVal); } 20 | return dynamic; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/enchantment/DamageEnchantmentMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.enchantment; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.LivingEntityAccess; 4 | import net.minecraft.enchantment.DamageEnchantment; 5 | import net.minecraft.entity.LivingEntity; 6 | import net.minecraft.entity.effect.StatusEffectInstance; 7 | import org.bukkit.event.entity.EntityPotionEffectEvent; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | 12 | @Mixin(DamageEnchantment.class) 13 | public class DamageEnchantmentMixin { 14 | @Redirect(method = "onTargetDamaged", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;addStatusEffect(Lnet/minecraft/entity/effect/StatusEffectInstance;)Z")) 15 | private boolean fukkit_cause(LivingEntity entity, StatusEffectInstance effect) { 16 | return ((LivingEntityAccess)entity).addEffect(effect, EntityPotionEffectEvent.Cause.ATTACK); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/enchantment/EnchantmentsMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.enchantment; 2 | 3 | import net.minecraft.enchantment.Enchantment; 4 | import net.minecraft.enchantment.Enchantments; 5 | import org.bukkit.craftbukkit.enchantments.CraftEnchantment; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 10 | 11 | @Mixin (Enchantments.class) 12 | public class EnchantmentsMixin { 13 | @Inject ( 14 | method = "register(Ljava/lang/String;Lnet/minecraft/enchantment/Enchantment;)" + 15 | "Lnet/minecraft/enchantment/Enchantment;", 16 | at = @At ("RETURN")) 17 | private static void fukkit_register(String string, Enchantment enchantment, 18 | CallbackInfoReturnable cir) { 19 | org.bukkit.enchantments.Enchantment.registerEnchantment(new CraftEnchantment(enchantment)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/ai/brain/task/GoToWorkTaskMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.ai.brain.task; 2 | 3 | import net.minecraft.entity.ai.brain.task.GoToWorkTask; 4 | import net.minecraft.entity.passive.VillagerEntity; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.village.VillagerData; 7 | import net.minecraft.village.VillagerProfession; 8 | import org.bukkit.craftbukkit.entity.CraftVillager; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.bukkit.entity.Villager; 11 | import org.bukkit.event.entity.VillagerCareerChangeEvent; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.injection.At; 14 | import org.spongepowered.asm.mixin.injection.Inject; 15 | import org.spongepowered.asm.mixin.injection.Redirect; 16 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 17 | 18 | @Mixin (GoToWorkTask.class) 19 | public class GoToWorkTaskMixin { 20 | private static Villager.Profession profession; 21 | 22 | @Inject (method = "method_18986", 23 | at = @At (value = "INVOKE", 24 | target = "net/minecraft/entity/passive/VillagerEntity.setVillagerData(Lnet/minecraft/village/VillagerData;)V"), 25 | cancellable = true) 26 | private static void fukkit_villagerCarreerEvent(VillagerEntity entity, ServerWorld world, VillagerProfession profession, CallbackInfo ret) { 27 | VillagerCareerChangeEvent event = CraftEventFactory.callVillagerCareerChangeEvent(entity, CraftVillager.nmsToBukkitProfession(profession), VillagerCareerChangeEvent.ChangeReason.EMPLOYED); 28 | if (event.isCancelled()) { 29 | ret.cancel(); 30 | } else GoToWorkTaskMixin.profession = event.getProfession(); 31 | } 32 | 33 | @Redirect (method = "method_18986", 34 | at = @At (value = "INVOKE", 35 | target = "Lnet/minecraft/village/VillagerData;withProfession(Lnet/minecraft/village/VillagerProfession;)Lnet/minecraft/village/VillagerData;")) 36 | private static VillagerData fukkit_villagerCarreerEvent(VillagerData entity, VillagerProfession villagerData) { 37 | return entity.withProfession(CraftVillager.bukkitToNmsProfession(profession)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/ai/brain/task/LookTargetUtilMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.ai.brain.task; 2 | 3 | import net.minecraft.entity.LivingEntity; 4 | import net.minecraft.entity.ai.brain.task.LookTargetUtil; 5 | import net.minecraft.item.ItemStack; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Inject; 9 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 10 | 11 | @Mixin(LookTargetUtil.class) 12 | public class LookTargetUtilMixin { 13 | @Inject(method = "give", at = @At("HEAD"), cancellable = true) 14 | private static void fukkit_noEmptyLoot(LivingEntity entity, ItemStack stack, LivingEntity target, CallbackInfo ci) { 15 | if(stack.isEmpty()) 16 | ci.cancel(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/ai/brain/task/LoseJobOnSiteLossTaskMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.ai.brain.task; 2 | 3 | import net.minecraft.entity.ai.brain.task.LoseJobOnSiteLossTask; 4 | import net.minecraft.entity.passive.VillagerEntity; 5 | import net.minecraft.server.world.ServerWorld; 6 | import net.minecraft.village.VillagerData; 7 | import net.minecraft.village.VillagerProfession; 8 | import org.bukkit.craftbukkit.entity.CraftVillager; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.bukkit.entity.Villager; 11 | import org.bukkit.event.entity.VillagerCareerChangeEvent; 12 | import org.spongepowered.asm.mixin.Mixin; 13 | import org.spongepowered.asm.mixin.injection.At; 14 | import org.spongepowered.asm.mixin.injection.Inject; 15 | import org.spongepowered.asm.mixin.injection.Redirect; 16 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 17 | 18 | @Mixin (LoseJobOnSiteLossTask.class) 19 | public class LoseJobOnSiteLossTaskMixin { 20 | private static Villager.Profession profession; 21 | 22 | @Inject (method = "run", 23 | at = @At (value = "INVOKE", 24 | target = "net/minecraft/entity/passive/VillagerEntity.setVillagerData(Lnet/minecraft/village/VillagerData;)V"), 25 | cancellable = true) 26 | private static void fukkit_villagerCarreerEvent(ServerWorld serverWorld, VillagerEntity entity, long l, CallbackInfo ci) { 27 | VillagerCareerChangeEvent event = CraftEventFactory.callVillagerCareerChangeEvent(entity, CraftVillager.nmsToBukkitProfession(VillagerProfession.NONE), VillagerCareerChangeEvent.ChangeReason.EMPLOYED); 28 | if (event.isCancelled()) { 29 | ci.cancel(); 30 | } else profession = event.getProfession(); 31 | } 32 | 33 | @Redirect (method = "run", 34 | at = @At (value = "INVOKE", 35 | target = "Lnet/minecraft/village/VillagerData;withProfession(Lnet/minecraft/village/VillagerProfession;)Lnet/minecraft/village/VillagerData;")) 36 | private static VillagerData fukkit_villagerCarreerEvent(VillagerData entity, VillagerProfession villagerData) { 37 | return entity.withProfession(CraftVillager.bukkitToNmsProfession(profession)); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/ai/brain/task/VillagerBreedTaskMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.ai.brain.task; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.world.ServerWorldAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 5 | import net.minecraft.entity.Entity; 6 | import net.minecraft.entity.ai.brain.task.VillagerBreedTask; 7 | import net.minecraft.entity.passive.VillagerEntity; 8 | import net.minecraft.world.World; 9 | import org.bukkit.craftbukkit.event.CraftEventFactory; 10 | import org.bukkit.event.entity.CreatureSpawnEvent; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.injection.At; 13 | import org.spongepowered.asm.mixin.injection.Inject; 14 | import org.spongepowered.asm.mixin.injection.Redirect; 15 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; 16 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 17 | import java.util.Optional; 18 | 19 | @Mixin (VillagerBreedTask.class) 20 | public class VillagerBreedTaskMixin { 21 | @Inject (method = "createChild", 22 | at = @At (value = "INVOKE_ASSIGN", 23 | target = "Lnet/minecraft/entity/passive/VillagerEntity;createChild(Lnet/minecraft/entity/passive/PassiveEntity;)Lnet/minecraft/entity/passive/VillagerEntity;"), 24 | locals = LocalCapture.CAPTURE_FAILHARD, 25 | cancellable = true) 26 | private void fukkit_callBreed(VillagerEntity first, VillagerEntity second, CallbackInfoReturnable> cir, VillagerEntity child) { 27 | if(CraftEventFactory.callEntityBreedEvent(child, first, second, null, null, 0).isCancelled()) 28 | cir.setReturnValue(Optional.empty()); 29 | } 30 | 31 | @Redirect(method = "createChild", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;spawnEntity(Lnet/minecraft/entity/Entity;)Z")) 32 | private boolean fukkit_spawnReason(World world, Entity entity) { 33 | return ((ServerWorldAccess)world).addEntity(entity, CreatureSpawnEvent.SpawnReason.BREEDING); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/ai/goal/AnimalMateGoalMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.ai.goal; 2 | 3 | import net.minecraft.entity.ai.goal.AnimalMateGoal; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.injection.At; 6 | import org.spongepowered.asm.mixin.injection.Inject; 7 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 8 | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; 9 | 10 | @Mixin (AnimalMateGoal.class) 11 | public class AnimalMateGoalMixin { 12 | @Inject (method = "breed", 13 | at = @At (value = "INVOKE", 14 | target = "Lnet/minecraft/entity/passive/AnimalEntity;getLovingPlayer()Lnet/minecraft/server/network/ServerPlayerEntity;"), 15 | locals = LocalCapture.PRINT) 16 | private void fukkit_tamableEntity(CallbackInfo ci) { 17 | 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/damage/DamageSourceMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.damage; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.damage.DamageSourceAccess; 4 | import net.minecraft.entity.damage.DamageSource; 5 | import org.spongepowered.asm.mixin.Implements; 6 | import org.spongepowered.asm.mixin.Interface; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | 9 | @Implements (@Interface (iface = DamageSourceAccess.class, prefix = "fukkit$")) 10 | @Mixin (DamageSource.class) 11 | public class DamageSourceMixin { 12 | private boolean sweep; 13 | 14 | public boolean fukkit$isSweep() { 15 | return this.sweep; 16 | } 17 | 18 | public DamageSource fukkit$sweep() { 19 | this.sweep = true; 20 | return (DamageSource) (Object) this; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/mob/DrownedEntityAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.mob; 2 | 3 | import net.minecraft.entity.ai.pathing.MobNavigation; 4 | import net.minecraft.entity.ai.pathing.SwimNavigation; 5 | import net.minecraft.entity.mob.DrownedEntity; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | import org.spongepowered.asm.mixin.gen.Accessor; 8 | 9 | @Mixin (DrownedEntity.class) 10 | public interface DrownedEntityAccess { 11 | @Accessor ("waterNavigation") SwimNavigation getWaterNavigation(); 12 | 13 | @Accessor ("landNavigation") MobNavigation getLandNavigation(); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/mob/MobEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.mob; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.entity.mob.MobEntityAccess; 4 | import net.minecraft.entity.mob.MobEntity; 5 | import org.spongepowered.asm.mixin.Implements; 6 | import org.spongepowered.asm.mixin.Interface; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Shadow; 9 | 10 | @Mixin (MobEntity.class) 11 | @Implements (@Interface (iface = MobEntityAccess.class, prefix = "fukkit$")) 12 | public class MobEntityMixin { 13 | // TODO skeleton impl 14 | @Shadow private boolean persistent; 15 | 16 | public void fukkit$setPersistent(boolean persistent) { 17 | this.persistent = persistent; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/entity/projectile/AbstractFireBallEntityMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.entity.projectile; 2 | 3 | import net.minecraft.entity.projectile.AbstractFireballEntity; 4 | import net.minecraft.item.ItemStack; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | import org.spongepowered.asm.mixin.Shadow; 7 | import org.spongepowered.asm.mixin.injection.At; 8 | import org.spongepowered.asm.mixin.injection.Redirect; 9 | 10 | @Mixin (AbstractFireballEntity.class) 11 | public abstract class AbstractFireBallEntityMixin { 12 | @Redirect (method = "readCustomDataFromTag", at = @At ( 13 | target = "Lnet/minecraft/entity/projectile/AbstractFireballEntity;setItem(Lnet/minecraft/item/ItemStack;)V", 14 | value = "INVOKE")) 15 | public void redirect(AbstractFireballEntity entity, ItemStack stack) { 16 | if (!stack.isEmpty()) { this.setItem(stack); } 17 | } 18 | 19 | @Shadow public abstract void setItem(ItemStack stack); 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/inventory/BasicInventoryMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.inventory; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.BasicInventoryAccess; 4 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 5 | import com.github.fukkitmc.fukkit.util.Constants; 6 | import net.minecraft.inventory.BasicInventory; 7 | import net.minecraft.item.ItemStack; 8 | import net.minecraft.util.DefaultedList; 9 | import org.bukkit.Location; 10 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 11 | import org.bukkit.entity.HumanEntity; 12 | import org.bukkit.inventory.InventoryHolder; 13 | import org.spongepowered.asm.mixin.*; 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | 17 | @Mixin (BasicInventory.class) 18 | public class BasicInventoryMixin implements BasicInventoryAccess { 19 | public List viewers = new ArrayList<>(); 20 | @Shadow 21 | @Final 22 | private DefaultedList stackList; 23 | private InventoryHolder holder; 24 | private int maxStack = Constants.MAX_STACK; 25 | 26 | @Override 27 | public List getContents() { 28 | return this.stackList; 29 | } 30 | 31 | @Override 32 | public void onOpen(CraftHumanEntity who) { 33 | this.viewers.add(who); 34 | } 35 | 36 | @Override 37 | public void onClose(CraftHumanEntity who) { 38 | this.viewers.remove(who); 39 | } 40 | 41 | @Override 42 | public List getViewers() { 43 | return this.viewers; 44 | } 45 | 46 | @Override 47 | public InventoryHolder getOwner() { 48 | return this.holder; 49 | } 50 | 51 | @Override 52 | public void setOwner(InventoryHolder holder) { 53 | this.holder = holder; 54 | } 55 | 56 | @Override 57 | public void setMaxStackSize(int size) { 58 | this.maxStack = size; 59 | } 60 | 61 | @Override 62 | public Location getLocation() { 63 | return null; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/inventory/CraftingResultInventoryMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.inventory; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.inventory.InventoryAccess; 4 | import net.minecraft.inventory.CraftingResultInventory; 5 | import net.minecraft.inventory.Inventory; 6 | import net.minecraft.item.ItemStack; 7 | import net.minecraft.util.DefaultedList; 8 | import org.bukkit.Location; 9 | import org.bukkit.craftbukkit.entity.CraftHumanEntity; 10 | import org.bukkit.entity.HumanEntity; 11 | import org.spongepowered.asm.mixin.*; 12 | 13 | import static com.github.fukkitmc.fukkit.util.Constants.MAX_STACK; 14 | 15 | @Mixin (CraftingResultInventory.class) 16 | public abstract class CraftingResultInventoryMixin implements InventoryAccess, Inventory { 17 | @Shadow @Final private DefaultedList stack; 18 | private int maxStack = MAX_STACK; 19 | 20 | @Override public java.util.List getContents() { 21 | return this.stack; 22 | } 23 | 24 | // Don't need a transaction; the InventoryCrafting keeps track of it for us 25 | @Override public void onOpen(CraftHumanEntity who) {} 26 | 27 | @Override public void onClose(CraftHumanEntity who) {} 28 | 29 | @Override public org.bukkit.inventory.InventoryHolder getOwner() { 30 | return null; // Result slots don't get an owner 31 | } 32 | 33 | @Override public void setMaxStackSize(int size) { 34 | this.maxStack = size; 35 | } 36 | 37 | @Override public Location getLocation() { 38 | return null; 39 | } 40 | 41 | @Override public java.util.List getViewers() { 42 | return new java.util.ArrayList<>(); 43 | } 44 | 45 | @Override 46 | public int getInvMaxStackAmount() { 47 | return this.maxStack; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/inventory/EnderChestInventoryMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.inventory; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.WorldAccess; 4 | import net.minecraft.block.entity.EnderChestBlockEntity; 5 | import net.minecraft.inventory.EnderChestInventory; 6 | import org.bukkit.Location; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Shadow; 9 | 10 | @Mixin (EnderChestInventory.class) public class EnderChestInventoryMixin extends BasicInventoryMixin { 11 | @Shadow private EnderChestBlockEntity currentBlockEntity; 12 | 13 | @Override public Location getLocation() { 14 | return new Location(((WorldAccess) this.currentBlockEntity.getWorld()).getBukkit(), this.currentBlockEntity.getPos().getX(), this.currentBlockEntity.getPos().getY(), this.currentBlockEntity.getPos().getZ()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/network/packet/c2s/play/ClientSettingsC2SPacketAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.network.packet.c2s.play; 2 | 3 | import net.minecraft.network.packet.c2s.play.ClientSettingsC2SPacket; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | @Mixin (ClientSettingsC2SPacket.class) 8 | public interface ClientSettingsC2SPacketAccess { 9 | @Accessor ("viewDistance") int getViewDistance(); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/server/ServerNetworkIoMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.server; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.ServerNetworkIoAccess; 4 | import io.netty.bootstrap.ServerBootstrap; 5 | import io.netty.channel.ChannelFuture; 6 | import io.netty.channel.ChannelOption; 7 | import net.minecraft.server.ServerNetworkIo; 8 | import org.spongepowered.asm.mixin.*; 9 | import org.spongepowered.asm.mixin.injection.At; 10 | import org.spongepowered.asm.mixin.injection.Redirect; 11 | import java.util.List; 12 | 13 | @Implements (@Interface (iface = ServerNetworkIoAccess.class, prefix = "fukkit$")) 14 | @Mixin (ServerNetworkIo.class) 15 | public abstract class ServerNetworkIoMixin { 16 | @Shadow @Final private List channels; 17 | 18 | @Redirect (method = "bind", at = @At (value = "INVOKE", 19 | target = "Lio/netty/bootstrap/ServerBootstrap;bind()" + 20 | "Lio/netty/channel/ChannelFuture;", 21 | remap = false)) 22 | public ChannelFuture bind(ServerBootstrap bootstrap) { 23 | return bootstrap.option(ChannelOption.AUTO_READ, false).bind(); 24 | } 25 | 26 | public void fukkit$acceptConnections() { 27 | synchronized (this.channels) { 28 | for (ChannelFuture channel : this.channels) { 29 | channel.channel().config().setAutoRead(true); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/server/command/CommandOutput$1Mixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.server.command; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.command.CommandOutputAccess; 4 | import net.minecraft.server.command.ServerCommandSource; 5 | import org.bukkit.command.CommandSender; 6 | import org.spongepowered.asm.mixin.Mixin; 7 | 8 | @Mixin(targets = "net/minecraft/server/command/CommandOutput$1") 9 | public class CommandOutput$1Mixin implements CommandOutputAccess { 10 | 11 | @Override 12 | public CommandSender getBukkitSender(ServerCommandSource wrapper) { 13 | throw new UnsupportedOperationException("Not supported yet."); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/server/command/CommandOutputMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.server.command; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.command.CommandOutputAccess; 4 | import net.minecraft.server.command.CommandOutput; 5 | import org.spongepowered.asm.mixin.Mixin; 6 | 7 | @Mixin(CommandOutput.class) 8 | public interface CommandOutputMixin extends CommandOutputAccess { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/server/world/SecondaryServerWorldMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.server.world; 2 | 3 | import net.minecraft.server.world.SecondaryServerWorld; 4 | import net.minecraft.util.profiler.Profiler; 5 | import net.minecraft.world.GameRules; 6 | import net.minecraft.world.World; 7 | import net.minecraft.world.chunk.ChunkManager; 8 | import net.minecraft.world.dimension.Dimension; 9 | import net.minecraft.world.dimension.DimensionType; 10 | import net.minecraft.world.level.LevelProperties; 11 | import org.spongepowered.asm.mixin.Mixin; 12 | import org.spongepowered.asm.mixin.Overwrite; 13 | import java.util.function.BiFunction; 14 | 15 | @Mixin (SecondaryServerWorld.class) 16 | public abstract class SecondaryServerWorldMixin extends World { 17 | 18 | protected SecondaryServerWorldMixin(LevelProperties levelProperties, DimensionType dimensionType, BiFunction chunkManagerProvider, Profiler profiler, boolean isClient) { 21 | super(levelProperties, dimensionType, chunkManagerProvider, profiler, isClient); 22 | } 23 | 24 | /** 25 | * @author HalfOf2 26 | * bukkit pls 27 | */ 28 | @Override 29 | @Overwrite 30 | public void tickTime() { 31 | this.setTime(this.properties.getTime() + 1L); 32 | if (this.properties.getGameRules().getBoolean(GameRules.DO_DAYLIGHT_CYCLE)) { 33 | this.setTimeOfDay(this.properties.getTimeOfDay() + 1L); 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/server/world/ThreadedAnvilChunkStorageMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.server.world; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.server.world.ThreadedAnvilChunkStorageAccess; 4 | import net.minecraft.server.WorldGenerationProgressListener; 5 | import net.minecraft.server.world.ThreadedAnvilChunkStorage; 6 | import org.spongepowered.asm.mixin.*; 7 | 8 | @Implements (@Interface (iface = ThreadedAnvilChunkStorageAccess.class, prefix = "fukkit$")) 9 | @Mixin (ThreadedAnvilChunkStorage.class) 10 | public class ThreadedAnvilChunkStorageMixin { 11 | 12 | @Shadow @Final private WorldGenerationProgressListener worldGenerationProgressListener; 13 | 14 | public WorldGenerationProgressListener fukkit$getListener() { 15 | return this.worldGenerationProgressListener; 16 | } 17 | // todo finish 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/util/math/Vec3iAccess.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.util.math; 2 | 3 | import net.minecraft.util.math.Vec3i; 4 | import org.spongepowered.asm.mixin.Mixin; 5 | import org.spongepowered.asm.mixin.gen.Accessor; 6 | 7 | @Mixin (Vec3i.class) 8 | public interface Vec3iAccess { 9 | @Accessor ("x") 10 | void setX(int x); 11 | 12 | @Accessor ("y") 13 | void setY(int y); 14 | 15 | @Accessor ("z") 16 | void setZ(int z); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/ChunkRegionMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.ChunkRegionAccess; 4 | import net.minecraft.entity.Entity; 5 | import net.minecraft.world.ChunkRegion; 6 | import org.bukkit.event.entity.CreatureSpawnEvent; 7 | import org.spongepowered.asm.mixin.Implements; 8 | import org.spongepowered.asm.mixin.Interface; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.Shadow; 11 | 12 | @Implements (@Interface (iface = ChunkRegionAccess.class, prefix = "fukkit$")) 13 | @Mixin (ChunkRegion.class) 14 | public abstract class ChunkRegionMixin { 15 | public boolean fukkit$addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason) { 16 | return this 17 | .spawnEntity(entity); // in craftbukkit, this parameter doesn't actually do anything, quite strange :p 18 | } 19 | 20 | @Shadow public abstract boolean spawnEntity(Entity entity); 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/biome/source/BiomeArrayMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.biome.source; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.biome.source.BiomeArrayAccess; 4 | import net.minecraft.util.math.MathHelper; 5 | import net.minecraft.world.biome.Biome; 6 | import net.minecraft.world.biome.source.BiomeArray; 7 | import org.spongepowered.asm.mixin.*; 8 | 9 | import static net.minecraft.world.biome.source.BiomeArray.HORIZONTAL_BIT_MASK; 10 | import static net.minecraft.world.biome.source.BiomeArray.VERTICAL_BIT_MASK; 11 | 12 | @Implements (@Interface (iface = BiomeArrayAccess.class, prefix = "fukkit$")) 13 | @Mixin (BiomeArray.class) 14 | public class BiomeArrayMixin { 15 | @Shadow @Final private static int HORIZONTAL_SECTION_COUNT; 16 | @Shadow @Final private Biome[] data; 17 | 18 | @Unique 19 | public void fukkit$setBiome(int x, int y, int z, Biome biome) { 20 | int i = x & HORIZONTAL_BIT_MASK; 21 | int j = MathHelper.clamp(y, 0, VERTICAL_BIT_MASK); 22 | int k = z & HORIZONTAL_BIT_MASK; 23 | this.data[j << HORIZONTAL_SECTION_COUNT + HORIZONTAL_SECTION_COUNT | k << HORIZONTAL_SECTION_COUNT | i] = 24 | biome; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/border/WorldBorderMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.border; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.border.WorldBorderAccess; 4 | import net.minecraft.server.world.ServerWorld; 5 | import net.minecraft.world.border.WorldBorder; 6 | import net.minecraft.world.border.WorldBorderListener; 7 | import org.spongepowered.asm.mixin.*; 8 | import org.spongepowered.asm.mixin.injection.At; 9 | import org.spongepowered.asm.mixin.injection.Inject; 10 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 11 | import java.util.List; 12 | 13 | @Implements (@Interface (iface = WorldBorderAccess.class, prefix = "fukkit$")) 14 | @Mixin (WorldBorder.class) 15 | public abstract class WorldBorderMixin { 16 | public ServerWorld world; 17 | @Shadow @Final private List listeners; 18 | 19 | @Inject (method = "addListener(Lnet/minecraft/world/border/WorldBorderListener;)V", at = @At ("HEAD"), 20 | cancellable = true) 21 | public void addListener(WorldBorderListener listener, CallbackInfo ci) { 22 | if (this.listeners.contains(listener)) { ci.cancel(); } 23 | } 24 | 25 | public ServerWorld fukkit$getServerWorld() { 26 | return this.world; 27 | } 28 | 29 | public void fukkit$setServerWorld(ServerWorld world) { 30 | this.world = world; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/dimension/DimensionMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.dimension; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension.DimensionAccess; 4 | import net.minecraft.world.dimension.Dimension; 5 | import net.minecraft.world.dimension.DimensionType; 6 | import org.spongepowered.asm.mixin.Final; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | import org.spongepowered.asm.mixin.Overwrite; 9 | import org.spongepowered.asm.mixin.Shadow; 10 | 11 | @Mixin (Dimension.class) 12 | public class DimensionMixin implements DimensionAccess { 13 | @Shadow @Final private DimensionType type; 14 | 15 | /** 16 | * craftbukkit told me to pls don't hurt me 17 | * 18 | * @author HalfOf2 19 | */ 20 | @Override 21 | @Overwrite 22 | public DimensionType getType() { 23 | return this.type; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/dimension/DimensionTypeMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.dimension; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension.DimensionTypeAccess; 4 | import net.minecraft.world.dimension.DimensionType; 5 | import org.spongepowered.asm.mixin.Implements; 6 | import org.spongepowered.asm.mixin.Interface; 7 | import org.spongepowered.asm.mixin.Mixin; 8 | 9 | @Mixin (DimensionType.class) 10 | public class DimensionTypeMixin implements DimensionTypeAccess { 11 | private DimensionType type; 12 | 13 | @Override 14 | public DimensionType getType() { 15 | return this.type == null ? (DimensionType) (Object) this : this.type; 16 | } 17 | 18 | @Override 19 | public void setType(DimensionType type) { 20 | this.type = type; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/dimension/OverworldDimensionMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.dimension; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension.DimensionAccess; 4 | import net.minecraft.world.World; 5 | import net.minecraft.world.dimension.Dimension; 6 | import net.minecraft.world.dimension.DimensionType; 7 | import net.minecraft.world.dimension.OverworldDimension; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Overwrite; 10 | 11 | @Mixin (OverworldDimension.class) 12 | public abstract class OverworldDimensionMixin extends Dimension { 13 | public OverworldDimensionMixin(World world, DimensionType type, float f) { 14 | super(world, type, f); 15 | } 16 | 17 | 18 | /** 19 | * handled by super 20 | * 21 | * @author HalfOf2 22 | */ 23 | @Override 24 | @Overwrite 25 | public DimensionType getType() { 26 | return ((DimensionAccess) this).getType(); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/dimension/TheEndDimensionMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.dimension; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension.DimensionAccess; 4 | import net.minecraft.world.World; 5 | import net.minecraft.world.dimension.Dimension; 6 | import net.minecraft.world.dimension.DimensionType; 7 | import net.minecraft.world.dimension.TheEndDimension; 8 | import org.spongepowered.asm.mixin.Mixin; 9 | import org.spongepowered.asm.mixin.Overwrite; 10 | 11 | @Mixin (TheEndDimension.class) 12 | public abstract class TheEndDimensionMixin extends Dimension { 13 | public TheEndDimensionMixin(World world, DimensionType type, float f) { 14 | super(world, type, f); 15 | } 16 | 17 | /** 18 | * handled by super 19 | * 20 | * @author HalfOf2 21 | */ 22 | @Override 23 | @Overwrite 24 | public DimensionType getType() { 25 | return ((DimensionAccess) this).getType(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/mixin/net/minecraft/world/dimension/TheNetherDimensionMixin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.mixin.net.minecraft.world.dimension; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.world.dimension.DimensionAccess; 4 | import net.minecraft.world.World; 5 | import net.minecraft.world.border.WorldBorder; 6 | import net.minecraft.world.dimension.Dimension; 7 | import net.minecraft.world.dimension.DimensionType; 8 | import net.minecraft.world.dimension.TheNetherDimension; 9 | import org.spongepowered.asm.mixin.Mixin; 10 | import org.spongepowered.asm.mixin.Overwrite; 11 | 12 | @Mixin (TheNetherDimension.class) 13 | public abstract class TheNetherDimensionMixin extends Dimension { 14 | public TheNetherDimensionMixin(World world, DimensionType type, float f) { 15 | super(world, type, f); 16 | } 17 | 18 | /** 19 | * Bukkit said this is needed, and so it must be done 20 | * 21 | * @author HalfOf2 22 | */ 23 | @Override 24 | @Overwrite 25 | public WorldBorder createWorldBorder() { 26 | return new WorldBorder(); 27 | } 28 | 29 | /** 30 | * handled by super 31 | * 32 | * @author HalfOf2 33 | */ 34 | @Override 35 | @Overwrite 36 | public DimensionType getType() { 37 | return ((DimensionAccess) this).getType(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/plugin/PublicPlugin.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.plugin; 2 | 3 | import org.objectweb.asm.tree.ClassNode; 4 | import org.objectweb.asm.tree.FieldNode; 5 | import org.objectweb.asm.tree.MethodNode; 6 | import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; 7 | import org.spongepowered.asm.mixin.extensibility.IMixinInfo; 8 | import java.util.List; 9 | import java.util.Set; 10 | 11 | public class PublicPlugin implements IMixinConfigPlugin { 12 | @Override 13 | public void onLoad(String mixinPackage) {} 14 | @Override 15 | public String getRefMapperConfig() { 16 | return null; 17 | } 18 | @Override 19 | public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { 20 | return true; 21 | } 22 | @Override 23 | public void acceptTargets(Set myTargets, Set otherTargets) {} 24 | @Override 25 | public List getMixins() { 26 | return null; 27 | } 28 | @Override 29 | public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} 30 | @Override 31 | public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { 32 | targetClass.access = widen(targetClass.access); 33 | for (FieldNode field : targetClass.fields) { 34 | field.access = widen(field.access); 35 | } 36 | for (MethodNode method : targetClass.methods) { 37 | method.access = widen(method.access); 38 | } 39 | } 40 | 41 | private static int widen(int mod) { 42 | return (mod & ~0b111) | 0b1; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/LocalVariable.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util; 2 | 3 | import java.util.LinkedList; 4 | import java.util.Queue; 5 | import java.util.logging.Logger; 6 | 7 | public class LocalVariable { 8 | private static final Logger LOGGER = Logger.getLogger("LocalVariable"); 9 | private final ThreadLocal> type = ThreadLocal.withInitial(LinkedList::new); 10 | private final int threshold; 11 | 12 | public LocalVariable() {this(20);} 13 | 14 | public LocalVariable(int threshold) {this.threshold = threshold;} 15 | 16 | public T get() { 17 | return this.type.get().peek(); 18 | } 19 | 20 | public T pop() { 21 | return this.type.get().poll(); 22 | } 23 | 24 | public void push(T val) { 25 | Queue queue = this.type.get(); 26 | if (queue.size() > this.threshold) { 27 | LOGGER.warning("Potential Memory Leak in " + new Throwable().getStackTrace()[1].getClassName()); 28 | } 29 | queue.add(val); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/BlockStateArrayList.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit; 2 | 3 | import org.bukkit.block.BlockState; 4 | import org.bukkit.craftbukkit.block.CraftBlockState; 5 | import java.util.ArrayList; 6 | 7 | public class BlockStateArrayList extends ArrayList { 8 | @Override 9 | public boolean add(CraftBlockState blockState) { 10 | for (BlockState blockState1 : this) { 11 | if (blockState1.getLocation().equals(blockState.getLocation())) { return false; } 12 | } 13 | return super.add(blockState); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/block/BukkitChestDoubleInventory.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.block; 2 | 3 | import net.minecraft.block.entity.ChestBlockEntity; 4 | import net.minecraft.container.Container; 5 | import net.minecraft.container.GenericContainer; 6 | import net.minecraft.container.NameableContainerFactory; 7 | import net.minecraft.entity.player.PlayerEntity; 8 | import net.minecraft.entity.player.PlayerInventory; 9 | import net.minecraft.text.Text; 10 | import net.minecraft.text.TranslatableText; 11 | 12 | // w:arr:ning 13 | // BlockChest.DoubleInventory 14 | public class BukkitChestDoubleInventory implements NameableContainerFactory { 15 | public final net.minecraft.inventory.DoubleInventory inventory; 16 | private final ChestBlockEntity leftChest; 17 | private final ChestBlockEntity rightChest; 18 | 19 | public BukkitChestDoubleInventory(ChestBlockEntity leftChest, ChestBlockEntity rightChest, 20 | net.minecraft.inventory.DoubleInventory inventory) { 21 | this.leftChest = leftChest; 22 | this.rightChest = rightChest; 23 | this.inventory = inventory; 24 | } 25 | 26 | @Override 27 | public Text getDisplayName() { 28 | return this.leftChest.hasCustomName() ? this.leftChest.getDisplayName() : 29 | (this.rightChest.hasCustomName() ? this.rightChest.getDisplayName() : 30 | new TranslatableText("container.chestDouble")); 31 | } 32 | 33 | @Override 34 | public Container createMenu(int syncId, PlayerInventory inv, PlayerEntity player) { 35 | if (this.leftChest.checkUnlocked(player) && this.rightChest.checkUnlocked(player)) { 36 | this.leftChest.checkLootInteraction(inv.player); 37 | this.rightChest.checkLootInteraction(inv.player); 38 | return GenericContainer.createGeneric9x6(syncId, inv, this.inventory); 39 | } else { 40 | return null; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/block/DualBlockList.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.block; 2 | 3 | import net.minecraft.util.math.BlockPos; 4 | import org.bukkit.World; 5 | import org.bukkit.block.Block; 6 | import java.util.AbstractList; 7 | import java.util.List; 8 | 9 | public class DualBlockList extends AbstractList { 10 | private final List moved; 11 | private final List broken; 12 | private final World world; 13 | 14 | public DualBlockList(List moved, List broken, World world) { 15 | this.moved = moved; 16 | this.broken = broken; 17 | this.world = world; 18 | } 19 | 20 | @Override 21 | public org.bukkit.block.Block get(int index) { 22 | if (index >= this.size() || index < 0) { 23 | throw new ArrayIndexOutOfBoundsException(index); 24 | } 25 | BlockPos pos = index < this.moved.size() ? this.moved.get(index) : this.broken.get(index - this.moved.size()); 26 | return this.world.getBlockAt(pos.getX(), pos.getY(), pos.getZ()); 27 | } 28 | 29 | @Override 30 | public int size() { 31 | return this.moved.size() + this.broken.size(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/container/CraftingUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.container; 2 | 3 | import com.github.fukkitmc.fukkit.access.net.minecraft.container.ContainerAccess; 4 | import net.minecraft.container.Container; 5 | import net.minecraft.entity.player.PlayerEntity; 6 | import net.minecraft.inventory.CraftingInventory; 7 | import net.minecraft.inventory.CraftingResultInventory; 8 | import net.minecraft.item.ItemStack; 9 | import net.minecraft.network.packet.s2c.play.ContainerSlotUpdateS2CPacket; 10 | import net.minecraft.recipe.CraftingRecipe; 11 | import net.minecraft.recipe.RecipeType; 12 | import net.minecraft.server.network.ServerPlayerEntity; 13 | import net.minecraft.world.World; 14 | import org.bukkit.craftbukkit.event.CraftEventFactory; 15 | import java.util.Optional; 16 | 17 | public class CraftingUtil { 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/datafix/PlayerNameFix.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.datafix; 2 | 3 | import com.mojang.datafixers.DSL; 4 | import com.mojang.datafixers.DataFix; 5 | import com.mojang.datafixers.TypeRewriteRule; 6 | import com.mojang.datafixers.schemas.Schema; 7 | import net.minecraft.datafixer.TypeReferences; 8 | import net.minecraft.datafixer.fix.EntityCustomNameToComponentFix; 9 | 10 | public class PlayerNameFix extends DataFix { 11 | public PlayerNameFix(Schema outputSchema) { 12 | super(outputSchema, false); 13 | } 14 | 15 | @Override 16 | protected TypeRewriteRule makeRule() { 17 | return this.fixTypeEverywhereTyped("Player CustomName", this.getInputSchema().getType(TypeReferences.PLAYER), (typed) -> typed.update(DSL.remainderFinder(), EntityCustomNameToComponentFix::fixCustomName)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/entity/EntityUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.entity; 2 | 3 | import net.minecraft.entity.effect.StatusEffect; 4 | import net.minecraft.entity.effect.StatusEffectInstance; 5 | import net.minecraft.nbt.CompoundTag; 6 | import org.bukkit.event.entity.EntityPotionEffectEvent; 7 | 8 | public class EntityUtil { 9 | public static boolean isLevelAtLeast(CompoundTag tag, int level) { 10 | return tag.contains("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; 11 | } 12 | 13 | public static class ProcessableEffect { 14 | private final EntityPotionEffectEvent.Cause cause; 15 | private StatusEffect type; 16 | private StatusEffectInstance effect; 17 | 18 | public ProcessableEffect(StatusEffectInstance effect, EntityPotionEffectEvent.Cause cause) { 19 | this.effect = effect; 20 | this.cause = cause; 21 | } 22 | 23 | public ProcessableEffect(StatusEffect type, EntityPotionEffectEvent.Cause cause) { 24 | this.type = type; 25 | this.cause = cause; 26 | } 27 | 28 | public StatusEffect getType() { 29 | return this.type; 30 | } 31 | 32 | public StatusEffectInstance getEffect() { 33 | return this.effect; 34 | } 35 | 36 | public EntityPotionEffectEvent.Cause getCause() { 37 | return this.cause; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/server/BanEntryUtil.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.server; 2 | 3 | import net.minecraft.server.BanEntry; 4 | import java.util.Date; 5 | 6 | public class BanEntryUtil { 7 | public static boolean isInvalid(BanEntry entry) { 8 | return entry.getExpiryDate() != null && entry.getExpiryDate().before(new Date()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/github/fukkitmc/fukkit/util/craftbukkit/net/minecraft/server/ResultWaitable.java: -------------------------------------------------------------------------------- 1 | package com.github.fukkitmc.fukkit.util.craftbukkit.net.minecraft.server; 2 | 3 | import org.bukkit.craftbukkit.CraftServer; 4 | import org.bukkit.craftbukkit.util.Waitable; 5 | import org.bukkit.event.player.PlayerPreLoginEvent; 6 | 7 | public class ResultWaitable extends Waitable { 8 | private final CraftServer server; 9 | private final PlayerPreLoginEvent event; 10 | 11 | public ResultWaitable(CraftServer server, PlayerPreLoginEvent event) { 12 | this.server = server; 13 | this.event = event; 14 | } 15 | 16 | @Override 17 | protected PlayerPreLoginEvent.Result evaluate() { 18 | this.server.getPluginManager().callEvent(this.event); 19 | return this.event.getResult(); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/resources/assets/fukkit/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/FukkitMC/CraftFukkit/eaabdcdebd270def4a72c10a4ebfe43665ef4700/src/main/resources/assets/fukkit/icon.png -------------------------------------------------------------------------------- /src/main/resources/configurations/bukkit.yml: -------------------------------------------------------------------------------- 1 | # This is the main configuration file for Bukkit. 2 | # As you can see, there's actually not that much to configure without any plugins. 3 | # For a reference for any variable inside this file, check out the Bukkit Wiki at 4 | # https://www.spigotmc.org/go/bukkit-yml 5 | # 6 | # If you need help on this file, feel free to join us on irc or leave a message 7 | # on the forums asking for advice. 8 | # 9 | # IRC: #spigot @ irc.spi.gt 10 | # (If this means nothing to you, just go to https://www.spigotmc.org/go/irc ) 11 | # Forums: https://www.spigotmc.org/ 12 | # Bug tracker: https://www.spigotmc.org/go/bugs 13 | 14 | 15 | settings: 16 | allow-end: true 17 | warn-on-overload: true 18 | permissions-file: permissions.yml 19 | update-folder: update 20 | plugin-profiling: false 21 | connection-throttle: 4000 22 | query-plugins: true 23 | deprecated-verbose: default 24 | shutdown-message: Server closed 25 | minimum-api: none 26 | spawn-limits: 27 | monsters: 70 28 | animals: 10 29 | water-animals: 15 30 | ambient: 15 31 | chunk-gc: 32 | period-in-ticks: 600 33 | ticks-per: 34 | animal-spawns: 400 35 | monster-spawns: 1 36 | autosave: 6000 37 | aliases: now-in-commands.yml 38 | -------------------------------------------------------------------------------- /src/main/resources/configurations/commands.yml: -------------------------------------------------------------------------------- 1 | # This is the commands configuration file for Bukkit. 2 | # For documentation on how to make use of this file, check out the Bukkit Wiki at 3 | # https://www.spigotmc.org/go/commands-yml 4 | # 5 | # If you need help on this file, feel free to join us on irc or leave a message 6 | # on the forums asking for advice. 7 | # 8 | # IRC: #spigot @ irc.spi.gt 9 | # (If this means nothing to you, just go to https://www.spigotmc.org/go/irc ) 10 | # Forums: https://www.spigotmc.org/ 11 | # Bug tracker: https://www.spigotmc.org/go/bugs 12 | 13 | command-block-overrides: [] 14 | ignore-vanilla-permissions: false 15 | aliases: 16 | icanhasbukkit: 17 | - "version $1-" 18 | -------------------------------------------------------------------------------- /src/main/resources/fabric.mod.json: -------------------------------------------------------------------------------- 1 | { 2 | "schemaVersion": 1, 3 | "id": "fukkit", 4 | "version": "${version}", 5 | "name": "fukkit", 6 | "description": "an implementation of the bukkit api in fabric", 7 | "authors": [ 8 | "HalfOf2" 9 | ], 10 | "contact": { 11 | "homepage": "https://github.com/FukkitMC", 12 | "souces": "https://github.com/FukkitMC/Fukkit" 13 | }, 14 | "license": "GPL-3.0", 15 | "icon": "assets/fukkit/icon.png", 16 | "environment": "*", 17 | "entrypoints": { 18 | "main": [ 19 | "com.github.fukkitmc.fukkit.FukkitInit" 20 | ] 21 | }, 22 | "depends": { 23 | "fabricloader": ">=0.4.0" 24 | }, 25 | "mixins": [ 26 | "net/minecraft/fukkit.world.mixins.json", 27 | "net/minecraft/fukkit.block.mixins.json", 28 | "net/minecraft/fukkit.server.mixins.json", 29 | "net/minecraft/fukkit.nms.mixins.json" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /src/main/resources/net/minecraft/fukkit.access.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "com.github.fukkitmc.fukkit.mixin.access", 4 | "compatibilityLevel": "JAVA_8", 5 | "plugin": "com.github.fukkitmc.fukkit.plugin.PublicPlugin", 6 | "mixins": [ 7 | ] 8 | } -------------------------------------------------------------------------------- /src/main/resources/net/minecraft/fukkit.server.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "com.github.fukkitmc.fukkit.mixin.net.minecraft", 4 | "plugin": "com.github.fukkitmc.fukkit.plugin.PublicPlugin", 5 | "compatibilityLevel": "JAVA_8", 6 | "mixins": [ 7 | "server.network.ServerLoginNetworkHandler$1Mixin", 8 | "server.network.ServerLoginNetworkHandlerMixin", 9 | "server.network.ServerPlayerEntityMixin", 10 | "server.world.SecondaryServerWorldMixin", 11 | "server.world.ServerWorldMixin", 12 | "server.world.ThreadedAnvilChunkStorageMixin", 13 | "server.MinecraftServerMixin", 14 | "server.PlayerManagerMixin", 15 | "server.ServerNetworkIoMixin" 16 | ], 17 | "injectors": { 18 | "injectionPoints": [ 19 | "com.github.fukkitmc.fukkit.injectors.GenericOpcode" 20 | ], 21 | "defaultRequire": 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/resources/net/minecraft/fukkit.world.mixins.json: -------------------------------------------------------------------------------- 1 | { 2 | "required": true, 3 | "package": "com.github.fukkitmc.fukkit.mixin.net.minecraft.world", 4 | "plugin": "com.github.fukkitmc.fukkit.plugin.PublicPlugin", 5 | "compatibilityLevel": "JAVA_8", 6 | "mixins": [ 7 | "explosion.ExplosionMixin", 8 | "biome.source.BiomeArrayMixin", 9 | "border.WorldBorderMixin", 10 | "chunk.WorldChunkMixin", 11 | "dimension.DimensionMixin", 12 | "dimension.DimensionTypeMixin", 13 | "dimension.TheEndDimensionMixin", 14 | "dimension.OverworldDimensionMixin", 15 | "dimension.TheNetherDimensionMixin", 16 | "level.LevelPropertiesMixin", 17 | "BlockViewMixin", 18 | "ChunkRegionMixin", 19 | "PortalForcerMixin", 20 | "WorldMixin", 21 | "WorldSaveHandlerMixin" 22 | ], 23 | "injectors": { 24 | "injectionPoints": [ 25 | "com.github.fukkitmc.fukkit.injectors.GenericOpcode" 26 | ], 27 | "defaultRequire": 1 28 | } 29 | } 30 | --------------------------------------------------------------------------------