mirror of
https://github.com/chylex/Hardcore-Ender-Expansion-2.git
synced 2025-04-14 12:15:44 +02:00
Add IStructureWorld adapter to place structures into a World
This commit is contained in:
parent
ed664e03ba
commit
9029fc2d81
src/main/java/chylex/hee/game/world/structure
@ -20,6 +20,8 @@ interface IStructureWorld{
|
||||
|
||||
fun addTrigger(pos: BlockPos, trigger: IStructureTrigger)
|
||||
|
||||
fun finalize()
|
||||
|
||||
// Utilities
|
||||
|
||||
@JvmDefault fun getBlock(pos: BlockPos): Block{
|
||||
|
@ -18,4 +18,8 @@ class OffsetStructureWorld(private val wrapped: IStructureWorld, private val off
|
||||
override fun addTrigger(pos: BlockPos, trigger: IStructureTrigger){
|
||||
wrapped.addTrigger(pos.add(offset), trigger)
|
||||
}
|
||||
|
||||
override fun finalize(){
|
||||
wrapped.finalize()
|
||||
}
|
||||
}
|
||||
|
@ -58,4 +58,8 @@ class RotatedStructureWorld(private val wrapped: IStructureWorld, private val si
|
||||
override fun addTrigger(pos: BlockPos, trigger: IStructureTrigger){
|
||||
wrapped.addTrigger(rotatePos(pos, size, rotation), RotatedStructureTrigger(trigger, rotation))
|
||||
}
|
||||
|
||||
override fun finalize(){
|
||||
wrapped.finalize()
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,71 @@
|
||||
package chylex.hee.game.world.structure.world
|
||||
import chylex.hee.game.world.structure.IStructureTrigger
|
||||
import chylex.hee.game.world.structure.IStructureWorld
|
||||
import chylex.hee.init.ModBlocks
|
||||
import chylex.hee.system.util.FLAG_SYNC_CLIENT
|
||||
import chylex.hee.system.util.getState
|
||||
import chylex.hee.system.util.setState
|
||||
import net.minecraft.block.Block
|
||||
import net.minecraft.block.state.IBlockState
|
||||
import net.minecraft.init.Blocks
|
||||
import net.minecraft.util.Rotation
|
||||
import net.minecraft.util.math.BlockPos
|
||||
import net.minecraft.world.World
|
||||
|
||||
class WorldToStructureWorldAdapter(private val world: World, private val offset: BlockPos) : IStructureWorld{
|
||||
private companion object{
|
||||
private val REQUIRE_SECOND_PASS = setOf<Block>(
|
||||
Blocks.WOODEN_BUTTON,
|
||||
Blocks.STONE_BUTTON,
|
||||
Blocks.TORCH,
|
||||
Blocks.REDSTONE_TORCH,
|
||||
Blocks.UNLIT_REDSTONE_TORCH,
|
||||
Blocks.REDSTONE_WIRE,
|
||||
Blocks.VINE,
|
||||
ModBlocks.DRY_VINES
|
||||
)
|
||||
|
||||
private val REQUIRE_IMMEDIATE_UPDATE = setOf<Block>(
|
||||
Blocks.LAVA,
|
||||
Blocks.WATER,
|
||||
ModBlocks.ENDER_GOO
|
||||
)
|
||||
}
|
||||
|
||||
private val secondPass = mutableMapOf<BlockPos, IBlockState>()
|
||||
|
||||
override val rand = world.rand!!
|
||||
|
||||
override fun getState(pos: BlockPos): IBlockState{
|
||||
return secondPass[pos] ?: pos.add(offset).getState(world)
|
||||
}
|
||||
|
||||
override fun setState(pos: BlockPos, state: IBlockState){
|
||||
val block = state.block
|
||||
|
||||
if (REQUIRE_SECOND_PASS.contains(block)){
|
||||
secondPass[pos] = state
|
||||
return
|
||||
}
|
||||
|
||||
val worldPos = pos.add(offset)
|
||||
worldPos.setState(world, state, FLAG_SYNC_CLIENT)
|
||||
|
||||
if (REQUIRE_IMMEDIATE_UPDATE.contains(block)){
|
||||
world.immediateBlockTick(worldPos, state, world.rand)
|
||||
world.neighborChanged(worldPos, block, worldPos) // needed for liquids
|
||||
}
|
||||
}
|
||||
|
||||
override fun addTrigger(pos: BlockPos, trigger: IStructureTrigger){
|
||||
trigger.realize(world, pos.add(offset), Rotation.NONE)
|
||||
}
|
||||
|
||||
override fun finalize(){
|
||||
for((pos, state) in secondPass){
|
||||
pos.add(offset).setState(world, state, FLAG_SYNC_CLIENT)
|
||||
}
|
||||
|
||||
secondPass.clear()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user