9
0
mirror of https://github.com/Auxilor/EcoMobs.git synced 2025-12-19 15:09:17 +00:00

Compare commits

...

94 Commits

Author SHA1 Message Date
Auxilor
ed0fd90df8 libreforge-updater 2023-04-02 17:44:13 +01:00
Auxilor
42af89c79a libreforge-updater 2023-03-30 15:30:24 +01:00
Auxilor
d453461eeb why is model engine like this 2023-03-29 19:31:03 +01:00
Auxilor
e4093a0fd5 libreforge-updater 2023-03-29 19:21:02 +01:00
Auxilor
7e950ea508 libreforge-updater 2023-03-29 15:47:17 +01:00
Auxilor
ac79baa2d3 Fixed workflows 2023-03-29 13:44:06 +01:00
Auxilor
50adfae567 Moved to repo.auxilor.io 2023-03-29 13:39:57 +01:00
Auxilor
153022c3bf Fixed permissions on paper 2023-03-28 21:42:33 +01:00
Auxilor
8d37635381 Cleanup 2023-03-28 21:19:12 +01:00
Auxilor
299d3ee1d6 Updated to reflect libreforge change 2023-03-28 19:28:06 +01:00
Auxilor
f0a2d32b95 Moved integration 2023-03-28 18:58:58 +01:00
Auxilor
4e86750c7d Fixed duplicated messages for lifespan 2023-03-28 17:23:24 +01:00
Auxilor
b3b7695218 Fixed several bugs 2023-03-28 16:04:59 +01:00
Auxilor
1aa0a27c65 Fixed publications 2023-03-28 14:55:23 +01:00
Auxilor
392a76bad8 Updated to libreforge 4 2023-03-28 14:32:53 +01:00
Auxilor
95afe96860 Changed load order 2023-03-22 22:10:03 +00:00
Auxilor
21d24a5198 libreforge-updater 2023-03-13 13:40:30 +00:00
Auxilor
af9766a391 libreforge-updater 2023-03-02 12:56:01 +00:00
Auxilor
df70871bad libreforge-updater 2023-02-22 15:02:39 +00:00
Auxilor
b030af609a libreforge-updater 2023-02-15 20:59:05 +00:00
Auxilor
344e71cd9a libreforge-updater 2023-02-12 16:55:42 +00:00
Auxilor
7b7a16f9c6 libreforge-updater 2023-02-09 14:12:44 +00:00
Auxilor
ba1c348f8e libreforge-updater 2023-02-07 14:46:53 +00:00
Auxilor
c81f7174e2 libreforge-updater 2023-02-04 15:36:59 +00:00
Auxilor
53b037816d libreforge-updater 2023-01-24 10:09:30 +00:00
Auxilor
d7e07c1a62 libreforge-updater 2023-01-17 16:48:42 +00:00
Auxilor
d939296d96 libreforge-updater 2023-01-13 18:08:48 +00:00
Auxilor
2505ddd845 libreforge-updater 2023-01-07 12:17:46 +00:00
Auxilor
ea7371db9e libreforge-updater 2023-01-02 15:58:40 +00:00
Auxilor
b53ab306ed libreforge-updater 2022-12-26 14:01:48 +01:00
Auxilor
33f82117e4 Updated modelengine 2022-12-20 15:20:45 +00:00
Auxilor
a80e060a7e libreforge-updater 2022-12-20 15:15:33 +00:00
Auxilor
a915752922 libreforge-updater 2022-12-12 14:01:34 +00:00
Auxilor
06eb724bd8 libreforge-updater 2022-12-09 17:01:53 +00:00
Auxilor
18c66ef10c libreforge-updater 2022-12-05 10:51:14 +00:00
Auxilor
ae0c8531b0 libreforge-updater 2022-11-30 17:38:55 +00:00
Auxilor
705eafb9af libreforge-updater 2022-11-27 21:45:04 +00:00
Auxilor
e83ede56f0 libreforge-updater 2022-11-26 19:20:59 +00:00
Auxilor
6bddf72111 libreforge-updater 2022-11-24 14:30:48 +00:00
Auxilor
d32d07f4e2 libreforge-updater 2022-11-23 17:25:42 +00:00
Auxilor
8c40d9861d libreforge-updater 2022-11-21 16:03:34 +00:00
Auxilor
03272f794e libreforge-updater 2022-11-17 08:39:07 +00:00
Auxilor
8ff42da43c libreforge-updater 2022-11-12 17:35:11 +00:00
Auxilor
7f61f6a66a libreforge-updater 2022-11-06 19:52:34 +00:00
Auxilor
c1dde026b7 Updated chains 2022-11-06 17:00:48 +00:00
Auxilor
983246a7c4 Added illusioner 2022-11-06 16:56:39 +00:00
Auxilor
ee32897b1c libreforge-updater 2022-11-01 16:23:35 +00:00
Auxilor
67b38896ca libreforge-updater 2022-10-28 11:35:44 +01:00
Auxilor
39b91bc828 libreforge-updater 2022-10-26 22:12:03 +01:00
Auxilor
e2e7b44a75 Fix 2022-10-24 17:11:42 +01:00
Auxilor
3c1e5ee192 libreforge-updater 2022-10-24 17:05:27 +01:00
Auxilor
56789f331b libreforge-updater 2022-10-21 19:26:42 +01:00
Auxilor
e99b96132f libreforge-updater 2022-10-19 20:44:41 +01:00
Auxilor
c0297cd3db libreforge-updater 2022-10-18 14:14:41 +01:00
Auxilor
3b798a8ed7 libreforge-updater 2022-10-16 23:27:19 +01:00
Auxilor
bc73201ec5 libreforge-updater 2022-10-13 20:13:11 +01:00
Auxilor
b1365855af libreforge-updater 2022-10-10 21:04:32 +01:00
Auxilor
1ce50cb0b9 libreforge-updater 2022-10-09 15:03:11 +01:00
Auxilor
2a50868624 libreforge-updater 2022-10-07 19:51:54 +01:00
Auxilor
0a0e7a9661 libreforge-updater 2022-10-06 12:04:55 +01:00
Auxilor
8cd4ccdbd7 libreforge-updater 2022-10-04 15:53:28 +01:00
Auxilor
429bc6a61f libreforge-updater 2022-10-03 18:30:03 +01:00
Auxilor
b92ea06667 Fixed _example.yml 2022-10-02 17:01:40 +01:00
Auxilor
1e332bf845 libreforge-updater 2022-10-02 14:58:47 +01:00
Auxilor
7cec9f3e30 Added separator ambivalence to boss configs and Model Engine animation support 2022-09-29 08:40:30 +01:00
Auxilor
7db3af5dca oops 2022-09-28 17:55:29 +01:00
Auxilor
137f4e3732 libreforge-updater 2022-09-28 17:53:14 +01:00
Auxilor
7338a24b81 Fix 2022-09-28 16:12:42 +01:00
Auxilor
bde5de1d77 Fixed plugin.yml 2022-09-28 16:12:23 +01:00
Auxilor
b48cc66383 Updated to 8.91.1 2022-09-28 16:12:00 +01:00
Auxilor
bf59ba4d4a Improved _example.yml 2022-09-28 16:11:48 +01:00
Auxilor
127a43e032 PR Improvements 2022-09-28 16:10:21 +01:00
Will FP
383893c8f6 Merge pull request #50
fix: boss transformations
2022-09-28 16:01:24 +01:00
Will FP
37926bd016 Merge pull request #52
Feature/modelengine
2022-09-28 16:01:08 +01:00
Will FP
6778058150 Merge pull request #53
fix: handle spawning of bosses from droppers and dispensers
2022-09-28 15:59:45 +01:00
Auxilor
8addad09d2 fix 2022-09-26 18:54:34 +01:00
DaRacci
7fe0eece16 fix: handle spawning of bosses from droppers and dispensers 2022-09-27 01:13:42 +10:00
DaRacci
eca8726323 fix: check if the model exists 2022-09-27 00:10:20 +10:00
DaRacci
16ba41f39a feat: ModelEngine support 2022-09-27 00:07:28 +10:00
Auxilor
685f40a71b Merge branch 'fix/publishing'
# Conflicts:
#	build.gradle
2022-09-26 13:54:00 +01:00
Auxilor
76c6d22a00 libreforge-updater 2022-09-26 10:52:49 +01:00
DaRacci
38629407bc fix: Use component from subproject 2022-09-26 14:44:12 +10:00
DaRacci
1eee00b88e fix: Publishing
Also converted gradle build to kotlin.
Also updated gradle to 7.5.1

