Fixed CFBR Iron Hatch recursion. Added scheduled Crafting Table client sync. In libmc fixed directional block default state forwarding during construction.

This commit is contained in:
stfwi 2021-02-12 20:00:03 +01:00
parent 7e8d7780dc
commit e8064f236f
10 changed files with 149 additions and 19 deletions

View file

@ -5,4 +5,4 @@ version_minecraft=1.16.4
version_forge_minecraft=1.16.4-35.1.10 version_forge_minecraft=1.16.4-35.1.10
version_fml_mappings=20201028-1.16.3 version_fml_mappings=20201028-1.16.3
version_jei=1.16.4:7.6.1.63 version_jei=1.16.4:7.6.1.63
version_engineersdecor=1.1.8-b1 version_engineersdecor=1.1.8-b2

View file

@ -1,6 +1,7 @@
{ {
"homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/",
"1.16.4": { "1.16.4": {
"1.1.8-b2": "[F] Fixed Iron Hatch isLadder bug (thx jerryw09).\n[F] Fixed Block Placer block placing pre-conditions (issue #160, ty XFactHD).\n[F] Added explicit scheduled Crafting Table client sync.\n[F] Fixed directional waterloggable block default state forwarding (issue #162, ty b52src).",
"1.1.8-b1": "[F] Fluid Funnel waterlogged fluid picking fixed (issue #158, thx ZoMadeStuff).\n[F] Roof rendering fixes (issues #153/#159, thx Salamance73/Murph).\n[A] Recessed Clinkers, Vertically Slit Clinkers, and Structured Vertical Clinker Slab added.", "1.1.8-b1": "[F] Fluid Funnel waterlogged fluid picking fixed (issue #158, thx ZoMadeStuff).\n[F] Roof rendering fixes (issues #153/#159, thx Salamance73/Murph).\n[A] Recessed Clinkers, Vertically Slit Clinkers, and Structured Vertical Clinker Slab added.",
"1.1.7": "[M] 1.16.5 support.\n[F] Fixed Labeled Crate include (issue #157, ty NillerMedDild).", "1.1.7": "[M] 1.16.5 support.\n[F] Fixed Labeled Crate include (issue #157, ty NillerMedDild).",
"1.1.6": "[F] Added common-config opt-out specification for pack level opt-outs (issue #154, ty gekkone), will replace server config opt-out in MC1.17.", "1.1.6": "[F] Added common-config opt-out specification for pack level opt-outs (issue #154, ty gekkone), will replace server config opt-out in MC1.17.",
@ -27,6 +28,6 @@
}, },
"promos": { "promos": {
"1.16.4-recommended": "1.1.7", "1.16.4-recommended": "1.1.7",
"1.16.4-latest": "1.1.8-b1" "1.16.4-latest": "1.1.8-b2"
} }
} }

View file

