mirror of
https://github.com/Auxilor/EcoMobs.git
synced 2025-12-19 23:19:17 +00:00
Compare commits
130 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4fa070dabe | ||
|
|
f73327b204 | ||
|
|
d9b702f2f1 | ||
|
|
7692e84a60 | ||
|
|
ffd6037e73 | ||
|
|
7c959d7221 | ||
|
|
91ad33334d | ||
|
|
c1b8ed5b48 | ||
|
|
2f3c5f60a4 | ||
|
|
f3387668e6 | ||
|
|
b62e79d904 | ||
|
|
d7afeecc27 | ||
|
|
72e61940c5 | ||
|
|
245445473b | ||
|
|
46772ac97a | ||
|
|
29a1e541a2 | ||
|
|
89a6bc97b7 | ||
|
|
c59707e6ac | ||
|
|
99bc2a04ab | ||
|
|
b4e90d9bda | ||
|
|
72c3722429 | ||
|
|
c14b2f0a80 | ||
|
|
0b6c7152e8 | ||
|
|
6e551eeaeb | ||
|
|
d5610ae804 | ||
|
|
79c8ed4992 | ||
|
|
947a0f3c6d | ||
|
|
ce8b0af155 | ||
|
|
a41e5b702d | ||
|
|
f04bf3aeea | ||
|
|
08941461c9 | ||
|
|
743dbac656 | ||
|
|
2e8d1ea4cc | ||
|
|
d31a98fd99 | ||
|
|
f7244a7d7f | ||
|
|
268ed76951 | ||
|
|
d0ccb78c17 | ||
|
|
34de040849 | ||
|
|
6b01f8e64a | ||
|
|
2a4d5a8fd2 | ||
|
|
f9d7315fd3 | ||
|
|
497f42ccc6 | ||
|
|
d149eb7907 | ||
|
|
47277d0dd8 | ||
|
|
f307f13d1e | ||
|
|
ac3370c0be | ||
|
|
4f616ac8c8 | ||
|
|
24256e9789 | ||
|
|
bbf20e77d0 | ||
|
|
8a506c015b | ||
|
|
744883630d | ||
|
|
8519f4fc23 | ||
|
|
d1cb11ef79 | ||
|
|
edcc185b58 | ||
|
|
ab6d297222 | ||
|
|
9626588c66 | ||
|
|
c4eda19d78 | ||
|
|
691326577a | ||
|
|
e2086387e7 | ||
|
|
13a72f849d | ||
|
|
6346975e77 | ||
|
|
0d846d9dff | ||
|
|
31610383c4 | ||
|
|
d7c16ad3cc | ||
|
|
afe9095276 | ||
|
|
31a782581f | ||
|
|
8aad221450 | ||
|
|
b0bff24263 | ||
|
|
04b00fa01b | ||
|
|
276ba4616a | ||
|
|
d8e5fb9cd0 | ||
|
|
9f05a6504a | ||
|
|
322a6bb41b | ||
|
|
4dbc8afdf4 | ||
|
|
7ffa6ff4f4 | ||
|
|
3769684bb0 | ||
|
|
7bb931e027 | ||
|
|
879d6dd72d | ||
|
|
0a4aff45ad | ||
|
|
5929da1f48 | ||
|
|
6db5de581b | ||
|
|
9ce1bb7ddf | ||
|
|
351d34de9f | ||
|
|
4d2b726aa0 | ||
|
|
ff20b70784 | ||
|
|
f31cd20200 | ||
|
|
0ad2d3cfc7 | ||
|
|
ccc7c5797a | ||
|
|
a218fa96c0 | ||
|
|
13c0a4d83a | ||
|
|
62e7177b1b | ||
|
|
752b30b4a2 | ||
|
|
be4d6156e3 | ||
|
|
fed6dcafd7 | ||
|
|
36f944c58c | ||
|
|
1bc35656fe | ||
|
|
1216e83a39 | ||
|
|
4723c7982c | ||
|
|
8ba3c7834c | ||
|
|
76530a1617 | ||
|
|
bf41554846 | ||
|
|
a741c78b6b | ||
|
|
0f8dce74da | ||
|
|
0d31556b84 | ||
|
|
f8544c284e | ||
|
|
512a477fc6 | ||
|
|
8a1b473837 | ||
|
|
7464133c74 | ||
|
|
1e00b28a8b | ||
|
|
b152313f87 | ||
|
|
ec6d7175b9 | ||
|
|
804a0e88b9 | ||
|
|
ff2de5aebe | ||
|
|
990ad363eb | ||
|
|
d958b94fb0 | ||
|
|
e4f2a91968 | ||
|
|
f1d50d6222 | ||
|
|
035550db06 | ||
|
|
f4bd64c192 | ||
|
|
4b8e1c0579 | ||
|
|
d8cf08eb25 | ||
|
|
a94c96e5d4 | ||
|
|
dddf2d8a20 | ||
|
|
7e67620c8c | ||
|
|
8c44303cdc | ||
|
|
97c1045243 | ||
|
|
c47019f3c5 | ||
|
|
1ffedfcb2e | ||
|
|
17705e9fdb | ||
|
|
7087feefbc |
@@ -1,6 +1,6 @@
|
|||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
<br>
|
<br>
|
||||||
<img src="https://i.imgur.com/A2qieC3.png" alt="EcoBosses logo" width="256">
|
<img src="https://i.imgur.com/3n3ssb4.png" alt="EcoBosses logo" width="256">
|
||||||
<br>
|
<br>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
|
|||||||
24
build.gradle
24
build.gradle
@@ -4,7 +4,7 @@ buildscript {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,15 +58,17 @@ allprojects {
|
|||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
relocate('com.willfp.libreforge', 'com.willfp.ecobosses.libreforge')
|
relocate('com.willfp.libreforge', 'com.willfp.ecobosses.libreforge')
|
||||||
|
relocate('org.joml', 'com.willfp.ecobosses.libreforge.joml')
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly 'com.willfp:eco:6.24.0'
|
compileOnly 'com.willfp:eco:6.35.1'
|
||||||
implementation 'com.willfp:libreforge:3.15.1'
|
implementation 'com.willfp:libreforge:3.64.0'
|
||||||
|
implementation 'org.joml:joml:1.10.4'
|
||||||
|
|
||||||
compileOnly 'org.jetbrains:annotations:23.0.0'
|
compileOnly 'org.jetbrains:annotations:23.0.0'
|
||||||
|
|
||||||
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.6.0'
|
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.6.21'
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
tasks.withType(JavaCompile) {
|
||||||
@@ -118,4 +120,16 @@ version = findProperty("version")
|
|||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|
||||||
build.dependsOn shadowJar
|
build.dependsOn shadowJar
|
||||||
build.dependsOn publishToMavenLocal
|
build.dependsOn publishToMavenLocal
|
||||||
|
|
||||||
|
task buyThePlugins {
|
||||||
|
dependsOn subprojects.build
|
||||||
|
|
||||||
|
doLast {
|
||||||
|
println 'If you like the plugin, please consider buying it on Spigot or Polymart!'
|
||||||
|
println 'Spigot: https://www.spigotmc.org/resources/authors/auxilor.507394/'
|
||||||
|
println 'Polymart: https://polymart.org/user/auxilor.1107/'
|
||||||
|
println 'Buying gives you access to support and the plugin auto-updater, and it allows me to keep developing plugins.'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
build.finalizedBy buyThePlugins
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
group 'com.willfp'
|
group 'com.willfp'
|
||||||
version rootProject.version
|
version rootProject.version
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
package com.willfp.ecobosses
|
package com.willfp.ecobosses
|
||||||
|
|
||||||
import com.willfp.eco.core.command.impl.PluginCommand
|
import com.willfp.eco.core.command.impl.PluginCommand
|
||||||
|
import com.willfp.eco.core.display.DisplayModule
|
||||||
import com.willfp.eco.core.integrations.IntegrationLoader
|
import com.willfp.eco.core.integrations.IntegrationLoader
|
||||||
import com.willfp.ecobosses.bosses.Bosses
|
import com.willfp.ecobosses.bosses.Bosses
|
||||||
|
import com.willfp.ecobosses.bosses.EggDisplay
|
||||||
import com.willfp.ecobosses.bosses.bossHolders
|
import com.willfp.ecobosses.bosses.bossHolders
|
||||||
import com.willfp.ecobosses.commands.CommandEcobosses
|
import com.willfp.ecobosses.commands.CommandEcobosses
|
||||||
import com.willfp.ecobosses.config.EcoBossesYml
|
import com.willfp.ecobosses.config.EcoBossesYml
|
||||||
@@ -12,6 +14,7 @@ import com.willfp.ecobosses.defence.MountHandler
|
|||||||
import com.willfp.ecobosses.defence.PickupHandler
|
import com.willfp.ecobosses.defence.PickupHandler
|
||||||
import com.willfp.ecobosses.integrations.levelledmobs.IntegrationLevelledMobs
|
import com.willfp.ecobosses.integrations.levelledmobs.IntegrationLevelledMobs
|
||||||
import com.willfp.ecobosses.lifecycle.CompatibilityListeners
|
import com.willfp.ecobosses.lifecycle.CompatibilityListeners
|
||||||
|
import com.willfp.ecobosses.lifecycle.ConsoleLoggers
|
||||||
import com.willfp.ecobosses.lifecycle.DeathListeners
|
import com.willfp.ecobosses.lifecycle.DeathListeners
|
||||||
import com.willfp.ecobosses.lifecycle.LifecycleHandlers
|
import com.willfp.ecobosses.lifecycle.LifecycleHandlers
|
||||||
import com.willfp.ecobosses.spawn.AutospawnHandler
|
import com.willfp.ecobosses.spawn.AutospawnHandler
|
||||||
@@ -22,7 +25,7 @@ import com.willfp.ecobosses.util.TopDamagerListener
|
|||||||
import com.willfp.libreforge.LibReforgePlugin
|
import com.willfp.libreforge.LibReforgePlugin
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
|
|
||||||
class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
|
class EcoBossesPlugin : LibReforgePlugin() {
|
||||||
val ecoBossesYml: EcoBossesYml
|
val ecoBossesYml: EcoBossesYml
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@@ -43,6 +46,10 @@ class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
|
|||||||
Bosses.getAllAlive().forEach { it.remove() }
|
Bosses.getAllAlive().forEach { it.remove() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun createDisplayModule(): DisplayModule {
|
||||||
|
return EggDisplay(this)
|
||||||
|
}
|
||||||
|
|
||||||
override fun loadPluginCommands(): List<PluginCommand> {
|
override fun loadPluginCommands(): List<PluginCommand> {
|
||||||
return listOf(
|
return listOf(
|
||||||
CommandEcobosses(this)
|
CommandEcobosses(this)
|
||||||
@@ -61,7 +68,8 @@ class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
|
|||||||
ImmunitiesHandler(),
|
ImmunitiesHandler(),
|
||||||
CompatibilityListeners(),
|
CompatibilityListeners(),
|
||||||
SpawnTotemHandler(),
|
SpawnTotemHandler(),
|
||||||
DeathListeners()
|
DeathListeners(),
|
||||||
|
ConsoleLoggers(this)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,7 +80,7 @@ class EcoBossesPlugin : LibReforgePlugin(525, 10635, "&9") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getMinimumEcoVersion(): String {
|
override fun getMinimumEcoVersion(): String {
|
||||||
return "6.24.0"
|
return "6.35.1"
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.ecobosses.bosses
|
package com.willfp.ecobosses.bosses
|
||||||
|
|
||||||
|
import com.willfp.eco.core.fast.fast
|
||||||
import com.willfp.ecobosses.EcoBossesPlugin
|
import com.willfp.ecobosses.EcoBossesPlugin
|
||||||
import com.willfp.libreforge.Holder
|
import com.willfp.libreforge.Holder
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
@@ -42,8 +43,7 @@ var ItemStack.bossEgg: EcoBoss?
|
|||||||
this.itemMeta = meta
|
this.itemMeta = meta
|
||||||
}
|
}
|
||||||
get() {
|
get() {
|
||||||
val meta = this.itemMeta ?: return null
|
val pdc = this.fast().persistentDataContainer
|
||||||
val pdc = meta.persistentDataContainer
|
|
||||||
val id = pdc.get(spawnEggKey, PersistentDataType.STRING) ?: return null
|
val id = pdc.get(spawnEggKey, PersistentDataType.STRING) ?: return null
|
||||||
return Bosses.getByID(id)
|
return Bosses.getByID(id)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.willfp.ecobosses.bosses
|
||||||
|
|
||||||
|
import com.willfp.eco.core.entities.ai.Goal
|
||||||
|
|
||||||
|
data class ConfiguredGoal<T : Goal<*>>(
|
||||||
|
val priority: Int,
|
||||||
|
val goal: T
|
||||||
|
)
|
||||||
@@ -5,29 +5,19 @@ import com.willfp.eco.core.config.interfaces.Config
|
|||||||
import com.willfp.eco.core.entities.CustomEntity
|
import com.willfp.eco.core.entities.CustomEntity
|
||||||
import com.willfp.eco.core.entities.Entities
|
import com.willfp.eco.core.entities.Entities
|
||||||
import com.willfp.eco.core.entities.TestableEntity
|
import com.willfp.eco.core.entities.TestableEntity
|
||||||
|
import com.willfp.eco.core.entities.ai.*
|
||||||
import com.willfp.eco.core.items.CustomItem
|
import com.willfp.eco.core.items.CustomItem
|
||||||
import com.willfp.eco.core.items.Items
|
import com.willfp.eco.core.items.Items
|
||||||
import com.willfp.eco.core.items.builder.ItemStackBuilder
|
import com.willfp.eco.core.items.builder.ItemStackBuilder
|
||||||
import com.willfp.eco.core.recipe.Recipes
|
import com.willfp.eco.core.recipe.Recipes
|
||||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
|
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
|
||||||
import com.willfp.eco.core.recipe.recipes.CraftingRecipe
|
import com.willfp.eco.core.recipe.recipes.CraftingRecipe
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils
|
||||||
import com.willfp.eco.util.toComponent
|
import com.willfp.eco.util.toComponent
|
||||||
import com.willfp.ecobosses.events.BossKillEvent
|
import com.willfp.ecobosses.events.BossKillEvent
|
||||||
import com.willfp.ecobosses.lifecycle.BossLifecycle
|
import com.willfp.ecobosses.lifecycle.BossLifecycle
|
||||||
import com.willfp.ecobosses.tick.BossBarTicker
|
import com.willfp.ecobosses.tick.*
|
||||||
import com.willfp.ecobosses.tick.BossTicker
|
import com.willfp.ecobosses.util.*
|
||||||
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.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.Holder
|
||||||
import com.willfp.libreforge.conditions.Conditions
|
import com.willfp.libreforge.conditions.Conditions
|
||||||
import com.willfp.libreforge.effects.Effects
|
import com.willfp.libreforge.effects.Effects
|
||||||
@@ -36,16 +26,17 @@ import org.bukkit.Bukkit
|
|||||||
import org.bukkit.Location
|
import org.bukkit.Location
|
||||||
import org.bukkit.Material
|
import org.bukkit.Material
|
||||||
import org.bukkit.entity.LivingEntity
|
import org.bukkit.entity.LivingEntity
|
||||||
|
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 java.util.Objects
|
import org.bukkit.persistence.PersistentDataType
|
||||||
import java.util.UUID
|
import java.util.*
|
||||||
|
|
||||||
class EcoBoss(
|
class EcoBoss(
|
||||||
val config: Config,
|
val config: Config,
|
||||||
private val plugin: EcoPlugin
|
private val plugin: EcoPlugin
|
||||||
) : Holder {
|
) : Holder {
|
||||||
val id: String = config.getString("id")
|
override val id: String = config.getString("id")
|
||||||
|
|
||||||
val displayName: String = config.getString("displayName")
|
val displayName: String = config.getString("displayName")
|
||||||
|
|
||||||
@@ -93,8 +84,15 @@ class EcoBoss(
|
|||||||
return@run null
|
return@run null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val name = config.getFormattedStringOrNull("spawn.egg.name")
|
||||||
|
|
||||||
val item = ItemStackBuilder(lookup)
|
val item = ItemStackBuilder(lookup)
|
||||||
.addLoreLines(config.getFormattedStrings("spawn.egg.lore"))
|
.addLoreLines(config.getFormattedStrings("spawn.egg.lore"))
|
||||||
|
.apply {
|
||||||
|
if (name != null) {
|
||||||
|
setDisplayName(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
.build().apply { bossEgg = this@EcoBoss }
|
.build().apply { bossEgg = this@EcoBoss }
|
||||||
|
|
||||||
val key = plugin.namespacedKeyFactory.create("${this.id}_spawn_egg")
|
val key = plugin.namespacedKeyFactory.create("${this.id}_spawn_egg")
|
||||||
@@ -135,9 +133,9 @@ class EcoBoss(
|
|||||||
}
|
}
|
||||||
|
|
||||||
SpawnTotem(
|
SpawnTotem(
|
||||||
Material.getMaterial(config.getString("spawn.totem.top")) ?: return@run null,
|
Material.getMaterial(config.getString("spawn.totem.top").uppercase()) ?: return@run null,
|
||||||
Material.getMaterial(config.getString("spawn.totem.middle")) ?: return@run null,
|
Material.getMaterial(config.getString("spawn.totem.middle").uppercase()) ?: return@run null,
|
||||||
Material.getMaterial(config.getString("spawn.totem.bottom")) ?: return@run null
|
Material.getMaterial(config.getString("spawn.totem.bottom").uppercase()) ?: return@run null
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,6 +161,22 @@ class EcoBoss(
|
|||||||
locations
|
locations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val hasCustomAI = config.getBool("customai.enabled")
|
||||||
|
|
||||||
|
val targetGoals = config.getSubsections("customai.target-goals").mapNotNull {
|
||||||
|
val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null
|
||||||
|
val deserializer = TargetGoals.getByKey(key) ?: return@mapNotNull null
|
||||||
|
val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null
|
||||||
|
ConfiguredGoal(it.getInt("priority"), goal)
|
||||||
|
}
|
||||||
|
|
||||||
|
val entityGoals = config.getSubsections("customai.ai-goals").mapNotNull {
|
||||||
|
val key = NamespacedKeyUtils.fromStringOrNull(it.getString("key")) ?: return@mapNotNull null
|
||||||
|
val deserializer = EntityGoals.getByKey(key) ?: return@mapNotNull null
|
||||||
|
val goal = deserializer.deserialize(it.getSubsection("args")) ?: return@mapNotNull null
|
||||||
|
ConfiguredGoal(it.getInt("priority"), goal)
|
||||||
|
}
|
||||||
|
|
||||||
val spawnConditions = config.getSubsections("spawn.conditions").mapNotNull {
|
val spawnConditions = config.getSubsections("spawn.conditions").mapNotNull {
|
||||||
Conditions.compile(it, "$id Spawn Conditions")
|
Conditions.compile(it, "$id Spawn Conditions")
|
||||||
}
|
}
|
||||||
@@ -195,6 +209,16 @@ class EcoBoss(
|
|||||||
map
|
map
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val commands: Map<BossLifecycle, LocalCommands> = run {
|
||||||
|
val map = mutableMapOf<BossLifecycle, LocalCommands>()
|
||||||
|
|
||||||
|
for (value in BossLifecycle.values()) {
|
||||||
|
map[value] = LocalCommands(config.getStrings("commands.${value.name.lowercase()}"))
|
||||||
|
}
|
||||||
|
|
||||||
|
map
|
||||||
|
}
|
||||||
|
|
||||||
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>>()
|
||||||
|
|
||||||
@@ -248,6 +272,7 @@ class EcoBoss(
|
|||||||
config.getDouble("chance"),
|
config.getDouble("chance"),
|
||||||
config.getStrings("items")
|
config.getStrings("items")
|
||||||
.map { Items.lookup(it) }
|
.map { Items.lookup(it) }
|
||||||
|
.filter { it !is EmptyTestableItem }
|
||||||
.map { it.item }
|
.map { it.item }
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -285,7 +310,26 @@ class EcoBoss(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun spawn(location: Location): LivingEcoBoss {
|
fun spawn(location: Location): LivingEcoBoss {
|
||||||
val mob = mob.spawn(location) as LivingEntity
|
val mob = mob.spawn(location) as Mob
|
||||||
|
mob.isPersistent = true
|
||||||
|
mob.isCustomNameVisible = true
|
||||||
|
mob.removeWhenFarAway = false
|
||||||
|
mob.persistentDataContainer.set(
|
||||||
|
plugin.namespacedKeyFactory.create("boss"),
|
||||||
|
PersistentDataType.STRING,
|
||||||
|
this.id
|
||||||
|
)
|
||||||
|
|
||||||
|
if (hasCustomAI) {
|
||||||
|
val controller = EntityController.getFor(mob)
|
||||||
|
.clearAllGoals()
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST") // What could go wrong?
|
||||||
|
targetGoals.forEach { controller.addTargetGoal(it.priority, it.goal as TargetGoal<in Mob>) }
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
entityGoals.forEach { controller.addEntityGoal(it.priority, it.goal as EntityGoal<in Mob>) }
|
||||||
|
}
|
||||||
|
|
||||||
val boss = LivingEcoBoss(
|
val boss = LivingEcoBoss(
|
||||||
plugin,
|
plugin,
|
||||||
mob.uniqueId,
|
mob.uniqueId,
|
||||||
@@ -323,6 +367,7 @@ class EcoBoss(
|
|||||||
fun handleLifecycle(lifecycle: BossLifecycle, location: Location, entity: LivingEntity?) {
|
fun handleLifecycle(lifecycle: BossLifecycle, location: Location, entity: LivingEntity?) {
|
||||||
sounds[lifecycle]?.play(location)
|
sounds[lifecycle]?.play(location)
|
||||||
messages[lifecycle]?.forEach { it.broadcast(location, entity?.topDamagers ?: emptyList()) }
|
messages[lifecycle]?.forEach { it.broadcast(location, entity?.topDamagers ?: emptyList()) }
|
||||||
|
commands[lifecycle]?.dispatch(location, entity?.topDamagers ?: emptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
fun processRewards(event: BossKillEvent) {
|
fun processRewards(event: BossKillEvent) {
|
||||||
@@ -331,7 +376,7 @@ class EcoBoss(
|
|||||||
val player = event.killer
|
val player = event.killer
|
||||||
|
|
||||||
for (drop in drops) {
|
for (drop in drops) {
|
||||||
drop.drop(location, player)
|
drop.drop(this, location, player)
|
||||||
}
|
}
|
||||||
|
|
||||||
xp.modify(event.event)
|
xp.modify(event.event)
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
package com.willfp.ecobosses.bosses
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin
|
||||||
|
import com.willfp.eco.core.display.Display
|
||||||
|
import com.willfp.eco.core.display.DisplayModule
|
||||||
|
import com.willfp.eco.core.display.DisplayPriority
|
||||||
|
import com.willfp.eco.core.fast.fast
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class EggDisplay(
|
||||||
|
plugin: EcoPlugin
|
||||||
|
) : DisplayModule(
|
||||||
|
plugin,
|
||||||
|
DisplayPriority.LOW
|
||||||
|
) {
|
||||||
|
override fun display(itemStack: ItemStack, player: Player?, vararg args: Any) {
|
||||||
|
if (player == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val fis = itemStack.fast()
|
||||||
|
|
||||||
|
val lore = fis.lore.toMutableList()
|
||||||
|
|
||||||
|
val egg = itemStack.bossEgg ?: return
|
||||||
|
|
||||||
|
val lines = egg.spawnConditions
|
||||||
|
.filterNot { it.isMet(player) }
|
||||||
|
.mapNotNull { it.notMetLines?.map { line -> Display.PREFIX + line } }
|
||||||
|
.flatten()
|
||||||
|
|
||||||
|
|
||||||
|
if (lines.isNotEmpty()) {
|
||||||
|
lore.add(Display.PREFIX)
|
||||||
|
lore.addAll(lines)
|
||||||
|
}
|
||||||
|
|
||||||
|
fis.lore = lore
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package com.willfp.ecobosses.bosses
|
|||||||
import com.google.common.collect.BiMap
|
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 org.bukkit.GameMode
|
||||||
import org.bukkit.entity.Entity
|
import org.bukkit.entity.Entity
|
||||||
import org.bukkit.entity.LivingEntity
|
import org.bukkit.entity.LivingEntity
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
@@ -23,7 +24,9 @@ class TargetMode(
|
|||||||
boss.boss.targetRange,
|
boss.boss.targetRange,
|
||||||
boss.boss.targetRange,
|
boss.boss.targetRange,
|
||||||
boss.boss.targetRange
|
boss.boss.targetRange
|
||||||
).filterIsInstance<Player>(),
|
).filterIsInstance<Player>()
|
||||||
|
.filter { listOf(GameMode.SURVIVAL, GameMode.ADVENTURE).contains(it.gameMode) }
|
||||||
|
.ifEmpty { return null },
|
||||||
entity
|
entity
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,8 @@ class CommandSpawn(plugin: EcoBossesPlugin) : Subcommand(
|
|||||||
val event = BossSpawnEvent(
|
val event = BossSpawnEvent(
|
||||||
boss,
|
boss,
|
||||||
location,
|
location,
|
||||||
BossSpawnEvent.SpawnReason.COMMAND
|
BossSpawnEvent.SpawnReason.COMMAND,
|
||||||
|
null
|
||||||
)
|
)
|
||||||
|
|
||||||
Bukkit.getPluginManager().callEvent(event)
|
Bukkit.getPluginManager().callEvent(event)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.willfp.ecobosses.events
|
|||||||
|
|
||||||
import com.willfp.ecobosses.bosses.EcoBoss
|
import com.willfp.ecobosses.bosses.EcoBoss
|
||||||
import org.bukkit.Location
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.event.Cancellable
|
import org.bukkit.event.Cancellable
|
||||||
import org.bukkit.event.Event
|
import org.bukkit.event.Event
|
||||||
import org.bukkit.event.HandlerList
|
import org.bukkit.event.HandlerList
|
||||||
@@ -9,7 +10,8 @@ import org.bukkit.event.HandlerList
|
|||||||
class BossSpawnEvent(
|
class BossSpawnEvent(
|
||||||
val boss: EcoBoss,
|
val boss: EcoBoss,
|
||||||
val location: Location,
|
val location: Location,
|
||||||
val reason: SpawnReason
|
val reason: SpawnReason,
|
||||||
|
val spawner: Player?
|
||||||
) : Event(), Cancellable {
|
) : Event(), Cancellable {
|
||||||
private var isCancelled: Boolean = false
|
private var isCancelled: Boolean = false
|
||||||
|
|
||||||
@@ -29,6 +31,7 @@ class BossSpawnEvent(
|
|||||||
TOTEM,
|
TOTEM,
|
||||||
EGG,
|
EGG,
|
||||||
COMMAND,
|
COMMAND,
|
||||||
|
AUTOSPAWN,
|
||||||
UNKNOWN
|
UNKNOWN
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.willfp.ecobosses.events
|
||||||
|
|
||||||
|
import com.willfp.ecobosses.bosses.EcoBoss
|
||||||
|
import com.willfp.ecobosses.bosses.LivingEcoBoss
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
import org.bukkit.event.Event
|
||||||
|
import org.bukkit.event.HandlerList
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class BossTryDropItemEvent(
|
||||||
|
val boss: EcoBoss,
|
||||||
|
val location: Location,
|
||||||
|
var items: MutableCollection<ItemStack>,
|
||||||
|
var chance: Double,
|
||||||
|
val player: Player?
|
||||||
|
): Event() {
|
||||||
|
override fun getHandlers(): HandlerList {
|
||||||
|
return HANDLERS
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val HANDLERS = HandlerList()
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun getHandlerList(): HandlerList {
|
||||||
|
return HANDLERS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package com.willfp.ecobosses.lifecycle
|
||||||
|
|
||||||
|
import com.willfp.ecobosses.events.BossDespawnEvent
|
||||||
|
import com.willfp.ecobosses.events.BossKillEvent
|
||||||
|
import com.willfp.ecobosses.events.BossSpawnEvent
|
||||||
|
import com.willfp.libreforge.LibReforgePlugin
|
||||||
|
import org.bukkit.event.EventHandler
|
||||||
|
import org.bukkit.event.EventPriority
|
||||||
|
import org.bukkit.event.Listener
|
||||||
|
|
||||||
|
class ConsoleLoggers(
|
||||||
|
private val plugin: LibReforgePlugin
|
||||||
|
) : Listener {
|
||||||
|
@EventHandler(
|
||||||
|
ignoreCancelled = true,
|
||||||
|
priority = EventPriority.MONITOR
|
||||||
|
)
|
||||||
|
fun handle(event: BossSpawnEvent) {
|
||||||
|
if (!plugin.configYml.getBool("log-spawn-kill")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val location = "${event.location.world?.name}: ${event.location.x}, ${event.location.y}, ${event.location.z}"
|
||||||
|
|
||||||
|
plugin.logger.info("&a${event.boss.id}&r was spawned by &a${event.spawner?.name}&r at &a$location")
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(
|
||||||
|
ignoreCancelled = true,
|
||||||
|
priority = EventPriority.MONITOR
|
||||||
|
)
|
||||||
|
fun handle(event: BossKillEvent) {
|
||||||
|
if (!plugin.configYml.getBool("log-spawn-kill")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val loc = event.boss.entity?.location
|
||||||
|
val location = "${loc?.world?.name}: ${loc?.x}, ${loc?.y}, ${loc?.z}"
|
||||||
|
|
||||||
|
plugin.logger.info("&a${event.boss.boss.id}&r was killed by &a${event.killer?.name}&r at &a$location")
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(
|
||||||
|
ignoreCancelled = true,
|
||||||
|
priority = EventPriority.MONITOR
|
||||||
|
)
|
||||||
|
fun handle(event: BossDespawnEvent) {
|
||||||
|
if (!plugin.configYml.getBool("log-spawn-kill")) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val loc = event.boss.entity?.location
|
||||||
|
val location = "${loc?.world?.name}: ${loc?.x}, ${loc?.y}, ${loc?.z}"
|
||||||
|
|
||||||
|
plugin.logger.info("&a${event.boss.boss.id}&r despawned at &a$location")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.willfp.ecobosses.lifecycle
|
package com.willfp.ecobosses.lifecycle
|
||||||
|
|
||||||
import com.willfp.eco.core.events.EntityDeathByEntityEvent
|
import com.willfp.eco.core.events.EntityDeathByEntityEvent
|
||||||
|
import com.willfp.eco.util.tryAsPlayer
|
||||||
import com.willfp.ecobosses.bosses.Bosses
|
import com.willfp.ecobosses.bosses.Bosses
|
||||||
import com.willfp.ecobosses.events.BossKillEvent
|
import com.willfp.ecobosses.events.BossKillEvent
|
||||||
import com.willfp.libreforge.tryAsPlayer
|
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package com.willfp.ecobosses.spawn
|
|||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin
|
import com.willfp.eco.core.EcoPlugin
|
||||||
import com.willfp.ecobosses.bosses.Bosses
|
import com.willfp.ecobosses.bosses.Bosses
|
||||||
|
import com.willfp.ecobosses.events.BossSpawnEvent
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
|
||||||
object AutospawnHandler {
|
object AutospawnHandler {
|
||||||
private var tick = 1
|
private var tick = 1
|
||||||
@@ -20,11 +22,19 @@ object AutospawnHandler {
|
|||||||
val location = boss.autoSpawnLocations.randomOrNull() ?: continue
|
val location = boss.autoSpawnLocations.randomOrNull() ?: continue
|
||||||
val world = location.world ?: continue
|
val world = location.world ?: continue
|
||||||
|
|
||||||
if (Bosses.getAllAlive().mapNotNull { it.entity }.any { it.world == world }) {
|
if (plugin.configYml.getBool("autospawn.one-boss-per-world")) {
|
||||||
continue
|
if (Bosses.getAllAlive().mapNotNull { it.entity }.any { it.world == world }) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
boss.spawn(location)
|
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.AUTOSPAWN, null)
|
||||||
|
|
||||||
|
Bukkit.getPluginManager().callEvent(spawnEvent)
|
||||||
|
|
||||||
|
if (!spawnEvent.isCancelled) {
|
||||||
|
boss.spawn(location)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tick++
|
tick++
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class SpawnEggHandler : Listener {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.EGG)
|
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.EGG, player)
|
||||||
|
|
||||||
Bukkit.getPluginManager().callEvent(spawnEvent)
|
Bukkit.getPluginManager().callEvent(spawnEvent)
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.willfp.eco.util.containsIgnoreCase
|
|||||||
import com.willfp.ecobosses.bosses.Bosses
|
import com.willfp.ecobosses.bosses.Bosses
|
||||||
import com.willfp.ecobosses.events.BossSpawnEvent
|
import com.willfp.ecobosses.events.BossSpawnEvent
|
||||||
import com.willfp.ecobosses.util.SpawnTotem
|
import com.willfp.ecobosses.util.SpawnTotem
|
||||||
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.Material
|
import org.bukkit.Material
|
||||||
import org.bukkit.block.Block
|
import org.bukkit.block.Block
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
@@ -16,36 +17,36 @@ class SpawnTotemHandler : Listener {
|
|||||||
)
|
)
|
||||||
fun handle(event: BlockPlaceEvent) {
|
fun handle(event: BlockPlaceEvent) {
|
||||||
for (i in 0..2) {
|
for (i in 0..2) {
|
||||||
lateinit var block1: Block
|
lateinit var top: Block
|
||||||
lateinit var block2: Block
|
lateinit var middle: Block
|
||||||
lateinit var block3: Block
|
lateinit var bottom: Block
|
||||||
|
|
||||||
// I know this code sucks ass, but I can't be arsed to write it nicely
|
// I know this code sucks ass, but I can't be arsed to write it nicely
|
||||||
when (i) {
|
when (i) {
|
||||||
0 -> {
|
0 -> {
|
||||||
block3 = event.block
|
top = event.block
|
||||||
block2 = event.block.getRelative(0, -1, 0)
|
middle = event.block.getRelative(0, -1, 0)
|
||||||
block1 = event.block.getRelative(0, -2, 0)
|
bottom = event.block.getRelative(0, -2, 0)
|
||||||
}
|
}
|
||||||
1 -> {
|
1 -> {
|
||||||
block1 = event.block
|
top = event.block.getRelative(0, 2, 0)
|
||||||
block2 = event.block.getRelative(0, 1, 0)
|
middle = event.block.getRelative(0, 1, 0)
|
||||||
block3 = event.block.getRelative(0, 2, 0)
|
bottom = event.block
|
||||||
}
|
}
|
||||||
2 -> {
|
2 -> {
|
||||||
block2 = event.block
|
top = event.block.getRelative(0, 1, 0)
|
||||||
block1 = event.block.getRelative(0, -1, 0)
|
middle = event.block
|
||||||
block3 = event.block.getRelative(0, 1, 0)
|
bottom = event.block.getRelative(0, -1, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val placedTotem = SpawnTotem(block1.type, block2.type, block3.type)
|
val placedTotem = SpawnTotem(top.type, middle.type, bottom.type)
|
||||||
for (boss in Bosses.values()) {
|
for (boss in Bosses.values()) {
|
||||||
if (boss.totem == null || boss.disabledTotemWorlds.containsIgnoreCase(event.block.world.name)) {
|
if (boss.totem == null || boss.disabledTotemWorlds.containsIgnoreCase(event.block.world.name)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if (boss.totem != placedTotem) {
|
if (!boss.totem.matches(placedTotem)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,12 +56,14 @@ class SpawnTotemHandler : Listener {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val spawnEvent = BossSpawnEvent(boss, event.block.location, BossSpawnEvent.SpawnReason.TOTEM)
|
val spawnEvent = BossSpawnEvent(boss, event.block.location, BossSpawnEvent.SpawnReason.TOTEM, player)
|
||||||
|
|
||||||
|
Bukkit.getPluginManager().callEvent(spawnEvent)
|
||||||
|
|
||||||
if (!spawnEvent.isCancelled) {
|
if (!spawnEvent.isCancelled) {
|
||||||
block1.type = Material.AIR
|
top.type = Material.AIR
|
||||||
block2.type = Material.AIR
|
middle.type = Material.AIR
|
||||||
block3.type = Material.AIR
|
bottom.type = Material.AIR
|
||||||
|
|
||||||
boss.spawn(event.block.location.add(0.0, 1.5, 0.0))
|
boss.spawn(event.block.location.add(0.0, 1.5, 0.0))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
package com.willfp.ecobosses.util
|
package com.willfp.ecobosses.util
|
||||||
|
|
||||||
|
import com.willfp.eco.util.tryAsPlayer
|
||||||
import com.willfp.ecobosses.EcoBossesPlugin
|
import com.willfp.ecobosses.EcoBossesPlugin
|
||||||
import com.willfp.libreforge.tryAsPlayer
|
|
||||||
import org.bukkit.entity.LivingEntity
|
import org.bukkit.entity.LivingEntity
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.EventPriority
|
import org.bukkit.event.EventPriority
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
import org.bukkit.event.entity.EntityDamageByEntityEvent
|
||||||
import java.util.UUID
|
import java.util.*
|
||||||
|
|
||||||
data class Damager(
|
data class Damager(
|
||||||
val uuid: UUID,
|
val uuid: UUID,
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.ecobosses.util
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config
|
||||||
|
import com.willfp.eco.util.NumberUtils
|
||||||
|
import com.willfp.eco.util.savedDisplayName
|
||||||
|
import com.willfp.ecobosses.EcoBossesPlugin
|
||||||
|
import org.bukkit.Bukkit
|
||||||
|
import org.bukkit.Location
|
||||||
|
|
||||||
|
data class LocalCommands(
|
||||||
|
val commands: Iterable<String>,
|
||||||
|
) {
|
||||||
|
fun dispatch(location: Location, topDamagers: List<Damager>) {
|
||||||
|
val toDispatch = commands.toMutableList()
|
||||||
|
toDispatch.replaceAll {
|
||||||
|
var command = it
|
||||||
|
|
||||||
|
for (i in 1..20) {
|
||||||
|
val damager = topDamagers.getOrNull(i - 1)
|
||||||
|
val damage = if (damager?.damage != null) NumberUtils.format(damager.damage) else
|
||||||
|
EcoBossesPlugin.instance.langYml.getFormattedString("na")
|
||||||
|
val player = if (damager?.uuid != null) Bukkit.getOfflinePlayer(damager.uuid).savedDisplayName else
|
||||||
|
EcoBossesPlugin.instance.langYml.getFormattedString("na")
|
||||||
|
|
||||||
|
command = command.replace("%damage_${i}%", damage)
|
||||||
|
.replace("%damage_${i}_player%", player)
|
||||||
|
}
|
||||||
|
|
||||||
|
command.replace("%x%", location.blockX.toString())
|
||||||
|
.replace("%y%", location.blockY.toString())
|
||||||
|
.replace("%z%", location.blockZ.toString())
|
||||||
|
}
|
||||||
|
|
||||||
|
for (s in toDispatch) {
|
||||||
|
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,8 @@ package com.willfp.ecobosses.util
|
|||||||
|
|
||||||
import com.willfp.eco.core.drops.DropQueue
|
import com.willfp.eco.core.drops.DropQueue
|
||||||
import com.willfp.eco.util.NumberUtils
|
import com.willfp.eco.util.NumberUtils
|
||||||
|
import com.willfp.ecobosses.bosses.EcoBoss
|
||||||
|
import com.willfp.ecobosses.events.BossTryDropItemEvent
|
||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.Location
|
import org.bukkit.Location
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
@@ -12,15 +14,19 @@ data class BossDrop(
|
|||||||
val chance: Double,
|
val chance: Double,
|
||||||
val drops: Collection<ItemStack>
|
val drops: Collection<ItemStack>
|
||||||
) {
|
) {
|
||||||
fun drop(location: Location, player: Player?) {
|
fun drop(boss: EcoBoss, location: Location, player: Player?) {
|
||||||
if (NumberUtils.randFloat(0.0, 100.0) < chance) {
|
val event = BossTryDropItemEvent(boss, location, drops.toMutableList(), chance, player)
|
||||||
|
|
||||||
|
Bukkit.getPluginManager().callEvent(event)
|
||||||
|
|
||||||
|
if (NumberUtils.randFloat(0.0, 100.0) < event.chance) {
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
DropQueue(player)
|
DropQueue(player)
|
||||||
.setLocation(location)
|
.setLocation(event.location)
|
||||||
.addItems(drops)
|
.addItems(event.items)
|
||||||
.push()
|
.push()
|
||||||
} else {
|
} else {
|
||||||
for (drop in drops) {
|
for (drop in event.items) {
|
||||||
location.world?.dropItemNaturally(location, drop)
|
location.world?.dropItemNaturally(location, drop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,4 +6,10 @@ data class SpawnTotem(
|
|||||||
val top: Material,
|
val top: Material,
|
||||||
val middle: Material,
|
val middle: Material,
|
||||||
val bottom: Material
|
val bottom: Material
|
||||||
)
|
) {
|
||||||
|
fun matches(totem: SpawnTotem): Boolean {
|
||||||
|
return this.top == totem.top
|
||||||
|
&& this.middle == totem.middle
|
||||||
|
&& this.bottom == totem.bottom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,10 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
discover-recipes: true
|
discover-recipes: true
|
||||||
|
log-spawn-kill: true
|
||||||
|
|
||||||
|
autospawn:
|
||||||
|
one-boss-per-world: true # If only one boss can auto-spawn per world at once.
|
||||||
|
|
||||||
cooldown:
|
cooldown:
|
||||||
in-actionbar: true
|
in-actionbar: true
|
||||||
@@ -31,4 +35,15 @@ point-names: # If you have point names that look ugly (eg g_souls) then you can
|
|||||||
|
|
||||||
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
|
||||||
raytrace-distance: 80 # The distance that alt_click should check for a location
|
raytrace-distance: 80 # The distance that alt_click should check for a location
|
||||||
block-item-drop-place-check: true # If the block_item_drop trigger should only fire on naturally placed blocks (prevents dupes)
|
block-item-drop-place-check: true # If the block_item_drop trigger should only fire on naturally placed blocks (prevents dupes)
|
||||||
|
|
||||||
|
potions:
|
||||||
|
icon:
|
||||||
|
permanent: true
|
||||||
|
triggered: true
|
||||||
|
ambient:
|
||||||
|
permanent: false
|
||||||
|
triggered: true
|
||||||
|
particles:
|
||||||
|
permanent: false
|
||||||
|
triggered: true
|
||||||
3
eco-core/core-plugin/src/main/resources/eco.yml
Normal file
3
eco-core/core-plugin/src/main/resources/eco.yml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
resource-id: 525
|
||||||
|
bstats-id: 10635
|
||||||
|
color: "&9"
|
||||||
@@ -26,6 +26,10 @@ bosses:
|
|||||||
# 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%"
|
displayName: "&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.
|
||||||
|
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
|
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
|
- id: run_chain
|
||||||
args:
|
args:
|
||||||
@@ -106,7 +110,8 @@ bosses:
|
|||||||
notInWorlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here
|
notInWorlds: [ ] # 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 name:"&8Steel Golem&f Spawn Egg"
|
item: evoker_spawn_egg unbreaking:1 hide_enchants
|
||||||
|
name: "&8Steel Golem&f Spawn Egg"
|
||||||
lore:
|
lore:
|
||||||
- ""
|
- ""
|
||||||
- "&8&oPlace on the ground to"
|
- "&8&oPlace on the ground to"
|
||||||
@@ -122,6 +127,13 @@ bosses:
|
|||||||
- iron_block
|
- iron_block
|
||||||
- netherite_block
|
- netherite_block
|
||||||
- iron_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:
|
messages:
|
||||||
# For each category, you can add as many messages as you want, each with their own radius.
|
# 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
|
# Radius is the distance from the boss where the player will be sent the message
|
||||||
|
|||||||
@@ -18,5 +18,6 @@ messages:
|
|||||||
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
|
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: "&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-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"
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
name: EcoBosses
|
name: EcoBosses
|
||||||
version: ${projectVersion}
|
version: ${projectVersion}
|
||||||
main: com.willfp.ecobosses.EcoBossesPlugin
|
main: com.willfp.ecobosses.EcoBossesPlugin
|
||||||
api-version: 1.16
|
api-version: 1.17
|
||||||
authors: [Auxilor]
|
authors: [Auxilor]
|
||||||
website: willfp.com
|
website: willfp.com
|
||||||
load: STARTUP
|
load: STARTUP
|
||||||
@@ -9,11 +9,17 @@ depend:
|
|||||||
- eco
|
- eco
|
||||||
softdepend:
|
softdepend:
|
||||||
- LevelledMobs
|
- LevelledMobs
|
||||||
- EcoSkills
|
|
||||||
- AureliumSkills
|
- AureliumSkills
|
||||||
- Jobs
|
- Jobs
|
||||||
- mcMMO
|
- mcMMO
|
||||||
- Vault
|
- Vault
|
||||||
|
- TMMobcoins
|
||||||
|
- EcoEnchants
|
||||||
|
- Talismans
|
||||||
|
- EcoArmor
|
||||||
|
- EcoItems
|
||||||
|
- EcoSkills
|
||||||
|
- Boosters
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
ecobosses:
|
ecobosses:
|
||||||
|
|||||||
@@ -1,2 +1,4 @@
|
|||||||
version = 8.0.0
|
#libreforge-updater
|
||||||
plugin-name = EcoBosses
|
#Sat Jun 18 12:19:23 BST 2022
|
||||||
|
version=8.49.0
|
||||||
|
plugin-name=EcoBosses
|
||||||
|
|||||||
Reference in New Issue
Block a user