Closes: https://github.com/Auxilor/EcoBosses/issues/49, https://github.com/Auxilor/EcoBosses/issues/41
2022-09-25 23:39:05 +10:00
DaRacci
de47ccf159 fix: boss transformations
Closes: https://github.com/Auxilor/EcoBosses/issues/36
2022-09-25 22:27:08 +10:00
Auxilor
b81e7af836 libreforge-updater 2022-09-22 17:31:03 +01:00
Auxilor
fcde21c21a libreforge-updater 2022-09-21 15:29:05 +01:00
Auxilor
405659f293 libreforge-updater 2022-09-20 10:57:39 +01:00
Auxilor
2d6154d11f libreforge-updater 2022-09-17 15:46:02 +01:00
Auxilor
9fad76ffad libreforge-updater 2022-09-15 12:15:47 +01:00
Auxilor
e4a40470b8 libreforge-updater 2022-09-15 12:09:44 +01:00
Auxilor
f966629e21 libreforge-updater 2022-09-14 18:53:14 +01:00
Auxilor
93d09c1f3d libreforge-updater 2022-09-14 15:12:30 +01:00
Auxilor
56763be02d libreforge-updater 2022-09-14 15:09:33 +01:00
Auxilor
bd05d4474f libreforge-updater 2022-09-14 12:59:22 +01:00
53 changed files with 1014 additions and 591 deletions

View File

@@ -1,8 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Auxilor Community Discord
- name: Discord
url: https://discord.gg/ZcwpSsE/
about: Join the Auxilor discord to get help from support staff and the general community!
- name: The most common issues people have
url: https://github.com/Auxilor/eco/issues/78
about: Check the list of known common issues to see if your issue has already been solved
about: Issues have moved to Discord, please join the server to get help!

View File

@@ -4,28 +4,8 @@ about: Report an issue with the plugin
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
# Please report bugs on the discord!
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Server Information (please complete the following information):**
- Version: (output of `/ver` command)
- Version of plugin and eco (`/ver eco`, `/ver <plugin>`)
**Additional context**
Add any other context about the problem here.
[Join by clicking here](https://discord.gg/ZcwpSsE/)

View File

@@ -1,20 +0,0 @@
---
name: Request a Feature
about: Suggest an idea for this plugin
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

33
.github/workflows/publish-release.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: Publish Packages
on:
workflow_dispatch:
release:
types: [ created ]
push:
tags:
- '*'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout latest code
uses: actions/checkout@v2
- name: Set up JDK 17
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: 17
- name: Change wrapper permissions
run: chmod +x ./gradlew
- name: Publish package
uses: gradle/gradle-build-action@v2
with:
arguments: publish
env:
MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}

View File

@@ -1,136 +0,0 @@
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10"
}
}
plugins {
id 'java-library'
id 'com.github.johnrengelman.shadow' version '7.0.0'
id 'maven-publish'
id 'java'
}
dependencies {
implementation project(":eco-core").getSubprojects()
}
allprojects {
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'maven-publish'
apply plugin: 'com.github.johnrengelman.shadow'
repositories {
mavenCentral()
mavenLocal()
maven { url 'https://jitpack.io' }
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
maven { url 'https://repo.codemc.org/repository/nms/' }
maven { url 'https://repo.codemc.org/repository/maven-public' }
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
maven { url 'https://oss.sonatype.org/content/groups/public/' }
maven { url 'https://maven.enginehub.org/repo/' }
maven { url 'https://ci.ender.zone/plugin/repository/project/' }
maven { url 'https://ci.ender.zone/plugin/repository/everything/' }
maven { url 'https://repo.md-5.net/content/repositories/snapshots/' }
maven { url 'https://repo.dmulloy2.net/nexus/repository/public/' }
maven { url 'https://papermc.io/repo/repository/maven-public/' }
maven { url 'https://repo.maven.apache.org/maven2/' }
maven { url 'https://repo.dustplanet.de/artifactory/ext-release-local/' }
maven { url 'https://maven.seyfahni.de/repository/snapshots/' }
maven { url 'https://libraries.minecraft.net/' }
maven { url 'https://repo.spongepowered.org/maven/' }
maven { url 'https://org.kitteh.pastegg' }
maven { url 'https://repo.mikeprimm.com/' }
maven { url 'https://maven.sk89q.com/repo/' }
maven { url 'https://github.com/factions-site/repo/raw/public/' }
maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
}
jar {
onlyIf { !sourceSets.main.allSource.files.isEmpty() }
}
shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.ecobosses.libreforge')
relocate('org.joml', 'com.willfp.ecobosses.libreforge.joml')
}
dependencies {
compileOnly 'com.willfp:eco:6.35.1'
implementation 'com.willfp:libreforge:3.99.0'
implementation 'org.joml:joml:1.10.4'
compileOnly 'org.jetbrains:annotations:23.0.0'
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.7.10'
}
tasks.withType(JavaCompile) {
options.deprecation = true
options.encoding = 'UTF-8'
}
processResources {
filesNotMatching(["**/*.png", "**/models/**", "**/textures/**", "**lang.yml"]) {
expand projectVersion: project.version
}
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile) {
kotlinOptions {
jvmTarget = "17"
freeCompilerArgs += ["-Xjvm-default=all"]
}
}
java.sourceCompatibility = JavaVersion.VERSION_17
java.targetCompatibility = JavaVersion.VERSION_17
compileJava.options.encoding = 'UTF-8'
compileJava.dependsOn clean
build.dependsOn shadowJar
}
tasks.withType(Jar) {
destinationDirectory = file("$rootDir/bin/")
}
clean.doLast {
file("${rootDir}/bin").deleteDir()
}
shadowJar {
archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + ".jar"
}
jar {
archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + " " + "unshaded" + ".jar"
}
group = 'com.willfp'
archivesBaseName = project.name
version = findProperty("version")
compileJava.options.encoding = 'UTF-8'
build.dependsOn shadowJar
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

83
build.gradle.kts Normal file
View File

