diff --git a/build.gradle b/build.gradle index 5d27acc..d7292c5 100644 --- a/build.gradle +++ b/build.gradle @@ -63,7 +63,7 @@ allprojects { dependencies { compileOnly 'com.willfp:eco:6.35.1' - implementation 'com.willfp:libreforge:3.89.0' + implementation 'com.willfp:libreforge:3.90.0' implementation 'org.joml:joml:1.10.4' compileOnly 'org.jetbrains:annotations:23.0.0' @@ -85,6 +85,7 @@ allprojects { tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) { kotlinOptions { jvmTarget = "17" + freeCompilerArgs += ["-Xjvm-default=all"] } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/EcoBossesPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/EcoBossesPlugin.kt index bbee877..7218c4b 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/EcoBossesPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/EcoBossesPlugin.kt @@ -7,7 +7,6 @@ import com.willfp.ecobosses.bosses.Bosses import com.willfp.ecobosses.bosses.EggDisplay import com.willfp.ecobosses.bosses.bossHolders import com.willfp.ecobosses.commands.CommandEcobosses -import com.willfp.ecobosses.config.EcoBossesYml import com.willfp.ecobosses.defence.DamageMultiplierHandler import com.willfp.ecobosses.defence.ImmunitiesHandler import com.willfp.ecobosses.defence.MountHandler @@ -26,14 +25,15 @@ import com.willfp.libreforge.LibReforgePlugin import org.bukkit.event.Listener class EcoBossesPlugin : LibReforgePlugin() { - val ecoBossesYml: EcoBossesYml - init { instance = this - ecoBossesYml = EcoBossesYml(this) registerHolderProvider { it.bossHolders } } + override fun handleEnableAdditional() { + this.copyConfigs("bosses") + } + override fun handleReloadAdditional() { Bosses.getAllAlive().forEach { it.remove() } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/Bosses.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/Bosses.kt index 7d18d07..401f3af 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/Bosses.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/Bosses.kt @@ -3,11 +3,13 @@ package com.willfp.ecobosses.bosses import com.google.common.collect.BiMap import com.google.common.collect.HashBiMap import com.google.common.collect.ImmutableList +import com.willfp.eco.core.config.ConfigType +import com.willfp.eco.core.config.TransientConfig import com.willfp.eco.core.config.updating.ConfigUpdater import com.willfp.ecobosses.EcoBossesPlugin -import com.willfp.libreforge.chains.EffectChains import org.bukkit.entity.LivingEntity -import java.util.UUID +import java.io.File +import java.util.* object Bosses { /** @@ -44,16 +46,18 @@ object Bosses { @ConfigUpdater @JvmStatic fun update(plugin: EcoBossesPlugin) { - plugin.ecoBossesYml.getSubsections("chains").mapNotNull { - EffectChains.compile(it, "Effect Chains") - } - for (boss in values()) { removeBoss(boss) } - for (bossConfig in plugin.ecoBossesYml.getSubsections("bosses")) { - addNewBoss(EcoBoss(bossConfig, plugin)) + for ((id, config) in plugin.fetchConfigs("bosses")) { + addNewBoss(EcoBoss(id, config, plugin)) + } + + val ecoBossesYml = TransientConfig(File(plugin.dataFolder, "ecobosses.yml"), ConfigType.YAML) + + for (bossConfig in ecoBossesYml.getSubsections("bosses")) { + addNewBoss(EcoBoss(bossConfig.getString("id"), bossConfig, plugin)) } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt index 9b5dd99..356b22b 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/bosses/EcoBoss.kt @@ -5,7 +5,11 @@ import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.entities.CustomEntity import com.willfp.eco.core.entities.Entities import com.willfp.eco.core.entities.TestableEntity -import com.willfp.eco.core.entities.ai.* +import com.willfp.eco.core.entities.ai.EntityController +import com.willfp.eco.core.entities.ai.EntityGoal +import com.willfp.eco.core.entities.ai.EntityGoals +import com.willfp.eco.core.entities.ai.TargetGoal +import com.willfp.eco.core.entities.ai.TargetGoals import com.willfp.eco.core.items.CustomItem import com.willfp.eco.core.items.Items import com.willfp.eco.core.items.builder.ItemStackBuilder @@ -16,8 +20,22 @@ import com.willfp.eco.util.NamespacedKeyUtils import com.willfp.eco.util.toComponent import com.willfp.ecobosses.events.BossKillEvent import com.willfp.ecobosses.lifecycle.BossLifecycle -import com.willfp.ecobosses.tick.* -import com.willfp.ecobosses.util.* +import com.willfp.ecobosses.tick.BossBarTicker +import com.willfp.ecobosses.tick.BossTicker +import com.willfp.ecobosses.tick.ChunkTicker +import com.willfp.ecobosses.tick.DisplayNameTicker +import com.willfp.ecobosses.tick.LifespanTicker +import com.willfp.ecobosses.tick.TargetTicker +import com.willfp.ecobosses.tick.TeleportHandler +import com.willfp.ecobosses.util.BossDrop +import com.willfp.ecobosses.util.CommandReward +import com.willfp.ecobosses.util.ConfiguredSound +import com.willfp.ecobosses.util.LocalBroadcast +import com.willfp.ecobosses.util.LocalCommands +import com.willfp.ecobosses.util.PlayableSound +import com.willfp.ecobosses.util.SpawnTotem +import com.willfp.ecobosses.util.XpReward +import com.willfp.ecobosses.util.topDamagers import com.willfp.libreforge.Holder import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.effects.Effects @@ -33,11 +51,10 @@ import org.bukkit.persistence.PersistentDataType import java.util.* class EcoBoss( + override val id: String, val config: Config, private val plugin: EcoPlugin ) : Holder { - override val id: String = config.getString("id") - val displayName: String = config.getString("displayName") val lifespan = config.getInt("lifespan") diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/config/EcoBossesYml.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/config/EcoBossesYml.kt deleted file mode 100644 index 9446c58..0000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/ecobosses/config/EcoBossesYml.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.willfp.ecobosses.config - -import com.willfp.eco.core.config.BaseConfig -import com.willfp.eco.core.config.ConfigType -import com.willfp.ecobosses.EcoBossesPlugin - -class EcoBossesYml(plugin: EcoBossesPlugin) : BaseConfig( - "ecobosses", - plugin, - true, - ConfigType.YAML -) diff --git a/eco-core/core-plugin/src/main/resources/bosses/_example.yml b/eco-core/core-plugin/src/main/resources/bosses/_example.yml new file mode 100644 index 0000000..f757527 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/bosses/_example.yml @@ -0,0 +1,189 @@ +# The ID of the boss is the name of the .yml file, +# for example steel_golem.yml has the ID of steel_golem +# You can place bosses anywhere in this folder, +# including in subfolders if you want to organize your boss configs +# _example.yml is not loaded. + +# A base mob and modifiers +# 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 +# Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56) +displayName: "&8Steel Golem &7| &c%health%♥ &7| &e%time%" +influence: 40 # The distance at which effects will be applied to players +customai: # Custom mob AI using the entity goal system. + 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. + ai-goals: [ ] # How the boss should behave. +effects: # Effects are done from the player's perspective: to treat the player as the victim, use the self_as_victim option in args + - id: run_chain + args: + chain: blind + self_as_victim: true + chance: 20 + triggers: + - static_20 +conditions: [ ] # Conditions to apply effects to players; useful if you don't want to affect low-level players +lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable. +defence: + preventMounts: true # If the boss shouldn't be able to get into boats, minecarts, etc + explosionImmune: true # If the boss should be immune to explosions + fireImmune: true # If the boss should be immune to fire damage + drowningImmune: true # If the boss should be immune to drowning damage + suffocationImmune: 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 + projectileDamageMultiplier: 0.2 # Same as melee multiplier, but for projectiles + + teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar + enabled: true # If the boss should teleport + interval: 100 # Ticks between teleportation attempts + range: 20 # The range that the boss should check for safe teleportation blocks. +rewards: + xp: # Experience will be randomly generated between these values + minimum: 30000 + maximum: 60000 + topDamagerCommands: + # You can specify as many ranks as you want (adding 4, 5, etc) + # You can use %player% as a placeholder for the player name + 1: + - chance: 100 # As a percentage + commands: + - eco give %player% 10000 + 2: [ ] + 3: [ ] + nearbyPlayerCommands: + # Commands to be executed for all players near the boss death location + radius: 10 + # Uses the same syntax as top damager commands (chance and a list of commands, can use %player%) + commands: [ ] + # You can specify as many drops as you want, and group several drops together under one chance + drops: + - chance: 100 + items: + - diamond_sword unbreaking:1 name:"Example Sword" +target: + # How the boss should choose which player to attack, choices are: + # highest_health, lowest_health, closest, random + mode: highest_health + # The distance to scan for players + range: 40 +bossBar: + # If the boss should have a boss bar + enabled: true + color: white # Options: blue, green, pink, purple, red, white, yellow + style: progress # Options: progress, notched_20, notched_12, notched_10, notched_6 + radius: 120 # The distance from the boss where the boss bar is visible +spawn: + # A list of conditions required for a player to be able to spawn a boss, useful to set + # minimum skill levels, etc + conditions: [ ] + autospawn: + # Spawn the boss automatically every x ticks. Picks a random location, but will only + # ever spawn in a world if there are no other bosses of that type in the world. + interval: -1 # The interval in ticks, set to -1 to disable + locations: # Add as many locations as you want + - world: world + x: 100 + y: 100 + z: 100 + totem: + enabled: false # A spawn totem is a set of 3 blocks on top of each other to spawn a boss (like a snow golem) + top: netherite_block + middle: iron_block + bottom: magma_block + notInWorlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here + egg: + enabled: true # If the boss should have a spawn egg + item: evoker_spawn_egg unbreaking:1 hide_enchants + name: "&8Steel Golem&f Spawn Egg" + lore: + - "" + - "&8&oPlace on the ground to" + - "&8&osummon a &8Steel Golem" + craftable: true + recipe: + - iron_block + - netherite_block + - iron_block + - air + - ecoitems:boss_core ? nether_star + - air + - iron_block + - netherite_block + - iron_block +commands: + # For each category, you can add as many commands as you want, which will be executed by + # console. Supported placeholders are the same as for messages (see below) + spawn: [ ] + kill: [ ] + despawn: [ ] + injure: [ ] +messages: + # For each category, you can add as many messages as you want, each with their own radius. + # Radius is the distance from the boss where the player will be sent the message + # Set to -1 to broadcast globally to all players online + + # Supported placeholders: %x%, %y%, %z% (coordinates) + spawn: + - message: + - "" + - "&fA &8&lSteel Golem&r&f has been spawned!" + - "&fCome fight it at &8%x%&f, &8%y%&f, &8%z%&f!" + - "" + radius: -1 + + # Supported placeholders: %damage__player%, %damage_% + # You can include as many ranks as you want - if there is no player at a certain rank, + # it will be replaced with N/A (change in lang.yml) + kill: + - message: + - "" + - "&fThe &8&lSteel Golem&r&f has been killed!" + - "&fMost Damage:" + - "&f - &8%damage_1_player%&f (%damage_1% Damage)" + - "&f - &8%damage_2_player%&f (%damage_2% Damage)" + - "&f - &8%damage_3_player%&f (%damage_3% Damage)" + - "" + radius: -1 + despawn: + - message: + - "" + - "&fYou ran out of time to kill the &8&lSteel Golem&r&f!" + - "" + radius: -1 + injure: [ ] + +# All sounds will be played together at the same time +# A list of sounds can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html +# Volume functions as the distance at which the sound will be heard +# Pitch is any value between 0.5 and 2 +# If you don't want the vanilla mob sounds, add 'silent' as an option to the mob +sounds: + spawn: + - sound: entity_iron_golem_death + pitch: 0.8 + volume: 100 + - sound: entity_iron_golem_hurt + pitch: 0.5 + volume: 100 + - sound: entity_ender_dragon_growl + pitch: 0.5 + volume: 100 + kill: + - sound: entity_ender_dragon_death + pitch: 1.8 + volume: 100 + - sound: entity_wither_death + pitch: 1.2 + volume: 100 + despawn: + - sound: entity_ender_dragon_ambient + pitch: 0.5 + volume: 50 + - sound: entity_enderman_death + pitch: 0.5 + volume: 50 + injure: + - sound: entity_iron_golem_damage + pitch: 0.7 + volume: 10 diff --git a/eco-core/core-plugin/src/main/resources/ecobosses.yml b/eco-core/core-plugin/src/main/resources/ecobosses.yml deleted file mode 100644 index b9bcfc9..0000000 --- a/eco-core/core-plugin/src/main/resources/ecobosses.yml +++ /dev/null @@ -1,205 +0,0 @@ -chains: - - id: blind - effects: - - id: teleport - - id: potion_effect - args: - effect: blindness - level: 3 - duration: 30 - apply_to_player: true - - id: send_message - args: - message: "&cYou have been blinded!" - action_bar: true - - id: play_sound - args: - sound: entity_dragon_fireball_explode - pitch: 1.5 - volume: 4 - -bosses: - - id: steel_golem - # A base mob and modifiers - # 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 - # Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56) - displayName: "&8Steel Golem &7| &c%health%♥ &7| &e%time%" - influence: 40 # The distance at which effects will be applied to players - customai: # Custom mob AI using the entity goal system. - 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. - ai-goals: [ ] # How the boss should behave. - effects: # Effects are done from the player's perspective: to treat the player as the victim, use the self_as_victim option in args - - id: run_chain - args: - chain: blind - self_as_victim: true - chance: 20 - triggers: - - static_20 - conditions: [ ] # Conditions to apply effects to players; useful if you don't want to affect low-level players - lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable. - defence: - preventMounts: true # If the boss shouldn't be able to get into boats, minecarts, etc - explosionImmune: true # If the boss should be immune to explosions - fireImmune: true # If the boss should be immune to fire damage - drowningImmune: true # If the boss should be immune to drowning damage - suffocationImmune: 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 - projectileDamageMultiplier: 0.2 # Same as melee multiplier, but for projectiles - - teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar - enabled: true # If the boss should teleport - interval: 100 # Ticks between teleportation attempts - range: 20 # The range that the boss should check for safe teleportation blocks. - rewards: - xp: # Experience will be randomly generated between these values - minimum: 30000 - maximum: 60000 - topDamagerCommands: - # You can specify as many ranks as you want (adding 4, 5, etc) - # You can use %player% as a placeholder for the player name - 1: - - chance: 100 # As a percentage - commands: - - eco give %player% 10000 - 2: [ ] - 3: [ ] - nearbyPlayerCommands: - # Commands to be executed for all players near the boss death location - radius: 10 - # Uses the same syntax as top damager commands (chance and a list of commands, can use %player%) - commands: [ ] - # You can specify as many drops as you want, and group several drops together under one chance - drops: - - chance: 100 - items: - - diamond_sword unbreaking:1 name:"Example Sword" - target: - # How the boss should choose which player to attack, choices are: - # highest_health, lowest_health, closest, random - mode: highest_health - # The distance to scan for players - range: 40 - bossBar: - # If the boss should have a boss bar - enabled: true - color: white # Options: blue, green, pink, purple, red, white, yellow - style: progress # Options: progress, notched_20, notched_12, notched_10, notched_6 - radius: 120 # The distance from the boss where the boss bar is visible - spawn: - # A list of conditions required for a player to be able to spawn a boss, useful to set - # minimum skill levels, etc - conditions: [ ] - autospawn: - # Spawn the boss automatically every x ticks. Picks a random location, but will only - # ever spawn in a world if there are no other bosses of that type in the world. - interval: -1 # The interval in ticks, set to -1 to disable - locations: # Add as many locations as you want - - world: world - x: 100 - y: 100 - z: 100 - totem: - enabled: false # A spawn totem is a set of 3 blocks on top of each other to spawn a boss (like a snow golem) - top: netherite_block - middle: iron_block - bottom: magma_block - notInWorlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here - egg: - enabled: true # If the boss should have a spawn egg - item: evoker_spawn_egg unbreaking:1 hide_enchants - name: "&8Steel Golem&f Spawn Egg" - lore: - - "" - - "&8&oPlace on the ground to" - - "&8&osummon a &8Steel Golem" - craftable: true - recipe: - - iron_block - - netherite_block - - iron_block - - air - - ecoitems:boss_core ? nether_star - - air - - iron_block - - netherite_block - - iron_block - commands: - # For each category, you can add as many commands as you want, which will be executed by - # console. Supported placeholders are the same as for messages (see below) - spawn: [ ] - kill: [ ] - despawn: [ ] - injure: [ ] - messages: - # For each category, you can add as many messages as you want, each with their own radius. - # Radius is the distance from the boss where the player will be sent the message - # Set to -1 to broadcast globally to all players online - - # Supported placeholders: %x%, %y%, %z% (coordinates) - spawn: - - message: - - "" - - "&fA &8&lSteel Golem&r&f has been spawned!" - - "&fCome fight it at &8%x%&f, &8%y%&f, &8%z%&f!" - - "" - radius: -1 - - # Supported placeholders: %damage__player%, %damage_% - # You can include as many ranks as you want - if there is no player at a certain rank, - # it will be replaced with N/A (change in lang.yml) - kill: - - message: - - "" - - "&fThe &8&lSteel Golem&r&f has been killed!" - - "&fMost Damage:" - - "&f - &8%damage_1_player%&f (%damage_1% Damage)" - - "&f - &8%damage_2_player%&f (%damage_2% Damage)" - - "&f - &8%damage_3_player%&f (%damage_3% Damage)" - - "" - radius: -1 - despawn: - - message: - - "" - - "&fYou ran out of time to kill the &8&lSteel Golem&r&f!" - - "" - radius: -1 - injure: [ ] - - # All sounds will be played together at the same time - # A list of sounds can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Sound.html - # Volume functions as the distance at which the sound will be heard - # Pitch is any value between 0.5 and 2 - # If you don't want the vanilla mob sounds, add 'silent' as an option to the mob - sounds: - spawn: - - sound: entity_iron_golem_death - pitch: 0.8 - volume: 100 - - sound: entity_iron_golem_hurt - pitch: 0.5 - volume: 100 - - sound: entity_ender_dragon_growl - pitch: 0.5 - volume: 100 - kill: - - sound: entity_ender_dragon_death - pitch: 1.8 - volume: 100 - - sound: entity_wither_death - pitch: 1.2 - volume: 100 - despawn: - - sound: entity_ender_dragon_ambient - pitch: 0.5 - volume: 50 - - sound: entity_enderman_death - pitch: 0.5 - volume: 50 - injure: - - sound: entity_iron_golem_damage - pitch: 0.7 - volume: 10 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 35c6c89..9467926 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ #libreforge-updater -#Mon Aug 29 10:58:32 BST 2022 -version=8.74.0 +#Tue Aug 30 19:21:42 BST 2022 +version=8.75.0 plugin-name=EcoBosses