9
0
mirror of https://github.com/Auxilor/EcoMobs.git synced 2025-12-19 15:09:17 +00:00

Added spawn totems

This commit is contained in:
Auxilor
2023-11-07 17:05:32 +00:00
parent 63ab03695c
commit adbb5faf7b
5 changed files with 96 additions and 1 deletions

View File

@@ -11,6 +11,7 @@ import com.willfp.ecomobs.goals.entity.EntityGoalRandomTeleport
import com.willfp.ecomobs.handler.DamageModifierHandler
import com.willfp.ecomobs.handler.MountHandler
import com.willfp.ecomobs.handler.SpawnEggHandler
import com.willfp.ecomobs.handler.SpawnTotemHandler
import com.willfp.ecomobs.handler.VanillaCompatibilityHandlers
import com.willfp.ecomobs.integrations.levelledmobs.IntegrationLevelledMobs
import com.willfp.ecomobs.integrations.libsdisguises.IntegrationLibsDisguises
@@ -45,7 +46,8 @@ class EcoMobsPlugin : LibreforgePlugin() {
MountHandler(),
VanillaCompatibilityHandlers(),
DiscoverRecipeListener(this),
SpawnEggHandler(this)
SpawnEggHandler(this),
SpawnTotemHandler()
)
}

View File

@@ -0,0 +1,51 @@
package com.willfp.ecomobs.handler
import com.willfp.ecomobs.mob.EcoMobs
import com.willfp.ecomobs.mob.SpawnReason
import com.willfp.ecomobs.mob.SpawnTotem
import com.willfp.libreforge.triggers.TriggerData
import org.bukkit.block.Block
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.BlockPlaceEvent
class SpawnTotemHandler : Listener {
@EventHandler(ignoreCancelled = true)
fun handle(event: BlockPlaceEvent) {
val block = event.block
val blockBelow = block.getRelative(0, -1, 0)
val blockTwoBelow = block.getRelative(0, -2, 0)
val blockAbove = block.getRelative(0, 1, 0)
val blockTwoAbove = block.getRelative(0, 2, 0)
val player = event.player
val location = block.location.add(0.0, 1.5, 0.0)
val totemPositions = listOf(
SpawnTotem(block.type, blockBelow.type, blockTwoBelow.type),
SpawnTotem(blockTwoAbove.type, blockAbove.type, block.type),
SpawnTotem(blockAbove.type, block.type, blockBelow.type)
)
for (totem in totemPositions) {
for (mob in EcoMobs.values()) {
val options = mob.totemOptions ?: continue
if (options.totem != totem) {
continue
}
if (!options.conditions.areMetAndTrigger(
TriggerData(
player = player
).dispatch(player)
)
) {
continue
}
mob.spawn(location, SpawnReason.TOTEM)
}
}
}
}

View File

@@ -39,6 +39,11 @@ interface EcoMob : KRegistrable {
*/
val spawnEgg: SpawnEgg?
/**
* The spawn totem options.
*/
val totemOptions: SpawnTotemOptions?
/**
* Get a living mob from a bukkit mob.
*/

View File

@@ -0,0 +1,15 @@
package com.willfp.ecomobs.mob
import com.willfp.libreforge.conditions.ConditionList
import org.bukkit.Material
data class SpawnTotem(
val top: Material,
val middle: Material,
val bottom: Material
)
data class SpawnTotemOptions(
val conditions: ConditionList,
val totem: SpawnTotem
)

View File

@@ -33,6 +33,8 @@ import com.willfp.ecomobs.mob.EcoMob
import com.willfp.ecomobs.mob.EcoMobs
import com.willfp.ecomobs.mob.LivingMob
import com.willfp.ecomobs.mob.SpawnReason
import com.willfp.ecomobs.mob.SpawnTotem
import com.willfp.ecomobs.mob.SpawnTotemOptions
import com.willfp.ecomobs.mob.addGoal
import com.willfp.ecomobs.mob.event.MobEvent
import com.willfp.ecomobs.mob.event.MobEvents
@@ -277,6 +279,26 @@ internal class ConfigDrivenEcoMob(
)
}
override val totemOptions = config.getBool("spawn.totem.enabled").ifTrue {
val conditions = Conditions.compile(
config.getSubsections("spawn.totem.conditions"),
context.with("spawn totem conditions")
)
val top = Items.lookup(config.getString("spawn.totem.top"))
val middle = Items.lookup(config.getString("spawn.totem.middle"))
val bottom = Items.lookup(config.getString("spawn.totem.bottom"))
SpawnTotemOptions(
conditions,
SpawnTotem(
top.item.type,
middle.item.type,
bottom.item.type
)
)
}
/*
----------
*/