1
0
Fork 0
The portal creating plugin for Minecraft.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.0 KiB

package net.deliciousreya.minecraftportal
import com.destroystokyo.paper.event.block.BlockDestroyEvent
import net.deliciousreya.minecraftportal.extensions.MID_BLOCK
import net.deliciousreya.minecraftportal.extensions.plus
import net.deliciousreya.minecraftportal.model.DOOR_TYPES
import net.deliciousreya.minecraftportal.model.PortalDataStore
import net.deliciousreya.minecraftportal.model.PortalFrame
import net.deliciousreya.minecraftportal.model.findPortalFrameConnectedTo
import org.bukkit.Sound
import org.bukkit.block.Block
import org.bukkit.block.data.type.Door
import org.bukkit.entity.Entity
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.*
import org.bukkit.event.entity.EntityChangeBlockEvent
import org.bukkit.event.entity.EntityExplodeEvent
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.event.player.PlayerMoveEvent
import org.bukkit.plugin.java.JavaPlugin
import org.bukkit.potion.PotionEffectType
class MinecraftPortalPlugin() : JavaPlugin(), Listener
{
val portals: PortalDataStore = PortalDataStore()
override fun onEnable() {
super.onEnable()
portals.loadFromAndAutoSaveTo(server, dataFolder.resolve("portal_data.binproto"), dataFolder.resolve("portal_data.binproto.bak"))
portals.validateWorldOnStartup(logger)
portals.launchEffectsOnStartup(this)
server.pluginManager.registerEvents(this, this)
}
override fun onDisable() {
super.onDisable()
portals.unload()
}
@EventHandler
fun onBlockPlaced(e: BlockPlaceEvent) {
if (e.block.type in PortalFrame.State.INACTIVE.allValidBlocks) {
val newPortal = findPortalFrameConnectedTo(
e.block,
PortalFrame.State.INACTIVE
)
if (newPortal != null) {
val replacedPortal = portals.activateAndReplacePortal(newPortal)
val otherPortal = portals.getOtherPortal(newPortal)
newPortal.activate()
replacedPortal?.deactivate()
if (otherPortal != null) {
newPortal.open()
otherPortal.open()
portals.startEffectsFor(newPortal, this)
} else {
newPortal.ejectEntities()
newPortal.close()
}
}
}
}
@EventHandler
fun onBlockDestroy(e:BlockDestroyEvent) {
onDestroyedBlock(e.block)
}
@EventHandler
fun onEntityExplosion(e:EntityExplodeEvent) {
e.blockList().forEach(::onDestroyedBlock)
}
@EventHandler
fun onBlockExplosion(e:BlockExplodeEvent) {
onDestroyedBlock(e.block)
e.blockList().forEach(::onDestroyedBlock)
}
@EventHandler
fun onBlockBurn(e: BlockBurnEvent) {
onDestroyedBlock(e.block)
}
@EventHandler
fun onBlockFade(e: BlockFadeEvent) {
onDestroyedBlock(e.block)
}
@EventHandler
fun onBlockBreak(e:BlockBreakEvent) {
onDestroyedBlock(e.block)
}
@EventHandler
fun onEntityChangeBlock(e: EntityChangeBlockEvent) {
onDestroyedBlock(e.block)
}
@EventHandler
fun onPlayerInteract(e: PlayerInteractEvent) {
if (e.clickedBlock == null || e.action != Action.RIGHT_CLICK_BLOCK) {
return
}
val block = e.clickedBlock!!
if(block.type !in DOOR_TYPES) {
return
}
val door = block.blockData as Door
val location = e.player.location
// i.e., is the door part of a portal and are we standing in that portal?
val portal = portals.isLocationInPortalChamber(block.location + MID_BLOCK) ?: return
if (location.toVector() !in portal.portalInsideBoundingBox) {
e.isCancelled = true
return
}
if (!door.isOpen) {
portals.stopTeleporting(portal)
} else {
portals.startTeleporting(portal, this)
}
}
fun onPlayerMove(e: PlayerMoveEvent) {
val player = e.player
val oldLocation = e.from
val portal = portals.isLocationInPortalChamber(oldLocation) ?: return
val newLocation = e.to ?: return
if (oldLocation.world != newLocation.world || oldLocation.toVector() !in portal.portalInsideBoundingBox) {
cancelTeleportFor(player)
}
}
private fun cancelTeleportFor(entity: Entity) {
}
fun onDestroyedBlock(block: Block) {
if (block.type !in PortalFrame.State.ACTIVE.allValidBlocks) {
return
}
val oldPortal = findPortalFrameConnectedTo(
block,
PortalFrame.State.ACTIVE
)
if (oldPortal != null) {
val otherPortal = portals.getOtherPortal(oldPortal)
portals.deactivatePortal(oldPortal)
oldPortal.deactivate()
if (otherPortal != null) {
otherPortal.ejectEntities()
otherPortal.close()
}
}
}
}