@@ -0,0 +1,83 @@
plugins {
java
`java-library`
`maven-publish`
kotlin("jvm") version "1.7.10"
id("com.github.johnrengelman.shadow") version "8.0.0"
id("com.willfp.libreforge-gradle-plugin") version "1.0.0"
}
group = "com.willfp"
version = findProperty("version")!!
val libreforgeVersion = findProperty("libreforge-version")
base {
archivesName.set(project.name)
}
dependencies {
project(":eco-core").dependencyProject.subprojects {
implementation(this)
}
}
allprojects {
apply(plugin = "java")
apply(plugin = "kotlin")
apply(plugin = "maven-publish")
apply(plugin = "com.github.johnrengelman.shadow")
repositories {
mavenLocal()
mavenCentral()
maven("https://repo.papermc.io/repository/maven-public/")
maven("https://repo.auxilor.io/repository/maven-public/")
maven("https://jitpack.io")
maven("https://mvn.lumine.io/repository/maven-public/")
}
dependencies {
compileOnly("com.willfp:eco:6.53.0")
compileOnly("org.jetbrains:annotations:23.0.0")
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:1.7.10")
}
java {
withSourcesJar()
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
tasks {
shadowJar {
relocate("com.willfp.libreforge.loader", "com.willfp.ecobosses.libreforge.loader")
}
compileKotlin {
kotlinOptions {
jvmTarget = "17"
}
}
compileJava {
options.isDeprecation = true
options.encoding = "UTF-8"
dependsOn(clean)
}
processResources {
filesMatching(listOf("**plugin.yml", "**eco.yml")) {
expand(
"version" to project.version,
"libreforgeVersion" to libreforgeVersion,
"pluginName" to rootProject.name
)
}
}
build {
dependsOn(shadowJar)
}
}
}

View File

@@ -1,2 +0,0 @@
group 'com.willfp'
version rootProject.version

View File

@@ -0,0 +1,2 @@
group = "com.willfp"
version = rootProject.version

View File

@@ -1,8 +0,0 @@
group 'com.willfp'
version rootProject.version
dependencies {
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'com.github.lokka30:LevelledMobs:3.1.4'
compileOnly 'net.kyori:adventure-api:4.9.3'
}

View File

@@ -0,0 +1,34 @@
group = "com.willfp"
version = rootProject.version
dependencies {
compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT")
compileOnly("com.github.lokka30:LevelledMobs:3.1.4")
compileOnly("com.ticxo.modelengine:api:R3.1.6")
}
publishing {
publications {
register("maven", MavenPublication::class) {
from(components["java"])
artifactId = rootProject.name
}
}
repositories {
maven {
name = "auxilor"
url = uri("https://repo.auxilor.io/repository/maven-releases/")
credentials {
username = System.getenv("MAVEN_USERNAME")
password = System.getenv("MAVEN_PASSWORD")
}
}
}
}
tasks {
build {
dependsOn(publishToMavenLocal)
}
}

View File

@@ -6,12 +6,15 @@ import com.willfp.eco.core.integrations.IntegrationLoader
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.bosses.EggDisplay
import com.willfp.ecobosses.bosses.bossHolders
import com.willfp.ecobosses.commands.CommandEcobosses
import com.willfp.ecobosses.commands.CommandEcoBosses
import com.willfp.ecobosses.defence.DamageMultiplierHandler
import com.willfp.ecobosses.defence.ImmunitiesHandler
import com.willfp.ecobosses.defence.MountHandler
import com.willfp.ecobosses.defence.PickupHandler
import com.willfp.ecobosses.integrations.levelledmobs.IntegrationLevelledMobs
import com.willfp.ecobosses.libreforge.EffectBossDropChanceMultiplier
import com.willfp.ecobosses.libreforge.TriggerKillBoss
import com.willfp.ecobosses.libreforge.TriggerSpawnBoss
import com.willfp.ecobosses.lifecycle.CompatibilityListeners
import com.willfp.ecobosses.lifecycle.ConsoleLoggers
import com.willfp.ecobosses.lifecycle.DeathListeners
@@ -21,28 +24,39 @@ import com.willfp.ecobosses.spawn.SpawnEggHandler
import com.willfp.ecobosses.spawn.SpawnTotemHandler
import com.willfp.ecobosses.util.DiscoverRecipeListener
import com.willfp.ecobosses.util.TopDamagerListener
import com.willfp.libreforge.LibReforgePlugin
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.registerHolderProvider
import com.willfp.libreforge.triggers.Triggers
import org.bukkit.event.Listener
class EcoBossesPlugin : LibReforgePlugin() {
class EcoBossesPlugin : LibreforgePlugin() {
init {
instance = this
}
override fun loadConfigCategories(): List<ConfigCategory> {
return listOf(
Bosses
)
}
override fun handleEnable() {
Effects.register(EffectBossDropChanceMultiplier)
Triggers.register(TriggerKillBoss)
Triggers.register(TriggerSpawnBoss)
registerHolderProvider { it.bossHolders }
}
override fun handleEnableAdditional() {
this.copyConfigs("bosses")
}
override fun handleReloadAdditional() {
override fun handleReload() {
Bosses.getAllAlive().forEach { it.remove() }
logger.info(Bosses.values().size.toString() + " Bosses Loaded")
AutospawnHandler.startSpawning(this)
}
override fun handleDisableAdditional() {
override fun handleDisable() {
Bosses.getAllAlive().forEach { it.remove() }
}
@@ -52,7 +66,7 @@ class EcoBossesPlugin : LibReforgePlugin() {
override fun loadPluginCommands(): List<PluginCommand> {
return listOf(
CommandEcobosses(this)
CommandEcoBosses(this)
)
}
@@ -61,7 +75,7 @@ class EcoBossesPlugin : LibReforgePlugin() {
DiscoverRecipeListener(this),
TopDamagerListener(),
LifecycleHandlers(),
SpawnEggHandler(),
SpawnEggHandler(this),
DamageMultiplierHandler(),
MountHandler(),
PickupHandler(),
@@ -73,16 +87,12 @@ class EcoBossesPlugin : LibReforgePlugin() {
)
}
override fun loadAdditionalIntegrations(): List<IntegrationLoader> {
override fun loadIntegrationLoaders(): List<IntegrationLoader> {
return listOf(
IntegrationLoader("LevelledMobs") { this.eventManager.registerListener(IntegrationLevelledMobs()) }
)
}
override fun getMinimumEcoVersion(): String {
return "6.35.1"
}
companion object {
@JvmStatic
lateinit var instance: EcoBossesPlugin

View File

@@ -2,15 +2,15 @@ package com.willfp.ecobosses.bosses
import com.willfp.eco.core.fast.fast
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.libreforge.Holder
import com.willfp.ecobosses.util.EntityProvidedHolder
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType
import kotlin.math.pow
val Player.bossHolders: Iterable<Holder>
val Player.bossHolders: Collection<EntityProvidedHolder>
get() {
val holders = mutableListOf<Holder>()
val holders = mutableListOf<EntityProvidedHolder>()
for (boss in Bosses.values()) {
for (livingBoss in boss.getAllAlive()) {
@@ -21,7 +21,7 @@ val Player.bossHolders: Iterable<Holder>
}
if (entity.location.distanceSquared(this.location) <= boss.influence.pow(2)) {
holders.add(boss)
holders.add(EntityProvidedHolder(boss, entity))
}
}
}
@@ -38,7 +38,7 @@ var ItemStack.bossEgg: EcoBoss?
if (value == null) {
pdc.remove(spawnEggKey)
} else {
pdc.set(spawnEggKey, PersistentDataType.STRING, value.id)
pdc.set(spawnEggKey, PersistentDataType.STRING, value.id.key)
}
this.itemMeta = meta
}

View File

@@ -1,21 +1,29 @@
package com.willfp.ecobosses.bosses
import com.google.common.collect.BiMap
import com.google.common.collect.HashBiMap
import com.google.common.collect.ImmutableList
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.TransientConfig
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.config.readConfig
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.registry.Registry
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.loader.configs.LegacyLocation
import com.willfp.libreforge.separatorAmbivalent
import org.bukkit.entity.Entity
import org.bukkit.entity.LivingEntity
import java.io.File
import java.util.*
import java.util.UUID
object Bosses {
/**
* Registered bosses.
*/
private val BY_ID: BiMap<String, EcoBoss> = HashBiMap.create()
object Bosses : ConfigCategory("boss", "bosses") {
/** Registered bosses. */
private val registry = Registry<EcoBoss>()
override val legacyLocation = LegacyLocation(
"ecobosses.yml",
"bosses"
)
/**
* Get all registered [EcoBoss]s.
@@ -24,7 +32,7 @@ object Bosses {
*/
@JvmStatic
fun values(): List<EcoBoss> {
return ImmutableList.copyOf(BY_ID.values)
return ImmutableList.copyOf(registry.values())
}
/**
@@ -35,51 +43,15 @@ object Bosses {
*/
@JvmStatic
fun getByID(name: String): EcoBoss? {
return BY_ID[name]
return registry[name]
}
/**
* Update all [EcoBoss]s.
*
* @param plugin Instance of EcoBosses.
*/
@ConfigUpdater
@JvmStatic
fun update(plugin: EcoBossesPlugin) {
for (boss in values()) {
removeBoss(boss)
}
for ((id, config) in plugin.fetchConfigs("bosses")) {
addNewBoss(EcoBoss(id, config, plugin))
}
val ecoBossesYml = TransientConfig(File(plugin.dataFolder, "ecobosses.yml"), ConfigType.YAML)
for (bossConfig in ecoBossesYml.getSubsections("bosses")) {
addNewBoss(EcoBoss(bossConfig.getString("id"), bossConfig, plugin))
}
override fun clear(plugin: LibreforgePlugin) {
registry.clear()
}
/**
* Add new [EcoBoss] to EcoBosses.
*
* @param set The [EcoBoss] to add.
*/
@JvmStatic
fun addNewBoss(set: EcoBoss) {
BY_ID.remove(set.id)
BY_ID[set.id] = set
}
/**
* Remove [EcoBoss] from EcoBosses.
*
* @param set The [EcoBoss] to remove.
*/
@JvmStatic
fun removeBoss(set: EcoBoss) {
BY_ID.remove(set.id)
override fun acceptConfig(plugin: LibreforgePlugin, id: String, config: Config) {
registry.register(EcoBoss(id, config, plugin as EcoBossesPlugin))
}
/**
@@ -123,4 +95,14 @@ object Bosses {
operator fun get(entity: LivingEntity): LivingEcoBoss? {
return get(entity.uniqueId)
}
/** If an entity is a boss. */
val Entity?.isBoss: Boolean
get() {
if (this !is LivingEntity) {
return false
}
return Bosses[this] != null
}
}

View File

@@ -1,5 +1,6 @@
package com.willfp.ecobosses.bosses
import com.ticxo.modelengine.api.ModelEngineAPI
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.entities.CustomEntity
@@ -16,6 +17,7 @@ import com.willfp.eco.core.items.builder.ItemStackBuilder
import com.willfp.eco.core.recipe.Recipes
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.core.recipe.recipes.CraftingRecipe
import com.willfp.eco.core.registry.Registrable
import com.willfp.eco.util.NamespacedKeyUtils
import com.willfp.eco.util.toComponent
import com.willfp.ecobosses.events.BossKillEvent
@@ -37,6 +39,7 @@ 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.ViolationContext
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import net.kyori.adventure.bossbar.BossBar
@@ -48,14 +51,17 @@ import org.bukkit.entity.Mob
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType
import java.util.*
import java.util.Objects
import java.util.UUID
class EcoBoss(
override val id: String,
id: String,
val config: Config,
private val plugin: EcoPlugin
) : Holder {
val displayName: String = config.getString("displayName")
) : Holder, Registrable {
override val id = plugin.createNamespacedKey(id)
val displayName: String = config.getString("display-name")
val lifespan = config.getInt("lifespan")
@@ -65,23 +71,23 @@ class EcoBoss(
val targetMode = TargetMode.getByID(config.getString("target.mode"))!!
val isBossBarEnabled = config.getBool("bossBar.enabled")
val isBossBarEnabled = config.getBool("boss-bar.enabled")
val bossBarRadius = config.getDouble("bossBar.radius")
val bossBarRadius = config.getDouble("boss-bar.radius")
val isPreventingMounts = config.getBool("defence.preventMounts")
val isPreventingMounts = config.getBool("defence.prevent-mounts")
val isImmuneToExplosions = config.getBool("defence.explosionImmune")
val isImmuneToExplosions = config.getBool("defence.explosion-immune")
val isImmuneToFire = config.getBool("defence.fireImmune")
val isImmuneToFire = config.getBool("defence.fire-immune")
val isImmuneToDrowning = config.getBool("defence.drowningImmune")
val isImmuneToDrowning = config.getBool("defence.drowning-immune")
val isImmuneToSuffocation = config.getBool("defence.suffocationImmune")
val isImmuneToSuffocation = config.getBool("defence.suffocation-immune")
val meleeDamageMultiplier = config.getDouble("defence.meleeDamageMultiplier")
val meleeDamageMultiplier = config.getDouble("defence.melee-damage-multiplier")
val projectileDamageMultiplier = config.getDouble("defence.projectileDamageMultiplier")
val projectileDamageMultiplier = config.getDouble("defence.projectile-damage-multiplier")
val canTeleport = config.getBool("defence.teleportation.enabled")
@@ -136,7 +142,7 @@ class EcoBoss(
val recipe = Recipes.createAndRegisterRecipe(
this@EcoBoss.plugin,
"${this.id}_spawn_egg",
"${this.id.key}_spawn_egg",
spawnEggBacker,
config.getStrings("spawn.egg.recipe")
)
@@ -156,7 +162,7 @@ class EcoBoss(
)
}
val disabledTotemWorlds: List<String> = config.getStrings("spawn.totem.notInWorlds")
val disabledTotemWorlds: List<String> = config.getStrings("spawn.totem.not-in-worlds")
val autoSpawnInterval = config.getInt("spawn.autospawn.interval")
@@ -168,47 +174,46 @@ class EcoBoss(
val x = config.getDouble("x")
val y = config.getDouble("y")
val z = config.getDouble("z")
locations.add(
Location(
world, x, y, z
)
)
locations.add(Location(world, x, y, z))
}
locations
}
val hasCustomAI = config.getBool("customai.enabled")
val hasCustomAI = config.getBool("custom-ai.enabled")
val targetGoals = config.getSubsections("customai.target-goals").mapNotNull {
val targetGoals = config.getSubsections("custom-ai.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 entityGoals = config.getSubsections("custom-ai.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 {
Conditions.compile(it, "$id Spawn Conditions")
}
val spawnConditions = Conditions.compile(
config.getSubsections("spawn.conditions"),
ViolationContext(plugin, "$id Spawn Conditions")
)
private val bossBarColor = BossBar.Color.valueOf(config.getString("bossBar.color").uppercase())
private val bossBarColor = BossBar.Color.valueOf(config.getString("boss-bar.color").uppercase())
private val bossBarStyle = BossBar.Overlay.valueOf(config.getString("bossBar.style").uppercase())
private val bossBarStyle = BossBar.Overlay.valueOf(config.getString("boss-bar.style").uppercase())
private val sounds: Map<BossLifecycle, PlayableSound> = run {
val map = mutableMapOf<BossLifecycle, PlayableSound>()
for (value in BossLifecycle.values()) {
map[value] = PlayableSound(config.getSubsections("sounds.${value.name.lowercase()}").map {
ConfiguredSound.fromConfig(it)
})
map[value] = PlayableSound(
config.getSubsections("sounds.${value.name.lowercase()}").map {
ConfiguredSound.fromConfig(it)
}
)
}
map
@@ -239,10 +244,10 @@ class EcoBoss(
private val commandRewards: Map<Int, Iterable<CommandReward>> = run {
val map = mutableMapOf<Int, Iterable<CommandReward>>()
for (rank in config.getSubsection("rewards.topDamagerCommands").getKeys(false)) {
for (rank in config.getSubsection("rewards.top-damager-commands").getKeys(false)) {
val rankRewards = mutableListOf<CommandReward>()
for (config in config.getSubsections("rewards.topDamagerCommands.$rank")) {
for (config in config.getSubsections("rewards.top-damager-commands.$rank")) {
rankRewards.add(
CommandReward(
config.getDouble("chance"),
@@ -257,12 +262,12 @@ class EcoBoss(
map
}
private val nearbyCommandRewardRadius = config.getDouble("rewards.nearbyPlayerCommands.radius")
private val nearbyCommandRewardRadius = config.getDouble("rewards.nearby-player-commands.radius")
private val nearbyCommands: Iterable<CommandReward> = run {
val list = mutableListOf<CommandReward>()
for (config in config.getSubsections("rewards.nearbyPlayerCommands.commands")) {
for (config in config.getSubsections("rewards.nearby-player-commands.commands")) {
list.add(
CommandReward(
config.getDouble("chance"),
@@ -279,7 +284,6 @@ class EcoBoss(
config.getInt("rewards.xp.maximum")
)
private val drops: Iterable<BossDrop> = run {
val list = mutableListOf<BossDrop>()
@@ -300,15 +304,21 @@ class EcoBoss(
private val mob: TestableEntity = Entities.lookup(config.getString("mob"))
private val modelEngineID = config.getStringOrNull("model-engine-id")
private val modelEngineAnimation = config.getStringOrNull("model-engine-animation")
private val currentlyAlive = mutableMapOf<UUID, LivingEcoBoss>()
override val conditions = config.getSubsections("conditions").mapNotNull {
Conditions.compile(it, "Boss ID $id")
}.toSet()
override val conditions = Conditions.compile(
config.getSubsections("conditions"),
ViolationContext(plugin, "Boss ID $id")
)
override val effects = config.getSubsections("effects").mapNotNull {
Effects.compile(it, "Boss ID $id")
}.toSet()
override val effects = Effects.compile(
config.getSubsections("effects"),
ViolationContext(plugin, "Boss ID $id")
)
fun markDead(uuid: UUID) {
currentlyAlive.remove(uuid)
@@ -334,12 +344,11 @@ class EcoBoss(
mob.persistentDataContainer.set(
plugin.namespacedKeyFactory.create("boss"),
PersistentDataType.STRING,
this.id
this.id.key
)
if (hasCustomAI) {
val controller = EntityController.getFor(mob)
.clearAllGoals()
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>) }
@@ -347,6 +356,35 @@ class EcoBoss(
entityGoals.forEach { controller.addEntityGoal(it.priority, it.goal as EntityGoal<in Mob>) }
}
if (modelEngineID != null && Bukkit.getPluginManager().isPluginEnabled("ModelEngine")) {
val model = ModelEngineAPI.createActiveModel(modelEngineID)
if (model == null) {
plugin.logger.warning("Invalid Model Engine ID for boss $id")
}
if (modelEngineAnimation != null) {
val animationHandler = model.animationHandler
val animationProperty = animationHandler.getAnimation(modelEngineAnimation)
if (animationProperty != null) {
animationHandler.playAnimation(animationProperty, true)
} else {
plugin.logger.warning("Animation $modelEngineAnimation not found in model $modelEngineID, defaulting to walk!")
val animationPropertyWalk = animationHandler.getAnimation("walk")
if (animationPropertyWalk != null) {
animationHandler.playAnimation(animationPropertyWalk, true)
} else {
plugin.logger.warning("Walk animation not found in $modelEngineID!")
}
}
}
val modelled = ModelEngineAPI.createModeledEntity(mob)
modelled.addModel(model, true)
modelled.isBaseEntityVisible = false
}
val boss = LivingEcoBoss(
plugin,
mob,
@@ -437,6 +475,9 @@ class EcoBoss(
)
}
override fun getID(): String {
return this.id.key
}
override fun equals(other: Any?): Boolean {
if (other !is EcoBoss) {
@@ -451,8 +492,10 @@ class EcoBoss(
}
override fun toString(): String {
return ("EcoBoss{"
+ id
+ "}")
return (
"EcoBoss{" +
id +
"}"
)
}
}

View File

@@ -5,6 +5,7 @@ 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 com.willfp.libreforge.SimpleProvidedHolder
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
@@ -26,8 +27,8 @@ class EggDisplay(
val egg = itemStack.bossEgg ?: return
val lines = egg.spawnConditions
.filterNot { it.isMet(player) }
.mapNotNull { it.notMetLines?.map { line -> Display.PREFIX + line } }
.filterNot { it.isMet(player, SimpleProvidedHolder(egg)) }
.map { it.notMetLines.map { line -> Display.PREFIX + line } }
.flatten()

View File

@@ -48,6 +48,6 @@ class LivingEcoBoss(
}
override fun toString(): String {
return "LivingEcoBoss{boss=${boss}, uuid=${entity.uniqueId}}"
return "LivingEcoBoss{boss=$boss, uuid=${entity.uniqueId}}"
}
}

View File

@@ -4,7 +4,7 @@ import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.ecobosses.EcoBossesPlugin
import org.bukkit.command.CommandSender
class CommandEcobosses(plugin: EcoBossesPlugin) : PluginCommand(
class CommandEcoBosses(plugin: EcoBossesPlugin) : PluginCommand(
plugin,
"ecobosses",
"ecobosses.command.ecobosses",

View File

@@ -47,7 +47,7 @@ class CommandGive(plugin: EcoPlugin) : Subcommand(
}
var message = plugin.langYml.getMessage("give-success")
message = message.replace("%boss%", boss.id).replace("%recipient%", reciever.name)
message = message.replace("%boss%", boss.id.key).replace("%recipient%", reciever.name)
sender.sendMessage(message)
val itemStack = boss.spawnEgg!!
@@ -94,7 +94,7 @@ class CommandGive(plugin: EcoPlugin) : Subcommand(
* The cached names.
*/
private val BOSS_NAMES: List<String>
get() = Bosses.values().map { it.id }
get() = Bosses.values().map { it.id.key }
/**

View File

@@ -166,7 +166,7 @@ class CommandSpawn(plugin: EcoBossesPlugin) : Subcommand(
* The cached names.
*/
private val BOSS_NAMES: List<String>
get() = Bosses.values().map { it.id }
get() = Bosses.values().map { it.id.key }
/**
* The cached numbers.

View File

@@ -1,10 +1,8 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.event.Event
import org.bukkit.event.HandlerList
import org.bukkit.event.entity.EntityDeathEvent
abstract class BossDeathEvent(
val boss: LivingEcoBoss

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.event.HandlerList
class BossDespawnEvent(

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.events
import com.willfp.ecobosses.bosses.LivingEcoBoss
import com.willfp.ecobosses.lifecycle.BossLifecycle
import org.bukkit.entity.Player
import org.bukkit.event.HandlerList
import org.bukkit.event.entity.EntityDeathEvent

View File

@@ -1,7 +1,6 @@
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
@@ -14,7 +13,7 @@ class BossTryDropItemEvent(
var items: MutableCollection<ItemStack>,
var chance: Double,
val player: Player?
): Event() {
) : Event() {
override fun getHandlers(): HandlerList {
return HANDLERS
}

View File

@@ -0,0 +1,28 @@
package com.willfp.ecobosses.libreforge
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.bosses.EcoBoss
import com.willfp.ecobosses.events.BossTryDropItemEvent
import com.willfp.libreforge.effects.templates.MultiMultiplierEffect
import org.bukkit.event.EventHandler
object EffectBossDropChanceMultiplier : MultiMultiplierEffect<EcoBoss>("boss_drop_chance_multiplier") {
override val key = "bosses"
override fun getElement(key: String): EcoBoss? {
return Bosses.getByID(key)
}
override fun getAllElements(): Collection<EcoBoss> {
return Bosses.values()
}
@EventHandler(ignoreCancelled = true)
fun handle(event: BossTryDropItemEvent) {
val player = event.player ?: return
val multiplier = getMultiplier(player, event.boss)
event.chance *= multiplier
}
}

View File

@@ -0,0 +1,32 @@
package com.willfp.ecobosses.libreforge
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.attribute.Attribute
import org.bukkit.event.EventHandler
object TriggerKillBoss : Trigger("kill_boss") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.VICTIM,
TriggerParameter.LOCATION
)
@EventHandler(ignoreCancelled = true)
fun handle(event: BossKillEvent) {
val killer = event.killer ?: return
val entity = event.boss.entity
this.dispatch(
killer,
TriggerData(
player = killer,
victim = entity,
location = entity.location,
value = entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)!!.value
)
)
}
}

View File

@@ -0,0 +1,28 @@
package com.willfp.ecobosses.libreforge
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerSpawnBoss : Trigger("spawn_boss") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.LOCATION
)
@EventHandler(ignoreCancelled = true)
fun handle(event: BossSpawnEvent) {
val player = event.spawner ?: return
val location = event.location
this.dispatch(
player,
TriggerData(
player = player,
location = location
)
)
}
}

View File

@@ -1,16 +1,25 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.ecobosses.bosses.Bosses
import org.bukkit.entity.LivingEntity
import com.willfp.ecobosses.bosses.Bosses.isBoss
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.entity.EntityTransformEvent
import org.bukkit.event.entity.SlimeSplitEvent
class CompatibilityListeners : Listener {
@EventHandler
fun handle(event: SlimeSplitEvent) {
if (Bosses[event.entity as? LivingEntity ?: return] != null) {
event.isCancelled = true
if (!event.entity.isBoss) {
return
}
event.isCancelled = true
}
@EventHandler
fun handle(event: EntityTransformEvent) {
if (!event.entity.isBoss) {
return
}
event.isCancelled = true
}
}

View File

@@ -1,15 +1,15 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.eco.core.EcoPlugin
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
private val plugin: EcoPlugin
) : Listener {
@EventHandler(
ignoreCancelled = true,

View File

@@ -1,7 +1,6 @@
package com.willfp.ecobosses.lifecycle
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossDeathEvent
import com.willfp.ecobosses.events.BossDespawnEvent
import com.willfp.ecobosses.events.BossKillEvent
import com.willfp.ecobosses.events.BossSpawnEvent

View File

@@ -23,7 +23,7 @@ object AutospawnHandler {
val world = location.world ?: continue
if (plugin.configYml.getBool("autospawn.one-boss-per-world")) {
if (Bosses.getAllAlive().mapNotNull { it.entity }.any { it.world == world }) {
if (Bosses.getAllAlive().map { it.entity }.any { it.world == world }) {
continue
}
}

View File

@@ -1,16 +1,26 @@
package com.willfp.ecobosses.spawn
import com.willfp.ecobosses.EcoBossesPlugin
import com.willfp.ecobosses.bosses.bossEgg
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.libreforge.SimpleProvidedHolder
import org.bukkit.Bukkit
import org.bukkit.Location
import org.bukkit.block.Container
import org.bukkit.block.data.Directional
import org.bukkit.entity.Player
import org.bukkit.event.Event
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.block.Action
import org.bukkit.event.block.BlockDispenseEvent
import org.bukkit.event.player.PlayerInteractEvent
import org.bukkit.inventory.EquipmentSlot
import org.bukkit.inventory.ItemStack
class SpawnEggHandler : Listener {
class SpawnEggHandler(
private val plugin: EcoBossesPlugin
) : Listener {
@EventHandler(
ignoreCancelled = true
)
@@ -19,28 +29,13 @@ class SpawnEggHandler : Listener {
return
}
val item = event.item ?: return
val boss = item.bossEgg ?: return
if (!this.handleSpawnEgg(event.item, event.clickedBlock?.location?.add(0.0, 1.5, 0.0), event.player)) {
return
}
event.isCancelled = true
event.setUseItemInHand(Event.Result.DENY)
val location = event.clickedBlock?.location?.add(0.0, 1.5, 0.0) ?: return
val player = event.player
if (!boss.spawnConditions.all { it.condition.isConditionMet(player, it.config) }) {
return
}
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.EGG, player)
Bukkit.getPluginManager().callEvent(spawnEvent)
if (spawnEvent.isCancelled) {
return
}
if (event.hand == EquipmentSlot.HAND) {
val hand = event.player.inventory.itemInMainHand
hand.amount = hand.amount - 1
@@ -48,7 +43,56 @@ class SpawnEggHandler : Listener {
val hand = event.player.inventory.itemInOffHand
hand.amount = hand.amount - 1
}
}
@EventHandler(
ignoreCancelled = true
)
fun handle(event: BlockDispenseEvent) {
val facing = (event.block.blockData as Directional).facing
val location = event.block.location.add(facing.direction.multiply(1.7))
if (!this.handleSpawnEgg(event.item, location, null)) return
event.isCancelled = true
val dispenser = event.block.state as? Container ?: return
// This is needed as the event must finish first,
// Otherwise the dispenser/dropper thinks the item is already removed from this event.
plugin.scheduler.run {
val item = dispenser.inventory.find { it?.isSimilar(event.item) == true } ?: return@run
item.amount--
dispenser.update()
}
}
private fun handleSpawnEgg(
item: ItemStack?,
location: Location?,
player: Player?
): Boolean {
val boss = item?.bossEgg ?: return false
if (location == null) {
return false
}
if (player != null) {
if (!boss.spawnConditions.areMet(player, SimpleProvidedHolder(boss))) {
return false
}
}
val spawnEvent = BossSpawnEvent(boss, location, BossSpawnEvent.SpawnReason.EGG, player)
Bukkit.getPluginManager().callEvent(spawnEvent)
if (spawnEvent.isCancelled) {
return false
}
boss.spawn(location)
return true
}
}
}

View File

@@ -4,6 +4,7 @@ import com.willfp.eco.util.containsIgnoreCase
import com.willfp.ecobosses.bosses.Bosses
import com.willfp.ecobosses.events.BossSpawnEvent
import com.willfp.ecobosses.util.SpawnTotem
import com.willfp.libreforge.SimpleProvidedHolder
import org.bukkit.Bukkit
import org.bukkit.Material
import org.bukkit.block.Block
@@ -28,11 +29,13 @@ class SpawnTotemHandler : Listener {
middle = event.block.getRelative(0, -1, 0)
bottom = event.block.getRelative(0, -2, 0)
}
1 -> {
top = event.block.getRelative(0, 2, 0)
middle = event.block.getRelative(0, 1, 0)
bottom = event.block
}
2 -> {
top = event.block.getRelative(0, 1, 0)
middle = event.block
@@ -52,7 +55,7 @@ class SpawnTotemHandler : Listener {
val player = event.player
if (!boss.spawnConditions.all { it.condition.isConditionMet(player, it.config) }) {
if (!boss.spawnConditions.areMet(player, SimpleProvidedHolder(boss))) {
return
}

View File

@@ -14,6 +14,7 @@ class BossBarTicker(
override fun tick(boss: LivingEcoBoss, tick: Int) {
val entity = boss.entity
@Suppress("DEPRECATION")
bar.name(entity.customName!!.toComponent())
bar.progress((entity.health / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)!!.value).toFloat())

View File

@@ -11,7 +11,7 @@ class ChunkTicker : BossTicker {
}
if (currentChunk.isLoaded && currentChunk.isForceLoaded) {
return;
return
}
currentChunk.load()

View File

@@ -15,6 +15,7 @@ class DisplayNameTicker : BossTicker {
val formattedTime = String.format("%d:%02d", timeLeft / 60, timeLeft % 60)
@Suppress("DEPRECATION")
entity.customName = boss.boss.displayName
.replace("%health%", NumberUtils.format(entity.health))
.replace("%time%", formattedTime)

View File

@@ -14,11 +14,6 @@ class LifespanTicker : BossTicker {
Bukkit.getPluginManager().callEvent(event)
boss.remove()
boss.boss.handleLifecycle(
BossLifecycle.DESPAWN,
boss.entity.location,
boss.entity
)
}
}
}

View File

@@ -0,0 +1,24 @@
package com.willfp.ecobosses.util
import com.willfp.libreforge.Holder
import com.willfp.libreforge.ProvidedHolder
import org.bukkit.entity.LivingEntity
class EntityProvidedHolder(
override val holder: Holder,
override val provider: LivingEntity
) : ProvidedHolder {
override fun equals(other: Any?): Boolean {
if (other !is EntityProvidedHolder) {
return false
}
return other.holder == holder && other.provider == provider
}
override fun hashCode(): Int {
var result = holder.hashCode()
result = 31 * result + provider.hashCode()
return result
}
}

View File

@@ -38,6 +38,7 @@ data class LocalBroadcast(
if (radius < 0) {
for (message in toBroadcast) {
@Suppress("DEPRECATION")
Bukkit.broadcastMessage(message)
}
} else {

View File

@@ -1,6 +1,5 @@
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
@@ -32,7 +31,7 @@ data class LocalCommands(
}
for (s in toDispatch) {
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s);
Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s)
}
}
}

View File

@@ -7,13 +7,21 @@
# A base mob and modifiers
# View an explanation for this system here: https://plugins.auxilor.io/all-plugins/the-entity-lookup-system
mob: iron_golem attack-damage:90 movement-speed:1.5 follow-range:16 health:1200
# If you're using model engine, you can specify the ID and animation here. You can also specify these in the mob with the lookup system.
model-engine-id: ""
model-engine-animation: ""
# Supported placeholders: %health%, %time% (formats as minutes:seconds, eg 1:56)
displayName: "&8Steel Golem &7| &c%health%♥ &7| &e%time%"
display-name: "&8Steel Golem &7| &c%health%♥ &7| &e%time%"
influence: 40 # The distance at which effects will be applied to players
customai: # Custom mob AI using the entity goal system.
custom-ai: # Custom mob AI using the entity goal system.
enabled: false # If custom AI should be enabled, this will override the vanilla mob behaviour.
target-goals: [ ] # How the boss decides who to attack, if the target mode isn't being used.
ai-goals: [ ] # How the boss should behave.
effects: # Effects are done from the player's perspective: to treat the player as the victim, use the self_as_victim option in args
- id: run_chain
args:
@@ -22,27 +30,32 @@ effects: # Effects are done from the player's perspective: to treat the player a
chance: 20
triggers:
- static_20
conditions: [ ] # Conditions to apply effects to players; useful if you don't want to affect low-level players
lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable.
defence:
preventMounts: true # If the boss shouldn't be able to get into boats, minecarts, etc
explosionImmune: true # If the boss should be immune to explosions
fireImmune: true # If the boss should be immune to fire damage
drowningImmune: true # If the boss should be immune to drowning damage
suffocationImmune: true # If the boss should be immune to suffocation
meleeDamageMultiplier: 0.8 # Incoming melee damage will be multiplied by this value. Set to 0 to render immune against melee
projectileDamageMultiplier: 0.2 # Same as melee multiplier, but for projectiles
conditions: [ ] # Conditions to apply effects to players; useful if you don't want to affect low-level players
lifespan: 120 # The lifespan of the boss before it despawns, in seconds. Set to a massive number to disable.
defence:
prevent-mounts: true # If the boss shouldn't be able to get into boats, minecarts, etc
explosion-immune: true # If the boss should be immune to explosions
fire-immune: true # If the boss should be immune to fire damage
drowning-immune: true # If the boss should be immune to drowning damage
suffocation-immune: true # If the boss should be immune to suffocation
melee-damage-multiplier: 0.8 # Incoming melee damage will be multiplied by this value. Set to 0 to render immune against melee
projectile-damage-multiplier: 0.2 # Same as melee multiplier, but for projectiles
teleportation: # Teleport every x ticks in order to avoid being caged in obsidian or similar
enabled: true # If the boss should teleport
interval: 100 # Ticks between teleportation attempts
range: 20 # The range that the boss should check for safe teleportation blocks.
rewards:
xp: # Experience will be randomly generated between these values
minimum: 30000
maximum: 60000
topDamagerCommands:
top-damager-commands:
# You can specify as many ranks as you want (adding 4, 5, etc)
# You can use %player% as a placeholder for the player name
1:
@@ -51,28 +64,33 @@ rewards:
- eco give %player% 10000
2: [ ]
3: [ ]
nearbyPlayerCommands:
nearby-player-commands:
# Commands to be executed for all players near the boss death location
radius: 10
# Uses the same syntax as top damager commands (chance and a list of commands, can use %player%)
commands: [ ]
# You can specify as many drops as you want, and group several drops together under one chance
drops:
- chance: 100
items:
- diamond_sword unbreaking:1 name:"Example Sword"
target:
# How the boss should choose which player to attack, choices are:
# highest_health, lowest_health, closest, random
mode: highest_health
# The distance to scan for players
range: 40
bossBar:
boss-bar:
# If the boss should have a boss bar
enabled: true
color: white # Options: blue, green, pink, purple, red, white, yellow
style: progress # Options: progress, notched_20, notched_12, notched_10, notched_6
radius: 120 # The distance from the boss where the boss bar is visible
spawn:
# A list of conditions required for a player to be able to spawn a boss, useful to set
# minimum skill levels, etc
@@ -91,7 +109,7 @@ spawn:
top: netherite_block
middle: iron_block
bottom: magma_block
notInWorlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here
not-in-worlds: [ ] # If spawn totems should be disallowed in certain worlds, specify them here
egg:
enabled: true # If the boss should have a spawn egg
item: evoker_spawn_egg unbreaking:1 hide_enchants
@@ -111,6 +129,7 @@ spawn:
- iron_block
- netherite_block
- iron_block
commands:
# For each category, you can add as many commands as you want, which will be executed by
# console. Supported placeholders are the same as for messages (see below)
@@ -118,6 +137,7 @@ commands:
kill: [ ]
despawn: [ ]
injure: [ ]
messages:
# For each category, you can add as many messages as you want, each with their own radius.
# Radius is the distance from the boss where the player will be sent the message

View File

@@ -0,0 +1,210 @@
mob: illusioner attack-damage:50 health:600 hand:"iron_sword sharpness:5"
model-engine-id: ""
model-engine-animation: ""
display-name: "&9Illusioner &7| &c%health%♥ &7| &e%time%"
influence: 40
custom-ai:
enabled: true
target-goals:
- key: minecraft:hurt_by
priority: 0
args:
blacklist: [ ]
- key: minecraft:nearest_attackable
priority: 1
args:
target:
- player
checkVisibility: false
checkCanNavigate: true
reciprocalChance: 300
- key: minecraft:nearest_attackable
priority: 2
args:
target:
- iron_golem
- villager
checkVisibility: false
checkCanNavigate: true
reciprocalChance: 300
ai-goals:
- key: minecraft:float
priority: 0
- key: minecraft:illusioner_mirror_spell
priority: 1
- key: minecraft:melee_attack
priority: 2
args:
speed: 1.6
pauseWhenMobIdle: false
- key: minecraft:random_stroll
priority: 8
args:
speed: 0.6
interval: 80
canDespawn: false
- key: minecraft:look_at_player
priority: 9
args:
range: 6
chance: 1
effects:
- id: run_chain
args:
chain: blind
self_as_victim: true
chance: 20
triggers:
- static_20
conditions: [ ]
lifespan: 120
defence:
prevent-mounts: true
explosion-immune: true
fire-immune: true
drowning-immune: true
suffocation-immune: true
melee-damage-multiplier: 1
projectile-damage-multiplier: 0.8
teleportation:
enabled: true
interval: 200
range: 20
rewards:
xp:
minimum: 20000
maximum: 40000
top-damager-commands:
1:
- chance: 100 # As a percentage
commands:
- eco give %player% 10000
2: [ ]
3: [ ]
nearby-player-commands:
radius: 10
commands: [ ]
drops: []
target:
mode: closest
range: 40
boss-bar:
enabled: true
color: blue
style: notched_20
radius: 120
spawn:
conditions: [ ]
autospawn:
interval: -1
locations: []
totem:
enabled: false
top: carved_pumpkin
middle: beacon
bottom: diamond_block
not-in-worlds: [ ]
egg:
enabled: true
item: dolphin_spawn_egg unbreaking:1 hide_enchants
name: "&9Illusioner&f Spawn Egg"
lore:
- ""
- "&8&oPlace on the ground to"
- "&8&osummon an &9Illusioner"
craftable: true
recipe:
- ""
- fermented_spider_eye 64
- ""
- fermented_spider_eye 64
- ecoitems:boss_core ? nether_star
- fermented_spider_eye 64
- ""
- fermented_spider_eye 64
- ""
commands:
spawn: [ ]
kill: [ ]
despawn: [ ]
injure: [ ]
messages:
spawn:
- message:
- ""
- "&fAn &9&lIllusioner&r&f has been spawned!"
- "&fCome fight it at &9%x%&f, &9%y%&f, &9%z%&f!"
- ""
radius: -1
kill:
- message:
- ""
- "&fThe &9&lIllusioner&r&f has been killed!"
- "&fMost Damage:"
- "&f - &9%damage_1_player%&f (%damage_1% Damage)"
- "&f - &9%damage_2_player%&f (%damage_2% Damage)"
- "&f - &9%damage_3_player%&f (%damage_3% Damage)"
- ""
radius: -1
despawn:
- message:
- ""
- "&fYou ran out of time to kill the &9&lIllusioner&r&f!"
- ""
radius: -1
injure: [ ]
sounds:
spawn:
- sound: entity_illusioner_mirror_move
pitch: 0.5
volume: 100
- sound: entity_wither_spawn
pitch: 2
volume: 100
kill:
- sound: entity_evoker_prepare_wololo
pitch: 0.8
volume: 100
- sound: entity_illusioner_prepare_blindness
pitch: 1
volume: 100
- sound: entity_wither_death
pitch: 2
volume: 100
despawn:
- sound: entity_ender_dragon_ambient
pitch: 0.6
volume: 50
- sound: entity_enderman_death
pitch: 0.8
volume: 50
injure:
- sound: entity_illusioner_cast_spell
pitch: 2
volume: 10

View File

@@ -1,21 +0,0 @@
# Read more about chains: https://plugins.auxilor.io/effects/configuring-an-effect#effect-chains
chains:
- id: example_chain
effects:
- id: teleport
- id: potion_effect
args:
effect: blindness
level: 3
duration: 30
apply_to_player: true
- id: send_message
args:
message: "&fYou have been teleported!"
action_bar: true
- id: play_sound
args:
sound: entity_dragon_fireball_explode
pitch: 1.5
volume: 4

View File

@@ -8,44 +8,3 @@ log-spawn-kill: true
autospawn:
one-boss-per-world: true # If only one boss can auto-spawn per world at once.
cooldown:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cannot-afford-type:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
point-names: # If you have point names that look ugly (eg g_souls) then you can map them to nice names to be shown to players.
example_point: "Nicely Formatted Point"
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
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
share-configs: true # If your configs are allowed to be used to gather data and improve the plugin. Nothing identifying (IP, Name, etc) is shared.

View File

@@ -1,3 +1,8 @@
resource-id: 525
bstats-id: 10635
color: "&9"
environment:
- name: libreforge version
value: ${libreforgeVersion}
options:
resource-id: 525
bstats-id: 10635
color: "&9"

View File

@@ -1,9 +1,10 @@
messages:
prefix: "&9&lEcoBosses &f» "
no-permission: "&cYou don't have permission to do this!"
invalid-command: "&cUnknown subcommand!"
not-player: "&cThis command must be run by a player"
invalid-command: "&cUnknown subcommand!"
reloaded: "Reloaded!"
sent-drop: "Check console for the drop!"
specify-boss: "&cYou must specify a valid boss!"
invalid-location: "&cInvalid location!"
@@ -15,9 +16,5 @@ messages:
invalid-stone: "&cInvalid boss!"
give-success: "Gave &a%boss%&r spawn egg to &a%recipient%"
requirements-not-met: "&cYou can't spawn this boss!"
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-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
cannot-transmit: "&cYou can't transmit here!"
na: "N/A"

View File

@@ -0,0 +1,53 @@
name: ${pluginName}
version: ${version}
main: com.willfp.ecobosses.EcoBossesPlugin
api-version: 1.19
dependencies:
- name: eco
required: true
bootstrap: false
- name: libreforge
required: false
bootstrap: false
load-after:
- name: eco
bootstrap: false
permissions:
ecobosses.*:
description: All ecobosses permissions
default: op
children:
ecobosses.command.*: true
ecobosses.command.*:
description: All ecobosses commands
default: op
children:
ecobosses.command.ecobosses: true
ecobosses.command.reload: true
ecobosses.command.spawn: true
ecobosses.command.give: true
ecobosses.command.ecobosses:
description: Allows the use of /ecobosses
default: true
ecobosses.command.give:
description: Allows the use of /ecobosses give
default: op
ecobosses.command.spawn:
description: Allows the use of /ecobosses spawn
default: op
ecobosses.command.killall:
description: Allows the use of /ecobosses killall
default: op
ecobosses.command.reload:
description: Allows the use of /ecobosses reload
default: op

View File

@@ -1,25 +1,15 @@
name: EcoBosses
version: ${projectVersion}
name: ${pluginName}
version: ${version}
main: com.willfp.ecobosses.EcoBossesPlugin
api-version: 1.17
authors: [Auxilor]
website: willfp.com
load: STARTUP
depend:
- eco
softdepend:
- libreforge
- LevelledMobs
- AureliumSkills
- Jobs
- mcMMO
- Vault
- TMMobcoins
- EcoEnchants
- Talismans
- EcoArmor
- EcoItems
- EcoSkills
- Boosters
commands:
ecobosses:
@@ -59,4 +49,4 @@ permissions:
ecobosses.command.reload:
description: Allows the use of /ecobosses reload
default: op
default: op

View File

@@ -1,4 +1,5 @@
#libreforge-updater
#Tue Sep 13 19:15:06 BST 2022
version=8.84.0
plugin-name=EcoBosses
#Sun Apr 02 17:44:13 BST 2023
kotlin.code.style=official
libreforge-version=4.2.1
version=9.2.1

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

269
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/usr/bin/env sh
#!/bin/sh
#
# Copyright 2015 the original author or authors.
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
##
## Gradle start up script for UN*X
##
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
MAX_FD=maximum
warn () {
echo "$*"
}
} >&2
die () {
echo
echo "$*"
echo
exit 1
}
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

View File

@@ -1,12 +0,0 @@
pluginManagement {
repositories {
gradlePluginPortal()
maven { url "https://repo.jpenilla.xyz/snapshots/" }
}
}
rootProject.name = 'EcoBosses'
// Core
include ':eco-core'
include ':eco-core:core-plugin'

14
settings.gradle.kts Normal file
View File

@@ -0,0 +1,14 @@
pluginManagement {
repositories {
gradlePluginPortal()
mavenLocal()
maven("https://repo.jpenilla.xyz/snapshots/")
maven("https://repo.auxilor.io/repository/maven-public/")
}
}
rootProject.name = "EcoBosses"
// Core
include(":eco-core")
include(":eco-core:core-plugin")