-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathBalloonBlock.kt
59 lines (48 loc) · 2.28 KB
/
BalloonBlock.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
package org.valkyrienskies.eureka.block
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.server.level.ServerLevel
import net.minecraft.world.damagesource.DamageSource
import net.minecraft.world.entity.Entity
import net.minecraft.world.entity.projectile.Projectile
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.phys.BlockHitResult
import org.valkyrienskies.core.api.ships.getAttachment
import org.valkyrienskies.eureka.EurekaConfig
import org.valkyrienskies.eureka.ship.EurekaShipControl
import org.valkyrienskies.mod.common.getShipManagingPos
import org.valkyrienskies.mod.common.getShipObjectManagingPos
class BalloonBlock(properties: Properties) : Block(properties) {
override fun fallOn(level: Level, state: BlockState, blockPos: BlockPos, entity: Entity, f: Float) {
entity.causeFallDamage(f, 0.2f, DamageSource.FALL)
}
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).balloons += 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 {
it.balloons -= 1
}
}
override fun onProjectileHit(level: Level, state: BlockState, hit: BlockHitResult, projectile: Projectile) {
if (level.isClientSide) return
level.destroyBlock(hit.blockPos, false)
Direction.entries.forEach {
val neighbor = hit.blockPos.relative(it)
if (level.getBlockState(neighbor).block == this &&
level.random.nextFloat() < EurekaConfig.SERVER.popSideBalloonChance
) {
level.destroyBlock(neighbor, false)
}
}
}
}