-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathShipHelmBlock.kt
149 lines (126 loc) · 5.68 KB
/
ShipHelmBlock.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package org.valkyrienskies.eureka.block
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.network.chat.TextComponent
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.context.BlockPlaceContext
import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level
import net.minecraft.world.level.LevelAccessor
import net.minecraft.world.level.block.BaseEntityBlock
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.RenderShape
import net.minecraft.world.level.block.Rotation
import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.block.state.StateDefinition
import net.minecraft.world.level.block.state.properties.BlockStateProperties.HORIZONTAL_FACING
import net.minecraft.world.level.pathfinder.PathComputationType
import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape
import org.valkyrienskies.core.api.ships.getAttachment
import org.valkyrienskies.eureka.blockentity.ShipHelmBlockEntity
import org.valkyrienskies.eureka.ship.EurekaShipControl
import org.valkyrienskies.eureka.util.DirectionalShape
import org.valkyrienskies.eureka.util.RotShapes
import org.valkyrienskies.mod.common.ValkyrienSkiesMod
import org.valkyrienskies.mod.common.getShipManagingPos
import org.valkyrienskies.mod.common.getShipObjectManagingPos
class ShipHelmBlock(properties: Properties, val woodType: IWoodType) : BaseEntityBlock(properties) {
val HELM_BASE = RotShapes.box(2.0, 0.0, 2.0, 14.0, 2.0, 14.0)
val HELM_POLE = RotShapes.box(4.0, 2.0, 5.0, 12.0, 13.0, 13.0)
val HELM_SHAPE = DirectionalShape(RotShapes.or(HELM_BASE, HELM_POLE))
init {
registerDefaultState(this.stateDefinition.any().setValue(HORIZONTAL_FACING, Direction.NORTH))
}
override fun onPlace(state: BlockState, level: Level, pos: BlockPos, oldState: BlockState, isMoving: Boolean) {
super.onPlace(state, level, pos, oldState, isMoving)
if (level.isClientSide) return
level as ServerLevel
val ship = level.getShipObjectManagingPos(pos) ?: level.getShipManagingPos(pos) ?: return
EurekaShipControl.getOrCreate(ship).helms += 1
}
override fun onRemove(state: BlockState, level: Level, pos: BlockPos, newState: BlockState, isMoving: Boolean) {
super.onRemove(state, level, pos, newState, isMoving)
if (level.isClientSide) return
level as ServerLevel
level.getShipManagingPos(pos)?.getAttachment<EurekaShipControl>()?.let { control ->
if (control.helms <= 1 && control.seatedPlayer?.vehicle?.type == ValkyrienSkiesMod.SHIP_MOUNTING_ENTITY_TYPE) {
control.seatedPlayer!!.unRide()
control.seatedPlayer = null
}
control.helms -= 1
}
}
override fun use(
state: BlockState,
level: Level,
pos: BlockPos,
player: Player,
hand: InteractionHand,
blockHitResult: BlockHitResult
): InteractionResult {
if (level.isClientSide) return InteractionResult.SUCCESS
val blockEntity = level.getBlockEntity(pos) as ShipHelmBlockEntity
return if (player.isSecondaryUseActive) {
player.openMenu(blockEntity)
InteractionResult.CONSUME
} else if (level.getShipManagingPos(pos) == null) {
player.displayClientMessage(TextComponent("Sneak to open the ship helm!"), true)
InteractionResult.CONSUME
} else if (blockEntity.sit(player)) {
InteractionResult.CONSUME
} else InteractionResult.PASS
}
override fun getRenderShape(blockState: BlockState): RenderShape {
return RenderShape.MODEL
}
override fun getStateForPlacement(ctx: BlockPlaceContext): BlockState? {
return defaultBlockState()
.setValue(HORIZONTAL_FACING, ctx.horizontalDirection.opposite)
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block, BlockState>) {
builder.add(HORIZONTAL_FACING)
}
override fun newBlockEntity(blockPos: BlockPos, state: BlockState): BlockEntity {
return ShipHelmBlockEntity(blockPos, state)
}
override fun getShape(
blockState: BlockState,
blockGetter: BlockGetter,
blockPos: BlockPos,
collisionContext: CollisionContext
): VoxelShape {
return HELM_SHAPE[blockState.getValue(HORIZONTAL_FACING)]
}
override fun useShapeForLightOcclusion(blockState: BlockState): Boolean {
return true
}
override fun isPathfindable(
blockState: BlockState,
blockGetter: BlockGetter,
blockPos: BlockPos,
pathComputationType: PathComputationType
): Boolean {
return false
}
override fun rotate(state: BlockState, rotation: Rotation): BlockState? {
return state.setValue(HORIZONTAL_FACING, rotation.rotate(state.getValue(HORIZONTAL_FACING) as Direction)) as BlockState
}
override fun <T : BlockEntity?> getTicker(
level: Level,
state: BlockState,
type: BlockEntityType<T>
): BlockEntityTicker<T> = BlockEntityTicker { level, pos, state, blockEntity ->
if (level.isClientSide) return@BlockEntityTicker
if (blockEntity is ShipHelmBlockEntity) {
blockEntity.tick()
}
}
}