Skip to content

Commit

Permalink
Update redstone and check I/O mode
Browse files Browse the repository at this point in the history
  • Loading branch information
james58899 committed May 29, 2021
1 parent 0e123fe commit c9a5775
Showing 1 changed file with 22 additions and 7 deletions.
29 changes: 22 additions & 7 deletions src/main/kotlin/one/oktw/galaxy/block/entity/PipeBlockEntity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,23 @@ open class PipeBlockEntity(type: BlockEntityType<*>, modelItem: ItemStack) : Mod
private val sideEntity = HashMap<Direction, UUID>()
private val queue = LinkedList<ItemTransferPacket>()
private var showingItemEntity: ItemEntity? = null
private var redstone = 0
private var needUpdatePipeConnect = true

/**
* Push [ItemTransferPacket] into pipe queue.
*
* @param item [ItemTransferPacket]
*/
fun pushItem(item: ItemTransferPacket) {
queue.offer(item)
}

/**
* Get pipe I/O mode.
*/
fun getMode(side: Direction): SideMode {
return sideMode.getOrDefault(side, SideMode.NONE)
}

override fun tick() {
super.tick()
if (queue.isEmpty() && showingItemEntity !== null) {
Expand Down Expand Up @@ -117,28 +123,37 @@ open class PipeBlockEntity(type: BlockEntityType<*>, modelItem: ItemStack) : Mod
override fun onNeighborUpdate(direct: Boolean) {
if (direct) {
updatePipeConnect()
needUpdatePipeConnect = true
needUpdatePipeConnect = true // Also update on next tick
} else {
// TODO update redstone
redstone = world!!.getReceivedRedstonePower(pos)
}
}

private fun setSideMode(side: Direction, mode: SideMode) {
if (mode == SideMode.NONE) {
sideMode.remove(side) // TODO spawn entity
sideMode.remove(side)?.let {
// Remove IO entity
val world = world as ServerWorld
sideEntity[side]?.let(world::getEntity)?.remove()

// Reconnect pipe
updatePipeConnect()
}
} else {
sideMode[side] = mode
spawnSideEntity(side, mode)
}
}

private fun updatePipeConnect() {
val world = (world as ServerWorld)
for (direction in POSITIVE_DIRECTION) {
if (sideMode.getOrDefault(direction, SideMode.NONE) != SideMode.NONE || world.getBlockEntity(pos.offset(direction.opposite)) !is PipeBlockEntity) {
val connectPipe = world.getBlockEntity(pos.offset(direction.opposite))
if (sideMode.getOrDefault(direction, SideMode.NONE) != SideMode.NONE || connectPipe !is PipeBlockEntity) {
sideEntity.remove(direction)?.let(world::getEntity)?.remove()
continue
}
if (!sideEntity.contains(direction)) {
if (!sideEntity.contains(direction) && connectPipe.getMode(direction.opposite) == SideMode.NONE) {
spawnSideEntity(direction, SideMode.NONE)
}
}
Expand Down

0 comments on commit c9a5775

Please sign in to comment.