NoCheatPlus/NCPCompatBukkit/src/main/java/fr/neatmonster/nocheatplus/compat/bukkit/MCAccessBukkitModern.java

208 lines
7.5 KiB
Java

/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.neatmonster.nocheatplus.compat.bukkit;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Material;
import fr.neatmonster.nocheatplus.compat.BridgeMaterial;
import fr.neatmonster.nocheatplus.compat.blocks.init.BlockInit;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitFence;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitGate;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitShapeModel;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitShulkerBox;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitSlab;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitStairs;
import fr.neatmonster.nocheatplus.compat.bukkit.model.BukkitStatic;
import fr.neatmonster.nocheatplus.config.WorldConfigProvider;
import fr.neatmonster.nocheatplus.utilities.map.BlockCache;
import fr.neatmonster.nocheatplus.utilities.map.BlockFlags;
import fr.neatmonster.nocheatplus.utilities.map.BlockProperties;
import fr.neatmonster.nocheatplus.utilities.map.MaterialUtil;
public class MCAccessBukkitModern extends MCAccessBukkit {
protected final Map<Material, BukkitShapeModel> shapeModels = new HashMap<Material, BukkitShapeModel>();
// Blocks that change shape based on interaction or redstone.
private static final BukkitShapeModel MODEL_GATE = new BukkitGate(
0.375, 1.5);
private static final BukkitShapeModel MODEL_SHULKER_BOX = new BukkitShulkerBox();
// Blocks that have a different shape, based on how they have been placed.
private static final BukkitShapeModel MODEL_SLAB = new BukkitSlab();
private static final BukkitShapeModel MODEL_STAIRS= new BukkitStairs();
// Blocks that have a different shape with neighbor blocks (bukkit takes care though).
private static final BukkitShapeModel MODEL_THIN_FENCE = new BukkitFence(
0.4375, 1.0);
private static final BukkitShapeModel MODEL_THICK_FENCE = new BukkitFence(
0.375, 1.5);
// Static blocks.
private static final BukkitShapeModel MODEL_FLOWER_POT = new BukkitStatic(
0.33, 0.375); // TODO: XZ really?
private static final BukkitShapeModel MODEL_GROUND_HEAD= new BukkitStatic(
0.25, 0.5); // TODO: XZ-really? 275 ?
private static final BukkitShapeModel MODEL_SINGLE_CHEST = new BukkitStatic(
0.062, .875);
private static final BukkitShapeModel MODEL_XZ100_HEIGHT16_1 = new BukkitStatic(
0.0625);
private static final BukkitShapeModel MODEL_XZ100_HEIGHT16_9 = new BukkitStatic(
0.5625);
private static final BukkitShapeModel MODEL_XZ100_HEIGHT16_15 = new BukkitStatic(
0.9375);
private static final BukkitShapeModel MODEL_XZ100_HEIGHT8_1 = new BukkitStatic(
0.125);
private static final BukkitShapeModel MODEL_XZ100_HEIGHT8_3 = new BukkitStatic(
0.375);
// TODO: enchanting table
// TODO: doors, trap doors
// TODO: Portals, end portal frame, ...
// TODO: END_ROD: 0.075 + 0.3, 0.925 - 0.3 / 1.0 -> BukkitCenteredFacing +-
// TODO: wall heads, chorus flower, other static, CAKE?
public MCAccessBukkitModern() {
super();
// TODO: Generic setup via Bukkit interface existence/relations, +- fetching methods.
BlockInit.assertMaterialExists("OAK_LOG");
BlockInit.assertMaterialExists("CAVE_AIR");
}
@Override
public String getMCVersion() {
return "1.13|?";
}
@Override
public BlockCache getBlockCache() {
return new BlockCacheBukkitModern(shapeModels);
}
public void addModel(Material mat, BukkitShapeModel model) {
processedBlocks.add(mat);
shapeModels.put(mat, model);
}
@Override
public void setupBlockProperties(final WorldConfigProvider<?> worldConfigProvider) {
// TODO: Also consider removing flags (passable_x4 etc).
// Directly keep blocks as is.
for (final Material mat : new Material[] {
BridgeMaterial.MOVING_PISTON,
Material.SNOW,
BridgeMaterial.COBWEB
}) {
processedBlocks.add(mat);
}
// 16/15 height, full xz bounds.
for (Material mat : new Material[] {
Material.GRASS_PATH, BridgeMaterial.FARMLAND
}) {
addModel(mat, MODEL_XZ100_HEIGHT16_15);
}
// 1/8 height.
for (Material mat : new Material[] {
BridgeMaterial.REPEATER,
Material.COMPARATOR
}) {
addModel(mat, MODEL_XZ100_HEIGHT8_1);
}
// 3/8 height.
for (Material mat : new Material[] {
Material.DAYLIGHT_DETECTOR
}) {
addModel(mat, MODEL_XZ100_HEIGHT8_3);
}
// Thin fence: Glass panes, iron bars.
for (final Material mat : MaterialUtil.addBlocks(
MaterialUtil.GLASS_PANES, BridgeMaterial.IRON_BARS)) {
addModel(mat, MODEL_THIN_FENCE);
}
// Slabs
for (final Material mat : MaterialUtil.SLABS) {
addModel(mat, MODEL_SLAB);
}
// Shulker boxes.
for (final Material mat : MaterialUtil.SHULKER_BOXES) {
addModel(mat, MODEL_SHULKER_BOX);
}
// Chests.
// TOOD: Might add a facing/directional extension for double chests.
for (Material mat : BridgeMaterial.getAllBlocks(
"chest", "trapped_chest",
"ender_chest"
)) {
addModel(mat, MODEL_SINGLE_CHEST);
}
// Beds
for (Material mat : MaterialUtil.BEDS) {
addModel(mat, MODEL_XZ100_HEIGHT16_9);
}
// Flower pots.
for (Material mat : MaterialUtil.FLOWER_POTS) {
addModel(mat, MODEL_FLOWER_POT);
}
// Carpets
for (final Material mat : MaterialUtil.CARPETS) {
addModel(mat, MODEL_XZ100_HEIGHT16_1);
}
// Ground heads.
for (final Material mat : MaterialUtil.HEADS_GROUND) {
addModel(mat, MODEL_GROUND_HEAD);
}
// Sort to processed by flags.
for (final Material mat : Material.values()) {
final long flags = BlockProperties.getBlockFlags(mat);
// Stairs.
if (BlockFlags.hasAnyFlag(flags, BlockProperties.F_STAIRS)) {
addModel(mat, MODEL_STAIRS);
}
// Fences, cobblestone wall.
if (BlockFlags.hasAnyFlag(flags, BlockProperties.F_THICK_FENCE)) {
if (BlockFlags.hasAnyFlag(flags, BlockProperties.F_PASSABLE_X4)) {
// TODO: Perhaps another model flag.
addModel(mat, MODEL_GATE);
}
else {
addModel(mat, MODEL_THICK_FENCE);
}
}
}
super.setupBlockProperties(worldConfigProvider);
}
}