Compare commits

...

202 Commits

Author SHA1 Message Date
Will FP
36195e16ce libreforge-updater 2025-03-29 14:22:31 +00:00
Will FP
bae0ab6150 libreforge-updater 2025-01-31 11:55:07 +00:00
Will FP
4445c7f681 libreforge-updater 2025-01-25 13:50:11 +00:00
Will FP
8285613d15 Fix 2025-01-25 13:48:01 +00:00
Will FP
855aa29e4b libreforge-updater 2025-01-25 13:46:06 +00:00
Will FP
92f47d1c87 libreforge-updater 2024-11-06 18:33:33 +00:00
Will FP
5b817fed20 libreforge-updater 2024-10-22 12:14:43 +01:00
Will FP
b6b523b1f8 libreforge-updater 2024-09-22 17:01:04 +01:00
Auxilor
8c016b94ef libreforge-updater 2024-09-02 11:30:08 +01:00
Auxilor
9c87498045 libreforge-updater 2024-08-30 17:25:07 +01:00
Auxilor
cbb48fa888 libreforge-updater 2024-08-29 12:09:17 +01:00
Auxilor
58ecfbe112 libreforge-updater 2024-08-23 15:35:23 +01:00
Auxilor
93e24a6f25 libreforge-updater 2024-08-21 18:58:20 +01:00
Auxilor
d8dfe6fd7c libreforge-updater 2024-08-15 15:07:35 +01:00
Auxilor
4551ddad08 libreforge-updater 2024-08-03 13:41:26 +01:00
Auxilor
e47533f03c libreforge-updater 2024-07-25 10:04:33 +01:00
Auxilor
5c9f792780 libreforge-updater 2024-07-21 12:19:17 +01:00
Auxilor
bde074bd7c libreforge-updater 2024-07-19 20:28:38 +01:00
Auxilor
5d143f6dec libreforge-updater 2024-07-18 13:24:13 +01:00
Auxilor
8abdcd6d33 libreforge-updater 2024-07-16 17:13:42 +01:00
Auxilor
210f618dc9 libreforge-updater 2024-07-13 20:45:18 +01:00
Auxilor
0514220390 libreforge-updater 2024-07-08 15:58:28 +01:00
Auxilor
2135293799 libreforge-updater 2024-07-05 13:02:45 +01:00
Auxilor
14e3d8fdf5 libreforge-updater 2024-07-03 17:43:57 +01:00
Auxilor
db4fb84160 libreforge-updater 2024-06-29 16:44:01 +01:00
Auxilor
6b0541646f libreforge-updater 2024-06-28 15:56:24 +01:00
Auxilor
72f826a57c libreforge-updater 2024-06-27 18:54:28 +01:00
Auxilor
04b0816e72 libreforge-updater 2024-06-26 16:52:20 +01:00
Auxilor
09980fc895 libreforge-updater 2024-06-25 15:13:59 +01:00
Auxilor
c737256349 libreforge-updater 2024-06-24 15:06:34 +01:00
Auxilor
ff4900da4d Updated to Java 21 2024-06-24 13:59:14 +01:00
Auxilor
570f1b1213 libreforge-updater 2024-06-23 17:26:31 +01:00
Auxilor
1f8714bb57 libreforge-updater 2024-06-23 13:19:01 +01:00
Will FP
08e964986b libreforge-updater 2024-05-31 20:37:57 +01:00
Will FP
2dcf954101 libreforge-updater 2024-05-11 18:21:22 +01:00
Will FP
d3d25290fd libreforge-updater 2024-04-17 20:35:06 +01:00
Auxilor
b9939057a0 libreforge-updater 2024-04-15 18:19:43 +01:00
Auxilor
26624faf98 libreforge-updater 2024-04-11 13:17:39 +01:00
Auxilor
23997922ed libreforge-updater 2024-03-29 16:08:46 +00:00
Will FP
b2120c59e3 libreforge-updater 2024-03-11 17:38:12 +00:00
Will FP
c04d6eca01 libreforge-updater 2024-03-10 20:09:43 +00:00
Will FP
5d18b5953a libreforge-updater 2024-03-02 15:20:58 +00:00
Will FP
5345394d14 libreforge-updater 2024-02-22 13:18:28 +00:00
Will FP
0c765272df libreforge-updater 2024-02-15 13:02:42 +00:00
Will FP
f17d4af664 libreforge-updater 2024-02-08 19:50:03 +00:00
Will FP
f57db1cd74 libreforge-updater 2024-01-30 11:27:47 +00:00
Will FP
188cac252f libreforge-updater 2024-01-18 17:03:28 +00:00
Will FP
8fd8f6237e libreforge-updater 2024-01-16 13:29:25 +00:00
Will FP
6abf50b009 libreforge-updater 2024-01-13 14:24:11 +00:00
Will FP
8a750b5824 libreforge-updater 2024-01-07 13:52:05 +00:00
Will FP
1fd45ccd75 libreforge-updater 2024-01-06 09:20:23 +00:00
Auxilor
1fdb3f65df libreforge-updater 2024-01-04 17:25:31 +00:00
Auxilor
a6fe3b095c libreforge-updater 2024-01-01 20:02:32 +00:00
Will FP
86c0c4d391 libreforge-updater 2023-12-27 14:17:52 +01:00
Will FP
b42dfe9be2 libreforge-updater 2023-12-24 14:55:01 +01:00
Auxilor
ea66d98df8 libreforge-updater 2023-12-20 15:57:14 +00:00
Will FP
2cc0d6b3c2 libreforge-updater 2023-12-14 16:13:55 +00:00
Will FP
8e2006fa2c libreforge-updater 2023-12-11 12:13:10 +00:00
Will FP
e8c387e85c libreforge-updater 2023-12-07 17:26:10 +00:00
Will FP
7a82b73b96 Updated to use ModelEngineBridge 2023-12-03 16:07:31 +00:00
Will FP
4049a429d6 libreforge-updater 2023-12-03 15:59:57 +00:00
Will FP
5895c12c6b libreforge-updater 2023-11-30 14:27:51 +00:00
Will FP
0b6112408f libreforge-updater 2023-11-26 23:24:54 +00:00
Will FP
8ee3852ad8 libreforge-updater 2023-11-23 13:21:50 +00:00
Auxilor
5aab3af9ea libreforge-updater 2023-11-21 22:41:48 +00:00
Auxilor
e83d8d4b14 libreforge-updater 2023-11-19 14:14:31 +00:00
Auxilor
0241b2fb2a libreforge-updater 2023-11-17 19:02:39 +00:00
Auxilor
ac9147463a libreforge-updater 2023-11-11 17:59:04 +00:00
Auxilor
d2928ee59f libreforge-updater 2023-11-10 13:59:34 +00:00
Auxilor
315d8f0954 libreforge-updater 2023-11-05 13:42:13 +00:00
Auxilor
7f616da0ce libreforge-updater 2023-10-30 13:31:12 +00:00
Auxilor
eeada10ef8 libreforge-updater 2023-10-28 14:15:39 +01:00
Auxilor
230eb9b87f libreforge-updater 2023-10-24 15:39:40 +01:00
Auxilor
803324c5c9 libreforge-updater 2023-10-19 12:52:41 +01:00
Auxilor
6aaf494b73 libreforge-updater 2023-10-14 14:20:38 +01:00
Auxilor
d34ad33c7d libreforge-updater 2023-10-14 14:19:18 +01:00
Auxilor
e0c1c27ea5 Updated to 2.36.2 2023-10-07 17:57:10 +01:00
Auxilor
a31b6a2a4c Fixed pets gui again 2023-10-07 17:57:00 +01:00
Auxilor
82decbb2cb Updated to 2.36.1 2023-10-07 14:09:39 +01:00
Auxilor
f143a90dd7 Fixed pet icon max level lore 2023-10-07 14:09:28 +01:00
Auxilor
58a16a33ec libreforge-updater 2023-10-02 11:54:46 +01:00
Auxilor
8626869a0f Updated to 2.35.0 2023-10-02 11:37:47 +01:00
Auxilor
88eea3c768 Added max level lore everywhere 2023-10-02 11:35:12 +01:00
Auxilor
0271c16357 Added /ecopets givecurrentxp <player> <amount> 2023-10-02 11:26:41 +01:00
Auxilor
2dc88624dd Updated to 2.34.1 2023-09-28 16:19:32 +01:00
Auxilor
20d7e3abf7 Added max level lore 2023-09-28 16:19:14 +01:00
Auxilor
2d1d423f83 libreforge-updater 2023-09-26 14:46:10 +01:00
Auxilor
2064bcc9f2 libreforge-updater 2023-09-20 15:34:00 +01:00
Auxilor
95b7bdc3db libreforge-updater 2023-09-17 11:20:29 +01:00
Auxilor
619d5fdde5 libreforge-updater 2023-09-13 15:09:07 +01:00
Auxilor
4226d544e9 libreforge-updater 2023-09-07 16:01:52 +01:00
Auxilor
cf8de5a182 libreforge-updater 2023-09-02 17:34:39 +01:00
Auxilor
26ef893d2c libreforge-updater 2023-08-31 16:59:40 +01:00
Auxilor
1e5836203a libreforge-updater 2023-08-30 11:31:35 +01:00
Auxilor
dcb06f6e25 Added use-local-storage 2023-08-30 09:49:33 +01:00
Auxilor
493d419e2c libreforge-updater 2023-08-26 18:11:39 +01:00
Auxilor
435160f626 libreforge-updater 2023-08-23 15:31:54 +01:00
Auxilor
dfe7af1e1b libreforge-updater 2023-08-19 15:32:47 +01:00
Auxilor
25fe58d2ab libreforge-updater 2023-08-15 18:54:18 +01:00
Auxilor
a538947fb8 libreforge-updater 2023-08-13 14:42:46 +01:00
Auxilor
345c8e9049 libreforge-updater 2023-08-10 19:59:39 +01:00
Auxilor
87e3a15d01 libreforge-updater 2023-08-10 19:57:45 +01:00
Auxilor
1ea152058c libreforge-updater 2023-08-09 15:58:48 +01:00
Auxilor
a1a08f750a libreforge-updater 2023-08-09 14:40:44 +01:00
Auxilor
0ec4e566b3 libreforge-updater 2023-08-09 14:37:35 +01:00
Auxilor
98c71e938c libreforge-updater 2023-08-08 17:59:36 +01:00
Auxilor
2e3db38e67 libreforge-updater 2023-08-05 21:07:17 +01:00
Auxilor
d3438a0db1 libreforge-updater 2023-07-27 15:21:49 +01:00
Auxilor
69b8179672 libreforge-updater 2023-07-27 15:18:57 +01:00
Auxilor
ffe6f47e22 libreforge-updater 2023-07-25 14:38:31 +01:00
Auxilor
759f921287 libreforge-updater 2023-07-23 11:40:38 +01:00
Auxilor
2a0e27d7e1 libreforge-updater 2023-07-22 14:59:48 +01:00
Will FP
ad1e639d00 Merge pull request #44 from SenPr/master
Add total_pets placeholder, `has_pet` condition and fix `has_active_pet`
2023-07-22 13:37:26 +01:00
Auxilor
9f1f6b206c libreforge-updater 2023-07-21 12:33:13 +01:00
Auxilor
2a465013d4 libreforge-updater 2023-07-20 13:07:00 +01:00
Sen2000
6b2ea93e3b imports... 2023-07-20 15:58:44 +07:00
Sen2000
9f55826f5e Add has_pet condition and fix has_active_pet 2023-07-20 15:44:22 +07:00
Auxilor
ff9e2cbcba libreforge-updater 2023-07-19 14:14:53 +01:00
Sen2000
8e90f57364 imports oopsie part 2 2023-07-19 01:14:40 +07:00
Sen2000
682cfe6c8e imports oopsie AGAIN 2023-07-19 01:13:24 +07:00
Sen2000
a4983ffea0 Add total_pets placeholder 2023-07-19 01:10:40 +07:00
Auxilor
ebda2dd3c9 libreforge-updater 2023-07-17 18:32:30 +01:00
Auxilor
75794f4af7 libreforge-updater 2023-07-16 13:33:22 +01:00
Auxilor
53d7688436 libreforge-updater 2023-07-12 13:08:08 +01:00
Auxilor
e145b21cb8 libreforge-updater 2023-07-09 17:24:56 +01:00
Auxilor
bf436b239f libreforge-updater 2023-07-06 18:47:05 +01:00
Auxilor
4707291704 libreforge-updater 2023-07-04 14:49:52 +01:00
Auxilor
321d3ed92c libreforge-updater 2023-06-27 10:41:52 +01:00
Auxilor
88b25f93ce libreforge-updater 2023-06-21 10:23:26 +01:00
Auxilor
244626682e libreforge-updater 2023-06-19 11:12:39 +02:00
Will FP
af6b811458 Create CODEOWNERS 2023-06-17 21:22:30 +02:00
Auxilor
e5064aabef libreforge-updater 2023-06-10 13:32:44 +01:00
Auxilor
558431d39c libreforge-updater 2023-06-05 16:26:49 +01:00
Auxilor
eca0980869 Fixed Publications 2023-06-03 18:03:02 +01:00
Auxilor
5645698d3f libreforge-updater 2023-06-03 15:45:34 +01:00
Auxilor
d4cf108d52 Invisible players will no longer have visible pets 2023-06-03 14:00:18 +01:00
Auxilor
95c8fe5277 libreforge-updater 2023-06-01 12:33:34 +01:00
Auxilor
0975391c9c libreforge-updater 2023-05-30 16:10:49 +01:00
Auxilor
3d4666f7e0 libreforge-updater 2023-05-24 14:58:12 +01:00
Auxilor
ae2c9680f3 libreforge-updater 2023-05-23 16:12:26 +01:00
Auxilor
ad3892fc90 Updated to 2.14.3 2023-05-22 15:14:06 +01:00
Auxilor
658aeee2cc Fixed /ecopets give 2023-05-22 15:06:37 +01:00
Auxilor
d09ebfa779 libreforge-updater 2023-05-20 17:41:14 +01:00
Auxilor
826d9c6300 Updated to 2.14.1 2023-05-20 17:34:08 +01:00
Will FP
508e5d32f5 Merge pull request #37
Page system fix
2023-05-20 17:33:53 +01:00
TomTom
16604aba7f Merge remote-tracking branch 'upstream/master' into new 2023-05-20 08:46:16 +02:00
Auxilor
84d0e025c3 i fucking hate model engine 2023-05-18 16:27:59 +01:00
Auxilor
9ad09ecec0 libreforge-updater 2023-05-18 16:25:44 +01:00
Auxilor
c725db06bd I BEG OF YOU 2023-05-17 16:37:06 +01:00
Auxilor
480cd9da49 libreforge-updater 2023-05-17 15:57:27 +01:00
Auxilor
797235c0a5 libreforge-updater 2023-05-16 20:30:22 +01:00
Auxilor
10cc3e07c8 libreforge-updater 2023-05-15 10:52:44 +01:00
Auxilor
c3825fb16c libreforge-updater 2023-05-14 13:08:44 +01:00
Auxilor
ac7c2eccc3 libreforge-updater 2023-05-09 17:45:43 +01:00
Auxilor
a274d0f6b8 libreforge-updater 2023-05-05 18:54:49 +01:00
Auxilor
3a5660f6b9 libreforge-updater 2023-05-03 14:48:12 +01:00
Auxilor
f33e36344e libreforge-updater 2023-04-30 19:57:25 +01:00
Auxilor
0462812f69 libreforge-updater 2023-04-29 17:19:43 +01:00
Auxilor
06ede699f2 libreforge-updater 2023-04-25 16:06:22 +01:00
Auxilor
478f618f43 libreforge-updater 2023-04-25 13:13:25 +01:00
Auxilor
f0422b5783 Hey wow! It's lumine again! kms 2023-04-24 22:52:39 +01:00
Auxilor
754f0fa281 libreforge-updater 2023-04-24 22:49:40 +01:00
Auxilor
b745c7f046 libreforge-updater 2023-04-20 20:21:10 +01:00
Auxilor
fa4182c228 libreforge-updater 2023-04-19 12:22:11 +01:00
Auxilor
670c2bfc28 libreforge-updater 2023-04-13 12:49:06 -04:00
Auxilor
76f31ecc7d libreforge-updater 2023-04-09 18:19:45 -04:00
Auxilor
27be85e00d libreforge-updater 2023-04-06 20:09:51 +02:00
Auxilor
24994e80b3 libreforge-updater 2023-04-05 13:14:15 +01:00
Auxilor
5a7c513cb5 libreforge-updater 2023-04-03 17:50:17 +01:00
Auxilor
26a51a88b5 libreforge-updater 2023-04-02 17:44:37 +01:00
Auxilor
b5f969438e libreforge-updater 2023-03-30 15:30:39 +01:00
Auxilor
79e23e8c80 I hate the model engine repo 2023-03-29 19:29:06 +01:00
Auxilor
272edef182 libreforge-updater 2023-03-29 19:21:13 +01:00
Auxilor
8847aaf285 libreforge-updater 2023-03-29 15:47:39 +01:00
Auxilor
4fc0e5fbba Moved to repo.auxilor.io 2023-03-29 13:51:59 +01:00
Auxilor
2a58723dfd Fixed permissions on paper 2023-03-28 21:45:36 +01:00
Auxilor
e1e4b403e7 Moved integration 2023-03-28 19:15:05 +01:00
Auxilor
55a3b830ba Fixed several bugs 2023-03-28 16:04:33 +01:00
Auxilor
b1fea795af Fixed publications 2023-03-28 15:01:04 +01:00
Auxilor
539d1e4b02 Completed v4 migration 2023-03-27 18:46:07 +01:00
Auxilor
4ec77fb69e Began libreforge v4 migration 2023-03-27 18:39:08 +01:00
Auxilor
790fcbaaf3 Changed load order 2023-03-22 22:20:59 +00:00
Auxilor
8cd31888db libreforge-updater 2023-03-13 13:41:11 +00:00
Auxilor
dc1c2829f2 libreforge-updater 2023-03-02 12:56:40 +00:00
TomTom
7a2a6accea Codestyle 2023-02-28 18:46:27 +01:00
TomTom
1a8c42f40a Fixed the fix 2023-02-28 18:45:00 +01:00
TomTom
043f70aa05 Fix the pages not working (I think) 2023-02-28 17:46:15 +01:00
Auxilor
e3445bb3fa Updated to 1.70.4 2023-02-25 17:51:02 +00:00
Auxilor
21748bc8c8 Fixed dependencies 2023-02-25 17:39:59 +00:00
Auxilor
7468239fca libreforge-updater 2023-02-22 15:03:20 +00:00
Auxilor
7bf5294a44 libreforge-updater 2023-02-15 20:59:45 +00:00
Auxilor
d1d718aa2f libreforge-updater 2023-02-12 16:56:24 +00:00
Auxilor
7da97170cf libreforge-updater 2023-02-09 14:13:23 +00:00
Auxilor
0f8e9b07e7 Updated to 1.69.0 2023-02-08 17:35:03 +00:00
Auxilor
bb411f6b9d Updated ME API 2023-02-08 17:34:56 +00:00
Auxilor
dff4bdc24f Added PetEvent 2023-02-08 17:34:09 +00:00
Auxilor
b05fef4dc3 libreforge-updater 2023-02-07 14:47:32 +00:00
Auxilor
05a45739e3 libreforge-updater 2023-02-04 15:37:40 +00:00
Auxilor
edc98b1300 libreforge-updater 2023-01-24 10:10:11 +00:00
Auxilor
a08286cd39 libreforge-updater 2023-01-17 16:49:23 +00:00
Auxilor
6f370657c4 libreforge-updater 2023-01-13 18:09:30 +00:00
Auxilor
8d28445639 libreforge-updater 2023-01-07 12:18:35 +00:00
52 changed files with 994 additions and 709 deletions

