Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor to more api/impl. #91

Merged
merged 4 commits into from
May 31, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.terraformersmc.terraform.dirt;
package com.terraformersmc.terraform.dirt.api;

import com.terraformersmc.terraform.dirt.block.TerraformDirtPathBlock;
import com.terraformersmc.terraform.dirt.block.TerraformFarmlandBlock;
import com.terraformersmc.terraform.dirt.block.TerraformGrassBlock;
import com.terraformersmc.terraform.dirt.block.TerraformSnowyBlock;
import com.terraformersmc.terraform.dirt.api.block.TerraformDirtPathBlock;
import com.terraformersmc.terraform.dirt.api.block.TerraformFarmlandBlock;
import com.terraformersmc.terraform.dirt.api.block.TerraformGrassBlock;
import com.terraformersmc.terraform.dirt.api.block.TerraformSnowyBlock;

import net.minecraft.block.Block;

Expand All @@ -15,6 +15,7 @@ public class DirtBlocks {
private TerraformFarmlandBlock farmland;

private DirtBlocks() {
return;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.terraformersmc.terraform.dirt;
package com.terraformersmc.terraform.dirt.api;

import net.minecraft.block.Block;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.util.Identifier;

public class TerraformDirtBlockTags {
public final class TerraformDirtBlockTags {
/**
* Dirts, grass blocks, and podzol.
*/
Expand All @@ -14,6 +14,7 @@ public class TerraformDirtBlockTags {
public static final TagKey<Block> FARMLAND = register("farmland");

private TerraformDirtBlockTags() {
return;
}

private static TagKey<Block> register(String id) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.terraformersmc.terraform.dirt.block;
package com.terraformersmc.terraform.dirt.api.block;

import net.minecraft.block.Block;
import net.minecraft.block.DirtPathBlock;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.terraformersmc.terraform.dirt.block;
package com.terraformersmc.terraform.dirt.api.block;

import com.terraformersmc.terraform.dirt.impl.mixin.MixinFarmlandBlock;
import net.minecraft.block.Block;
import net.minecraft.block.FarmlandBlock;

/**
* A custom farmland block for new farmland. Mixins are required to make hoes create these blocks and to allow seeds to be planted.
* @see com.terraformersmc.terraform.dirt.mixin.MixinFarmlandBlock
* @see MixinFarmlandBlock
*/
public class TerraformFarmlandBlock extends FarmlandBlock {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.terraformersmc.terraform.dirt.block;
package com.terraformersmc.terraform.dirt.api.block;

import com.google.common.collect.ImmutableMap;
import net.minecraft.block.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.terraformersmc.terraform.dirt.block;
package com.terraformersmc.terraform.dirt.api.block;

import net.minecraft.block.SnowyBlock;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.terraformersmc.terraform.dirt.api.registry;

import java.util.Optional;

import com.terraformersmc.terraform.dirt.api.DirtBlocks;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.impl.registry.TerraformDirtRegistryImpl;
import net.minecraft.block.Block;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.TestableWorld;

public final class TerraformDirtRegistry {
private TerraformDirtRegistry() {
return;
}

/**
* Registers a new set of dirt blocks to Terraform.
*
* <p>This is needed to make sure that the dirt can be tilled into farmland, that plants and saplings will work with
* your dirt, and make most other interactions work.</p>
*
* <p>Please note that you must add your blocks to the correct {@link TerraformDirtBlockTags tags}</p> as well, or
* else things will not work properly!</p>
*
* @param blocks the DirtBlocks to register with Terraform. Note that you are still responsible for registering the
* block instances with {@link net.minecraft.registry.Registries#BLOCK} yourself, this method does
* not do that for you.
* @return the registered DirtBlocks instance for convenience
*/
@SuppressWarnings("unused")
public static DirtBlocks register(DirtBlocks blocks) {
return TerraformDirtRegistryImpl.register(blocks);
}

/**
* Return the corresponding DirtBlocks if the Block at pos is any Terraform API dirt variant;
* otherwise returns {@link Optional#empty()}.
*
* <p>If you are looking for only specific dirt variants, see
* {@link TerraformDirtRegistry#getByGrassBlock(Block)} and
* {@link TerraformDirtRegistry#getByFarmland(Block)}.</p>
*
* @param world the world to check
* @param pos the block position in the world to check
* @return optional of the matching {@link DirtBlocks} if any
*/
public static Optional<DirtBlocks> getFromWorld(TestableWorld world, BlockPos pos) {
return TerraformDirtRegistryImpl.getFromWorld(world, pos);
}

/**
* Return the corresponding DirtBlocks if the given grass block is any Terraform API dirt variant;
* otherwise returns {@link Optional#empty()}.
*
* @param grass the grass block to check
* @return optional of the matching {@link DirtBlocks} if any
*/
public static Optional<DirtBlocks> getByGrassBlock(Block grass) {
return TerraformDirtRegistryImpl.getByGrassBlock(grass);
}

/**
* Return the corresponding DirtBlocks if the given farmland is any Terraform API dirt variant;
* otherwise returns {@link Optional#empty()}.
*
* @param farmland the farmland block to check
* @return optional of the matching {@link DirtBlocks} if any
*/
public static Optional<DirtBlocks> getByFarmland(Block farmland) {
return TerraformDirtRegistryImpl.getByFarmland(farmland);
}
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
package com.terraformersmc.terraform.dirt;
package com.terraformersmc.terraform.dirt.api.registry;

import java.util.function.Consumer;
import java.util.function.Predicate;

import com.mojang.datafixers.util.Pair;

import com.terraformersmc.terraform.dirt.impl.registry.TillableBlockRegistryImpl;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.item.HoeItem;
import net.minecraft.item.ItemUsageContext;
import net.minecraft.item.ToolMaterial;

/**
* Allows the addition of custom tillable block mappings. You probably don't need to use this directly if you're using
* {@link TerraformDirtRegistry}.
*/
public abstract class TillableBlockRegistry extends HoeItem {
private TillableBlockRegistry(ToolMaterial material, Settings settings) {
super(material, settings);
public final class TillableBlockRegistry {
private TillableBlockRegistry() {
return;
}

/**
Expand All @@ -29,7 +29,7 @@ private TillableBlockRegistry(ToolMaterial material, Settings settings) {
* @param pair the interaction between the blocks
*/
public static void add(Block block, Pair<Predicate<ItemUsageContext>, Consumer<ItemUsageContext>> pair) {
TILLING_ACTIONS.put(block, pair);
TillableBlockRegistryImpl.add(block, pair);
}

/**
Expand All @@ -41,6 +41,6 @@ public static void add(Block block, Pair<Predicate<ItemUsageContext>, Consumer<I
* @param state the block to be replaced with
*/
public static void add(Block block, BlockState state) {
TILLING_ACTIONS.put(block, Pair.of(HoeItem::canTillFarmland, createTillAction(state)));
TillableBlockRegistryImpl.add(block, Pair.of(HoeItem::canTillFarmland, HoeItem.createTillAction(state)));
}
}
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
package com.terraformersmc.terraform.dirt.mixin;

import com.terraformersmc.terraform.dirt.DirtBlocks;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.TerraformDirtRegistry;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.api.DirtBlocks;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.impl.registry.TerraformDirtRegistryImpl;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.gen.treedecorator.AlterGroundTreeDecorator;
import net.minecraft.world.gen.treedecorator.TreeDecorator;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(AlterGroundTreeDecorator.class)
public class MixinAlterGroundTreeDecorator {
Expand All @@ -30,7 +29,7 @@ public class MixinAlterGroundTreeDecorator {
if (generator.getWorld().testBlockState(posUp, state -> state.isIn(TerraformDirtBlockTags.SOIL))) {
// Try to determine if the soil block is registered, and if so, replace it with custom podzol.
// Fall back to vanilla podzol if the soil block is unregistered.
Block podzol = TerraformDirtRegistry.getFromWorld(generator.getWorld(), posUp).map(DirtBlocks::getPodzol).orElse(Blocks.PODZOL);
Block podzol = TerraformDirtRegistryImpl.getFromWorld(generator.getWorld(), posUp).map(DirtBlocks::getPodzol).orElse(Blocks.PODZOL);

generator.replace(posUp, podzol.getDefaultState());
ci.cancel();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.entity.passive.AnimalEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import net.minecraft.block.*;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.DirtBlocks;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.TerraformDirtRegistry;
import com.terraformersmc.terraform.dirt.api.DirtBlocks;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.impl.registry.TerraformDirtRegistryImpl;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
Expand Down Expand Up @@ -55,7 +55,7 @@ public class MixinEatGrassGoal {
if (this.world.getGameRules().getBoolean(GameRules.DO_MOB_GRIEFING)) {
this.world.syncWorldEvent(2001, downPos, Block.getRawIdFromState(Blocks.GRASS_BLOCK.getDefaultState()));

Block replacement = TerraformDirtRegistry.getByGrassBlock(down.getBlock()).map(DirtBlocks::getDirt).orElse(Blocks.DIRT);
Block replacement = TerraformDirtRegistryImpl.getByGrassBlock(down.getBlock()).map(DirtBlocks::getDirt).orElse(Blocks.DIRT);

this.world.setBlockState(downPos, replacement.getDefaultState(), 2);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package com.terraformersmc.terraform.dirt.mixin;

import com.terraformersmc.terraform.dirt.TerraformDirtRegistry;
import net.minecraft.world.event.GameEvent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.impl.registry.TerraformDirtRegistryImpl;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.FarmlandBlock;
import net.minecraft.entity.Entity;
import net.minecraft.item.ItemPlacementContext;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.event.GameEvent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

@Mixin(FarmlandBlock.class)
Expand All @@ -30,9 +29,8 @@ public MixinFarmlandBlock(Settings settings) {
)
private void terraformDirt$setCustomDirtInBlockPlacement(ItemPlacementContext context, CallbackInfoReturnable<BlockState> cir) {
// If this is custom farmland, make sure that we don't set back to vanilla dirt
TerraformDirtRegistry.getByFarmland(this).ifPresent(blocks -> {
cir.setReturnValue(blocks.getDirt().getDefaultState());
});
TerraformDirtRegistryImpl.getByFarmland(this)
.ifPresent(blocks -> cir.setReturnValue(blocks.getDirt().getDefaultState()));
}

@Inject(method = "setToDirt",
Expand All @@ -44,7 +42,7 @@ public MixinFarmlandBlock(Settings settings) {
// If this is custom dirt block, make sure that we don't set back to vanilla dirt.
// Note: as of 1.20.2, vanilla uses FarmlandBlock.setToDirt() for all trample-able blocks;
// we are not responsible for evaluating whether the block can be trampled, here.
TerraformDirtRegistry.getFromWorld(world, pos).ifPresent(blocks -> {
TerraformDirtRegistryImpl.getFromWorld(world, pos).ifPresent(blocks -> {
BlockState dirtState = FarmlandBlock.pushEntitiesUpBeforeBlockChange(state, blocks.getDirt().getDefaultState(), world, pos);
world.setBlockState(pos, dirtState);
world.emitGameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Emitter.of(entity, dirtState));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import net.minecraft.block.BlockState;
import net.minecraft.world.gen.feature.Feature;
import org.spongepowered.asm.mixin.Mixin;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import net.minecraft.block.BlockState;
import net.minecraft.block.PlantBlock;
import net.minecraft.util.math.BlockPos;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import net.minecraft.block.*;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;

@Mixin({AttachedStemBlock.class, CropBlock.class, PitcherCropBlock.class, StemBlock.class})
public class MixinPlantingOnFarmland {
@Inject(method = "canPlantOnTop", at = @At("HEAD"), cancellable = true)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.terraformersmc.terraform.dirt.TerraformDirtBlockTags;
import com.terraformersmc.terraform.dirt.api.TerraformDirtBlockTags;
import net.minecraft.block.*;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.terraformersmc.terraform.dirt.mixin;
package com.terraformersmc.terraform.dirt.impl.mixin;

import com.terraformersmc.terraform.dirt.api.block.TerraformGrassBlock;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.SpreadableBlock;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.random.Random;

import com.terraformersmc.terraform.dirt.block.TerraformGrassBlock;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
Expand Down
Loading
Loading