@ -11,6 +11,11 @@ Mod sources for Minecraft version 1.16.x.
## Version history ## Version history
- v1.1.8-b2 [F] Fixed Iron Hatch isLadder bug (thx jerryw09).
[F] Fixed Block Placer block placing pre-conditions (issue #160, ty XFactHD).
[F] Added explicit scheduled Crafting Table client sync.
[F] Fixed directional waterloggable block default state forwarding (issue #162, ty b52src).
- v1.1.8-b1 [F] Fluid Funnel waterlogged fluid picking fixed (issue #158, thx ZoMadeStuff). - v1.1.8-b1 [F] Fluid Funnel waterlogged fluid picking fixed (issue #158, thx ZoMadeStuff).
[F] Roof rendering fixes (issues #153/#159, thx Salamance73/Murph). [F] Roof rendering fixes (issues #153/#159, thx Salamance73/Murph).
[A] Recessed Clinkers, Vertically Slit Clinkers, and Structured Vertical Clinker Slab added. [A] Recessed Clinkers, Vertically Slit Clinkers, and Structured Vertical Clinker Slab added.

View file

@ -37,6 +37,7 @@ import net.minecraft.util.text.StringTextComponent;
import net.minecraft.client.gui.widget.button.ImageButton; import net.minecraft.client.gui.widget.button.ImageButton;
import net.minecraft.client.gui.widget.button.Button; import net.minecraft.client.gui.widget.button.Button;
import net.minecraft.client.renderer.ItemRenderer; import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.NetworkHooks;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
@ -158,19 +159,27 @@ public class EdCraftingTable
} }
return stacks; return stacks;
} }
@Override
public void tick(BlockState state, ServerWorld world, BlockPos pos, Random rand)
{
TileEntity te = world.getTileEntity(pos);
if(!(te instanceof CraftingTableTileEntity)) return;
((CraftingTableTileEntity)te).sync();
}
} }
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
// Tile entity // Tile entity
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
public static class CraftingTableTileEntity extends TileEntity implements INameable, INamedContainerProvider public static class CraftingTableTileEntity extends TileEntity implements INameable, INamedContainerProvider, Networking.IPacketTileNotifyReceiver
{ {
public static final int NUM_OF_STORAGE_SLOTS = 18; public static final int NUM_OF_STORAGE_SLOTS = 18;
public static final int NUM_OF_STORAGE_ROWS = 2; public static final int NUM_OF_STORAGE_ROWS = 2;
public static final int NUM_OF_SLOTS = 9+NUM_OF_STORAGE_SLOTS; public static final int NUM_OF_SLOTS = 9+NUM_OF_STORAGE_SLOTS;
protected Inventories.StorageInventory inventory_ = new StorageInventory(this, NUM_OF_SLOTS, 1); protected Inventories.StorageInventory inventory_;
protected CompoundNBT history = new CompoundNBT(); protected CompoundNBT history = new CompoundNBT();
public CraftingTableTileEntity() public CraftingTableTileEntity()
@ -179,12 +188,17 @@ public class EdCraftingTable
public CraftingTableTileEntity(TileEntityType<?> te_type) public CraftingTableTileEntity(TileEntityType<?> te_type)
{ {
super(te_type); super(te_type);
inventory_ = new StorageInventory(this, NUM_OF_SLOTS, 1);
inventory_.setCloseAction((player)->{ inventory_.setCloseAction((player)->{
if(getWorld() instanceof World) { if(getWorld() instanceof World) {
scheduleSync();
BlockState state = getBlockState(); BlockState state = getBlockState();
getWorld().notifyBlockUpdate(getPos(), state, state, 1|2|16); getWorld().notifyBlockUpdate(getPos(), state, state, 1|2|16);
} }
}); });
inventory_.setSlotChangeAction((slot_index,stack)-> {
if(slot_index < 9) scheduleSync();
});
} }
public void reset() public void reset()
@ -256,6 +270,27 @@ public class EdCraftingTable
@Override @Override
public Container createMenu( int id, PlayerInventory inventory, PlayerEntity player ) public Container createMenu( int id, PlayerInventory inventory, PlayerEntity player )
{ return new CraftingTableContainer(id, inventory, inventory_, IWorldPosCallable.of(world, pos)); } { return new CraftingTableContainer(id, inventory, inventory_, IWorldPosCallable.of(world, pos)); }
@Override
public void onServerPacketReceived(CompoundNBT nbt)
{ readnbt(nbt); }
public void sync()
{
if(getWorld().isRemote()) return;
CompoundNBT nbt = new CompoundNBT();
writenbt(nbt);
Networking.PacketTileNotifyServerToClient.sendToPlayers(this, nbt);
}
public void scheduleSync()
{
if(world.isRemote()) return;
final Block crafting_table_block = getBlockState().getBlock();
if(!(crafting_table_block instanceof CraftingTableBlock)) return;
if(world.getPendingBlockTicks().isTickScheduled(getPos(), crafting_table_block)) return;
world.getPendingBlockTicks().scheduleTick(getPos(), crafting_table_block, 20, TickPriority.LOW);
}
} }
//-------------------------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------------------------
@ -1476,7 +1511,14 @@ public class EdCraftingTable
} }
} }
super.onCrafting(stack); super.onCrafting(stack);
}
@Override
public ItemStack onTake(PlayerEntity player, ItemStack stack)
{
final ItemStack result_stack = super.onTake(player, stack);
container.sync(); container.sync();
return result_stack;
} }
} }

View file

@ -65,7 +65,20 @@ public class EdHatchBlock extends DecorBlock.HorizontalWaterLoggable implements
@Override @Override
public boolean isLadder(BlockState state, IWorldReader world, BlockPos pos, LivingEntity entity) public boolean isLadder(BlockState state, IWorldReader world, BlockPos pos, LivingEntity entity)
{ return state.get(OPEN) && world.getBlockState(pos.up()).isLadder(world, pos, entity); } {
if(!state.get(OPEN)) return false;
{
final BlockState up_state = world.getBlockState(pos.up());
if(up_state.isIn(this) && (up_state.get(OPEN))) return true;
if(up_state.isLadder(world, pos.up(), entity)) return true;
}
{
final BlockState down_state = world.getBlockState(pos.down());
if(down_state.isIn(this) && (down_state.get(OPEN))) return true;
if(down_state.isLadder(world, pos.down(), entity)) return true;
}
return false;
}
@Override @Override
public boolean canCreatureSpawn(BlockState state, IBlockReader world, BlockPos pos, EntitySpawnPlacementRegistry.PlacementType type, @Nullable EntityType<?> entityType) public boolean canCreatureSpawn(BlockState state, IBlockReader world, BlockPos pos, EntitySpawnPlacementRegistry.PlacementType type, @Nullable EntityType<?> entityType)

View file

