Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6ad33e98fc | ||
|
|
c60c64c6b3 | ||
|
|
9eb67d5204 | ||
|
|
77f08961b8 | ||
|
|
be4c70e0c5 | ||
|
|
614831687f | ||
|
|
3ea5d8f4d3 | ||
|
|
2e472abc98 | ||
|
|
927c1fbcae | ||
|
|
7e6b5c4b80 |
@@ -21,7 +21,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
[](https://discord.gg/ZcwpSsE/)
|
[](https://discord.gg/ZcwpSsE/)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
*Click here to read [the entire license](https://github.com/Auxilor/EcoPets/blob/master/LICENSE.md).*
|
*Click here to read [the entire license](https://github.com/Auxilor/EcoPets/blob/master/LICENSE.md).*
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ allprojects {
|
|||||||
maven { url 'https://repo.codemc.io/repository/maven-public/' }
|
maven { url 'https://repo.codemc.io/repository/maven-public/' }
|
||||||
maven { url 'https://repo.dmulloy2.net/repository/public/' }
|
maven { url 'https://repo.dmulloy2.net/repository/public/' }
|
||||||
maven { url 'https://repo.essentialsx.net/releases/' }
|
maven { url 'https://repo.essentialsx.net/releases/' }
|
||||||
|
maven { url 'https://mvn.lumine.io/repository/maven-public/' }
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
@@ -47,7 +48,7 @@ allprojects {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly 'com.willfp:eco:6.37.1'
|
compileOnly 'com.willfp:eco:6.37.1'
|
||||||
implementation 'com.willfp:libreforge:3.64.0'
|
implementation 'com.willfp:libreforge:3.65.0'
|
||||||
implementation 'org.joml:joml:1.10.4'
|
implementation 'org.joml:joml:1.10.4'
|
||||||
|
|
||||||
compileOnly 'org.jetbrains:annotations:23.0.0'
|
compileOnly 'org.jetbrains:annotations:23.0.0'
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ dependencies {
|
|||||||
compileOnly 'net.kyori:adventure-api:4.10.1'
|
compileOnly 'net.kyori:adventure-api:4.10.1'
|
||||||
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
|
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
|
||||||
compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
|
compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
|
||||||
|
compileOnly 'com.ticxo.modelengine:api:R2.5.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
build.dependsOn publishToMavenLocal
|
build.dependsOn publishToMavenLocal
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.ecopets
|
package com.willfp.ecopets
|
||||||
|
|
||||||
import com.willfp.eco.core.command.impl.PluginCommand
|
import com.willfp.eco.core.command.impl.PluginCommand
|
||||||
|
import com.willfp.eco.core.integrations.IntegrationLoader
|
||||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder
|
import com.willfp.eco.core.placeholder.PlayerPlaceholder
|
||||||
import com.willfp.eco.util.toSingletonList
|
import com.willfp.eco.util.toSingletonList
|
||||||
import com.willfp.ecopets.commands.CommandEcopets
|
import com.willfp.ecopets.commands.CommandEcopets
|
||||||
@@ -12,6 +13,8 @@ import com.willfp.ecopets.pets.PetTriggerXPGainListener
|
|||||||
import com.willfp.ecopets.pets.SpawnEggHandler
|
import com.willfp.ecopets.pets.SpawnEggHandler
|
||||||
import com.willfp.ecopets.pets.activePet
|
import com.willfp.ecopets.pets.activePet
|
||||||
import com.willfp.ecopets.pets.activePetLevel
|
import com.willfp.ecopets.pets.activePetLevel
|
||||||
|
import com.willfp.ecopets.pets.entity.ModelEnginePetEntity
|
||||||
|
import com.willfp.ecopets.pets.entity.PetEntity
|
||||||
import com.willfp.libreforge.LibReforgePlugin
|
import com.willfp.libreforge.LibReforgePlugin
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
|
|
||||||
@@ -48,6 +51,16 @@ class EcoPetsPlugin : LibReforgePlugin() {
|
|||||||
petDisplay.shutdown()
|
petDisplay.shutdown()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun loadAdditionalIntegrations(): List<IntegrationLoader> {
|
||||||
|
return listOf(
|
||||||
|
IntegrationLoader("ModelEngine") {
|
||||||
|
PetEntity.registerPetEntity("modelengine") { pet, id ->
|
||||||
|
ModelEnginePetEntity(pet, id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
override fun loadPluginCommands(): List<PluginCommand> {
|
override fun loadPluginCommands(): List<PluginCommand> {
|
||||||
return listOf(
|
return listOf(
|
||||||
CommandEcopets(this),
|
CommandEcopets(this),
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import com.willfp.eco.core.fast.fast
|
|||||||
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.items.builder.SkullBuilder
|
|
||||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder
|
import com.willfp.eco.core.placeholder.PlayerPlaceholder
|
||||||
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder
|
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder
|
||||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder
|
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder
|
||||||
@@ -21,6 +20,7 @@ import com.willfp.eco.util.toNiceString
|
|||||||
import com.willfp.ecopets.EcoPetsPlugin
|
import com.willfp.ecopets.EcoPetsPlugin
|
||||||
import com.willfp.ecopets.api.event.PlayerPetExpGainEvent
|
import com.willfp.ecopets.api.event.PlayerPetExpGainEvent
|
||||||
import com.willfp.ecopets.api.event.PlayerPetLevelUpEvent
|
import com.willfp.ecopets.api.event.PlayerPetLevelUpEvent
|
||||||
|
import com.willfp.ecopets.pets.entity.PetEntity
|
||||||
import com.willfp.libreforge.conditions.Conditions
|
import com.willfp.libreforge.conditions.Conditions
|
||||||
import com.willfp.libreforge.conditions.ConfiguredCondition
|
import com.willfp.libreforge.conditions.ConfiguredCondition
|
||||||
import com.willfp.libreforge.effects.ConfiguredEffect
|
import com.willfp.libreforge.effects.ConfiguredEffect
|
||||||
@@ -112,9 +112,7 @@ class Pet(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val petEntityItem: ItemStack = SkullBuilder()
|
val entityTexture = config.getString("entity-texture")
|
||||||
.setSkullTexture(config.getString("entity-texture"))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
private val levelXpRequirements = listOf(0) + config.getInts("level-xp-requirements")
|
private val levelXpRequirements = listOf(0) + config.getInts("level-xp-requirements")
|
||||||
|
|
||||||
@@ -153,12 +151,15 @@ class Pet(
|
|||||||
private val petXpGains = config.getSubsections("xp-gain-methods").mapNotNull {
|
private val petXpGains = config.getSubsections("xp-gain-methods").mapNotNull {
|
||||||
val trigger = Triggers.getById(it.getString("id")) ?: return@mapNotNull null
|
val trigger = Triggers.getById(it.getString("id")) ?: return@mapNotNull null
|
||||||
val multiplier = it.getDouble("multiplier")
|
val multiplier = it.getDouble("multiplier")
|
||||||
|
val conditions = it.getSubsections("conditions")
|
||||||
|
.mapNotNull { cfg -> Conditions.compile(cfg, "Pet $id XP Gain methods") }
|
||||||
|
|
||||||
PetXPGain(
|
trigger to PetXPGain(
|
||||||
trigger,
|
trigger,
|
||||||
multiplier
|
multiplier,
|
||||||
|
conditions
|
||||||
)
|
)
|
||||||
}
|
}.toMap()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
config.injectPlaceholders(
|
config.injectPlaceholders(
|
||||||
@@ -239,6 +240,10 @@ class Pet(
|
|||||||
}.register()
|
}.register()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun makePetEntity(): PetEntity {
|
||||||
|
return PetEntity.create(this)
|
||||||
|
}
|
||||||
|
|
||||||
fun getLevel(level: Int): PetLevel = levels.get(level) {
|
fun getLevel(level: Int): PetLevel = levels.get(level) {
|
||||||
PetLevel(this, it, effects, conditions)
|
PetLevel(this, it, effects, conditions)
|
||||||
}
|
}
|
||||||
@@ -396,12 +401,8 @@ class Pet(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun canGainXPFromTrigger(trigger: Trigger): Boolean {
|
fun getPetXPGain(trigger: Trigger): PetXPGain? {
|
||||||
return petXpGains.any { it.trigger == trigger }
|
return petXpGains[trigger]
|
||||||
}
|
|
||||||
|
|
||||||
fun getTriggerXPMultiplier(trigger: Trigger): Double {
|
|
||||||
return petXpGains.firstOrNull { it.trigger == trigger }?.multiplier ?: 1.0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
override fun equals(other: Any?): Boolean {
|
||||||
|
|||||||
@@ -6,16 +6,13 @@ import com.willfp.eco.util.formatEco
|
|||||||
import org.bukkit.Bukkit
|
import org.bukkit.Bukkit
|
||||||
import org.bukkit.Location
|
import org.bukkit.Location
|
||||||
import org.bukkit.entity.ArmorStand
|
import org.bukkit.entity.ArmorStand
|
||||||
import org.bukkit.entity.EntityType
|
|
||||||
import org.bukkit.entity.Player
|
import org.bukkit.entity.Player
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
import org.bukkit.event.Listener
|
import org.bukkit.event.Listener
|
||||||
import org.bukkit.event.player.PlayerQuitEvent
|
import org.bukkit.event.player.PlayerQuitEvent
|
||||||
import org.bukkit.inventory.EquipmentSlot
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import kotlin.math.PI
|
import kotlin.math.PI
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
import kotlin.math.sin
|
|
||||||
|
|
||||||
class PetDisplay(
|
class PetDisplay(
|
||||||
private val plugin: EcoPlugin
|
private val plugin: EcoPlugin
|
||||||
@@ -37,7 +34,6 @@ class PetDisplay(
|
|||||||
val pet = player.activePet
|
val pet = player.activePet
|
||||||
|
|
||||||
if (pet != null) {
|
if (pet != null) {
|
||||||
stand.equipment?.helmet = pet.petEntityItem
|
|
||||||
stand.customName = plugin.configYml.getString("pet-entity.name")
|
stand.customName = plugin.configYml.getString("pet-entity.name")
|
||||||
.replace("%player%", player.displayName)
|
.replace("%player%", player.displayName)
|
||||||
.replace("%pet%", pet.name)
|
.replace("%pet%", pet.name)
|
||||||
@@ -49,7 +45,10 @@ class PetDisplay(
|
|||||||
location.y += NumberUtils.fastSin(tick / (2 * PI) * 0.5) * 0.15
|
location.y += NumberUtils.fastSin(tick / (2 * PI) * 0.5) * 0.15
|
||||||
|
|
||||||
stand.teleport(location)
|
stand.teleport(location)
|
||||||
stand.setRotation((20 * tick / (2 * PI)).toFloat(), 0f)
|
|
||||||
|
if (!pet.entityTexture.contains(":")) {
|
||||||
|
stand.setRotation((20 * tick / (2 * PI)).toFloat(), 0f)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,24 +74,9 @@ class PetDisplay(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val location = getLocation(player)
|
val location = getLocation(player)
|
||||||
val newStand = location.world!!.spawnEntity(location, EntityType.ARMOR_STAND) as ArmorStand
|
val stand = pet.makePetEntity().spawn(location)
|
||||||
newStand.isVisible = false
|
|
||||||
newStand.isInvulnerable = true
|
|
||||||
newStand.isPersistent = true
|
|
||||||
newStand.removeWhenFarAway = false
|
|
||||||
newStand.isSmall = true
|
|
||||||
newStand.setGravity(false)
|
|
||||||
newStand.isCollidable = false
|
|
||||||
|
|
||||||
for (slot in EquipmentSlot.values()) {
|
trackedEntities[player.uniqueId] = stand
|
||||||
newStand.addEquipmentLock(slot, ArmorStand.LockType.ADDING_OR_CHANGING)
|
|
||||||
}
|
|
||||||
|
|
||||||
newStand.equipment?.helmet = pet.petEntityItem
|
|
||||||
newStand.isCustomNameVisible = true
|
|
||||||
newStand.customName = pet.name
|
|
||||||
|
|
||||||
trackedEntities[player.uniqueId] = newStand
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return trackedEntities[player.uniqueId]
|
return trackedEntities[player.uniqueId]
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.ecopets.pets
|
package com.willfp.ecopets.pets
|
||||||
|
|
||||||
|
import com.willfp.libreforge.conditions.ConfiguredCondition
|
||||||
import com.willfp.libreforge.events.TriggerPreProcessEvent
|
import com.willfp.libreforge.events.TriggerPreProcessEvent
|
||||||
import com.willfp.libreforge.triggers.Trigger
|
import com.willfp.libreforge.triggers.Trigger
|
||||||
import org.bukkit.event.EventHandler
|
import org.bukkit.event.EventHandler
|
||||||
@@ -7,10 +8,11 @@ import org.bukkit.event.Listener
|
|||||||
|
|
||||||
data class PetXPGain(
|
data class PetXPGain(
|
||||||
val trigger: Trigger,
|
val trigger: Trigger,
|
||||||
val multiplier: Double
|
val multiplier: Double,
|
||||||
|
val conditions: Iterable<ConfiguredCondition>
|
||||||
)
|
)
|
||||||
|
|
||||||
object PetTriggerXPGainListener: Listener {
|
object PetTriggerXPGainListener : Listener {
|
||||||
@EventHandler(ignoreCancelled = true)
|
@EventHandler(ignoreCancelled = true)
|
||||||
fun handle(event: TriggerPreProcessEvent) {
|
fun handle(event: TriggerPreProcessEvent) {
|
||||||
val player = event.player
|
val player = event.player
|
||||||
@@ -19,11 +21,15 @@ object PetTriggerXPGainListener: Listener {
|
|||||||
|
|
||||||
val pet = event.player.activePet ?: return
|
val pet = event.player.activePet ?: return
|
||||||
|
|
||||||
if (pet.canGainXPFromTrigger(trigger)) {
|
val xpGain = pet.getPetXPGain(trigger) ?: return
|
||||||
player.givePetExperience(
|
|
||||||
pet,
|
if (xpGain.conditions.any { !it.isMet(player) }) {
|
||||||
value * pet.getTriggerXPMultiplier(trigger)
|
return
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
player.givePetExperience(
|
||||||
|
pet,
|
||||||
|
value * xpGain.multiplier
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.willfp.ecopets.pets.entity
|
||||||
|
|
||||||
|
import com.ticxo.modelengine.api.ModelEngineAPI
|
||||||
|
import com.willfp.ecopets.pets.Pet
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.entity.ArmorStand
|
||||||
|
import org.bukkit.entity.EntityType
|
||||||
|
import org.bukkit.inventory.EquipmentSlot
|
||||||
|
|
||||||
|
class ModelEnginePetEntity(
|
||||||
|
pet: Pet,
|
||||||
|
private val modelID: String
|
||||||
|
) : PetEntity(pet) {
|
||||||
|
override fun spawn(location: Location): ArmorStand {
|
||||||
|
val stand = location.world!!.spawnEntity(location, EntityType.ARMOR_STAND) as ArmorStand
|
||||||
|
stand.isVisible = false
|
||||||
|
stand.isInvulnerable = true
|
||||||
|
stand.isPersistent = true
|
||||||
|
stand.removeWhenFarAway = false
|
||||||
|
stand.isSmall = true
|
||||||
|
stand.setGravity(false)
|
||||||
|
stand.isCollidable = false
|
||||||
|
|
||||||
|
for (slot in EquipmentSlot.values()) {
|
||||||
|
stand.addEquipmentLock(slot, ArmorStand.LockType.ADDING_OR_CHANGING)
|
||||||
|
}
|
||||||
|
|
||||||
|
val model = ModelEngineAPI.createActiveModel(modelID)
|
||||||
|
val modelled = ModelEngineAPI.createModeledEntity(stand)
|
||||||
|
modelled.addActiveModel(model)
|
||||||
|
|
||||||
|
stand.isCustomNameVisible = true
|
||||||
|
stand.customName = pet.name
|
||||||
|
|
||||||
|
return stand
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.ecopets.pets.entity
|
||||||
|
|
||||||
|
import com.willfp.ecopets.pets.Pet
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.entity.ArmorStand
|
||||||
|
|
||||||
|
abstract class PetEntity(
|
||||||
|
val pet: Pet
|
||||||
|
) {
|
||||||
|
abstract fun spawn(location: Location): ArmorStand
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val registrations = mutableMapOf<String, (Pet, String) -> PetEntity>()
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun registerPetEntity(id: String, parse: (Pet, String) -> PetEntity) {
|
||||||
|
registrations[id] = parse
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
fun create(pet: Pet): PetEntity {
|
||||||
|
val texture = pet.entityTexture
|
||||||
|
|
||||||
|
if (!texture.contains(":")) {
|
||||||
|
return SkullPetEntity(pet)
|
||||||
|
}
|
||||||
|
|
||||||
|
val id = texture.split(":")[0]
|
||||||
|
val parse = registrations[id] ?: return SkullPetEntity(pet)
|
||||||
|
return parse(pet, texture.removePrefix("$id:"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.ecopets.pets.entity
|
||||||
|
|
||||||
|
import com.willfp.eco.core.items.builder.SkullBuilder
|
||||||
|
import com.willfp.ecopets.pets.Pet
|
||||||
|
import org.bukkit.Location
|
||||||
|
import org.bukkit.entity.ArmorStand
|
||||||
|
import org.bukkit.entity.Entity
|
||||||
|
import org.bukkit.entity.EntityType
|
||||||
|
import org.bukkit.inventory.EquipmentSlot
|
||||||
|
import org.bukkit.inventory.ItemStack
|
||||||
|
|
||||||
|
class SkullPetEntity(pet: Pet) : PetEntity(pet) {
|
||||||
|
override fun spawn(location: Location): ArmorStand {
|
||||||
|
val newStand = location.world!!.spawnEntity(location, EntityType.ARMOR_STAND) as ArmorStand
|
||||||
|
newStand.isVisible = false
|
||||||
|
newStand.isInvulnerable = true
|
||||||
|
newStand.isPersistent = true
|
||||||
|
newStand.removeWhenFarAway = false
|
||||||
|
newStand.isSmall = true
|
||||||
|
newStand.setGravity(false)
|
||||||
|
newStand.isCollidable = false
|
||||||
|
|
||||||
|
for (slot in EquipmentSlot.values()) {
|
||||||
|
newStand.addEquipmentLock(slot, ArmorStand.LockType.ADDING_OR_CHANGING)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val skull: ItemStack = SkullBuilder()
|
||||||
|
.setSkullTexture(pet.entityTexture)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
newStand.equipment?.helmet = skull
|
||||||
|
newStand.isCustomNameVisible = true
|
||||||
|
newStand.customName = pet.name
|
||||||
|
|
||||||
|
return newStand
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -65,6 +65,7 @@ pets:
|
|||||||
xp-gain-methods:
|
xp-gain-methods:
|
||||||
- id: melee_attack
|
- id: melee_attack
|
||||||
multiplier: 0.5
|
multiplier: 0.5
|
||||||
|
conditions: [ ] # You can add a list of conditions that must be met on xp gain
|
||||||
|
|
||||||
# Custom placeholders to be used in descriptions,
|
# Custom placeholders to be used in descriptions,
|
||||||
# Don't add % to the IDs, this is done automatically
|
# Don't add % to the IDs, this is done automatically
|
||||||
@@ -110,6 +111,7 @@ pets:
|
|||||||
conditions: [ ]
|
conditions: [ ]
|
||||||
|
|
||||||
# The texture of the pet entity in game
|
# The texture of the pet entity in game
|
||||||
|
# If you're using modelengine, use modelengine:id as the texture
|
||||||
entity-texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTA5NWZjYzFlM2Q3Y2JkMzUwZjE5YjM4OTQ5OGFiOGJiOTZjNjVhZDE4NWQzNDU5MjA2N2E3ZDAzM2FjNDhkZSJ9fX0="
|
entity-texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTA5NWZjYzFlM2Q3Y2JkMzUwZjE5YjM4OTQ5OGFiOGJiOTZjNjVhZDE4NWQzNDU5MjA2N2E3ZDAzM2FjNDhkZSJ9fX0="
|
||||||
|
|
||||||
# The icon in GUIs
|
# The icon in GUIs
|
||||||
@@ -229,4 +231,108 @@ pets:
|
|||||||
- "&8&oPlace on the ground to"
|
- "&8&oPlace on the ground to"
|
||||||
- "&8&ounlock the &r<gradient:#F2F2F2>Skeleton</gradient:#DBDBDB>&8&o pet!"
|
- "&8&ounlock the &r<gradient:#F2F2F2>Skeleton</gradient:#DBDBDB>&8&o pet!"
|
||||||
craftable: false
|
craftable: false
|
||||||
|
recipe: [ ]
|
||||||
|
|
||||||
|
- id: ravager
|
||||||
|
name: "<gradient:#1e3c72>Ravager</gradient:#2a5298>"
|
||||||
|
description: "&8&oLevel up by successfully defending against village raids"
|
||||||
|
|
||||||
|
level-xp-requirements:
|
||||||
|
- 50
|
||||||
|
- 150
|
||||||
|
- 300
|
||||||
|
- 500
|
||||||
|
- 750
|
||||||
|
- 1000
|
||||||
|
- 1300
|
||||||
|
- 1650
|
||||||
|
- 2050
|
||||||
|
- 2500
|
||||||
|
- 3000
|
||||||
|
- 3550
|
||||||
|
- 4150
|
||||||
|
- 4800
|
||||||
|
- 5500
|
||||||
|
- 6250
|
||||||
|
- 7050
|
||||||
|
- 7900
|
||||||
|
- 8800
|
||||||
|
- 9750
|
||||||
|
- 10750
|
||||||
|
- 11800
|
||||||
|
- 12900
|
||||||
|
- 14050
|
||||||
|
- 15250
|
||||||
|
- 16500
|
||||||
|
- 17800
|
||||||
|
- 19150
|
||||||
|
- 20550
|
||||||
|
- 22000
|
||||||
|
- 23500
|
||||||
|
- 25050
|
||||||
|
- 26650
|
||||||
|
- 28300
|
||||||
|
- 30000
|
||||||
|
- 31750
|
||||||
|
- 33550
|
||||||
|
- 35400
|
||||||
|
- 37300
|
||||||
|
- 39250
|
||||||
|
- 41250
|
||||||
|
- 43300
|
||||||
|
- 45400
|
||||||
|
- 47550
|
||||||
|
- 49700
|
||||||
|
- 51950
|
||||||
|
- 53250
|
||||||
|
- 55600
|
||||||
|
- 57000
|
||||||
|
|
||||||
|
xp-gain-methods:
|
||||||
|
- id: potion_effect
|
||||||
|
conditions:
|
||||||
|
- id: has_potion_effect
|
||||||
|
args:
|
||||||
|
effect: hero_of_the_village
|
||||||
|
multiplier: 50
|
||||||
|
|
||||||
|
level-placeholders:
|
||||||
|
- id: "health_boost"
|
||||||
|
value: "%level%"
|
||||||
|
|
||||||
|
effects-description:
|
||||||
|
1:
|
||||||
|
- "&8» &8Gives a &a+%health_boost%%&8 bonus"
|
||||||
|
|
||||||
|
rewards-description:
|
||||||
|
1:
|
||||||
|
- "&8» &8Gives a &a+%health_boost%%&8 bonus"
|
||||||
|
|
||||||
|
level-up-messages:
|
||||||
|
1:
|
||||||
|
- "&8» &8Gives a &a+%health_boost%%&8 bonus"
|
||||||
|
|
||||||
|
level-commands: [ ]
|
||||||
|
|
||||||
|
effects:
|
||||||
|
- id: potion_effect
|
||||||
|
args:
|
||||||
|
effect: health_boost
|
||||||
|
level: "%level%"
|
||||||
|
|
||||||
|
conditions: [ ]
|
||||||
|
|
||||||
|
entity-texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2QyMGJmNTJlYzM5MGEwNzk5Mjk5MTg0ZmM2NzhiZjg0Y2Y3MzJiYjFiZDc4ZmQxYzRiNDQxODU4ZjAyMzVhOCJ9fX0="
|
||||||
|
|
||||||
|
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvY2QyMGJmNTJlYzM5MGEwNzk5Mjk5MTg0ZmM2NzhiZjg0Y2Y3MzJiYjFiZDc4ZmQxYzRiNDQxODU4ZjAyMzVhOCJ9fX0=
|
||||||
|
|
||||||
|
spawn-egg:
|
||||||
|
enabled: true
|
||||||
|
item: ravager_spawn_egg unbreaking:1 hide_enchants
|
||||||
|
name: "<gradient:#1e3c72>Ravager</gradient:#2a5298>&f Pet Spawn Egg"
|
||||||
|
lore:
|
||||||
|
- ""
|
||||||
|
- "&8&oPlace on the ground to"
|
||||||
|
- "&8&ounlock the &r<gradient:#1e3c72>Ravager</gradient:#2a5298>&8&o pet!"
|
||||||
|
craftable: false
|
||||||
recipe: [ ]
|
recipe: [ ]
|
||||||
@@ -23,6 +23,7 @@ softdepend:
|
|||||||
- Boosters
|
- Boosters
|
||||||
- EcoSkills
|
- EcoSkills
|
||||||
- Reforges
|
- Reforges
|
||||||
|
- ModelEngine
|
||||||
commands:
|
commands:
|
||||||
ecopets:
|
ecopets:
|
||||||
description: Base Command
|
description: Base Command
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#libreforge-updater
|
#libreforge-updater
|
||||||
#Sat Jun 18 12:20:08 BST 2022
|
#Sun Jun 19 12:18:45 BST 2022
|
||||||
version=1.1.0
|
version=1.3.0
|
||||||
plugin-name=EcoPets
|
plugin-name=EcoPets
|
||||||
|
|||||||
Reference in New Issue
Block a user