9
0
mirror of https://github.com/Auxilor/EcoMobs.git synced 2025-12-20 15:39:31 +00:00

Compare commits

...

48 Commits

Author SHA1 Message Date
Auxilor
df70871bad libreforge-updater 2023-02-22 15:02:39 +00:00
Auxilor
b030af609a libreforge-updater 2023-02-15 20:59:05 +00:00
Auxilor
344e71cd9a libreforge-updater 2023-02-12 16:55:42 +00:00
Auxilor
7b7a16f9c6 libreforge-updater 2023-02-09 14:12:44 +00:00
Auxilor
ba1c348f8e libreforge-updater 2023-02-07 14:46:53 +00:00
Auxilor
c81f7174e2 libreforge-updater 2023-02-04 15:36:59 +00:00
Auxilor
53b037816d libreforge-updater 2023-01-24 10:09:30 +00:00
Auxilor
d7e07c1a62 libreforge-updater 2023-01-17 16:48:42 +00:00
Auxilor
d939296d96 libreforge-updater 2023-01-13 18:08:48 +00:00
Auxilor
2505ddd845 libreforge-updater 2023-01-07 12:17:46 +00:00
Auxilor
ea7371db9e libreforge-updater 2023-01-02 15:58:40 +00:00
Auxilor
b53ab306ed libreforge-updater 2022-12-26 14:01:48 +01:00
Auxilor
33f82117e4 Updated modelengine 2022-12-20 15:20:45 +00:00
Auxilor
a80e060a7e libreforge-updater 2022-12-20 15:15:33 +00:00
Auxilor
a915752922 libreforge-updater 2022-12-12 14:01:34 +00:00
Auxilor
06eb724bd8 libreforge-updater 2022-12-09 17:01:53 +00:00
Auxilor
18c66ef10c libreforge-updater 2022-12-05 10:51:14 +00:00
Auxilor
ae0c8531b0 libreforge-updater 2022-11-30 17:38:55 +00:00
Auxilor
705eafb9af libreforge-updater 2022-11-27 21:45:04 +00:00
Auxilor
e83ede56f0 libreforge-updater 2022-11-26 19:20:59 +00:00
Auxilor
6bddf72111 libreforge-updater 2022-11-24 14:30:48 +00:00
Auxilor
d32d07f4e2 libreforge-updater 2022-11-23 17:25:42 +00:00
Auxilor
8c40d9861d libreforge-updater 2022-11-21 16:03:34 +00:00
Auxilor
03272f794e libreforge-updater 2022-11-17 08:39:07 +00:00
Auxilor
8ff42da43c libreforge-updater 2022-11-12 17:35:11 +00:00
Auxilor
7f61f6a66a libreforge-updater 2022-11-06 19:52:34 +00:00
Auxilor
c1dde026b7 Updated chains 2022-11-06 17:00:48 +00:00
Auxilor
983246a7c4 Added illusioner 2022-11-06 16:56:39 +00:00
Auxilor
ee32897b1c libreforge-updater 2022-11-01 16:23:35 +00:00
Auxilor
67b38896ca libreforge-updater 2022-10-28 11:35:44 +01:00
Auxilor
39b91bc828 libreforge-updater 2022-10-26 22:12:03 +01:00
Auxilor
e2e7b44a75 Fix 2022-10-24 17:11:42 +01:00
Auxilor
3c1e5ee192 libreforge-updater 2022-10-24 17:05:27 +01:00
Auxilor
56789f331b libreforge-updater 2022-10-21 19:26:42 +01:00
Auxilor
e99b96132f libreforge-updater 2022-10-19 20:44:41 +01:00
Auxilor
c0297cd3db libreforge-updater 2022-10-18 14:14:41 +01:00
Auxilor
3b798a8ed7 libreforge-updater 2022-10-16 23:27:19 +01:00
Auxilor
bc73201ec5 libreforge-updater 2022-10-13 20:13:11 +01:00
Auxilor
b1365855af libreforge-updater 2022-10-10 21:04:32 +01:00
Auxilor
1ce50cb0b9 libreforge-updater 2022-10-09 15:03:11 +01:00
Auxilor
2a50868624 libreforge-updater 2022-10-07 19:51:54 +01:00
Auxilor
0a0e7a9661 libreforge-updater 2022-10-06 12:04:55 +01:00
Auxilor
8cd4ccdbd7 libreforge-updater 2022-10-04 15:53:28 +01:00
Auxilor
429bc6a61f libreforge-updater 2022-10-03 18:30:03 +01:00
Auxilor
b92ea06667 Fixed _example.yml 2022-10-02 17:01:40 +01:00
Auxilor
1e332bf845 libreforge-updater 2022-10-02 14:58:47 +01:00
Auxilor
7cec9f3e30 Added separator ambivalence to boss configs and Model Engine animation support 2022-09-29 08:40:30 +01:00
Auxilor
7db3af5dca oops 2022-09-28 17:55:29 +01:00
20 changed files with 355 additions and 79 deletions

