Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
11a79a5352 | ||
|
|
9473deda7c | ||
|
|
44676515b2 | ||
|
|
4e7317e69a | ||
|
|
8ca8018ab2 | ||
|
|
78e033990b | ||
|
|
033ac785d6 | ||
|
|
6ddf34f7f6 | ||
|
|
fb889b2936 | ||
|
|
dcf89687e3 | ||
|
|
2835eeaa5d | ||
|
|
1647a5dfaf | ||
|
|
3d260e82ae | ||
|
|
1fdbd064a9 | ||
|
|
94d1802b51 | ||
|
|
8604bf7b46 | ||
|
|
c21eecae11 | ||
|
|
80950aecf3 | ||
|
|
6ad33e98fc | ||
|
|
c60c64c6b3 | ||
|
|
9eb67d5204 | ||
|
|
77f08961b8 | ||
|
|
be4c70e0c5 | ||
|
|
614831687f | ||
|
|
3ea5d8f4d3 | ||
|
|
2e472abc98 | ||
|
|
927c1fbcae | ||
|
|
7e6b5c4b80 |
@@ -21,7 +21,7 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
[](https://discord.gg/ZcwpSsE/)
|
||||
[](https://discord.gg/ZcwpSsE/)
|
||||
|
||||
## License
|
||||
*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.dmulloy2.net/repository/public/' }
|
||||
maven { url 'https://repo.essentialsx.net/releases/' }
|
||||
maven { url 'https://mvn.lumine.io/repository/maven-public/' }
|
||||
}
|
||||
|
||||
jar {
|
||||
@@ -47,7 +48,7 @@ allprojects {
|
||||
|
||||
dependencies {
|
||||
compileOnly 'com.willfp:eco:6.37.1'
|
||||
implementation 'com.willfp:libreforge:3.64.0'
|
||||
implementation 'com.willfp:libreforge:3.69.0'
|
||||
implementation 'org.joml:joml:1.10.4'
|
||||
|
||||
compileOnly 'org.jetbrains:annotations:23.0.0'
|
||||
|
||||
@@ -7,6 +7,7 @@ dependencies {
|
||||
compileOnly 'net.kyori:adventure-api:4.10.1'
|
||||
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
|
||||
compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
|
||||
compileOnly 'com.ticxo.modelengine:api:R2.5.0'
|
||||
}
|
||||
|
||||
build.dependsOn publishToMavenLocal
|
||||
|
||||
@@ -1,17 +1,21 @@
|
||||
package com.willfp.ecopets
|
||||
|
||||
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.util.toSingletonList
|
||||
import com.willfp.ecopets.commands.CommandEcopets
|
||||
import com.willfp.ecopets.commands.CommandPets
|
||||
import com.willfp.ecopets.config.PetsYml
|
||||
import com.willfp.ecopets.pets.DiscoverRecipeListener
|
||||
import com.willfp.ecopets.pets.PetDisplay
|
||||
import com.willfp.ecopets.pets.PetLevelListener
|
||||
import com.willfp.ecopets.pets.PetTriggerXPGainListener
|
||||
import com.willfp.ecopets.pets.SpawnEggHandler
|
||||
import com.willfp.ecopets.pets.activePet
|
||||
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 org.bukkit.event.Listener
|
||||
|
||||
@@ -48,6 +52,16 @@ class EcoPetsPlugin : LibReforgePlugin() {
|
||||
petDisplay.shutdown()
|
||||
}
|
||||
|
||||
override fun loadAdditionalIntegrations(): List<IntegrationLoader> {
|
||||
return listOf(
|
||||
IntegrationLoader("ModelEngine") {
|
||||
PetEntity.registerPetEntity("modelengine") { pet, id ->
|
||||
ModelEnginePetEntity(pet, id)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
override fun loadPluginCommands(): List<PluginCommand> {
|
||||
return listOf(
|
||||
CommandEcopets(this),
|
||||
@@ -60,7 +74,8 @@ class EcoPetsPlugin : LibReforgePlugin() {
|
||||
PetLevelListener(this),
|
||||
PetTriggerXPGainListener,
|
||||
SpawnEggHandler(this),
|
||||
petDisplay
|
||||
petDisplay,
|
||||
DiscoverRecipeListener(this)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.willfp.ecopets.pets
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Keyed
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.player.PlayerJoinEvent
|
||||
import org.bukkit.inventory.Recipe
|
||||
|
||||
class DiscoverRecipeListener(private val plugin: EcoPlugin) : Listener {
|
||||
@EventHandler
|
||||
fun onJoin(event: PlayerJoinEvent) {
|
||||
if (!plugin.configYml.getBool("discover-recipes")) {
|
||||
return
|
||||
}
|
||||
mutableListOf<Recipe>()
|
||||
.apply { Bukkit.getServer().recipeIterator().forEachRemaining(this::add) }
|
||||
.filterIsInstance<Keyed>().map { it.key }
|
||||
.filter { it.namespace == plugin.name.lowercase() }
|
||||
.filter { !it.key.contains("displayed") }
|
||||
.forEach { event.player.discoverRecipe(it) }
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@ import com.willfp.eco.core.fast.fast
|
||||
import com.willfp.eco.core.items.CustomItem
|
||||
import com.willfp.eco.core.items.Items
|
||||
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.PlayerStaticPlaceholder
|
||||
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.api.event.PlayerPetExpGainEvent
|
||||
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.ConfiguredCondition
|
||||
import com.willfp.libreforge.effects.ConfiguredEffect
|
||||
@@ -107,14 +107,12 @@ class Pet(
|
||||
"${this.id}_spawn_egg",
|
||||
egg,
|
||||
config.getStrings("spawn-egg.recipe"),
|
||||
config.getString("spawn-egg.recipe-permission")
|
||||
config.getStringOrNull("spawn-egg.recipe-permission")
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
val petEntityItem: ItemStack = SkullBuilder()
|
||||
.setSkullTexture(config.getString("entity-texture"))
|
||||
.build()
|
||||
val entityTexture = config.getString("entity-texture")
|
||||
|
||||
private val levelXpRequirements = listOf(0) + config.getInts("level-xp-requirements")
|
||||
|
||||
@@ -153,12 +151,16 @@ class Pet(
|
||||
private val petXpGains = config.getSubsections("xp-gain-methods").mapNotNull {
|
||||
val trigger = Triggers.getById(it.getString("id")) ?: return@mapNotNull null
|
||||
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,
|
||||
multiplier
|
||||
multiplier,
|
||||
conditions,
|
||||
it.getSubsection("filters")
|
||||
)
|
||||
}
|
||||
}.toMap()
|
||||
|
||||
init {
|
||||
config.injectPlaceholders(
|
||||
@@ -239,6 +241,10 @@ class Pet(
|
||||
}.register()
|
||||
}
|
||||
|
||||
fun makePetEntity(): PetEntity {
|
||||
return PetEntity.create(this)
|
||||
}
|
||||
|
||||
fun getLevel(level: Int): PetLevel = levels.get(level) {
|
||||
PetLevel(this, it, effects, conditions)
|
||||
}
|
||||
@@ -396,12 +402,8 @@ class Pet(
|
||||
}
|
||||
}
|
||||
|
||||
fun canGainXPFromTrigger(trigger: Trigger): Boolean {
|
||||
return petXpGains.any { it.trigger == trigger }
|
||||
}
|
||||
|
||||
fun getTriggerXPMultiplier(trigger: Trigger): Double {
|
||||
return petXpGains.firstOrNull { it.trigger == trigger }?.multiplier ?: 1.0
|
||||
fun getPetXPGain(trigger: Trigger): PetXPGain? {
|
||||
return petXpGains[trigger]
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
|
||||
@@ -6,16 +6,13 @@ import com.willfp.eco.util.formatEco
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.entity.ArmorStand
|
||||
import org.bukkit.entity.EntityType
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
import org.bukkit.event.player.PlayerQuitEvent
|
||||
import org.bukkit.inventory.EquipmentSlot
|
||||
import java.util.*
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.abs
|
||||
import kotlin.math.sin
|
||||
|
||||
class PetDisplay(
|
||||
private val plugin: EcoPlugin
|
||||
@@ -37,7 +34,6 @@ class PetDisplay(
|
||||
val pet = player.activePet
|
||||
|
||||
if (pet != null) {
|
||||
stand.equipment?.helmet = pet.petEntityItem
|
||||
stand.customName = plugin.configYml.getString("pet-entity.name")
|
||||
.replace("%player%", player.displayName)
|
||||
.replace("%pet%", pet.name)
|
||||
@@ -49,7 +45,10 @@ class PetDisplay(
|
||||
location.y += NumberUtils.fastSin(tick / (2 * PI) * 0.5) * 0.15
|
||||
|
||||
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 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
|
||||
val stand = pet.makePetEntity().spawn(location)
|
||||
|
||||
for (slot in EquipmentSlot.values()) {
|
||||
newStand.addEquipmentLock(slot, ArmorStand.LockType.ADDING_OR_CHANGING)
|
||||
}
|
||||
|
||||
newStand.equipment?.helmet = pet.petEntityItem
|
||||
newStand.isCustomNameVisible = true
|
||||
newStand.customName = pet.name
|
||||
|
||||
trackedEntities[player.uniqueId] = newStand
|
||||
trackedEntities[player.uniqueId] = stand
|
||||
}
|
||||
|
||||
return trackedEntities[player.uniqueId]
|
||||
|
||||
@@ -1,29 +1,43 @@
|
||||
package com.willfp.ecopets.pets
|
||||
|
||||
import com.willfp.eco.core.config.interfaces.Config
|
||||
import com.willfp.libreforge.conditions.ConfiguredCondition
|
||||
import com.willfp.libreforge.events.TriggerPreProcessEvent
|
||||
import com.willfp.libreforge.filters.ConfiguredFilter
|
||||
import com.willfp.libreforge.triggers.Trigger
|
||||
import org.bukkit.event.EventHandler
|
||||
import org.bukkit.event.Listener
|
||||
|
||||
data class PetXPGain(
|
||||
val trigger: Trigger,
|
||||
val multiplier: Double
|
||||
val multiplier: Double,
|
||||
val conditions: Iterable<ConfiguredCondition>,
|
||||
val filters: Config
|
||||
)
|
||||
|
||||
object PetTriggerXPGainListener: Listener {
|
||||
object PetTriggerXPGainListener : Listener {
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
fun handle(event: TriggerPreProcessEvent) {
|
||||
val player = event.player
|
||||
val trigger = event.trigger
|
||||
val value = event.value
|
||||
val data = event.data
|
||||
|
||||
val pet = event.player.activePet ?: return
|
||||
|
||||
if (pet.canGainXPFromTrigger(trigger)) {
|
||||
player.givePetExperience(
|
||||
pet,
|
||||
value * pet.getTriggerXPMultiplier(trigger)
|
||||
)
|
||||
val xpGain = pet.getPetXPGain(trigger) ?: return
|
||||
|
||||
if (xpGain.conditions.any { !it.isMet(player) }) {
|
||||
return
|
||||
}
|
||||
|
||||
if (!ConfiguredFilter(xpGain.filters).matches(data)) {
|
||||
return
|
||||
}
|
||||
|
||||
player.givePetExperience(
|
||||
pet,
|
||||
value * xpGain.multiplier
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,6 @@ import org.bukkit.Material
|
||||
import org.bukkit.Sound
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.checkerframework.checker.units.qual.m
|
||||
import kotlin.math.ceil
|
||||
import kotlin.math.max
|
||||
import kotlin.math.min
|
||||
@@ -42,8 +41,8 @@ object PetsGUI {
|
||||
val bottomRightColumn = plugin.configYml.getInt("gui.pet-area.bottom-right.column")
|
||||
|
||||
petAreaSlots.clear()
|
||||
for (column in topLeftColumn..bottomRightColumn) {
|
||||
for (row in topLeftRow..bottomRightRow) {
|
||||
for (row in topLeftRow..bottomRightRow) {
|
||||
for (column in topLeftColumn..bottomRightColumn) {
|
||||
petAreaSlots.add(Pair(row, column))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@
|
||||
# by Auxilor
|
||||
#
|
||||
|
||||
discover-recipes: true
|
||||
|
||||
gui:
|
||||
rows: 6
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ pets:
|
||||
xp-gain-methods:
|
||||
- id: melee_attack
|
||||
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,
|
||||
# Don't add % to the IDs, this is done automatically
|
||||
@@ -110,6 +111,7 @@ pets:
|
||||
conditions: [ ]
|
||||
|
||||
# The texture of the pet entity in game
|
||||
# If you're using modelengine, use modelengine:id as the texture
|
||||
entity-texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTA5NWZjYzFlM2Q3Y2JkMzUwZjE5YjM4OTQ5OGFiOGJiOTZjNjVhZDE4NWQzNDU5MjA2N2E3ZDAzM2FjNDhkZSJ9fX0="
|
||||
|
||||
# The icon in GUIs
|
||||
@@ -229,4 +231,108 @@ pets:
|
||||
- "&8&oPlace on the ground to"
|
||||
- "&8&ounlock the &r<gradient:#F2F2F2>Skeleton</gradient:#DBDBDB>&8&o pet!"
|
||||
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: [ ]
|
||||
@@ -23,6 +23,7 @@ softdepend:
|
||||
- Boosters
|
||||
- EcoSkills
|
||||
- Reforges
|
||||
- ModelEngine
|
||||
commands:
|
||||
ecopets:
|
||||
description: Base Command
|
||||
@@ -31,7 +32,8 @@ commands:
|
||||
aliases:
|
||||
- pet
|
||||
description: Open the pets menu
|
||||
permission: ecopets.command.skills
|
||||
permission: ecopets.command.pets
|
||||
default: true
|
||||
|
||||
permissions:
|
||||
ecopets.*:
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#libreforge-updater
|
||||
#Sat Jun 18 12:20:08 BST 2022
|
||||
version=1.1.0
|
||||
#Wed Jun 22 22:25:32 BST 2022
|
||||
version=1.7.0
|
||||
plugin-name=EcoPets
|
||||
|
||||
Reference in New Issue
Block a user