blob: 3830de1e77aa26a0ecce9f7a951ff69dda2e1c20 [file] [log] [blame] [raw]
package li.cil.oc.common.event
import cpw.mods.fml.common.eventhandler.SubscribeEvent
import li.cil.oc.common.EventHandler
import li.cil.oc.util.BlockPosition
import net.minecraft.entity.Entity
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.world.{IWorldAccess, World}
import net.minecraftforge.event.world.WorldEvent
import scala.collection.mutable
/**
* @author Vexatos
*/
object BlockChangeHandler {
def addListener(listener: ChangeListener, coord: BlockPosition) = {
EventHandler.scheduleServer(() => changeListeners.put(listener, coord))
}
def removeListener(listener: ChangeListener) = {
EventHandler.scheduleServer(() => changeListeners.remove(listener))
}
private val changeListeners = mutable.WeakHashMap.empty[ChangeListener, BlockPosition]
@SubscribeEvent
def onWorldLoad(e: WorldEvent.Load) {
e.world.addWorldAccess(new Listener(e.world))
}
trait ChangeListener {
def onBlockChanged()
}
private class Listener(world: World) extends IWorldAccess {
override def markBlockForUpdate(x: Int, y: Int, z: Int): Unit = {
val current = BlockPosition(x, y, z, world)
for ((listener, coord) <- changeListeners) if (coord.equals(current)) {
listener.onBlockChanged()
}
}
override def playRecord(recordName: String, x: Int, y: Int, z: Int) {}
override def playAuxSFX(player: EntityPlayer, sfxType: Int, x: Int, y: Int, z: Int, data: Int) {}
override def onEntityDestroy(entity: Entity) {}
override def destroyBlockPartially(breakerId: Int, x: Int, y: Int, z: Int, progress: Int) {}
override def markBlockForRenderUpdate(x: Int, y: Int, z: Int) {}
override def spawnParticle(particleType: String, x: Double, y: Double, z: Double, velX: Double, velY: Double, velZ: Double) {}
override def playSound(soundName: String, x: Double, y: Double, z: Double, volume: Float, pitch: Float) {}
override def broadcastSound(soundID: Int, x: Int, y: Int, z: Int, data: Int) {}
override def playSoundToNearExcept(player: EntityPlayer, soundName: String, x: Double, y: Double, z: Double, volume: Float, pitch: Float) {}
override def markBlockRangeForRenderUpdate(x1: Int, y1: Int, z1: Int, x2: Int, y2: Int, z2: Int) {}
override def onEntityCreate(entity: Entity) {}
override def onStaticEntitiesChanged() {}
}
}