View File

@@ -37,11 +37,11 @@ allprojects {
} }
dependencies { dependencies {
compileOnly("com.willfp:eco:6.35.1") compileOnly("com.willfp:eco:6.44.0")
compileOnly("org.jetbrains:annotations:23.0.0") compileOnly("org.jetbrains:annotations:23.0.0")
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.7.10") compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
implementation("com.willfp:libreforge:3.106.0' implementation("com.willfp:libreforge:3.129.3")
implementation("org.joml:joml:1.10.4") implementation("org.joml:joml:1.10.4")
} }

View File

@@ -79,10 +79,6 @@ class EcoBossesPlugin : LibReforgePlugin() {
) )
} }
override fun getMinimumEcoVersion(): String {
return "6.35.1"
}
companion object { companion object {
@JvmStatic @JvmStatic
lateinit var instance: EcoBossesPlugin lateinit var instance: EcoBossesPlugin

View File

@@ -4,9 +4,10 @@ import com.google.common.collect.BiMap
import com.google.common.collect.HashBiMap import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableList import com.google.common.collect.ImmutableList
import com.willfp.eco.core.config.ConfigType import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.TransientConfig import com.willfp.eco.core.config.readConfig
import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.ecobosses.EcoBossesPlugin import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.libreforge.separatorAmbivalent
import org.bukkit.entity.Entity import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity import org.bukkit.entity.LivingEntity
import java.io.File import java.io.File
@@ -53,10 +54,11 @@ object Bosses {
addNewBoss(EcoBoss(id, config, plugin)) addNewBoss(EcoBoss(id, config, plugin))
} }
val ecoBossesYml = TransientConfig(File(plugin.dataFolder, "ecobosses.yml"), ConfigType.YAML) val ecoBossesYml = File(plugin.dataFolder, "ecobosses.yml").readConfig(ConfigType.YAML)
for (bossConfig in ecoBossesYml.getSubsections("bosses")) { for (bossConfig in ecoBossesYml.getSubsections("bosses")) {
addNewBoss(EcoBoss(bossConfig.getString("id"), bossConfig, plugin)) // Boss configs are separator ambivalent in order to preserve backwards compatibility
addNewBoss(EcoBoss(bossConfig.getString("id"), bossConfig.separatorAmbivalent(), plugin))
} }
} }

View File

