feat: impl ProjectionEffect events
This commit is contained in:
parent
5b22f9087b
commit
c1e090d59d
@ -7,7 +7,7 @@ import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.resources.ResourceKey
|
||||
import net.minecraft.resources.ResourceLocation
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
|
||||
abstract class ProjectionEffect {
|
||||
@ -24,14 +24,13 @@ abstract class ProjectionEffect {
|
||||
|
||||
override fun hashCode() = type.hashCode()
|
||||
|
||||
fun activated(level: ServerLevel, projectorPos: BlockPos) {
|
||||
}
|
||||
open fun activate(level: Level, pos: BlockPos) {}
|
||||
|
||||
fun deactivated(level: ServerLevel, projectorPos: BlockPos) {
|
||||
}
|
||||
open fun deactivate(level: Level, pos: BlockPos) {}
|
||||
|
||||
fun randomTick(level: ServerLevel, projectorPos: BlockPos, random: RandomSource) {
|
||||
}
|
||||
open fun update(level: Level, pos: BlockPos, old: ProjectionEffect) {}
|
||||
|
||||
open fun randomTick(level: ServerLevel, pos: BlockPos) {}
|
||||
|
||||
}
|
||||
|
||||
@ -45,7 +44,7 @@ data class ProjectionEffectType<T : ProjectionEffect>(val constructor: () -> T)
|
||||
|
||||
}
|
||||
|
||||
val id by lazy { registry.getResourceKey(this).get().location()!! }
|
||||
val id: ResourceLocation by lazy { registry.getResourceKey(this).get().location() }
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,8 @@
|
||||
package quaedam.projection.swarm
|
||||
|
||||
import net.minecraft.core.BlockPos
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.server.level.ServerLevel
|
||||
import quaedam.projection.ProjectionEffect
|
||||
|
||||
data class SwarmProjectionEffect(
|
||||
@ -30,4 +32,7 @@ data class SwarmProjectionEffect(
|
||||
withVillager = tag.getBoolean(TAG_WITH_VILLAGER)
|
||||
}
|
||||
|
||||
override fun randomTick(level: ServerLevel, pos: BlockPos) {
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -9,13 +9,11 @@ import net.minecraft.world.entity.LivingEntity
|
||||
import net.minecraft.world.entity.player.Player
|
||||
import net.minecraft.world.item.ItemStack
|
||||
import net.minecraft.world.level.Level
|
||||
import net.minecraft.world.level.LevelAccessor
|
||||
import net.minecraft.world.level.block.Block
|
||||
import net.minecraft.world.level.block.EntityBlock
|
||||
import net.minecraft.world.level.block.state.BlockState
|
||||
import net.minecraft.world.level.material.MapColor
|
||||
import net.minecraft.world.phys.BlockHitResult
|
||||
import quaedam.projection.ProjectionBlock
|
||||
|
||||
object ProjectorBlock : Block(Properties.of()
|
||||
.jumpFactor(0.8f)
|
||||
@ -53,8 +51,8 @@ object ProjectorBlock : Block(Properties.of()
|
||||
pos: BlockPos,
|
||||
random: RandomSource
|
||||
) {
|
||||
// @TODO: call projectorRandomTick
|
||||
checkUpdate(level, pos)
|
||||
(level.getBlockEntity(pos) as ProjectorBlockEntity).effects.values.forEach { it.randomTick(level, pos) }
|
||||
}
|
||||
|
||||
@Suppress("DEPRECATION", "OVERRIDE_DEPRECATION")
|
||||
|
@ -88,10 +88,18 @@ class ProjectorBlockEntity(pos: BlockPos, state: BlockState) :
|
||||
|
||||
fun updateEffects(effects: Map<ProjectionEffectType<*>, ProjectionEffect>, notify: Boolean = true) {
|
||||
if (effects != this.effects) {
|
||||
val oldEffects = this.effects
|
||||
val level = level!!
|
||||
this.effects = effects
|
||||
if (!level!!.isClientSide) {
|
||||
if (!level.isClientSide) {
|
||||
sendBlockUpdated()
|
||||
}
|
||||
val addedEffects = effects.filterKeys { it !in oldEffects }
|
||||
val removedEffects = oldEffects.filterKeys { it !in effects }
|
||||
val updatedEffects = effects.filter { (k, v) -> oldEffects[k] != v }
|
||||
addedEffects.values.forEach { it.activate(level, blockPos) }
|
||||
removedEffects.values.forEach { it.deactivate(level, blockPos) }
|
||||
updatedEffects.forEach { (k, v) -> v.update(level, blockPos, oldEffects[k]!!) }
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user