1
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1 @@
* @WillFP

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 21
uses: actions/setup-java@v2
with:
distribution: 'temurin'
java-version: 21
- 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,124 +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.io/repository/maven-public/' }
maven { url 'https://repo.dmulloy2.net/repository/public/' }
maven { url 'https://repo.essentialsx.net/releases/' }
maven { url 'https://mvn.lumine.io/repository/maven-public/' }
}
jar {
onlyIf { !sourceSets.main.allSource.files.isEmpty() }
}
shadowJar {
relocate('com.willfp.libreforge', 'com.willfp.ecopets.libreforge')
relocate('com.willfp.ecomponent', 'com.willfp.ecopets.ecomponent')
relocate('org.joml', 'com.willfp.ecopets.libreforge.joml')
}
dependencies {
compileOnly 'com.willfp:eco:6.44.0'
implementation 'com.willfp:libreforge:3.127.0'
implementation 'com.willfp:ecomponent:1.0.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

87
build.gradle.kts Normal file
View File

@@ -0,0 +1,87 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins {
java
`java-library`
`maven-publish`
kotlin("jvm") version "2.1.0"
id("com.gradleup.shadow") version "8.3.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.gradleup.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.55.0")
compileOnly("org.jetbrains:annotations:23.0.0")
compileOnly("org.jetbrains.kotlin:kotlin-stdlib:2.1.0")
}
java {
withSourcesJar()
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
}
tasks {
shadowJar {
relocate("com.willfp.libreforge.loader", "com.willfp.ecopets.libreforge.loader")
relocate("com.willfp.ecomponent", "com.willfp.ecopets.ecomponent")
relocate("com.willfp.modelenginebridge", "com.willfp.ecopets.modelenginebridge")
}
compileKotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_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,21 +0,0 @@
group 'com.willfp'
version rootProject.version
dependencies {
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.0'
compileOnly 'net.kyori:adventure-api:4.10.1'
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6'
compileOnly 'com.ticxo.modelengine:api:R3.1.3'
}
build.dependsOn publishToMavenLocal
publishing {
publications {
maven(MavenPublication) {
from(components.java)
}
}
}

View File

@@ -0,0 +1,41 @@
group = "com.willfp"
version = rootProject.version
dependencies {
compileOnly("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT")
compileOnly("com.github.ben-manes.caffeine:caffeine:3.0.2")
implementation("com.willfp:ecomponent:1.3.0")
implementation("com.willfp:ModelEngineBridge:1.2.0")
}
publishing {
publications {
register<MavenPublication>("maven") {
groupId = project.group.toString()
version = project.version.toString()
artifactId = rootProject.name
artifact(rootProject.tasks.shadowJar.get().archiveFile)
}
}
publishing {
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

@@ -3,31 +3,66 @@ package com.willfp.ecopets
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.eco.core.integrations.IntegrationLoader
import com.willfp.eco.core.placeholder.PlayerPlaceholder
import com.willfp.eco.util.toSingletonList
import com.willfp.ecopets.commands.CommandEcopets
import com.willfp.ecopets.commands.CommandEcoPets
import com.willfp.ecopets.commands.CommandPets
import com.willfp.ecopets.libreforge.ConditionHasActivePet
import com.willfp.ecopets.libreforge.ConditionHasPet
import com.willfp.ecopets.libreforge.ConditionHasPetLevel
import com.willfp.ecopets.libreforge.EffectGivePetXp
import com.willfp.ecopets.libreforge.EffectPetXpMultiplier
import com.willfp.ecopets.libreforge.FilterPet
import com.willfp.ecopets.libreforge.TriggerGainPetXp
import com.willfp.ecopets.libreforge.TriggerLevelUpPet
import com.willfp.ecopets.pets.DiscoverRecipeListener
import com.willfp.ecopets.pets.PetDisplay
import com.willfp.ecopets.pets.PetLevelListener
import com.willfp.ecopets.pets.PetTriggerXPGainListener
import com.willfp.ecopets.pets.Pets
import com.willfp.ecopets.pets.SpawnEggHandler
import com.willfp.ecopets.pets.activePet
import com.willfp.ecopets.pets.activePetLevel
import com.willfp.ecopets.pets.hasPet
import com.willfp.ecopets.pets.entity.ModelEnginePetEntity
import com.willfp.ecopets.pets.entity.PetEntity
import com.willfp.libreforge.LibReforgePlugin
import com.willfp.libreforge.SimpleProvidedHolder
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.filters.Filters
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.registerHolderProvider
import com.willfp.libreforge.registerSpecificHolderProvider
import com.willfp.libreforge.triggers.Triggers
import org.bukkit.entity.Player
import org.bukkit.event.Listener
class EcoPetsPlugin : LibReforgePlugin() {
class EcoPetsPlugin : LibreforgePlugin() {
private val petDisplay = PetDisplay(this)
init {
instance = this
registerHolderProvider { it.activePetLevel?.toSingletonList() ?: emptyList() }
}
override fun handleEnableAdditional() {
this.copyConfigs("pets")
override fun loadConfigCategories(): List<ConfigCategory> {
return listOf(
Pets
)
}
override fun handleEnable() {
Conditions.register(ConditionHasPetLevel)
Conditions.register(ConditionHasActivePet)
Conditions.register(ConditionHasPet)
Effects.register(EffectPetXpMultiplier)
Effects.register(EffectGivePetXp)
Triggers.register(TriggerGainPetXp)
Triggers.register(TriggerLevelUpPet)
Filters.register(FilterPet)
registerSpecificHolderProvider<Player> {
it.activePetLevel?.let { p ->
listOf(SimpleProvidedHolder(p))
} ?: emptyList()
}
PlayerPlaceholder(
this,
@@ -38,9 +73,21 @@ class EcoPetsPlugin : LibReforgePlugin() {
this,
"pet_id"
) { it.activePet?.id ?: "" }.register()
PlayerPlaceholder(
this,
"total_pets"
) {
var pets = 0
for (pet in Pets.values()) {
if (it.hasPet(pet))
pets++
}
pets.toString()
}.register()
}
override fun handleReloadAdditional() {
override fun handleReload() {
if (!this.configYml.getBool("pet-entity.enabled")) {
return
}
@@ -50,11 +97,11 @@ class EcoPetsPlugin : LibReforgePlugin() {
}
}
override fun handleDisableAdditional() {
override fun handleDisable() {
petDisplay.shutdown()
}
override fun loadAdditionalIntegrations(): List<IntegrationLoader> {
override fun loadIntegrationLoaders(): List<IntegrationLoader> {
return listOf(
IntegrationLoader("ModelEngine") {
PetEntity.registerPetEntity("modelengine") { pet, id ->
@@ -66,7 +113,7 @@ class EcoPetsPlugin : LibReforgePlugin() {
override fun loadPluginCommands(): List<PluginCommand> {
return listOf(
CommandEcopets(this),
CommandEcoPets(this),
CommandPets(this)
)
}
@@ -74,7 +121,6 @@ class EcoPetsPlugin : LibReforgePlugin() {
override fun loadListeners(): List<Listener> {
return listOf(
PetLevelListener(this),
PetTriggerXPGainListener,
SpawnEggHandler(this),
petDisplay,
DiscoverRecipeListener(this)
@@ -86,4 +132,3 @@ class EcoPetsPlugin : LibReforgePlugin() {
lateinit var instance: EcoPetsPlugin
}
}

View File

@@ -0,0 +1,7 @@
package com.willfp.ecopets.api.event
import com.willfp.ecopets.pets.Pet
interface PetEvent {
val pet: Pet
}

View File

@@ -1,18 +1,17 @@
package com.willfp.ecopets.api.event
import org.bukkit.entity.Player
import com.willfp.ecopets.pets.Pet
import org.bukkit.event.player.PlayerEvent
import org.bukkit.event.HandlerList
import com.willfp.ecopets.api.event.PlayerPetExpGainEvent
import org.bukkit.entity.Player
import org.bukkit.event.Cancellable
import org.bukkit.event.HandlerList
import org.bukkit.event.player.PlayerEvent
class PlayerPetExpGainEvent(
who: Player,
val pet: Pet,
override val pet: Pet,
var amount: Double,
val isMultiply: Boolean
) : PlayerEvent(who), Cancellable {
) : PlayerEvent(who), Cancellable, PetEvent {
private var cancelled = false
override fun setCancelled(cancel: Boolean) {

View File

@@ -1,16 +1,15 @@
package com.willfp.ecopets.api.event
import org.bukkit.entity.Player
import com.willfp.ecopets.pets.Pet
import org.bukkit.event.player.PlayerEvent
import org.bukkit.entity.Player
import org.bukkit.event.HandlerList
import com.willfp.ecopets.api.event.PlayerPetLevelUpEvent
import org.bukkit.event.player.PlayerEvent
class PlayerPetLevelUpEvent(
who: Player,
val pet: Pet,
override val pet: Pet,
val level: Int
) : PlayerEvent(who) {
) : PlayerEvent(who), PetEvent {
override fun getHandlers(): HandlerList {
return handlerList
}

View File

@@ -0,0 +1,22 @@
package com.willfp.ecopets.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.PluginCommand
import org.bukkit.command.CommandSender
class CommandEcoPets(plugin: EcoPlugin) : PluginCommand(plugin, "ecopets", "ecopets.command.ecopets", false) {
init {
this.addSubcommand(CommandReload(plugin))
.addSubcommand(CommandGive(plugin))
.addSubcommand(CommandGiveEgg(plugin))
.addSubcommand(CommandGiveXP(plugin))
.addSubcommand(CommandReset(plugin))
.addSubcommand(CommandGiveCurrentXP(plugin))
}
override fun onExecute(sender: CommandSender, args: List<String>) {
sender.sendMessage(
plugin.langYml.getMessage("invalid-command")
)
}
}

View File

@@ -1,34 +0,0 @@
package com.willfp.ecopets.commands
import com.willfp.eco.core.command.impl.PluginCommand
import com.willfp.ecopets.pets.Pets
import com.willfp.libreforge.LibReforgePlugin
import com.willfp.libreforge.lrcdb.CommandExport
import com.willfp.libreforge.lrcdb.CommandImport
import com.willfp.libreforge.lrcdb.ExportableConfig
import org.bukkit.command.CommandSender
class CommandEcopets(plugin: LibReforgePlugin) : PluginCommand(plugin, "ecopets", "ecopets.command.ecopets", false) {
init {
this.addSubcommand(CommandReload(plugin))
.addSubcommand(CommandGive(plugin))
.addSubcommand(CommandGiveEgg(plugin))
.addSubcommand(CommandGiveXP(plugin))
.addSubcommand(CommandReset(plugin))
.addSubcommand(CommandImport("pets", plugin))
.addSubcommand(CommandExport(plugin) {
Pets.values().map {
ExportableConfig(
it.id,
it.config
)
}
})
}
override fun onExecute(sender: CommandSender, args: List<String>) {
sender.sendMessage(
plugin.langYml.getMessage("invalid-command")
)
}
}

View File

@@ -9,6 +9,7 @@ import com.willfp.ecopets.pets.hasPet
import com.willfp.ecopets.pets.setPetLevel
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandGive(plugin: EcoPlugin) : Subcommand(plugin, "give", "ecopets.command.give", false) {
@@ -28,7 +29,7 @@ class CommandGive(plugin: EcoPlugin) : Subcommand(plugin, "give", "ecopets.comma
@Suppress("DEPRECATION")
val player = Bukkit.getOfflinePlayer(playerName)
if (!player.hasPlayedBefore()) {
if (!player.hasPlayedBefore() && player !is Player) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}

View File

@@ -0,0 +1,80 @@
package com.willfp.ecopets.commands
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.command.impl.Subcommand
import com.willfp.eco.util.StringUtils
import com.willfp.eco.util.savedDisplayName
import com.willfp.eco.util.toNiceString
import com.willfp.ecopets.pets.Pets
import com.willfp.ecopets.pets.activePet
import com.willfp.ecopets.pets.givePetExperience
import com.willfp.ecopets.pets.hasPet
import org.bukkit.Bukkit
import org.bukkit.command.CommandSender
import org.bukkit.entity.Player
import org.bukkit.util.StringUtil
class CommandGiveCurrentXP(plugin: EcoPlugin) : Subcommand(plugin, "givecurrentxp", "ecopets.command.givecurrentxp", false) {
override fun onExecute(sender: CommandSender, args: List<String>) {
if (args.isEmpty()) {
sender.sendMessage(plugin.langYml.getMessage("needs-player"))
return
}
if (args.size == 1) {
sender.sendMessage(plugin.langYml.getMessage("needs-amount"))
return
}
val playerName = args[0]
val player = Bukkit.getPlayer(playerName)
if (player == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-player"))
return
}
val pet = player.activePet
if (pet == null) {
sender.sendMessage(plugin.langYml.getMessage("no-pet"))
return
}
if (!player.hasPet(pet)) {
sender.sendMessage(plugin.langYml.getMessage("doesnt-have-pet"))
return
}
val amount = args[1].toDoubleOrNull()
if (amount == null) {
sender.sendMessage(plugin.langYml.getMessage("invalid-amount"))
return
}
player.givePetExperience(
pet,
amount
)
sender.sendMessage(
plugin.langYml.getMessage("gave-current-xp", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS)
.replace("%player%", player.savedDisplayName)
.replace("%xp%", amount.toNiceString())
)
}
override fun tabComplete(sender: CommandSender, args: List<String>): List<String> {
if (args.size == 1) {
return Bukkit.getOnlinePlayers().map { it.name }
}
if (args.size == 2) {
return listOf("10", "100", "1000", "10000")
}
return emptyList()
}
}

View File

@@ -0,0 +1,29 @@
package com.willfp.ecopets.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecopets.api.EcoPetsAPI
import com.willfp.ecopets.pets.Pets
import com.willfp.libreforge.Dispatcher
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.ProvidedHolder
import com.willfp.libreforge.arguments
import com.willfp.libreforge.conditions.Condition
import com.willfp.libreforge.get
import org.bukkit.entity.Player
object ConditionHasActivePet : Condition<NoCompileData>("has_active_pet") {
override val arguments = arguments {
require("pet", "You must specify the pet!")
}
override fun isMet(
dispatcher: Dispatcher<*>,
config: Config,
holder: ProvidedHolder,
compileData: NoCompileData
): Boolean {
val player = dispatcher.get<Player>() ?: return false
return EcoPetsAPI.instance.getActivePet(player) == Pets.getByID(config.getString("pet").lowercase())
}
}

View File

@@ -0,0 +1,27 @@
package com.willfp.ecopets.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecopets.api.EcoPetsAPI
import com.willfp.ecopets.pets.Pets
import com.willfp.libreforge.Dispatcher
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.ProvidedHolder
import com.willfp.libreforge.conditions.Condition
import com.willfp.libreforge.get
import org.bukkit.entity.Player
object ConditionHasPet : Condition<NoCompileData>("has_pet") {
override fun isMet(
dispatcher: Dispatcher<*>,
config: Config,
holder: ProvidedHolder,
compileData: NoCompileData
): Boolean {
val player = dispatcher.get<Player>() ?: return false
return EcoPetsAPI.instance.hasPet(
player,
Pets.getByID(config.getString("pet").lowercase()) ?: return false
)
}
}

View File

@@ -0,0 +1,43 @@
package com.willfp.ecopets.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecopets.api.EcoPetsAPI
import com.willfp.ecopets.api.event.PlayerPetLevelUpEvent
import com.willfp.ecopets.pets.Pets
import com.willfp.libreforge.Dispatcher
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.ProvidedHolder
import com.willfp.libreforge.arguments
import com.willfp.libreforge.conditions.Condition
import com.willfp.libreforge.get
import com.willfp.libreforge.toDispatcher
import com.willfp.libreforge.updateEffects
import org.bukkit.entity.Player
import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
object ConditionHasPetLevel : Condition<NoCompileData>("has_pet_level") {
override val arguments = arguments {
require("pet", "You must specify the pet!")
require("level", "You must specify the level!")
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun handle(event: PlayerPetLevelUpEvent) {
event.player.toDispatcher().updateEffects()
}
override fun isMet(
dispatcher: Dispatcher<*>,
config: Config,
holder: ProvidedHolder,
compileData: NoCompileData
): Boolean {
val player = dispatcher.get<Player>() ?: return false
return EcoPetsAPI.instance.getPetLevel(
player,
Pets.getByID(config.getString("pet").lowercase()) ?: return false
) >= config.getIntFromExpression("level", player)
}
}

View File

@@ -0,0 +1,33 @@
package com.willfp.ecopets.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecopets.api.EcoPetsAPI
import com.willfp.ecopets.pets.Pets
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.arguments
import com.willfp.libreforge.effects.Effect
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
object EffectGivePetXp : Effect<NoCompileData>("give_pet_xp") {
override val parameters = setOf(
TriggerParameter.PLAYER
)
override val arguments = arguments {
require("amount", "You must specify the amount of xp to give!")
require("pet", "You must specify the pet to give xp for!")
}
override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean {
val player = data.player ?: return false
EcoPetsAPI.instance.givePetExperience(
player,
Pets.getByID(config.getString("pet")) ?: return false,
config.getDoubleFromExpression("amount", player)
)
return true
}
}

View File

@@ -0,0 +1,27 @@
package com.willfp.ecopets.libreforge
import com.willfp.ecopets.api.event.PlayerPetExpGainEvent
import com.willfp.ecopets.pets.Pet
import com.willfp.ecopets.pets.Pets
import com.willfp.libreforge.effects.templates.MultiMultiplierEffect
import com.willfp.libreforge.toDispatcher
import org.bukkit.event.EventHandler
object EffectPetXpMultiplier : MultiMultiplierEffect<Pet>("pet_xp_multiplier") {
override val key = "pets"
override fun getElement(key: String): Pet? {
return Pets.getByID(key.lowercase())
}
override fun getAllElements(): Collection<Pet> {
return Pets.values()
}
@EventHandler(ignoreCancelled = true)
fun handle(event: PlayerPetExpGainEvent) {
val player = event.player
event.amount *= getMultiplier(player.toDispatcher(), event.pet)
}
}

View File

@@ -0,0 +1,21 @@
package com.willfp.ecopets.libreforge
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.ecopets.api.event.PetEvent
import com.willfp.libreforge.NoCompileData
import com.willfp.libreforge.filters.Filter
import com.willfp.libreforge.triggers.TriggerData
object FilterPet : Filter<NoCompileData, Collection<String>>("pet") {
override fun getValue(config: Config, data: TriggerData?, key: String): Collection<String> {
return config.getStrings(key)
}
override fun isMet(data: TriggerData, value: Collection<String>, compileData: NoCompileData): Boolean {
val event = data.event as? PetEvent ?: return false
return value.any { petName ->
petName.equals(event.pet.id, ignoreCase = true)
}
}
}

View File

@@ -0,0 +1,31 @@
package com.willfp.ecopets.libreforge
import com.willfp.ecopets.api.event.PlayerPetExpGainEvent
import com.willfp.libreforge.toDispatcher
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerGainPetXp : Trigger("gain_pet_xp") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.LOCATION,
TriggerParameter.EVENT
)
@EventHandler(ignoreCancelled = true)
fun handle(event: PlayerPetExpGainEvent) {
val player = event.player
this.dispatch(
player.toDispatcher(),
TriggerData(
player = player,
location = player.location,
event = event,
value = event.amount
)
)
}
}

View File

@@ -0,0 +1,31 @@
package com.willfp.ecopets.libreforge
import com.willfp.ecopets.api.event.PlayerPetLevelUpEvent
import com.willfp.libreforge.toDispatcher
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.TriggerData
import com.willfp.libreforge.triggers.TriggerParameter
import org.bukkit.event.EventHandler
object TriggerLevelUpPet : Trigger("level_up_pet") {
override val parameters = setOf(
TriggerParameter.PLAYER,
TriggerParameter.LOCATION,
TriggerParameter.EVENT
)
@EventHandler(ignoreCancelled = true)
fun handle(event: PlayerPetLevelUpEvent) {
val player = event.player
this.dispatch(
player.toDispatcher(),
TriggerData(
player = player,
location = player.location,
event = event,
value = event.level.toDouble()
)
)
}
}

View File

@@ -14,6 +14,7 @@ import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder
import com.willfp.eco.core.recipe.Recipes
import com.willfp.eco.core.recipe.parts.EmptyTestableItem
import com.willfp.eco.core.registry.Registrable
import com.willfp.eco.util.NumberUtils
import com.willfp.eco.util.formatEco
import com.willfp.eco.util.toNiceString
@@ -21,12 +22,12 @@ import com.willfp.ecopets.EcoPetsPlugin
import com.willfp.ecopets.api.event.PlayerPetExpGainEvent
import com.willfp.ecopets.api.event.PlayerPetLevelUpEvent
import com.willfp.ecopets.pets.entity.PetEntity
import com.willfp.libreforge.ViolationContext
import com.willfp.libreforge.conditions.ConditionList
import com.willfp.libreforge.conditions.Conditions
import com.willfp.libreforge.conditions.ConfiguredCondition
import com.willfp.libreforge.effects.ConfiguredEffect
import com.willfp.libreforge.counters.Counters
import com.willfp.libreforge.effects.EffectList
import com.willfp.libreforge.effects.Effects
import com.willfp.libreforge.triggers.Trigger
import com.willfp.libreforge.triggers.Triggers
import org.bukkit.Bukkit
import org.bukkit.OfflinePlayer
import org.bukkit.entity.Player
@@ -40,7 +41,7 @@ class Pet(
val id: String,
val config: Config,
private val plugin: EcoPetsPlugin
) {
) : Registrable {
val name = config.getFormattedString("name")
val description = config.getFormattedString("description")
@@ -113,7 +114,6 @@ class Pet(
}
val entityTexture = config.getString("entity-texture")
val modelEngineAnimation = config.getStringOrNull("modelengine-animation")
private val levelXpRequirements = listOf(0) + config.getInts("level-xp-requirements")
@@ -123,8 +123,8 @@ class Pet(
private val baseItem: ItemStack = Items.lookup(config.getString("icon")).item
private val effects: Set<ConfiguredEffect>
private val conditions: Set<ConfiguredCondition>
private val effects: EffectList
private val conditions: ConditionList
private val levels = Caffeine.newBuilder()
.build<Int, PetLevel>()
@@ -150,18 +150,11 @@ class Pet(
}
private val petXpGains = config.getSubsections("xp-gain-methods").mapNotNull {
val trigger = Triggers.getById(it.getString("id")) ?: return@mapNotNull null
val multiplier = it.getDouble("multiplier")
val conditions = it.getSubsections("conditions")
.mapNotNull { cfg -> Conditions.compile(cfg, "Pet $id XP Gain methods") }
trigger to PetXPGain(
trigger,
multiplier,
conditions,
it.getSubsection("filters")
Counters.compile(
it,
ViolationContext(plugin, "Pet $id XP Gain methods")
)
}.toMap()
}
init {
config.injectPlaceholders(
@@ -174,12 +167,12 @@ class Pet(
effects = Effects.compile(
config.getSubsections("effects"),
"Pet $id"
ViolationContext(plugin, "Pet $id")
)
conditions = Conditions.compile(
config.getSubsections("conditions"),
"Pet $id"
ViolationContext(plugin, "Pet $id")
)
for (string in config.getStrings("level-commands")) {
@@ -249,7 +242,7 @@ class Pet(
}
fun getLevel(level: Int): PetLevel = levels.get(level) {
PetLevel(this, it, effects, conditions)
PetLevel(plugin, this, it, effects, conditions)
}
private fun getLevelUpMessages(level: Int, whitespace: Int = 0): List<String> = levelUpMessages.get(level) {
@@ -355,12 +348,22 @@ class Pet(
return processed.flatten().formatEco(player)
}
override fun onRegister() {
petXpGains.forEach { it.bind(PetXPAccumulator(this)) }
}
override fun onRemove() {
petXpGains.forEach { it.unbind() }
}
fun getIcon(player: Player): ItemStack {
val base = baseItem.clone()
val level = player.getPetLevel(this)
val isActive = player.activePet == this
val baseLoreLocation = if (level == this.maxLevel) "max-level-lore" else "lore"
return ItemStackBuilder(base)
.setDisplayName(
plugin.configYml.getFormattedString("gui.pet-icon.name")
@@ -368,7 +371,7 @@ class Pet(
.replace("%pet%", this.name)
)
.addLoreLines {
injectPlaceholdersInto(plugin.configYml.getStrings("gui.pet-icon.lore"), player) +
injectPlaceholdersInto(plugin.configYml.getStrings("gui.pet-icon.$baseLoreLocation"), player) +
if (isActive) plugin.configYml.getStrings("gui.pet-icon.active-lore") else
plugin.configYml.getStrings("gui.pet-icon.not-active-lore")
}
@@ -377,6 +380,9 @@ class Pet(
fun getPetInfoIcon(player: Player): ItemStack {
val base = baseItem.clone()
val prefix = if (player.getPetLevel(this) == this.maxLevel) "max-level-" else ""
return ItemStackBuilder(base)
.setDisplayName(
plugin.configYml.getFormattedString("gui.pet-info.active.name")
@@ -384,7 +390,7 @@ class Pet(
.replace("%pet%", this.name)
)
.addLoreLines {
injectPlaceholdersInto(plugin.configYml.getStrings("gui.pet-info.active.lore"), player)
injectPlaceholdersInto(plugin.configYml.getStrings("gui.pet-info.active.${prefix}lore"), player)
}
.build()
}
@@ -405,8 +411,8 @@ class Pet(
}
}
fun getPetXPGain(trigger: Trigger): PetXPGain? {
return petXpGains[trigger]
override fun getID(): String {
return this.id
}
override fun equals(other: Any?): Boolean {
@@ -496,7 +502,7 @@ private val expMultiplierCache = Caffeine.newBuilder()
}
val Player.petExperienceMultiplier: Double
get() = expMultiplierCache.get(this)
get() = expMultiplierCache.get(this)!!
private fun Player.cacheSkillExperienceMultiplier(): Double {
if (this.hasPermission("ecopets.xpmultiplier.quadruple")) {

View File

@@ -36,6 +36,12 @@ class PetDisplay(
val pet = player.activePet
if (pet != null) {
if (player.isInvisible) {
remove(player)
return
}
@Suppress("DEPRECATION")
stand.customName = plugin.configYml.getString("pet-entity.name")
.replace("%player%", player.displayName)
.replace("%pet%", pet.name)
@@ -76,6 +82,10 @@ class PetDisplay(
}
private fun getOrNew(player: Player): ArmorStand? {
if (player.isInvisible) {
return null
}
val tracked = trackedEntities[player.uniqueId]
val existing = tracked?.stand

View File

@@ -1,14 +1,16 @@
package com.willfp.ecopets.pets
import com.willfp.eco.core.EcoPlugin
import com.willfp.libreforge.Holder
import com.willfp.libreforge.conditions.ConfiguredCondition
import com.willfp.libreforge.effects.ConfiguredEffect
import com.willfp.libreforge.conditions.ConditionList
import com.willfp.libreforge.effects.EffectList
class PetLevel(
plugin: EcoPlugin,
val pet: Pet,
val level: Int,
override val effects: Set<ConfiguredEffect>,
override val conditions: Set<ConfiguredCondition>
): Holder {
override val id = "${pet.id}_$level"
override val effects: EffectList,
override val conditions: ConditionList
) : Holder {
override val id = plugin.createNamespacedKey("${pet.id}_$level")
}

View File

@@ -35,6 +35,8 @@ class PetLevelGUI(
override fun getLevelItem(player: Player, menu: Menu, level: Int, levelState: LevelState): ItemStack {
val key = levelState.name.lowercase().replace("_", "-")
val prefix = if (player.getPetLevel(pet) == pet.maxLevel) "max-level-" else ""
return ItemStackBuilder(Items.lookup(plugin.configYml.getString("level-gui.progression-slots.$key.item")))
.setDisplayName(
plugin.configYml.getFormattedString("level-gui.progression-slots.$key.name")
@@ -44,7 +46,7 @@ class PetLevelGUI(
)
.addLoreLines(
pet.injectPlaceholdersInto(
plugin.configYml.getFormattedStrings("level-gui.progression-slots.$key.lore"),
plugin.configYml.getFormattedStrings("level-gui.progression-slots.$key.${prefix}lore"),
player,
forceLevel = level
)

View File

@@ -0,0 +1,16 @@
package com.willfp.ecopets.pets
import com.willfp.libreforge.counters.Accumulator
import org.bukkit.entity.Player
class PetXPAccumulator(
private val pet: Pet
) : Accumulator {
override fun accept(player: Player, count: Double) {
if (player.activePet != pet) {
return
}
player.givePetExperience(pet, count)
}
}

View File

@@ -1,44 +0,0 @@
package com.willfp.ecopets.pets
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.libreforge.conditions.ConfiguredCondition
import com.willfp.libreforge.events.TriggerPreProcessEvent
import com.willfp.libreforge.filters.Filter
import com.willfp.libreforge.filters.Filters
import com.willfp.libreforge.triggers.Trigger
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
data class PetXPGain(
val trigger: Trigger,
val multiplier: Double,
val conditions: Iterable<ConfiguredCondition>,
val filters: Config
)
object PetTriggerXPGainListener : Listener {
@EventHandler(ignoreCancelled = true)
fun handle(event: TriggerPreProcessEvent) {
val player = event.player
val trigger = event.trigger
val value = event.value
val data = event.data
val pet = event.player.activePet ?: return
val xpGain = pet.getPetXPGain(trigger) ?: return
if (xpGain.conditions.any { !it.isMet(player) }) {
return
}
if (!Filters.passes(data, xpGain.filters)) {
return
}
player.givePetExperience(
pet,
value * xpGain.multiplier
)
}
}

View File

@@ -1,16 +1,20 @@
package com.willfp.ecopets.pets
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.readConfig
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.registry.Registry
import com.willfp.ecopets.EcoPetsPlugin
import java.io.File
import com.willfp.libreforge.loader.LibreforgePlugin
import com.willfp.libreforge.loader.configs.ConfigCategory
import com.willfp.libreforge.loader.configs.LegacyLocation
object Pets {
private val BY_ID: BiMap<String, Pet> = HashBiMap.create()
object Pets : ConfigCategory("pet", "pets") {
private val registry = Registry<Pet>()
override val legacyLocation = LegacyLocation(
"pets.yml",
"pets"
)
/**
* Get all registered [Pet]s.
@@ -19,7 +23,7 @@ object Pets {
*/
@JvmStatic
fun values(): List<Pet> {
return ImmutableList.copyOf(BY_ID.values)
return ImmutableList.copyOf(registry.values())
}
/**
@@ -30,50 +34,14 @@ object Pets {
*/
@JvmStatic
fun getByID(name: String): Pet? {
return BY_ID[name]
return registry[name]
}
/**
* Update all [Pet]s.
*
* @param plugin Instance of EcoPets.
*/
@ConfigUpdater
@JvmStatic
fun update(plugin: EcoPetsPlugin) {
for (set in values()) {
removePet(set)
}
val petsYml = File(plugin.dataFolder, "pets.yml").readConfig(ConfigType.YAML)
for ((id, petConfig) in plugin.fetchConfigs("pets")) {
addNewPet(Pet(id, petConfig, plugin))
}
for (petConfig in petsYml.getSubsections("pets")) {
addNewPet(Pet(petConfig.getString("id"), petConfig, plugin))
}
override fun clear(plugin: LibreforgePlugin) {
registry.clear()
}
/**
* Add new [Pet] to EcoPets.
*
* @param pet The [Pet] to add.
*/
@JvmStatic
fun addNewPet(pet: Pet) {
BY_ID.remove(pet.id)
BY_ID[pet.id] = pet
override fun acceptConfig(plugin: LibreforgePlugin, id: String, config: Config) {
registry.register(Pet(id, config, plugin as EcoPetsPlugin))
}
/**
* Remove [Pet] from EcoPets.
*
* @param pet The [Pet] to remove.
*/
@JvmStatic
fun removePet(pet: Pet) {
BY_ID.remove(pet.id)
}
}
}

View File

@@ -3,6 +3,8 @@ package com.willfp.ecopets.pets
import com.willfp.eco.core.config.updating.ConfigUpdater
import com.willfp.eco.core.gui.menu
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.page.Page
import com.willfp.eco.core.gui.page.PageChangeEvent
import com.willfp.eco.core.gui.slot
import com.willfp.eco.core.gui.slot.ConfigSlot
import com.willfp.eco.core.gui.slot.FillerMask
@@ -21,17 +23,6 @@ import kotlin.math.min
object PetsGUI {
private lateinit var menu: Menu
private val petAreaSlots = mutableListOf<Pair<Int, Int>>()
private const val pageKey = "page"
private fun getPage(menu: Menu, player: Player): Int {
val pages = ceil(Pets.values()
.filter { player.getPetLevel(it) > 0 }
.size.toDouble() / petAreaSlots.size).toInt()
val page = menu.getState(player, pageKey) ?: 1
return max(min(pages, page + 1), 1)
}
@JvmStatic
@ConfigUpdater
@@ -42,8 +33,8 @@ object PetsGUI {
val bottomRightColumn = plugin.configYml.getInt("gui.pet-area.bottom-right.column")
petAreaSlots.clear()
for (row in topLeftRow..bottomRightRow) {
for (column in topLeftColumn..bottomRightColumn) {
for (row in topLeftRow .. bottomRightRow) {
for (column in topLeftColumn .. bottomRightColumn) {
petAreaSlots.add(Pair(row, column))
}
}
@@ -55,31 +46,28 @@ object PetsGUI {
val petInfoItemBuilder = { player: Player, _: Menu ->
val pet = player.activePet
if (pet == null) {
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.pet-info.no-active.item")))
pet?.getPetInfoIcon(player)
?: ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.pet-info.no-active.item")))
.setDisplayName(plugin.configYml.getFormattedString("gui.pet-info.no-active.name"))
.addLoreLines(plugin.configYml.getFormattedStrings("gui.pet-info.no-active.lore"))
.build()
} else {
pet.getPetInfoIcon(player)
}
}
val petIconBuilder = { player: Player, menu: Menu, index: Int ->
val page = getPage(menu, player)
val page = menu.getPage(player)
val unlockedPets = Pets.values()
.sortedByDescending { player.getPetLevel(it) }
.filter { player.getPetLevel(it) > 0 }
val pagedIndex = ((page - 1) * petAreaSlots.size) + index
val pagedIndex = page * petAreaSlots.size - petAreaSlots.size + index
val pet = unlockedPets.getOrNull(pagedIndex)
pet?.getIcon(player) ?: ItemStack(Material.AIR)
}
return menu(plugin.configYml.getInt("gui.rows")) {
setTitle(plugin.langYml.getString("menu.title"))
title = plugin.langYml.getString("menu.title")
setMask(
FillerMask(
@@ -88,35 +76,30 @@ object PetsGUI {
)
)
setSlot(
plugin.configYml.getInt("gui.pet-info.row"),
plugin.configYml.getInt("gui.pet-info.column"),
slot(petInfoItemBuilder) {
onLeftClick { event, _, _ ->
val player = event.whoClicked as Player
player.activePet?.levelGUI?.open(player)
}
onRender { player, menu ->
menu.setState(player, "ecopets", true)
if (menu.getPage(player) > menu.getMaxPage(player)) {
menu.setState(player, Page.PAGE_KEY, 1)
}
)
}
for ((index, pair) in petAreaSlots.withIndex()) {
val (row, column) = pair
setSlot(row, column, slot({ p, m -> petIconBuilder(p, m, index) }) {
setUpdater { p, m, _ ->
petIconBuilder(p, m, index)
setSlot(row, column, slot({ player, menu -> petIconBuilder(player, menu, index) }) {
setUpdater { player, menu, _ ->
petIconBuilder(player, menu, index)
}
onLeftClick { event, _, _ ->
val player = event.whoClicked as Player
val page = getPage(menu, player)
val page = menu.getPage(player)
val unlockedPets = Pets.values()
.sortedByDescending { player.getPetLevel(it) }
.filter { player.getPetLevel(it) > 0 }
val pagedIndex = ((page - 1) * petAreaSlots.size) + index
val pagedIndex = page * petAreaSlots.size - petAreaSlots.size + index
val pet = unlockedPets.getOrNull(pagedIndex) ?: return@onLeftClick
@@ -134,6 +117,8 @@ object PetsGUI {
})
}
// I do this for backwards compatibility because with PageChanger if you don't have any more pages, the item will disappear and this would require an update of the config for all users
// This is terrible imo, but everything for compatibility!
setSlot(
plugin.configYml.getInt("gui.prev-page.location.row"),
plugin.configYml.getInt("gui.prev-page.location.column"),
@@ -141,14 +126,19 @@ object PetsGUI {
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.prev-page.item")))
.setDisplayName(plugin.configYml.getString("gui.prev-page.name"))
.build()
) {
onLeftClick { event, _, menu ->
)
{
onLeftClick { event, _, _ ->
val player = event.whoClicked as Player
val page = getPage(menu, player)
val page = menu.getPage(player)
val newPage = max(1, min(page + -1, menu.getMaxPage(player)))
val newPage = max(1, page - 1)
if (newPage == page) {
return@onLeftClick
}
menu.setState(player, pageKey, newPage)
menu.setState(player, Page.PAGE_KEY, newPage)
menu.callEvent(player, PageChangeEvent(newPage, page))
}
}
)
@@ -160,19 +150,30 @@ object PetsGUI {
ItemStackBuilder(Items.lookup(plugin.configYml.getString("gui.next-page.item")))
.setDisplayName(plugin.configYml.getString("gui.next-page.name"))
.build()
) {
onLeftClick { event, _, menu ->
)
{
onLeftClick { event, _, _ ->
val player = event.whoClicked as Player
val page = menu.getPage(player)
val newPage = max(1, min(page + 1, menu.getMaxPage(player)))
val pages = ceil(Pets.values()
.filter { player.getPetLevel(it) > 0 }
.size.toDouble() / petAreaSlots.size).toInt()
if (newPage == page) {
return@onLeftClick
}
val page = getPage(menu, player)
menu.setState(player, Page.PAGE_KEY, newPage)
menu.callEvent(player, PageChangeEvent(newPage, page))
}
}
)
val newPage = min(pages, page + 1)
menu.setState(player, pageKey, newPage)
setSlot(
plugin.configYml.getInt("gui.pet-info.row"),
plugin.configYml.getInt("gui.pet-info.column"),
slot(petInfoItemBuilder) {
onLeftClick { event, _, _ ->
val player = event.whoClicked as Player
player.activePet?.levelGUI?.open(player)
}
}
)
@@ -209,6 +210,21 @@ object PetsGUI {
ConfigSlot(config)
)
}
maxPages { player ->
val unlockedPets = Pets.values()
.sortedByDescending { player.getPetLevel(it) }
.filter { player.getPetLevel(it) > 0 }
val perPage = petAreaSlots.size
val pages = if (unlockedPets.isEmpty()) {
0
} else {
ceil((unlockedPets.size.toDouble() / perPage)).toInt()
}
pages
}
}
}

View File

@@ -1,8 +1,8 @@
package com.willfp.ecopets.pets.entity
import com.ticxo.modelengine.api.ModelEngineAPI
import com.willfp.ecopets.EcoPetsPlugin
import com.willfp.ecopets.pets.Pet
import com.willfp.modelenginebridge.ModelEngineBridge
import org.bukkit.Location
import org.bukkit.entity.ArmorStand
@@ -13,29 +13,11 @@ class ModelEnginePetEntity(
) : PetEntity(pet) {
override fun spawn(location: Location): ArmorStand {
val stand = emptyArmorStandAt(location, pet)
val meAnimation = pet.modelEngineAnimation
val model = ModelEngineAPI.createActiveModel(modelID)
val model = ModelEngineBridge.instance.createActiveModel(modelID) ?: return stand
if (meAnimation != null) {
val animationHandler = model.animationHandler
val animationProperty = animationHandler.getAnimation(meAnimation)
if (animationProperty != null) {
animationHandler.playAnimation(animationProperty, true)
} else {
plugin.logger.warning("Animation $meAnimation not found in model $modelID, defaulting to walk!")
val animationPropertyWalk = animationHandler.getAnimation("walk")
if (animationPropertyWalk != null) {
animationHandler.playAnimation(animationPropertyWalk, true)
} else {
plugin.logger.warning("Walk animation not found in $modelID!")
}
}
}
val modelled = ModelEngineAPI.createModeledEntity(stand)
modelled.addModel(model, true)
val modelled = ModelEngineBridge.instance.createModeledEntity(stand)
modelled.addModel(model)
return stand
}

View File

@@ -49,6 +49,7 @@ internal fun emptyArmorStandAt(location: Location, pet: Pet): ArmorStand {
}
stand.isCustomNameVisible = true
@Suppress("DEPRECATION")
stand.customName = pet.name
return stand

View File

@@ -14,6 +14,7 @@ class SkullPetEntity(pet: Pet) : PetEntity(pet) {
.setSkullTexture(pet.entityTexture)
.build()
@Suppress("UNNECESSARY_SAFE_CALL") // Can be null.
stand.equipment?.helmet = skull
return stand

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

@@ -3,6 +3,11 @@
# by Auxilor
#
# Even if eco is set up to use a database, you can
# force EcoPets to save to local storage to disable
# cross-server sync.
use-local-storage: false
discover-recipes: true
gui:
@@ -64,6 +69,20 @@ gui:
- ""
- "&eClick to view Level Progression!"
# By default, the lore for the max level is the same,
# but you can change this if you want.
max-level-lore:
- "%description%"
- "&f"
- "&fEffects:"
- "%effects%"
- ""
- "&fProgress:"
- "&8» &e%percentage_progress%%"
- "&8» &e%current_xp%&8/&7%required_xp% &fXP"
- ""
- "&eClick to view Level Progression!"
pet-icon:
name: "%pet% &fLvl. &a%level%"
lore:
@@ -76,6 +95,18 @@ gui:
- "&8» &e%percentage_progress%%"
- "&8» &e%current_xp%&8/&7%required_xp% &fXP"
# By default, the lore for the max level is the same,
# but you can change this if you want.
max-level-lore:
- "%description%"
- "&f"
- "&fEffects:"
- "%effects%"
- ""
- "&fProgress:"
- "&8» &e%percentage_progress%%"
- "&8» &e%current_xp%&8/&7%required_xp% &fXP"
active-lore:
- ""
- "&cThis pet is already active!"
@@ -198,6 +229,17 @@ level-gui:
- "&fProgress:"
- "&8» &e%percentage_progress%%"
- "&8» &e%current_xp%&8/&7%required_xp% &fXP"
# By default, the lore for the max level is the same,
# but you can change this if you want.
max-level-lore:
- "&f"
- "&fRewards:"
- "%rewards%"
- "&f"
- "&fProgress:"
- "&8» &e%percentage_progress%%"
- "&8» &e%current_xp%&8/&7%required_xp% &fXP"
locked:
item: red_stained_glass_pane
name: "%pet% &fLvl. &a%level%"
@@ -237,48 +279,3 @@ level-up:
id: entity_player_levelup
# Pitch between 0.5 and 2
pitch: 1.3
cannot-afford:
in-actionbar: true
sound:
enabled: true
sound: "BLOCK_NOTE_BLOCK_PLING"
pitch: 0.5
cooldown:
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
cannot-afford-price:
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
potions:
icon:
permanent: true
triggered: true
ambient:
permanent: false
triggered: true
particles:
permanent: false
triggered: true

View File

@@ -1,3 +1,8 @@
resource-id: 2534
bstats-id: 15502
color: "&#d977c2"
environment:
- name: libreforge version
value: ${libreforgeVersion}
options:
resource-id: 2534
bstats-id: 15502
color: "&#d977c2"

View File

@@ -4,21 +4,11 @@ messages:
not-player: "&cThis command must be run by a player"
invalid-command: "&cUnknown subcommand!"
reloaded: "Reloaded!"
cannot-afford: "&cYou can't afford to do this! &fCost: &a$$%cost%"
cannot-afford-type: "&cYou can't afford to do this! &fCost: &a%cost% %type%"
cannot-afford-price: "&cYou can't afford to do this! &fPrice: %price%"
on-cooldown: "&cThis effect is on cooldown! &fTime left: &a%seconds% seconds"
cannot-transmit: "&cYou can't transmit here!"
must-specify-lrcdb-id: "&cYou must specify the ID of the config to download! Not sure what this means? Go to &alrcdb.auxilor.io"
lrcdb-import-error: "&cError importing config: &f%message%"
lrcdb-import-success: "&fImported &a%name%&f! Reload the plugin to install it"
must-specify-config-name: "&cYou must specify the config name!"
invalid-config-name: "&cInvalid config name!"
lrcdb-export-error: "&cError exporting config: &f%message%"
lrcdb-export-success: "&fExported &a%name%&f! View it on &alrcdb.auxilor.io&f, or share your config ID: &f%id%"
needs-player: "&cYou must specify a player!"
gave-xp: "&fYou have given &a%xp% &fXP to %player%&f's %pet%&f!"
gave-current-xp: "&fYou have given &a%xp% &fXP to %player%&f's currently active pet!"
no-pet: "&cThe player doesn't have a pet active!"
reset-xp: "&fYou have reset %player%&f's %pet%&f XP!"
needs-pet: "&cYou must specify a pet!"
need-amount: "&cYou must specify a amount!"

View File

@@ -1,19 +0,0 @@
# Options for lrcdb (https://lrcdb.auxilor.io), a website to share configs
# with other server owners, so you can get more configs without making them
# yourself!
author: "Unknown Author" # The name attached to configs you export
# Options about automatically sharing configs you create
share-configs:
# If you want all your configs to automatically be publicly available,
# set this to true. This really helps out other users!
publicly: false
# If you don't want your configs to be usable to gather information about
# plugin usage or to improve the plugins in the future, disable this.
# Nothing identifying is shared.
enabled: true
# If you disable share-configs, you can still share select configs publicly
# with /ecopets export <config>.

View File

@@ -116,7 +116,6 @@ conditions: [ ]
# The texture of the pet entity in game
# If you're using modelengine, use modelengine:id as the texture
entity-texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTA5NWZjYzFlM2Q3Y2JkMzUwZjE5YjM4OTQ5OGFiOGJiOTZjNjVhZDE4NWQzNDU5MjA2N2E3ZDAzM2FjNDhkZSJ9fX0="
modelengine-animation: "fly" # If you're using ModelEngine, you can specify an animation here
# The icon in GUIs
icon: player_head texture:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTA5NWZjYzFlM2Q3Y2JkMzUwZjE5YjM4OTQ5OGFiOGJiOTZjNjVhZDE4NWQzNDU5MjA2N2E3ZDAzM2FjNDhkZSJ9fX0=

View File

@@ -1,29 +1,13 @@
name: EcoPets
version: ${projectVersion}
name: ${pluginName}
version: ${version}
main: com.willfp.ecopets.EcoPetsPlugin
api-version: 1.17
authors: [ Auxilor ]
website: willfp.com
load: STARTUP
depend:
- eco
- ProtocolLib
- PlaceholderAPI
softdepend:
- AureliumSkills
- Vault
- mcMMO
- Jobs
- TMMobcoins
- EcoEnchants
- EcoBosses
- Talismans
- EcoArmor
- EcoItems
- Boosters
- EcoSkills
- Reforges
- ModelEngine
- libreforge
commands:
ecopets:
description: Base Command
@@ -51,11 +35,10 @@ permissions:
ecopets.command.give: true
ecopets.command.giveegg: true
ecopets.command.givexp: true
ecopets.command.givecurrentxp: true
ecopets.command.reset: true
ecopets.command.activate: true
ecopets.command.deactivate: true
ecopets.command.import: true
ecopets.command.export: true
ecopets.command.reload:
description: Allows reloading the config
@@ -75,15 +58,12 @@ permissions:
ecopets.command.givexp:
description: Allows the use of /ecopets givexp.
default: op
ecopets.command.givecurrentxp:
description: Allows the use of /ecopets givecurrentxp.
default: op
ecopets.command.reset:
description: Allows the use of /ecopets reset.
default: op
ecopets.command.import:
description: Allows the use of /ecopets import.
default: op
ecopets.command.export:
description: Allows the use of /ecopets export.
default: op
ecopets.command.activate:
description: Allows the use of /pets activate.
default: true

View File

@@ -1,4 +1,5 @@
#libreforge-updater
#Mon Jan 02 15:59:15 GMT 2023
version=1.67.0
plugin-name=EcoPets
#Sat Mar 29 14:22:31 GMT 2025
kotlin.code.style=official
libreforge-version=4.75.0
version=2.74.0

Binary file not shown.

View File

@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
networkTimeout=10000
validateDistributionUrl=true
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,6 +0,0 @@
jdk: openjdk17
before_install:
- source "$HOME/.sdkman/bin/sdkman-init.sh"
- sdk update
- sdk install java 17.0.1-tem
- sdk use java 17.0.1-tem

View File

@@ -1,5 +0,0 @@
rootProject.name = 'EcoPets'
// Core
include ':eco-core'
include ':eco-core:core-plugin'

18
settings.gradle.kts Normal file
View File

@@ -0,0 +1,18 @@
pluginManagement {
repositories {
gradlePluginPortal()
mavenLocal()
maven("https://repo.auxilor.io/repository/maven-public/")
maven("https://repo.papermc.io/repository/maven-public/")
}
}
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
}
rootProject.name = "EcoPets"
// Core
include(":eco-core")
include(":eco-core:core-plugin")