reimplemented block componenets
This commit is contained in:
parent
ecda11b620
commit
ce00fcf596
@ -1,70 +0,0 @@
|
||||
package org.kapelle.multiblock;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Represents a single position in a multiblock.
|
||||
* Can be a single type of block or multiple types.
|
||||
* Custom valid check functions are supported,
|
||||
*/
|
||||
public class BlockComponent {
|
||||
private final BlockComponentMode mode;
|
||||
private final Set<Material> blocks;
|
||||
private ICheckFunction customCheckFunction;
|
||||
|
||||
public BlockComponent(BlockComponentMode mode){
|
||||
if(mode == BlockComponentMode.SET){
|
||||
throw new RuntimeException("Component is impossible to satisfy because no valid blocks are given");
|
||||
}
|
||||
|
||||
this.mode = mode;
|
||||
this.blocks = Collections.emptySet();
|
||||
}
|
||||
|
||||
public BlockComponent(BlockComponentMode mode, Set<Material> validBlocks){
|
||||
this.mode = mode;
|
||||
this.blocks = validBlocks;
|
||||
}
|
||||
|
||||
public BlockComponent(ICheckFunction customCheckFunction){
|
||||
this.mode = BlockComponentMode.CUSTOM;
|
||||
this.blocks = Collections.emptySet();
|
||||
this.customCheckFunction = customCheckFunction;
|
||||
}
|
||||
|
||||
public BlockComponent(Material type){
|
||||
this.blocks = new HashSet<>();
|
||||
this.blocks.add(type);
|
||||
this.mode = BlockComponentMode.SET;
|
||||
}
|
||||
|
||||
|
||||
public boolean isValidBlock(Location location){
|
||||
if(this.mode == BlockComponentMode.CUSTOM){
|
||||
return this.customCheckFunction.apply(location);
|
||||
}else{
|
||||
return isValidType(location.getBlock().getType());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isValidType(Material type){
|
||||
switch (this.mode){
|
||||
case AIR:
|
||||
return type == Material.AIR;
|
||||
case ANY:
|
||||
return true;
|
||||
case SET:
|
||||
return blocks.contains(type);
|
||||
default:
|
||||
return false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,5 +0,0 @@
|
||||
package org.kapelle.multiblock;
|
||||
|
||||
public enum BlockComponentMode {
|
||||
ANY, AIR, SET, CUSTOM
|
||||
}
|
@ -6,12 +6,13 @@ import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.util.BlockVector;
|
||||
import org.kapelle.multiblock.block_component.IBlockComponent;
|
||||
|
||||
/**
|
||||
* Listens for block placements and checks if it is part of a the multiblock structure.
|
||||
*/
|
||||
public abstract class MultiblockListener implements Listener {
|
||||
protected final BlockComponent coreBlock;
|
||||
protected final IBlockComponent coreBlock;
|
||||
protected final BlockVector coreBlockOffset;
|
||||
protected final MultiblockStructure structure;
|
||||
|
||||
|
@ -2,6 +2,7 @@ package org.kapelle.multiblock;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.util.BlockVector;
|
||||
import org.kapelle.multiblock.block_component.IBlockComponent;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -11,7 +12,7 @@ import java.util.List;
|
||||
*/
|
||||
public class MultiblockStructure {
|
||||
|
||||
List<List<List<BlockComponent>>> structure;
|
||||
List<List<List<IBlockComponent>>> structure;
|
||||
|
||||
/**
|
||||
* Create a multiblock structure.
|
||||
@ -19,15 +20,15 @@ public class MultiblockStructure {
|
||||
* So you describe the layers from bottom to top.
|
||||
* @param structure structure in the format: [y][z][x]
|
||||
*/
|
||||
public MultiblockStructure(List<List<List<BlockComponent>>> structure){
|
||||
public MultiblockStructure(List<List<List<IBlockComponent>>> structure){
|
||||
this.structure = structure;
|
||||
}
|
||||
|
||||
public BlockComponent getComponent(BlockVector offset){
|
||||
public IBlockComponent getComponent(BlockVector offset){
|
||||
return getComponent(offset.getBlockX(),offset.getBlockY(),offset.getBlockZ());
|
||||
}
|
||||
|
||||
public BlockComponent getComponent(int x, int y, int z){
|
||||
public IBlockComponent getComponent(int x, int y, int z){
|
||||
return structure.get(y).get(z).get(x);
|
||||
}
|
||||
|
||||
@ -42,7 +43,7 @@ public class MultiblockStructure {
|
||||
for (int z = 0; z < structure.get(y).size(); z++) {
|
||||
for (int x = 0; x < structure.get(y).get(z).size() ; x++) {
|
||||
|
||||
BlockComponent currentComponent = getComponent(x,y,z);
|
||||
IBlockComponent currentComponent = getComponent(x,y,z);
|
||||
Location globalBlockLocation = location.clone().subtract(offset).add(new BlockVector(x,y,z));
|
||||
|
||||
if(!currentComponent.isValidBlock(globalBlockLocation)){
|
||||
|
@ -0,0 +1,21 @@
|
||||
package org.kapelle.multiblock.block_component;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
public class AnyBlock implements IBlockComponent{
|
||||
private static final AnyBlock singleton = new AnyBlock();
|
||||
|
||||
private AnyBlock(){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidBlock(Location location) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public static AnyBlock getInstance(){
|
||||
return AnyBlock.singleton;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package org.kapelle.multiblock.block_component;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
/**
|
||||
* Represents a single position in a multiblock.
|
||||
*/
|
||||
public interface IBlockComponent {
|
||||
public boolean isValidBlock(Location location);
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package org.kapelle.multiblock;
|
||||
package org.kapelle.multiblock.block_component;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
@ -0,0 +1,16 @@
|
||||
package org.kapelle.multiblock.block_component;
|
||||
|
||||
import org.bukkit.Location;
|
||||
|
||||
public class LambdaComponent implements IBlockComponent{
|
||||
private final ICheckFunction checkFunction;
|
||||
|
||||
public LambdaComponent(ICheckFunction checkFunction){
|
||||
this.checkFunction = checkFunction;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidBlock(Location location) {
|
||||
return checkFunction.apply(location);
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package org.kapelle.multiblock.block_component;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
public class MultipleBlocks implements IBlockComponent{
|
||||
private final Set<Material> validMaterial;
|
||||
|
||||
public MultipleBlocks(Set<Material> validMaterial){
|
||||
this.validMaterial = validMaterial;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidBlock(Location location) {
|
||||
return this.validMaterial.contains(location.getBlock().getType());
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package org.kapelle.multiblock.block_component;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
|
||||
public class SingleBlock implements IBlockComponent{
|
||||
private final Material material;
|
||||
|
||||
public SingleBlock(Material material){
|
||||
this.material = material;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isValidBlock(Location location) {
|
||||
return location.getBlock().getType() == this.material;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user