@@ -49,14 +49,15 @@ import org.bukkit.entity.Mob
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
import java.util.* import java.util.Objects
import java.util.UUID
class EcoBoss( class EcoBoss(
override val id: String, override val id: String,
val config: Config, val config: Config,
private val plugin: EcoPlugin private val plugin: EcoPlugin
) : Holder { ) : Holder {
val displayName: String = config.getString("displayName") val displayName: String = config.getString("display-name")
val lifespan = config.getInt("lifespan") val lifespan = config.getInt("lifespan")
@@ -66,23 +67,23 @@ class EcoBoss(
val targetMode = TargetMode.getByID(config.getString("target.mode"))!! val targetMode = TargetMode.getByID(config.getString("target.mode"))!!
val isBossBarEnabled = config.getBool("bossBar.enabled") val isBossBarEnabled = config.getBool("boss-bar.enabled")
val bossBarRadius = config.getDouble("bossBar.radius") val bossBarRadius = config.getDouble("boss-bar.radius")
val isPreventingMounts = config.getBool("defence.preventMounts") val isPreventingMounts = config.getBool("defence.prevent-mounts")
val isImmuneToExplosions = config.getBool("defence.explosionImmune") val isImmuneToExplosions = config.getBool("defence.explosion-immune")
val isImmuneToFire = config.getBool("defence.fireImmune") val isImmuneToFire = config.getBool("defence.fire-immune")
val isImmuneToDrowning = config.getBool("defence.drowningImmune") val isImmuneToDrowning = config.getBool("defence.drowning-immune")
val isImmuneToSuffocation = config.getBool("defence.suffocationImmune") val isImmuneToSuffocation = config.getBool("defence.suffocation-immune")
val meleeDamageMultiplier = config.getDouble("defence.meleeDamageMultiplier") val meleeDamageMultiplier = config.getDouble("defence.melee-damage-multiplier")
val projectileDamageMultiplier = config.getDouble("defence.projectileDamageMultiplier") val projectileDamageMultiplier = config.getDouble("defence.projectile-damage-multiplier")
val canTeleport = config.getBool("defence.teleportation.enabled") val canTeleport = config.getBool("defence.teleportation.enabled")
@@ -157,7 +158,7 @@ class EcoBoss(
) )
} }
val disabledTotemWorlds: List<String> = config.getStrings("spawn.totem.notInWorlds") val disabledTotemWorlds: List<String> = config.getStrings("spawn.totem.not-in-worlds")
val autoSpawnInterval = config.getInt("spawn.autospawn.interval") val autoSpawnInterval = config.getInt("spawn.autospawn.interval")
@@ -175,16 +176,16 @@ class EcoBoss(
locations locations
} }
val hasCustomAI = config.getBool("customai.enabled") val hasCustomAI = config.getBool("custom-ai.enabled")
val targetGoals = config.getSubsections("customai.target-goals").mapNotNull { val targetGoals = config.getSubsections("custom-ai.target-goals").mapNotNull {
val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null
val deserializer = TargetGoals.getByKey(key) ?: return@mapNotNull null val deserializer = TargetGoals.getByKey(key) ?: return@mapNotNull null
val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null
ConfiguredGoal(it.getInt("priority"), goal) ConfiguredGoal(it.getInt("priority"), goal)
} }
val entityGoals = config.getSubsections("customai.ai-goals").mapNotNull { val entityGoals = config.getSubsections("custom-ai.ai-goals").mapNotNull {
val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null
val deserializer = EntityGoals.getByKey(key) ?: return@mapNotNull null val deserializer = EntityGoals.getByKey(key) ?: return@mapNotNull null
val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null
@@ -195,9 +196,9 @@ class EcoBoss(
Conditions.compile(it, "$id Spawn Conditions") Conditions.compile(it, "$id Spawn Conditions")
} }
private val bossBarColor = BossBar.Color.valueOf(config.getString("bossBar.color").uppercase()) private val bossBarColor = BossBar.Color.valueOf(config.getString("boss-bar.color").uppercase())
private val bossBarStyle = BossBar.Overlay.valueOf(config.getString("bossBar.style").uppercase()) private val bossBarStyle = BossBar.Overlay.valueOf(config.getString("boss-bar.style").uppercase())
private val sounds: Map<BossLifecycle, PlayableSound> = run { private val sounds: Map<BossLifecycle, PlayableSound> = run {
val map = mutableMapOf<BossLifecycle, PlayableSound>() val map = mutableMapOf<BossLifecycle, PlayableSound>()
@@ -238,10 +239,10 @@ class EcoBoss(
private val commandRewards: Map<Int, Iterable<CommandReward>> = run { private val commandRewards: Map<Int, Iterable<CommandReward>> = run {
val map = mutableMapOf<Int, Iterable<CommandReward>>() val map = mutableMapOf<Int, Iterable<CommandReward>>()
for (rank in config.getSubsection("rewards.topDamagerCommands").getKeys(false)) { for (rank in config.getSubsection("rewards.top-damager-commands").getKeys(false)) {
val rankRewards = mutableListOf<CommandReward>() val rankRewards = mutableListOf<CommandReward>()
for (config in config.getSubsections("rewards.topDamagerCommands.$rank")) { for (config in config.getSubsections("rewards.top-damager-commands.$rank")) {
rankRewards.add( rankRewards.add(
CommandReward( CommandReward(
config.getDouble("chance"), config.getDouble("chance"),
@@ -256,12 +257,12 @@ class EcoBoss(
map map
} }
private val nearbyCommandRewardRadius = config.getDouble("rewards.nearbyPlayerCommands.radius") private val nearbyCommandRewardRadius = config.getDouble("rewards.nearby-player-commands.radius")
private val nearbyCommands: Iterable<CommandReward> = run { private val nearbyCommands: Iterable<CommandReward> = run {
val list = mutableListOf<CommandReward>() val list = mutableListOf<CommandReward>()
for (config in config.getSubsections("rewards.nearbyPlayerCommands.commands")) { for (config in config.getSubsections("rewards.nearby-player-commands.commands")) {
list.add( list.add(
CommandReward( CommandReward(
config.getDouble("chance"), config.getDouble("chance"),
@@ -298,17 +299,21 @@ class EcoBoss(
private val mob: TestableEntity = Entities.lookup(config.getString("mob")) private val mob: TestableEntity = Entities.lookup(config.getString("mob"))
private val modelEngineID = config.getStringOrNull("modelEngineID") private val modelEngineID = config.getStringOrNull("model-engine-id")
private val modelEngineAnimation = config.getStringOrNull("model-engine-animation")
private val currentlyAlive = mutableMapOf<UUID, LivingEcoBoss>() private val currentlyAlive = mutableMapOf<UUID, LivingEcoBoss>()
override val conditions = config.getSubsections("conditions").mapNotNull { override val conditions = Conditions.compile(
Conditions.compile(it, "Boss ID $id") config.getSubsections("conditions"),
}.toSet() "Boss ID $id"
)
override val effects = config.getSubsections("effects").mapNotNull { override val effects = Effects.compile(
Effects.compile(it, "Boss ID $id") config.getSubsections("effects"),
}.toSet() "Boss ID $id"
)
fun markDead(uuid: UUID) { fun markDead(uuid: UUID) {
currentlyAlive.remove(uuid) currentlyAlive.remove(uuid)
@@ -346,13 +351,30 @@ class EcoBoss(
entityGoals.forEach { controller.addEntityGoal(it.priority, it.goal as EntityGoal<in Mob>) } entityGoals.forEach { controller.addEntityGoal(it.priority, it.goal as EntityGoal<in Mob>) }
} }
if (modelEngineID != null && Bukkit.getPluginManager().isPluginEnabled("modelEngine")) { if (modelEngineID != null && Bukkit.getPluginManager().isPluginEnabled("ModelEngine")) {
val model = ModelEngineAPI.createActiveModel(modelEngineID) val model = ModelEngineAPI.createActiveModel(modelEngineID)
if (model == null) { if (model == null) {
plugin.logger.warning("Invalid Model Engine ID for boss $id") plugin.logger.warning("Invalid Model Engine ID for boss $id")
} }
if (modelEngineAnimation != null) {
val animationHandler = model.animationHandler
val animationProperty = animationHandler.getAnimation(modelEngineAnimation)
if (animationProperty != null) {
animationHandler.playAnimation(animationProperty, true)
} else {
plugin.logger.warning("Animation $modelEngineAnimation not found in model $modelEngineID, defaulting to walk!")
val animationPropertyWalk = animationHandler.getAnimation("walk")
if (animationPropertyWalk != null) {
animationHandler.playAnimation(animationPropertyWalk, true)
} else {
plugin.logger.warning("Walk animation not found in $modelEngineID!")
}
}
}
val modelled = ModelEngineAPI.createModeledEntity(mob) val modelled = ModelEngineAPI.createModeledEntity(mob)
modelled.addModel(model, true) modelled.addModel(model, true)
modelled.isBaseEntityVisible = false modelled.isBaseEntityVisible = false

View File

@@ -2,6 +2,10 @@ package com.willfp.ecobosses.commands
import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.ecobosses.EcoBossesPlugin import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.libreforge.lrcdb.CommandExport
import com.willfp.libreforge.lrcdb.CommandImport
import com.willfp.libreforge.lrcdb.ExportableConfig
import org.bukkit.command.CommandSender import org.bukkit.command.CommandSender
class CommandEcobosses(plugin: EcoBossesPlugin) : PluginCommand( class CommandEcobosses(plugin: EcoBossesPlugin) : PluginCommand(
@@ -22,5 +26,14 @@ class CommandEcobosses(plugin: EcoBossesPlugin) : PluginCommand(
.addSubcommand(CommandKillall(plugin)) .addSubcommand(CommandKillall(plugin))
.addSubcommand(CommandSpawn(plugin)) .addSubcommand(CommandSpawn(plugin))
.addSubcommand(CommandGive(plugin)) .addSubcommand(CommandGive(plugin))
.addSubcommand(CommandImport("bosses", plugin))
.addSubcommand(CommandExport(plugin) {
Bosses.values().map {
ExportableConfig(
it.id,
it.config
)
}
})
} }
} }

View File

@@ -1,10 +1,8 @@
package com.willfp.ecobosses.events package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.event.Event import org.bukkit.event.Event
import org.bukkit.event.HandlerList import org.bukkit.event.HandlerList
import org.bukkit.event.entity.EntityDeathEvent
abstract class BossDeathEvent( abstract class BossDeathEvent(
val boss: LivingEcoBoss val boss: LivingEcoBoss

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.event.HandlerList import org.bukkit.event.HandlerList
class BossDespawnEvent( class BossDespawnEvent(

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.event.HandlerList import org.bukkit.event.HandlerList
import org.bukkit.event.entity.EntityDeathEvent import org.bukkit.event.entity.EntityDeathEvent

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.lifecycle package com.willfp.ecobosses.lifecycle
import com.willfp.ecobosses.bosses.Bosses import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossDeathEvent
import com.willfp.ecobosses.events.BossDespawnEvent import com.willfp.ecobosses.events.BossDespawnEvent
import com.willfp.ecobosses.events.BossKillEvent import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.ecobosses.events.BossSpawnEvent import com.willfp.ecobosses.events.BossSpawnEvent

View File

@@ -23,7 +23,7 @@ object AutospawnHandler {
val world = location.world ?: continue val world = location.world ?: continue
if (plugin.configYml.getBool("autospawn.one-boss-per-world")) { if (plugin.configYml.getBool("autospawn.one-boss-per-world")) {
if (Bosses.getAllAlive().mapNotNull { it.entity }.any { it.world == world }) { if (Bosses.getAllAlive().map { it.entity }.any { it.world == world }) {
continue continue
} }
} }

View File

@@ -11,7 +11,7 @@ class ChunkTicker : BossTicker {
} }
if (currentChunk.isLoaded && currentChunk.isForceLoaded) { if (currentChunk.isLoaded && currentChunk.isForceLoaded) {
return; return
} }
currentChunk.load() currentChunk.load()

View File

@@ -1,6 +1,5 @@
package com.willfp.ecobosses.util package com.willfp.ecobosses.util
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.util.NumberUtils import com.willfp.eco.util.NumberUtils
import com.willfp.eco.util.savedDisplayName import com.willfp.eco.util.savedDisplayName
import com.willfp.ecobosses.EcoBossesPlugin import com.willfp.ecobosses.EcoBossesPlugin
@@ -32,7 +31,7 @@ data class LocalCommands(
} }
for (s in toDispatch) { for (s in toDispatch) {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s); Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s)
} }
} }
} }

View File

@@ -8,15 +8,16 @@
# View an explanation for this system here: https://plugins.auxilor.io/all-plugins/the-entity-lookup-system # View an explanation for this system here: https://plugins.auxilor.io/all-plugins/the-entity-lookup-system
mob: iron_golem attack-damage:90 movement-speed:1.5 follow-range:16 health:1200 mob: iron_golem attack-damage:90 movement-speed:1.5 follow-range:16 health:1200
# If you're using model engine, you can specify the ID here # If you're using model engine, you can specify the ID and animation here. You can also specify these in the mob with the lookup system.
modelEngineID: "" model-engine-id: ""
model-engine-animation: ""
# Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56) # Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56)
displayName: "&8Steel Golem &7| &c%health%♥ &7| &e%time%" display-name: "&8Steel Golem &7| &c%health%♥ &7| &e%time%"
influence: 40 # The distance at which effects will be applied to players influence: 40 # The distance at which effects will be applied to players
customai: # Custom mob AI using the entity goal system. custom-ai: # Custom mob AI using the entity goal system.
enabled: false # If custom AI should be enabled, this will override the vanilla mob behaviour. enabled: false # If custom AI should be enabled, this will override the vanilla mob behaviour.
target-goals: [ ] # How the boss decides who to attack, if the target mode isn't being used. target-goals: [ ] # How the boss decides who to attack, if the target mode isn't being used.
ai-goals: [ ] # How the boss should behave. ai-goals: [ ] # How the boss should behave.
@@ -35,14 +36,14 @@ conditions: [ ] # Conditions to apply effects to players; useful if you don't wa
lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable. lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable.
defence: defence:
preventMounts: true # If the boss shouldn't be able to get into boats, minecarts, etc prevent-mounts: true # If the boss shouldn't be able to get into boats, minecarts, etc
explosionImmune: true # If the boss should be immune to explosions explosion-immune: true # If the boss should be immune to explosions
fireImmune: true # If the boss should be immune to fire damage fire-immune: true # If the boss should be immune to fire damage
drowningImmune: true # If the boss should be immune to drowning damage drowning-immune: true # If the boss should be immune to drowning damage
suffocationImmune: true # If the boss should be immune to suffocation suffocation-immune: true # If the boss should be immune to suffocation
meleeDamageMultiplier: 0.8 # Incoming melee damage will be multiplied by this value. Set to 0 to render immune against melee melee-damage-multiplier: 0.8 # Incoming melee damage will be multiplied by this value. Set to 0 to render immune against melee
projectileDamageMultiplier: 0.2 # Same as melee multiplier, but for projectiles projectile-damage-multiplier: 0.2 # Same as melee multiplier, but for projectiles
teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar
enabled: true # If the boss should teleport enabled: true # If the boss should teleport
@@ -54,7 +55,7 @@ rewards:
minimum: 30000 minimum: 30000
maximum: 60000 maximum: 60000
topDamagerCommands: top-damager-commands:
# You can specify as many ranks as you want (adding 4, 5, etc) # You can specify as many ranks as you want (adding 4, 5, etc)
# You can use %player% as a placeholder for the player name # You can use %player% as a placeholder for the player name
1: 1:
@@ -64,7 +65,7 @@ rewards:
2: [ ] 2: [ ]
3: [ ] 3: [ ]
nearbyPlayerCommands: nearby-player-commands:
# Commands to be executed for all players near the boss death location # Commands to be executed for all players near the boss death location
radius: 10 radius: 10
# Uses the same syntax as top damager commands (chance and a list of commands, can use %player%) # Uses the same syntax as top damager commands (chance and a list of commands, can use %player%)
@@ -83,7 +84,7 @@ target:
# The distance to scan for players # The distance to scan for players
range: 40 range: 40
bossBar: boss-bar:
# If the boss should have a boss bar # If the boss should have a boss bar
enabled: true enabled: true
color: white # Options: blue, green, pink, purple, red, white, yellow color: white # Options: blue, green, pink, purple, red, white, yellow
@@ -108,7 +109,7 @@ spawn:
top: netherite_block top: netherite_block
middle: iron_block middle: iron_block
bottom: magma_block bottom: magma_block
notInWorlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here not-in-worlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here
egg: egg:
enabled: true # If the boss should have a spawn egg enabled: true # If the boss should have a spawn egg
item: evoker_spawn_egg unbreaking:1 hide_enchants item: evoker_spawn_egg unbreaking:1 hide_enchants

View File

@@ -0,0 +1,210 @@
mob: illusioner attack-damage:50 health:600 hand:"iron_sword sharpness:5"
model-engine-id: ""
model-engine-animation: ""
display-name: "&9Illusioner &7| &c%health%♥ &7| &e%time%"
influence: 40
custom-ai:
enabled: true
target-goals:
- key: minecraft:hurt_by
priority: 0
args:
blacklist: [ ]
- key: minecraft:nearest_attackable
priority: 1
args:
target:
- player
checkVisibility: false
checkCanNavigate: true
reciprocalChance: 300
- key: minecraft:nearest_attackable
priority: 2
args:
target:
- iron_golem
- villager
checkVisibility: false
checkCanNavigate: true
reciprocalChance: 300
ai-goals:
- key: minecraft:float
priority: 0
- key: minecraft:illusioner_mirror_spell
priority: 1
- key: minecraft:melee_attack
priority: 2
args:
speed: 1.6
pauseWhenMobIdle: false
- key: minecraft:random_stroll
priority: 8
args:
speed: 0.6
interval: 80
canDespawn: false
- key: minecraft:look_at_player
priority: 9
args:
range: 6
chance: 1
effects:
- id: run_chain
args:
chain: blind
self_as_victim: true
chance: 20
triggers:
- static_20
conditions: [ ]
lifespan: 120
defence:
prevent-mounts: true
explosion-immune: true
fire-immune: true
drowning-immune: true
suffocation-immune: true
melee-damage-multiplier: 1
projectile-damage-multiplier: 0.8
teleportation:
enabled: true
interval: 200
range: 20
rewards:
xp:
minimum: 20000
maximum: 40000
top-damager-commands:
1:
- chance: 100 # As a percentage
commands:
- eco give %player% 10000
2: [ ]
3: [ ]
nearby-player-commands:
radius: 10
commands: [ ]
drops: []
target:
mode: closest
range: 40
boss-bar:
enabled: true
color: blue
style: notched_20
radius: 120
spawn:
conditions: [ ]
autospawn:
interval: -1
locations: []
totem:
enabled: false
top: carved_pumpkin
middle: beacon
bottom: diamond_block
not-in-worlds: [ ]
egg:
enabled: true
item: dolphin_spawn_egg unbreaking:1 hide_enchants
name: "&9Illusioner&f Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
- "&8&osummon an &9Illusioner"
craftable: true
recipe:
- ""
- fermented_spider_eye 64
- ""
- fermented_spider_eye 64
- ecoitems:boss_core ? nether_star
- fermented_spider_eye 64
- ""
- fermented_spider_eye 64
- ""
commands:
spawn: [ ]
kill: [ ]
despawn: [ ]
injure: [ ]
messages:
spawn:
- message:
- ""
- "&fAn &9&lIllusioner&r&f has been spawned!"
- "&fCome fight it at &9%x%&f, &9%y%&f, &9%z%&f!"
- ""
radius: -1
kill:
- message:
- ""
- "&fThe &9&lIllusioner&r&f has been killed!"
- "&fMost Damage:"
- "&f - &9%damage_1_player%&f (%damage_1% Damage)"
- "&f - &9%damage_2_player%&f (%damage_2% Damage)"
- "&f - &9%damage_3_player%&f (%damage_3% Damage)"
- ""
radius: -1
despawn:
- message:
- ""
- "&fYou ran out of time to kill the &9&lIllusioner&r&f!"
- ""
radius: -1
injure: [ ]
sounds:
spawn:
- sound: entity_illusioner_mirror_move
pitch: 0.5
volume: 100
- sound: entity_wither_spawn
pitch: 2
volume: 100
kill:
- sound: entity_evoker_prepare_wololo
pitch: 0.8
volume: 100
- sound: entity_illusioner_prepare_blindness
pitch: 1
volume: 100
- sound: entity_wither_death
pitch: 2
volume: 100
despawn:
- sound: entity_ender_dragon_ambient
pitch: 0.6
volume: 50
- sound: entity_enderman_death
pitch: 0.8
volume: 50
injure:
- sound: entity_illusioner_cast_spell
pitch: 2
volume: 10

View File

@@ -1,19 +1,14 @@
# Read more about chains: https://plugins.auxilor.io/effects/configuring-an-effect#effect-chains # Read more about chains: https://plugins.auxilor.io/effects/configuring-an-effect#effect-chains
chains: chains:
- id: example_chain - id: blind
effects: effects:
- id: teleport
- id: potion_effect - id: potion_effect
args: args:
effect: blindness effect: blindness
level: 3 level: 3
duration: 30 duration: 30
apply_to_player: true apply_to_player: true
- id: send_message
args:
message: "&fYou have been teleported!"
action_bar: true
- id: play_sound - id: play_sound
args: args:
sound: entity_dragon_fireball_explode sound: entity_dragon_fireball_explode

View File

@@ -30,7 +30,14 @@ cannot-afford-type:
sound: "BLOCK_NOTE_BLOCK_PLING" sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5 pitch: 0.5
point-names: # If you have point names that look ugly (eg g_souls) then you can map them to nice names to be shown to players. cannot-afford-price:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
point-names: # If you have point names that look ugly (e.g. souls) then you can map them to nice names to be shown to players.
example_point: "Nicely Formatted Point" example_point: "Nicely Formatted Point"
use-faster-move-trigger: true # Disable if you want move trigger to detect sub-1-block movements use-faster-move-trigger: true # Disable if you want move trigger to detect sub-1-block movements
@@ -46,5 +53,3 @@ potions:
particles: particles:
permanent: false permanent: false
triggered: true triggered: true
share-configs: true # If your configs are allowed to be used to gather data and improve the plugin. Nothing identifying (IP, Name, etc) is shared.

View File

@@ -1,9 +1,22 @@
messages: messages:
prefix: "&9&lEcoBosses &f» " prefix: "&9&lEcoBosses &f» "
no-permission: "&cYou don't have permission to do this!" no-permission: "&cYou don't have permission to do this!"
invalid-command: "&cUnknown subcommand!"
not-player: "&cThis command must be run by a player" not-player: "&cThis command must be run by a player"
invalid-command: "&cUnknown subcommand!"
reloaded: "Reloaded!" reloaded: "Reloaded!"
cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%"
cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
cannot-afford-price: "&cYou can't afford to do this! &fPrice: %price%"
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-transmit: "&cYou can't transmit here!"
must-specify-lrcdb-id: "&cYou must specify the ID of the config to download! Not sure what this means? Go to &alrcdb.auxilor.io"
lrcdb-import-error: "&cError importing config: &f%message%"
lrcdb-import-success: "&fImported &a%name%&f! Reload the plugin to install it"
must-specify-config-name: "&cYou must specify the config name!"
invalid-config-name: "&cInvalid config name!"
lrcdb-export-error: "&cError exporting config: &f%message%"
lrcdb-export-success: "&fExported &a%name%&f! View it on &alrcdb.auxilor.io&f, or share your config ID: &f%id%"
sent-drop: "Check console for the drop!" sent-drop: "Check console for the drop!"
specify-boss: "&cYou must specify a valid boss!" specify-boss: "&cYou must specify a valid boss!"
invalid-location: "&cInvalid location!" invalid-location: "&cInvalid location!"
@@ -15,9 +28,5 @@ messages:
invalid-stone: "&cInvalid boss!" invalid-stone: "&cInvalid boss!"
give-success: "Gave &a%boss%&r spawn egg to &a%recipient%" give-success: "Gave &a%boss%&r spawn egg to &a%recipient%"
requirements-not-met: "&cYou can't spawn this boss!" requirements-not-met: "&cYou can't spawn this boss!"
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%"
cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
cannot-transmit: "&cYou can't transmit here!"
na: "N/A" na: "N/A"

View File

@@ -0,0 +1,19 @@
# Options for lrcdb (https://lrcdb.auxilor.io), a website to share configs
# with other server owners, so you can get more configs without making them
# yourself!
author: "Unknown Author" # The name attached to configs you export
# Options about automatically sharing configs you create
share-configs:
# If you want all your configs to automatically be publicly available,
# set this to true. This really helps out other users!
publicly: false
# If you don't want your configs to be usable to gather information about
# plugin usage or to improve the plugins in the future, disable this.
# Nothing identifying is shared.
enabled: true
# If you disable share-configs, you can still share select configs publicly
# with /ecobosses export <config>.

View File

@@ -42,6 +42,8 @@ permissions:
ecobosses.command.reload: true ecobosses.command.reload: true
ecobosses.command.spawn: true ecobosses.command.spawn: true
ecobosses.command.give: true ecobosses.command.give: true
ecobosses.command.import: true
ecobosses.command.export: true
ecobosses.command.ecobosses: ecobosses.command.ecobosses:
description: Allows the use of /ecobosses description: Allows the use of /ecobosses
@@ -62,3 +64,11 @@ permissions:
ecobosses.command.reload: ecobosses.command.reload:
description: Allows the use of /ecobosses reload description: Allows the use of /ecobosses reload
default: op default: op
ecobosses.command.import:
description: Allows the use of /ecobosses import
default: op
ecobosses.command.export:
description: Allows the use of /ecobosses export
default: op

View File

@@ -1,4 +1,4 @@
#libreforge-updater #libreforge-updater
#Wed Sep 28 17:53:14 BST 2022 #Wed Feb 22 15:02:39 GMT 2023
version=8.92.0 version=8.115.3
plugin-name=EcoBosses plugin-name=EcoBosses