Compare commits

...

23 Commits
1.1.0 ... 1.6.0

Author SHA1 Message Date
Auxilor
78e033990b libreforge-updater 2022-06-22 12:43:42 +01:00
Auxilor
033ac785d6 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	gradle.properties
2022-06-21 18:49:52 +01:00
Auxilor
6ddf34f7f6 Updated to 1.5.1 2022-06-21 18:49:41 +01:00
Auxilor
fb889b2936 Added discover-recipes 2022-06-21 18:49:34 +01:00
Auxilor
dcf89687e3 libreforge-updater 2022-06-21 08:29:46 +01:00
Auxilor
2835eeaa5d libreforge-updater 2022-06-20 21:38:10 +01:00
Auxilor
1647a5dfaf 1.4.0 2022-06-20 21:36:33 +01:00
Auxilor
3d260e82ae Fixed pet GUI 2022-06-20 21:36:24 +01:00
Auxilor
1fdbd064a9 Updated libreforge 2022-06-20 18:06:02 +01:00
Auxilor
94d1802b51 libreforge-updater 2022-06-20 14:17:43 +01:00
Auxilor
8604bf7b46 Updated to 1.3.1 2022-06-20 14:09:46 +01:00
Will FP
c21eecae11 Merge pull request #3 from Sedri05/master
Fixed default perm for pets menu
2022-06-20 14:06:02 +01:00
Sedri05
80950aecf3 Fixed default perm for pets menu 2022-06-19 13:18:47 +02:00
Auxilor
6ad33e98fc libreforge-updater 2022-06-19 12:18:45 +01:00
Auxilor
c60c64c6b3 Added ravager pet 2022-06-18 15:32:39 +01:00
Auxilor
9eb67d5204 Updated to 1.2.0 2022-06-18 14:55:56 +01:00
Auxilor
77f08961b8 Added conditions to xp gain methods 2022-06-18 14:55:46 +01:00
Auxilor
be4c70e0c5 Updated comments 2022-06-18 13:24:56 +01:00
Auxilor
614831687f Updated README 2022-06-18 13:22:36 +01:00
Auxilor
3ea5d8f4d3 Fixed rotation 2022-06-18 13:19:13 +01:00
Auxilor
2e472abc98 Fixed softdepends 2022-06-18 13:18:25 +01:00
Auxilor
927c1fbcae Improved ModelEngine support 2022-06-18 13:16:21 +01:00
Auxilor
7e6b5c4b80 Added ModelEngine support 2022-06-18 13:09:56 +01:00
16 changed files with 300 additions and 51 deletions

View File

@@ -21,7 +21,7 @@
</a> </a>
</p> </p>
[![Docs](https://i.imgur.com/6GFV1bQ.png)](https://discord.gg/ZcwpSsE/) [![Docs](https://i.imgur.com/4JciYrQ.png)](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).*

View File

@@ -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.68.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'

View File

@@ -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

View File

@@ -1,17 +1,21 @@
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
import com.willfp.ecopets.commands.CommandPets import com.willfp.ecopets.commands.CommandPets
import com.willfp.ecopets.config.PetsYml import com.willfp.ecopets.config.PetsYml
import com.willfp.ecopets.pets.DiscoverRecipeListener
import com.willfp.ecopets.pets.PetDisplay import com.willfp.ecopets.pets.PetDisplay
import com.willfp.ecopets.pets.PetLevelListener import com.willfp.ecopets.pets.PetLevelListener
import com.willfp.ecopets.pets.PetTriggerXPGainListener 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 +52,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),
@@ -60,7 +74,8 @@ class EcoPetsPlugin : LibReforgePlugin() {
PetLevelListener(this), PetLevelListener(this),
PetTriggerXPGainListener, PetTriggerXPGainListener,
SpawnEggHandler(this), SpawnEggHandler(this),
petDisplay petDisplay,
DiscoverRecipeListener(this)
) )
} }

View File

@@ -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) }
}
}

View File

@@ -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 {

View File

@@ -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,9 +45,12 @@ 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)
if (!pet.entityTexture.contains(":")) {
stand.setRotation((20 * tick / (2 * PI)).toFloat(), 0f) stand.setRotation((20 * tick / (2 * PI)).toFloat(), 0f)
} }
} }
}
private fun getLocation(player: Player): Location { private fun getLocation(player: Player): Location {
val offset = player.eyeLocation.direction.clone().normalize() val offset = player.eyeLocation.direction.clone().normalize()
@@ -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]

View File

@@ -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,7 +8,8 @@ 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 {
@@ -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
if (xpGain.conditions.any { !it.isMet(player) }) {
return
}
player.givePetExperience( player.givePetExperience(
pet, pet,
value * pet.getTriggerXPMultiplier(trigger) value * xpGain.multiplier
) )
} }
} }
}

View File

@@ -13,7 +13,6 @@ import org.bukkit.Material
import org.bukkit.Sound import org.bukkit.Sound
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.checkerframework.checker.units.qual.m
import kotlin.math.ceil import kotlin.math.ceil
import kotlin.math.max import kotlin.math.max
import kotlin.math.min import kotlin.math.min
@@ -42,8 +41,8 @@ object PetsGUI {
val bottomRightColumn = plugin.configYml.getInt("gui.pet-area.bottom-right.column") val bottomRightColumn = plugin.configYml.getInt("gui.pet-area.bottom-right.column")
petAreaSlots.clear() 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)) petAreaSlots.add(Pair(row, column))
} }
} }

View File

@@ -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
}
}

View File

@@ -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:"))
}
}
}

View File

@@ -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
}
}

View File

@@ -3,6 +3,8 @@
# by Auxilor # by Auxilor
# #
discover-recipes: true
gui: gui:
rows: 6 rows: 6

View File

@@ -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
@@ -230,3 +232,107 @@ pets:
- "&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: [ ] 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: [ ]

View File

@@ -23,6 +23,7 @@ softdepend:
- Boosters - Boosters
- EcoSkills - EcoSkills
- Reforges - Reforges
- ModelEngine
commands: commands:
ecopets: ecopets:
description: Base Command description: Base Command
@@ -31,7 +32,8 @@ commands:
aliases: aliases:
- pet - pet
description: Open the pets menu description: Open the pets menu
permission: ecopets.command.skills permission: ecopets.command.pets
default: true
permissions: permissions:
ecopets.*: ecopets.*:

View File

@@ -1,4 +1,4 @@
#libreforge-updater #libreforge-updater
#Sat Jun 18 12:20:08 BST 2022 #Wed Jun 22 12:43:42 BST 2022
version=1.1.0 version=1.6.0
plugin-name=EcoPets plugin-name=EcoPets