@ -9,6 +9,7 @@
package wile.engineersdecor.blocks; package wile.engineersdecor.blocks;
import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.matrix.MatrixStack;
import net.minecraft.fluid.Fluids;
import net.minecraft.inventory.container.ClickType; import net.minecraft.inventory.container.ClickType;
import net.minecraft.util.math.vector.Vector3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.block.*; import net.minecraft.block.*;
@ -454,7 +455,7 @@ public class EdPlacer
private boolean try_place(Direction facing, boolean triggered) private boolean try_place(Direction facing, boolean triggered)
{ {
if(world.isRemote) return false; if(world.isRemote()) return false;
BlockPos placement_pos = pos.offset(facing); BlockPos placement_pos = pos.offset(facing);
if(world.getTileEntity(placement_pos) != null) return false; if(world.getTileEntity(placement_pos) != null) return false;
ItemStack current_stack = ItemStack.EMPTY; ItemStack current_stack = ItemStack.EMPTY;
@ -500,21 +501,29 @@ public class EdPlacer
placement_pos = placement_pos.up(); placement_pos = placement_pos.up();
} }
} }
} else if( } else {
(!world.getBlockState(placement_pos).getMaterial().isReplaceable()) || final BlockState current_placement_pos_state = world.getBlockState(placement_pos);
(!world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(placement_pos), (Entity e)->{ @SuppressWarnings("deprecation")
if(e.canBeCollidedWith()) return true; final boolean replacable = current_placement_pos_state.getMaterial().isReplaceable()
if(triggered) return false; || current_placement_pos_state.getBlock().isReplaceable(block.getDefaultState(), Fluids.EMPTY)
if((e instanceof ItemEntity)) { || world.isAirBlock(placement_pos);
if((e.getMotion().getY() > 0) || (e.getMotion().getY() < -0.5)) return true; // not falling or falling by if((!replacable) || (
if(Math.abs(e.getMotion().getX())+Math.abs(e.getMotion().getZ()) > 0) return true; // not straight (!world.getEntitiesWithinAABB(Entity.class, new AxisAlignedBB(placement_pos), (Entity e)->{
} if(e.canBeCollidedWith()) return true;
return false; if(triggered) return false;
}).isEmpty()) if((e instanceof ItemEntity)) {
if((e.getMotion().getY() > 0) || (e.getMotion().getY() < -0.5)) return true; // not falling or falling by
if(Math.abs(e.getMotion().getX())+Math.abs(e.getMotion().getZ()) > 0) return true; // not straight
}
return false;
}).isEmpty())
)
) { ) {
block = Blocks.AIR; block = Blocks.AIR;
no_space = true; no_space = true;
} }
}
// println("PLACE " + current_stack + " --> " + block + " at " + placement_pos.subtract(pos) + "( item=" + item + ")"); // println("PLACE " + current_stack + " --> " + block + " at " + placement_pos.subtract(pos) + "( item=" + item + ")");
if(block != Blocks.AIR) { if(block != Blocks.AIR) {
try { try {

View file

@ -263,7 +263,7 @@ public class StandardBlocks
public Directed(long config, Block.Properties properties, final Supplier<ArrayList<VoxelShape>> shape_supplier) public Directed(long config, Block.Properties properties, final Supplier<ArrayList<VoxelShape>> shape_supplier)
{ {
super(config, properties); super(config, properties);
setDefaultState(stateContainer.getBaseState().with(FACING, Direction.UP)); setDefaultState(super.getDefaultState().with(FACING, Direction.UP));
vshapes = shape_supplier.get(); vshapes = shape_supplier.get();
} }
@ -338,7 +338,7 @@ public class StandardBlocks
public Horizontal(long config, Block.Properties properties, final Supplier<ArrayList<VoxelShape>> shape_supplier) public Horizontal(long config, Block.Properties properties, final Supplier<ArrayList<VoxelShape>> shape_supplier)
{ {
super(config|CFG_HORIZIONTAL, properties); super(config|CFG_HORIZIONTAL, properties);
setDefaultState(stateContainer.getBaseState().with(HORIZONTAL_FACING, Direction.NORTH)); setDefaultState(super.getDefaultState().with(HORIZONTAL_FACING, Direction.NORTH));
vshapes = shape_supplier.get(); vshapes = shape_supplier.get();
} }

View file

@ -0,0 +1,20 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_slab",
"required": ["engineersdecor:clinker_brick_block"]
}
],
"recipe": {
"type": "minecraft:stonecutting",
"ingredient": { "item": "engineersdecor:clinker_brick_block" },
"result": "engineersdecor:clinker_brick_slab",
"count": 2
}
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_stairs",
"required": ["engineersdecor:clinker_brick_block"]
}
],
"recipe": {
"type": "minecraft:stonecutting",
"ingredient": { "item": "engineersdecor:clinker_brick_block" },
"result": "engineersdecor:clinker_brick_stairs",
"count": 1
}
}
]
}

View file

@ -0,0 +1,20 @@
{
"type": "forge:conditional",
"recipes": [
{
"conditions": [
{
"type": "engineersdecor:optional",
"result": "engineersdecor:clinker_brick_vertical_slab_structured",
"required": ["engineersdecor:clinker_brick_block"]
}
],
"recipe": {
"type": "minecraft:stonecutting",
"ingredient": { "item": "engineersdecor:clinker_brick_block" },
"result": "engineersdecor:clinker_brick_vertical_slab_structured",
"count": 2
}
}
]
}