33 Commits
Author SHA1 Message Date
NotAlexNoyle 2b0fff4051 Exclude CODEOWNERS from language statistics 2026-10-29 16:18:53 -04:00
NotAlexNoyle 3a8a20946a Add CODEOWNERS (one staff approval) 2026-10-29 16:18:53 -04:00
NotAlexNoyle 750400f2d1 Add world whitelist 2026-05-25 17:31:23 -04:00
NotAlexNoyle dfaa19b376 Improve code quality 2026-03-26 11:34:25 -04:00
NotAlexNoyle 569730a8e2 Add both discords 2026-03-26 11:23:40 -04:00
NotAlexNoyle 7583decfbb Merge pull request #2 from IdreesInc/master
Update README.md
2026-03-26 11:22:02 -04:00
NotAlexNoyle 189078220c Update README.md 2026-03-26 11:20:35 -04:00
NotAlexNoyle 797243c91e Update README.md 2026-03-26 10:53:36 -04:00
NotAlexNoyle 79c05999fe Merge pull request #1 from true-og/merge-rm20killer-daytime-adaptive
Merge rm20killer daytime adaptive
2026-03-26 10:45:50 -04:00
NotAlexNoyle e3b7824928 Merge branch 'Day-time-drops' from rm20killer/Celeste 2026-03-26 10:40:48 -04:00
NotAlexNoyle 58c71bd309 Merge branch 'adaptive-chances' from rm20killer/Celeste 2026-03-26 10:37:51 -04:00
NotAlexNoyle 77aaa5a3be Use live TrueOG Network config file 2025-12-28 09:55:37 -05:00
NotAlexNoyle 6194938b77 Update gradle to 8.14.3, add formatting 2025-08-20 08:49:14 -04:00
Idrees 0fce8bafac Update README.md 2025-07-26 13:03:28 -04:00
NotAlexNoyle ef3e7282ef Merge branch 'merge-from-spacex'
Merge good upstream changes (GPLv3)
2025-06-25 01:28:58 -04:00
NotAlexNoyle d848ad106a Merge SpaceXCheeseWheel 1.19 update 2025-06-25 01:27:38 -04:00
NotAlexNoyle 5e17a5c0c5 Update gradle to 8.14.2, add auto formatting 2025-06-24 23:03:54 -04:00
NotAlexNoyle 9c6008219b Update gradle to 8.14.1, shadow to 8.3.6 2025-06-13 16:10:30 -04:00
NotAlexNoyle 769a1d0df1 Include wrapper 2024-10-25 20:30:58 +00:00
NotAlexNoyle 74b9b29fa3 Fix build. purge log4j 2024-10-25 04:57:14 +00:00
NotAlexNoyle 2214c80c2a Celeste-OG Initial Release 2024-07-03 14:19:30 -04:00
RM20 d66d8100a8 make it also work during day 2024-06-01 16:01:34 +01:00
RM20 07062c394b Made /celeste info show falling star rate 2023-06-08 03:05:41 +01:00
RM20 939acae421 use global player count
Also made it so it does not /0
2023-06-08 02:46:23 +01:00
RM20 c18f2b77b2 Update Celeste-2.1.jar 2023-06-05 03:26:00 +01:00
RM20 85b9d33a51 fixed new moon phase not having adaptive 2023-06-05 03:23:36 +01:00
RM20 a0587fe2f0 adaptive changes
need testing
2023-06-04 23:18:24 +01:00
Gabe Rocketman bef6e29943 Merge branch 'crgorg/1.19.2' into 1.19.2
fix screwup
2022-11-19 11:31:20 -07:00
Gabe Rocketman 3af37487bc update to 1.19.2, update gitignore. 2022-11-19 11:25:28 -07:00
Gabe Rocketman fb9bbec21b Merge remote-tracking branch 'crgorg/master' into crgorg/1.19.2
update
2022-11-19 11:12:40 -07:00
Gabe e1002437be CI Build using GHA 2022-11-19 10:57:45 -07:00
Gabe 41be698750 Fix typo, 320 is definitely not 330 2022-11-17 23:47:04 -07:00
Gabe Rocketman 519ce529e9 Added config for height of falling stars. Helpful on 1.18+ worlds, where the stars spawn close to earth, 2022-11-17 23:31:29 -07:00
35 changed files with 1804 additions and 1362 deletions

No files matched your search

+1
View File
@@ -0,0 +1 @@
.gitea/CODEOWNERS linguist-detectable=false
+3
View File
@@ -0,0 +1,3 @@
# Pull requests request review from the eligible staff team(s).
# One approval from either an Admin or Developer satisfies branch protection.
* @trueog/Admins @trueog/Developers
+3 -10
View File
@@ -1,4 +1,3 @@
# IntelliJ project files
.idea
*.iml
out
@@ -8,14 +7,8 @@ target/
.classpath
.project
.settings/
.gitignore
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
dist/
build/
.gradle
+182 -99
View File
@@ -1,149 +1,232 @@
# Celeste - Add shooting stars to your Minecraft server
Celeste is a simple plugin that adds shooting stars to your Minecraft server. Inspired by the shooting stars from Animal Crossing and the falling stars from Breath of the Wild, this plugin brings some celestial ambience to your Minecraft world.
# Celeste-OG - Add shooting stars to your Minecraft server
Celeste-OG is a 1.19 fork of [Celeste](https://github.com/IdreesInc/Celeste) maintained for [TrueOG Network](https://true-og.net). It keeps the original Celeste concept and documentation while updating the project for this fork's Gradle build, Purpur 1.19.4 target, and additional gameplay/config features merged from upstream community work.
[Check out the overview video](https://www.youtube.com/watch?v=TXdrECjVTiU)
Inspired by the shooting stars from Animal Crossing and the falling stars from Breath of the Wild, this plugin brings some celestial ambience to your Minecraft world.
[Download the server plugin on Spigot](https://www.spigotmc.org/resources/celeste.81862/)
## Fork Changes
[Learn more about Celeste (the plugin, not the owl)](https://idreesinc.com/about-celeste.html?utm_source=github&utm_medium=readme&utm_campaign=celeste)
### [NotAlexNoyle](https://github.com/NotAlexNoyle)
- Gradle build instead of Maven
- Purpur API `1.19.4-R0.1-SNAPSHOT`
- Java 17 toolchain
- Removed bStats metrics
- Removed update checker
- World whitelist for falling stars (`falling-stars-world-whitelist`)
### [SpaceXCheeseWheel](https://github.com/SpaceXCheeseWheel)
- Configurable falling star max height
### [rm20killer](https://github.com/rm20killer)
- Adaptive shooting star and falling star spawn rates based on player count
- Optional daytime falling stars with a configurable multiplier
- `/celeste info` shows the effective highest falling star rate
<a href="https://discord.gg/6yxE9prcNc" target="_blank">
<img alt="Idree's Discord" src="https://img.shields.io/discord/1398471368403583120?logo=discord&logoColor=fff&label=Idree%27s%20Discord&color=5865F2">
</a>
<a href="https://discord.gg/ma9pMYpBU6" target="_blank">
<img alt="TrueOG Network Discord" src="https://img.shields.io/badge/TrueOG%20Network-Discord-5865F2?logo=discord&logoColor=fff">
</a>
## Features
- Add shooting stars to the night sky, with configurable frequency
- Add shooting stars to the night sky with configurable frequency
- Find rare falling stars that deliver precious materials in a sparkling package
- Watch meteor showers that occur every new moon, increasing the rate of shooting and falling stars
- Scale star activity with server or world player counts
- Allow falling stars during the day at a reduced rate if desired
- Override settings per world
- Use either simple weighted loot or Minecraft loot tables for falling star rewards
![Shooting stars and a falling star in the corner](/images/meteor_shower.gif)
### Shooting stars
Shooting stars occur once every 10 seconds by default (6 times a minute), but due to how large the area around a player is, you would usually only see one every few minutes unless you were stargazing. They have no functional purpose and are only there to sparkle and look pretty.
To more accurately emulate real world meteors, these virtual shooting stars vary in speed, length, and can even break up into multiple parts while burning up!
Shooting stars occur frequently, but because they spawn around random players in large areas, players usually only notice them when they are actually stargazing. They are cosmetic only and exist to make the sky feel alive. Celeste varies their speed, length, and breakup behavior to better resemble real meteors.
![Falling star](/images/falling_star_close.gif)
### Falling stars
Inspired by the star fragments from The Legend of Zelda: Breath of the Wild, these rare stars are fall from the sky only once or twice a night! They are marked by a streak of light and resonating sound as they fall towards the earth, and once they land the stars spark and sizzle for 10 seconds by default to help players find them. They can be easy to miss, with players only knowing one has fallen by the distinctly resonating sound they make on impact. But if a player is lucky enough to find one, they may receive a rare treasure as well as some experience! This loot is completely customizable, and the documentation for that can be found further below.
Falling stars are much rarer and are meant to be discovered. They streak toward the ground, play an impact sound, and leave behind a short-lived sparkling landing site so players can hunt them down. When found, they can reward configurable loot and experience.
## In-Depth Functionality
Shooting stars and falling stars spawn on a per-world basis. This means that the number of players in a world does not affect the spawning rate. When either type of star is given a chance to spawn, the plugin will find a random player within that world and center the spawn in a large radius around said player, in order to avoid sending stars to unloaded chunks where they would never be found.
Additionally, the worlds that shooting and falling stars can spawn in must meet the following conditions:
- Must have players in the world currently
- Must be nighttime (between 13000 and 23000 in game time by default, but this can be configured)
- Must be clear weather (no rain or snow)
- Will not spawn in the nether or end by default
Stars are processed per world. When a star is selected to spawn, the plugin chooses a random player in that world and centers the spawn around that player to avoid wasting events on unloaded chunks.
By default, stars only spawn when these conditions are met:
- A world has at least one player in it
- The world time is between `13000` and `23000`
- The weather is clear
- The world is a normal overworld unless explicitly overridden in config
This fork also supports:
- Adaptive spawn bonuses using either global online player count or per-world player count
- Falling stars during daytime when `falling-stars-daylight` is enabled
- Per-world overrides via `world-overrides`
- Restricting falling stars to specific worlds via `falling-stars-world-whitelist`
## Build
This repo no longer uses Maven.
Requirements:
- Java 17
Build with:
```bash
./gradlew build
```
Compile only:
```bash
./gradlew compileJava
```
## Installation
Copy the built jar into your server's `plugins/` folder and start the server once to generate the default config.
## Configuration
Installation is as simple as copying the newest build jar to your plugins folder. A configuration file is created by default, but if the file was created previously it may not include default values that were added in later updates. These values can be added easily by just copying and pasting the particular lines from the defaults below.
### Defaults
``` yaml
# Whether to perform an update check when starting or reloading the plugin
check-for-updates: true
# Whether to spawn shooting stars or not
shooting-stars-enabled: true
# Whether to spawn falling stars or not
falling-stars-enabled: true
# When to begin spawning shooting and falling stars
begin-spawning-stars-time: 13000
# When to stop spawning shooting and falling stars
end-spawning-stars-time: 23000
# The average number of shooting stars to create per minute for each world
shooting-stars-per-minute: 6
# The minimum y level where a shooting star can spawn
shooting-stars-min-height: 130
# The "maximum" y level where a shooting star can spawn
# Note that shooting stars will always spawn at least 50 blocks above a player which can overrule this limit
shooting-stars-max-height: 160
# The average number of falling stars to create per minute for each world
falling-stars-per-minute: 0.2
# The maximum distance around a player within which a falling star may spawn
falling-stars-radius: 75
# Whether falling stars should play a sound when falling
falling-stars-sound-enabled: true
# The volume at which falling star sounds should play
# Note that this maxes out at 1.0, with anything more increasing range by a factor of ~15 blocks per step
falling-stars-volume: 6
# How many ticks a falling star should spark for once it has landed (20 ticks is a second)
falling-stars-spark-time: 200
# How many experience points (not levels) to provide from catching a falling star
falling-stars-experience: 100
# The possible loot from a falling star, and the weighted chance of each item appearing
falling-stars-loot:
diamond: 60
emerald: 20
fire_charge: 20
# Whether to have meteor showers on nights with a new moon, increasing the spawn rates
new-moon-meteor-shower: true
# The number of shooting stars to create per minute during meteor showers
shooting-stars-per-minute-during-meteor-showers: 15
# The number of falling stars to create per minute during meteor showers
falling-stars-per-minute-during-meteor-showers: 0.3
# The message to send in response to summoning a shooting star
shooting-stars-summon-text: "Make a wish!"
# The message to send in response to summoning a falling star
falling-stars-summon-text: "Make a wish!"
# Enables debug mode, which adds log messages for shooting and falling stars among other things
debug: false
```
### Falling Star Loot
Falling stars drop loot wherever they fall, and spark for 10 seconds (200 ticks) by default to show their location. The loot they drop is randomly selected from the loot table in the config, with each material being given a weight. For instance, in the default config, there is a 60% chance for a diamond, 20% of an emerald, and 20% chance of a fire_charge. Experience also drops from falling stars, 100 points (not levels) by default.
If your config was created by an older version, it may be missing newly added settings. Add the missing keys from the defaults below as needed.
**You have the option of defining a simple list of items in the config or using Minecraft's built-in [loot table](https://minecraft.fandom.com/wiki/Loot_table) system.** The config-based loot system is simpler as it doesn't require messing with data packs, but it is limited to only one item at a time and is unable to produce items with NBT data attached. For more advanced loot, you'll probably want to use loot tables. Note that both kinds of loot configurations can be used at the same time if you wish to do so for whatever reason.
### Default Config
```yaml
shooting-stars-enabled: true
falling-stars-enabled: true
begin-spawning-stars-time: 13000
end-spawning-stars-time: 23000
shooting-stars-per-minute: 12
shooting-stars-min-height: 160
shooting-stars-max-height: 310
falling-stars-per-minute: 0.2
falling-stars-max-height: 300
falling-stars-radius: 75
falling-stars-sound-enabled: true
falling-stars-volume: 6
falling-stars-spark-time: 200
falling-stars-experience: 25
falling-stars-loot:
diamond: 1
emerald: 0
fire_charge: 0
new-moon-meteor-shower: true
shooting-stars-per-minute-during-meteor-showers: 36
falling-stars-per-minute-during-meteor-showers: 0.4
shooting-stars-summon-text: "&eMake a wish!"
falling-stars-summon-text: "&eWish granted!"
debug: false
# Adaptive settings
# This settings will increase falling-stars-per-minute and shooting-stars-per-minute depending on player count.
# 0 is disabled, 1 will increase it by 0.1 for every player, 2 will increase it by 0.2 for every 2 players etc
adaptive-falling-stars: 0
adaptive-shooting-stars: 0
adaptive-use-global-player-count: true
# Allow falling stars to spawn during the day with a lower chance.
falling-stars-daylight: false
falling-stars-day-multiplicative: 0
# World whitelist for falling stars (case-sensitive world names).
# If empty, falling stars may spawn in any eligible world (default behavior).
# If non-empty, falling stars only spawn in the listed worlds.
falling-stars-world-whitelist: []
```
### Adaptive Spawn Settings
- `adaptive-falling-stars`: Adds to the falling star rate based on player count
- `adaptive-shooting-stars`: Adds to the shooting star rate based on player count
- `adaptive-use-global-player-count`: If `true`, uses total online players; if `false`, uses players in each world
Example:
- `adaptive-falling-stars: 1` adds `0.1` falling stars per minute per player
- `adaptive-falling-stars: 2` adds `0.1` per 2 players
- `0` disables the adaptive bonus entirely
### Daytime Falling Stars
- `falling-stars-daylight`: Enables falling stars outside the configured night window
- `falling-stars-day-multiplicative`: Multiplies the falling star rate during daytime
Example:
- `falling-stars-daylight: true`
- `falling-stars-day-multiplicative: 0.25`
This keeps daytime falling stars possible while making them much rarer than nighttime events.
### Falling Star World Whitelist
- `falling-stars-world-whitelist`: Restricts natural falling stars to specific worlds (case-sensitive names)
Behavior:
- Empty list (default): falling stars may spawn in any otherwise-eligible world
- Non-empty list: falling stars only spawn in the listed worlds
Example:
```yaml
falling-stars-world-whitelist:
- world
- world_nether
```
This only affects natural spawns. The `/fallingstar` command still works in any world. Shooting stars are not affected.
### Falling Star Loot
Falling stars can reward experience, simple weighted loot, or a Minecraft loot table.
#### Simple Config-Based Loot
Use `falling-stars-loot` to define weighted single-item rewards:
To define a simple list of potential loot that can appear, add the `falling-stars-loot` attribute to your config (remember, you will have to create the plugin config if it doesn't already exist) and list each item you want as well as the probability for it to appear. **The names of the items must be from the list provided [here](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html)**. Remember to only add materials available in your server version. Using this method, only one item will spawn at a time. If you want to spawn more items at once or add NBT data to the items spawned, you'll need to use loot tables (more on that below).
Here is an example of a custom config-based loot configuration:
``` yaml
```yaml
falling-stars-loot:
nether_star: 0.05
apple: 33
blaze_spawn_egg: 33
blue_orchid: 33
```
```
#### Loot Tables
Material names must match Bukkit `Material` names valid for your server version.
Using Minecraft's built-in loot table feature, you can fully customize the type of items dropped, the number of items, and add whatever metadata you want. The catch is that loot tables are much more complex and require messing with external data files. [This](https://minecraft.tools/en/loots.php) tool can make it easier to work with loot tables, and a special thanks to [@Trico-Everfire](https://github.com/Trico-Everfire) for this feature's inclusion.
#### Loot Tables
Use `falling-stars-loot-table` to hand reward generation to Minecraft:
Here is an example of how to use a built-in loot table for the falling star drops:
``` yaml
```yaml
falling-stars-loot-table: "minecraft:chests/simple_dungeon"
```
```
### Custom World Settings
Loot tables are better if you want multiple drops, more complex rewards, or NBT data.
If you would like to use different settings for particular worlds, you can use the `world-overrides` attribute in your config. World overrides give you the ability to easily change the plugin's functionality on a per-world basis. The following is an example of a config that has different settings for certain worlds:
### World Overrides
You can override global settings for specific worlds:
``` yaml
```yaml
falling-stars-spark-time: 200
falling-stars-experience: 100
falling-stars-experience: 25
falling-stars-loot:
diamond: 60
emerald: 20
fire_charge: 20
# These settings override the above global settings for the specified worlds
diamond: 1
emerald: 0
fire_charge: 0
world-overrides:
some_world:
falling-stars-enabled: false
another_world:
falling-stars-loot-table: "minecraft:chests/simple_dungeon"
falling-stars-experience: 300
adaptive-falling-stars: 1
falling-stars-daylight: true
falling-stars-day-multiplicative: 0.25
```
In the above example, the worlds "some_world" and "another_world" have properties that override the global settings. For instance, falling stars are disabled in "some_world" and a loot table is used in place of the simple loot config for "another_world". Any worlds not mentioned in the `world-overrides` section will continue to follow the global configs or use built in defaults if the attribute is unchanged.
Any world not listed under `world-overrides` continues to use the global settings.
## Commands
**/shootingstar [player]** summons a shooting star in the sky directly above the player. If no player is given, spawns one above the summoner.
*Permission: celeste.shootingstar*
`/shootingstar [player]` summons a shooting star near the target player, or near the sender if no player is supplied.
Permission: `celeste.shootingstar`
**/fallingstar [player]** summons a falling star directly above the player. If no player is given, spawns one above the summoner.
*Permission: celeste.fallingstar*
`/fallingstar [player]` summons a falling star near the target player, or near the sender if no player is supplied.
Permission: `celeste.fallingstar`
**/celeste reload** reloads the config file, recalculates the falling star loot, and checks for updates (if enabled)
*Permission: celeste.reload*
`/celeste reload` reloads the plugin configuration and rebuilds the active config set.
Permission: `celeste.reload`
**/celeste info** displays if shooting stars, falling stars, and meteor showers are enabled
*Permission: celeste.info*
`/celeste info` shows whether shooting stars, falling stars, and meteor showers are enabled, plus the highest current falling star rate.
Permission: `celeste.info`
## Credits
- Original plugin by [IdreesInc](https://github.com/IdreesInc)
- Fork build, platform migration, and falling star world whitelist by [NotAlexNoyle](https://github.com/NotAlexNoyle)
- Falling star max height config by [SpaceXCheeseWheel](https://github.com/SpaceXCheeseWheel)
- Adaptive spawn scaling, daytime falling stars, and `/celeste info` rate display by [rm20killer](https://github.com/rm20killer)
+1
View File
@@ -0,0 +1 @@
/main/
+103
View File
@@ -0,0 +1,103 @@
/* ------------------------------ Plugins ------------------------------ */
plugins {
id("java") // Import Java plugin.
id("java-library") // Import Java Library plugin.
id("com.diffplug.spotless") version "8.1.0" // Import Spotless plugin.
id("com.gradleup.shadow") version "8.3.9" // Import Shadow plugin.
id("checkstyle") // Import Checkstyle plugin.
eclipse // Import Eclipse plugin.
kotlin("jvm") version "2.1.21" // Import Kotlin JVM plugin.
}
/* --------------------------- JDK / Kotlin ---------------------------- */
java {
sourceCompatibility = JavaVersion.VERSION_17 // Compile with JDK 17 compatibility.
toolchain { // Select Java toolchain.
languageVersion.set(JavaLanguageVersion.of(17)) // Use JDK 17.
vendor.set(JvmVendorSpec.GRAAL_VM) // Use GraalVM CE.
}
}
kotlin { jvmToolchain(17) }
/* ----------------------------- Metadata ------------------------------ */
group = "net.trueog.celeste-og" // Declare bundle identifier.
version = "1.1" // Declare plugin version (will be in .jar).
val apiVersion = "1.19" // Declare minecraft server target version.
/* ----------------------------- Resources ----------------------------- */
tasks.named<ProcessResources>("processResources") {
val props = mapOf("version" to version, "apiVersion" to apiVersion)
inputs.properties(props) // Indicates to rerun if version changes.
filesMatching("plugin.yml") { expand(props) }
from("LICENSE") { into("/") } // Bundle licenses into jarfiles.
}
/* ---------------------------- Repos ---------------------------------- */
repositories {
mavenCentral() // Import the Maven Central Maven Repository.
gradlePluginPortal() // Import the Gradle Plugin Portal Maven Repository.
maven { url = uri("https://repo.purpurmc.org/snapshots") } // Import the PurpurMC Maven Repository.
}
/* ---------------------- Java project deps ---------------------------- */
dependencies {
compileOnly("org.purpurmc.purpur:purpur-api:1.19.4-R0.1-SNAPSHOT") // Declare Purpur API version to be packaged.
}
/* ---------------------- Reproducible jars ---------------------------- */
tasks.withType<AbstractArchiveTask>().configureEach { // Ensure reproducible .jars
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
/* ----------------------------- Shadow -------------------------------- */
tasks.shadowJar {
exclude("io.github.miniplaceholders.*") // Exclude the MiniPlaceholders package from being shadowed.
isEnableRelocation = true
relocationPrefix = "${project.group}.shadow"
archiveClassifier.set("") // Use empty string instead of null.
minimize()
}
tasks.jar { archiveClassifier.set("part") } // Applies to root jarfile only.
tasks.build { dependsOn(tasks.spotlessApply, tasks.shadowJar) } // Build depends on spotless and shadow.
/* --------------------------- Javac opts ------------------------------- */
tasks.withType<JavaCompile>().configureEach {
options.compilerArgs.add("-parameters") // Enable reflection for java code.
options.isFork = true // Run javac in its own process.
options.compilerArgs.add("-Xlint:deprecation") // Trigger deprecation warning messages.
options.encoding = "UTF-8" // Use UTF-8 file encoding.
}
/* ----------------------------- Auto Formatting ------------------------ */
spotless {
java {
eclipse().configFile("config/formatter/eclipse-java-formatter.xml") // Eclipse java formatting.
leadingTabsToSpaces() // Convert leftover leading tabs to spaces.
removeUnusedImports() // Remove imports that aren't being called.
}
kotlinGradle {
ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } // JetBrains Kotlin formatting.
target("build.gradle.kts", "settings.gradle.kts") // Gradle files to format.
}
}
checkstyle {
toolVersion = "10.18.1" // Declare checkstyle version to use.
configFile = file("config/checkstyle/checkstyle.xml") // Point checkstyle to config file.
isIgnoreFailures = true // Don't fail the build if checkstyle does not pass.
isShowViolations = true // Show the violations in any IDE with the checkstyle plugin.
}
tasks.named("compileJava") {
dependsOn("spotlessApply") // Run spotless before compiling with the JDK.
}
tasks.named("spotlessCheck") {
dependsOn("spotlessApply") // Run spotless before checking if spotless ran.
}
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="TreeWalker">
<module name="FinalLocalVariable"/>
<module name="AvoidStarImport"/>
<module name="Indentation">
<property name="severity" value="ignore"/>
</module>
</module>
<module name="RegexpSingleline">
<property name="format" value="\borg\.junit\.jupiter\.api\.Assertions\.fail\s*\(\s*&quot;Not yet implemented&quot;\s*\)\s*;"/>
<property name="message" value="Remove placeholder fail() and implement the test."/>
<property name="ignoreCase" value="true"/>
<property name="severity" value="warning"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="(?&lt;!\w)fail\s*\(\s*&quot;Not yet implemented&quot;\s*\)\s*;"/>
<property name="message" value="Remove placeholder fail() and implement the test."/>
<property name="severity" value="warning"/>
</module>
</module>
+404
View File
@@ -0,0 +1,404 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="23">
<profile kind="CodeFormatterProfile" name="TrueOG Network Formatting" version="23">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_permitted_types_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.javadoc_do_not_separate_block_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case_after_arrow" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.align_arrows_in_switch_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow" value="20"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+7
View File
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored Executable
+251
View File
@@ -0,0 +1,251 @@
#!/bin/sh
#
# 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.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# 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/HEAD/platforms/jvm/plugins-application/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
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
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
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 ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
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
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
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
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# 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.
# 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
# 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"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# 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" "$@"
Vendored
+94
View File
@@ -0,0 +1,94 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
-45
View File
@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.idreesinc</groupId>
<artifactId>Celeste</artifactId>
<version>2.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<outputDirectory>dist</outputDirectory>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spigotmc-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.18-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
+1
View File
@@ -0,0 +1 @@
rootProject.name = "Celeste-OG"
@@ -1,60 +0,0 @@
package com.idreesinc.celeste;
import com.idreesinc.celeste.config.CelesteConfig;
import org.bukkit.World;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.List;
import java.util.Random;
public class Astronomer extends BukkitRunnable {
private final Celeste celeste;
public Astronomer(Celeste celeste) {
this.celeste = celeste;
}
public void run() {
if (celeste.getServer().getOnlinePlayers().size() == 0) {
return;
}
List<World> worlds = celeste.getServer().getWorlds();
for (World world : worlds) {
CelesteConfig config = celeste.configManager.getConfigForWorld(world.getName());
if (!celeste.configManager.doesWorldHaveOverrides(world.getName())
&& !world.getEnvironment().equals(World.Environment.NORMAL)) {
// Ensure that Celeste only runs on normal worlds unless override is specified in config
continue;
}
if (world.getPlayers().size() == 0) {
continue;
}
if (!(world.getTime() >= config.beginSpawningStarsTime && world.getTime() <= config.endSpawningStarsTime)) {
continue;
}
if (world.hasStorm()) {
continue;
}
double shootingStarChance;
double fallingStarChance;
if (config.newMoonMeteorShower && (world.getFullTime() / 24000) % 8 == 4) {
shootingStarChance = config.shootingStarsPerMinuteMeteorShower / 120d;
fallingStarChance = config.fallingStarsPerMinuteMeteorShower / 120d;
} else {
shootingStarChance = config.shootingStarsPerMinute / 120d;
fallingStarChance = config.fallingStarsPerMinute / 120d;
}
if (config.shootingStarsEnabled && new Random().nextDouble() <= shootingStarChance) {
CelestialSphere.createShootingStar(celeste,
world.getPlayers().get(new Random().nextInt(world.getPlayers().size())));
}
if (config.fallingStarsEnabled && new Random().nextDouble() <= fallingStarChance) {
CelestialSphere.createFallingStar(celeste,
world.getPlayers().get(new Random().nextInt(world.getPlayers().size())));
}
}
}
}
@@ -1,57 +0,0 @@
package com.idreesinc.celeste;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import com.idreesinc.celeste.commands.CommandCeleste;
import com.idreesinc.celeste.commands.CommandFallingStar;
import com.idreesinc.celeste.commands.CommandShootingStar;
import com.idreesinc.celeste.utilities.Metrics;
import com.idreesinc.celeste.utilities.UpdateChecker;
import com.idreesinc.celeste.config.CelesteConfigManager;
public class Celeste extends JavaPlugin {
public CelesteConfigManager configManager = new CelesteConfigManager(this);
@Override
public void onEnable() {
this.saveDefaultConfig();
// bStats metrics
Metrics metrics = new Metrics(this, 8292);
this.getCommand("celeste").setExecutor(new CommandCeleste(this));
this.getCommand("shootingstar").setExecutor(new CommandShootingStar(this));
this.getCommand("fallingstar").setExecutor(new CommandFallingStar(this));
configManager.processConfigs();
BukkitRunnable stargazingTask = new Astronomer(this);
stargazingTask.runTaskTimer(this, 0, 10);
checkForUpdates();
}
public void reload() {
reloadConfig();
configManager.processConfigs();
checkForUpdates();
}
public void checkForUpdates() {
if (this.getConfig().getBoolean("check-for-updates")) {
new UpdateChecker(this, 81862).getVersion(version -> {
try {
double current = Double.parseDouble(this.getDescription().getVersion());
double api = Double.parseDouble(version);
if (current < api) {
this.getLogger().info("There is an update available for Celeste (" + current + " -> " + api + ")");
}
} catch (NumberFormatException e) {
if (this.getConfig().getBoolean("debug")) {
this.getLogger().severe("Unable to process remote plugin version number '" + version + "'");
}
}
});
}
}
}
@@ -1,39 +0,0 @@
package com.idreesinc.celeste.commands;
import com.idreesinc.celeste.Celeste;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
public class CommandCeleste implements CommandExecutor {
Celeste celeste;
public CommandCeleste(Celeste celeste) {
this.celeste = celeste;
}
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 1 && args[0].equalsIgnoreCase("reload")) {
if (sender.hasPermission("celeste.reload")) {
celeste.reload();
sender.sendMessage("Celeste has been reloaded");
} else {
sender.sendMessage("You do not have permission to use this command");
}
return true;
} else if (args.length == 1 && args[0].equalsIgnoreCase("info")) {
if (sender.hasPermission("celeste.info")) {
sender.sendMessage("Celeste v" + celeste.getDescription().getVersion());
sender.sendMessage("Shooting stars: " + (celeste.getConfig().getBoolean("shooting-stars-enabled") ? "Enabled" : "Disabled"));
sender.sendMessage("Falling stars: " + (celeste.getConfig().getBoolean("falling-stars-enabled") ? "Enabled" : "Disabled"));
sender.sendMessage("Meteor showers: " + (celeste.getConfig().getBoolean("new-moon-meteor-shower") ? "Enabled" : "Disabled"));
} else {
sender.sendMessage("You do not have permission to use this command");
}
return true;
}
return false;
}
}
@@ -1,58 +0,0 @@
package com.idreesinc.celeste.config;
import com.idreesinc.celeste.Celeste;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.HashMap;
import java.util.Map;
public class CelesteConfigManager {
private final Celeste celeste;
private final Map<String, CelesteConfig> worldConfigs = new HashMap<>();
private CelesteConfig globalConfig;
public CelesteConfigManager(Celeste celeste) {
this.celeste = celeste;
}
public void processConfigs() {
this.worldConfigs.clear();
FileConfiguration config = this.celeste.getConfig();
globalConfig = new CelesteConfig(config);
ConfigurationSection worlds = config.getConfigurationSection("world-overrides");
if (worlds != null) {
for (String world : worlds.getKeys(false)) {
ConfigurationSection worldSettings = worlds.getConfigurationSection(world);
if (worldSettings == null) {
this.celeste.getLogger().severe("Your world override config for world '" + world + "' is malformed, please review example configs at https://github.com/IdreesInc/Celeste");
continue;
}
CelesteConfig worldConfig = new CelesteConfig(worldSettings, globalConfig);
worldConfigs.put(world, worldConfig);
}
}
}
/**
* Get the config for the given world name (case-sensitive) or the global config if no overrides have been added
* @param worldName The name of the world
* @return The config that applies to the given world
*/
public CelesteConfig getConfigForWorld(String worldName) {
CelesteConfig config = worldConfigs.get(worldName);
if (config == null) {
config = globalConfig;
}
return config;
}
/**
* Check whether the world has been configured with specific overrides in the config file
* @return Whether the specified world's configuration has been modified
*/
public boolean doesWorldHaveOverrides(String worldName) {
return worldConfigs.containsKey(worldName);
}
}
@@ -1,838 +0,0 @@
package com.idreesinc.celeste.utilities;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;
import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.lang.reflect.Method;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.zip.GZIPOutputStream;
public class Metrics {
private final Plugin plugin;
private final MetricsBase metricsBase;
/**
* Creates a new Metrics instance.
*
* @param plugin Your plugin instance.
* @param serviceId The id of the service. It can be found at <a
* href="https://bstats.org/what-is-my-plugin-id">What is my plugin id?</a>
*/
public Metrics(JavaPlugin plugin, int serviceId) {
this.plugin = plugin;
// Get the config file
File bStatsFolder = new File(plugin.getDataFolder().getParentFile(), "bStats");
File configFile = new File(bStatsFolder, "config.yml");
YamlConfiguration config = YamlConfiguration.loadConfiguration(configFile);
if (!config.isSet("serverUuid")) {
config.addDefault("enabled", true);
config.addDefault("serverUuid", UUID.randomUUID().toString());
config.addDefault("logFailedRequests", false);
config.addDefault("logSentData", false);
config.addDefault("logResponseStatusText", false);
// Inform the server owners about bStats
config
.options()
.header(
"bStats (https://bStats.org) collects some basic information for plugin authors, like how\n"
+ "many people use their plugin and their total player count. It's recommended to keep bStats\n"
+ "enabled, but if you're not comfortable with this, you can turn this setting off. There is no\n"
+ "performance penalty associated with having metrics enabled, and data sent to bStats is fully\n"
+ "anonymous.")
.copyDefaults(true);
try {
config.save(configFile);
} catch (IOException ignored) {
}
}
// Load the data
boolean enabled = config.getBoolean("enabled", true);
String serverUUID = config.getString("serverUuid");
boolean logErrors = config.getBoolean("logFailedRequests", false);
boolean logSentData = config.getBoolean("logSentData", false);
boolean logResponseStatusText = config.getBoolean("logResponseStatusText", false);
metricsBase =
new MetricsBase(
"bukkit",
serverUUID,
serviceId,
enabled,
this::appendPlatformData,
this::appendServiceData,
submitDataTask -> Bukkit.getScheduler().runTask(plugin, submitDataTask),
plugin::isEnabled,
(message, error) -> this.plugin.getLogger().log(Level.WARNING, message, error),
(message) -> this.plugin.getLogger().log(Level.INFO, message),
logErrors,
logSentData,
logResponseStatusText);
}
/**
* Adds a custom chart.
*
* @param chart The chart to add.
*/
public void addCustomChart(CustomChart chart) {
metricsBase.addCustomChart(chart);
}
private void appendPlatformData(JsonObjectBuilder builder) {
builder.appendField("playerAmount", getPlayerAmount());
builder.appendField("onlineMode", Bukkit.getOnlineMode() ? 1 : 0);
builder.appendField("bukkitVersion", Bukkit.getVersion());
builder.appendField("bukkitName", Bukkit.getName());
builder.appendField("javaVersion", System.getProperty("java.version"));
builder.appendField("osName", System.getProperty("os.name"));
builder.appendField("osArch", System.getProperty("os.arch"));
builder.appendField("osVersion", System.getProperty("os.version"));
builder.appendField("coreCount", Runtime.getRuntime().availableProcessors());
}
private void appendServiceData(JsonObjectBuilder builder) {
builder.appendField("pluginVersion", plugin.getDescription().getVersion());
}
private int getPlayerAmount() {
try {
// Around MC 1.8 the return type was changed from an array to a collection,
// This fixes java.lang.NoSuchMethodError:
// org.bukkit.Bukkit.getOnlinePlayers()Ljava/util/Collection;
Method onlinePlayersMethod = Class.forName("org.bukkit.Server").getMethod("getOnlinePlayers");
return onlinePlayersMethod.getReturnType().equals(Collection.class)
? ((Collection<?>) onlinePlayersMethod.invoke(Bukkit.getServer())).size()
: ((Player[]) onlinePlayersMethod.invoke(Bukkit.getServer())).length;
} catch (Exception e) {
// Just use the new method if the reflection failed
return Bukkit.getOnlinePlayers().size();
}
}
public static class MetricsBase {
/** The version of the Metrics class. */
public static final String METRICS_VERSION = "2.2.1";
private static final ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1, task -> new Thread(task, "bStats-Metrics"));
private static final String REPORT_URL = "https://bStats.org/api/v2/data/%s";
private final String platform;
private final String serverUuid;
private final int serviceId;
private final Consumer<JsonObjectBuilder> appendPlatformDataConsumer;
private final Consumer<JsonObjectBuilder> appendServiceDataConsumer;
private final Consumer<Runnable> submitTaskConsumer;
private final Supplier<Boolean> checkServiceEnabledSupplier;
private final BiConsumer<String, Throwable> errorLogger;
private final Consumer<String> infoLogger;
private final boolean logErrors;
private final boolean logSentData;
private final boolean logResponseStatusText;
private final Set<CustomChart> customCharts = new HashSet<>();
private final boolean enabled;
/**
* Creates a new MetricsBase class instance.
*
* @param platform The platform of the service.
* @param serviceId The id of the service.
* @param serverUuid The server uuid.
* @param enabled Whether or not data sending is enabled.
* @param appendPlatformDataConsumer A consumer that receives a {@code JsonObjectBuilder} and
* appends all platform-specific data.
* @param appendServiceDataConsumer A consumer that receives a {@code JsonObjectBuilder} and
* appends all service-specific data.
* @param submitTaskConsumer A consumer that takes a runnable with the submit task. This can be
* used to delegate the data collection to a another thread to prevent errors caused by
* concurrency. Can be {@code null}.
* @param checkServiceEnabledSupplier A supplier to check if the service is still enabled.
* @param errorLogger A consumer that accepts log message and an error.
* @param infoLogger A consumer that accepts info log messages.
* @param logErrors Whether or not errors should be logged.
* @param logSentData Whether or not the sent data should be logged.
* @param logResponseStatusText Whether or not the response status text should be logged.
*/
public MetricsBase(
String platform,
String serverUuid,
int serviceId,
boolean enabled,
Consumer<JsonObjectBuilder> appendPlatformDataConsumer,
Consumer<JsonObjectBuilder> appendServiceDataConsumer,
Consumer<Runnable> submitTaskConsumer,
Supplier<Boolean> checkServiceEnabledSupplier,
BiConsumer<String, Throwable> errorLogger,
Consumer<String> infoLogger,
boolean logErrors,
boolean logSentData,
boolean logResponseStatusText) {
this.platform = platform;
this.serverUuid = serverUuid;
this.serviceId = serviceId;
this.enabled = enabled;
this.appendPlatformDataConsumer = appendPlatformDataConsumer;
this.appendServiceDataConsumer = appendServiceDataConsumer;
this.submitTaskConsumer = submitTaskConsumer;
this.checkServiceEnabledSupplier = checkServiceEnabledSupplier;
this.errorLogger = errorLogger;
this.infoLogger = infoLogger;
this.logErrors = logErrors;
this.logSentData = logSentData;
this.logResponseStatusText = logResponseStatusText;
checkRelocation();
if (enabled) {
startSubmitting();
}
}
public void addCustomChart(CustomChart chart) {
this.customCharts.add(chart);
}
private void startSubmitting() {
final Runnable submitTask =
() -> {
if (!enabled || !checkServiceEnabledSupplier.get()) {
// Submitting data or service is disabled
scheduler.shutdown();
return;
}
if (submitTaskConsumer != null) {
submitTaskConsumer.accept(this::submitData);
} else {
this.submitData();
}
};
// Many servers tend to restart at a fixed time at xx:00 which causes an uneven distribution
// of requests on the
// bStats backend. To circumvent this problem, we introduce some randomness into the initial
// and second delay.
// WARNING: You must not modify and part of this Metrics class, including the submit delay or
// frequency!
// WARNING: Modifying this code will get your plugin banned on bStats. Just don't do it!
long initialDelay = (long) (1000 * 60 * (3 + Math.random() * 3));
long secondDelay = (long) (1000 * 60 * (Math.random() * 30));
scheduler.schedule(submitTask, initialDelay, TimeUnit.MILLISECONDS);
scheduler.scheduleAtFixedRate(
submitTask, initialDelay + secondDelay, 1000 * 60 * 30, TimeUnit.MILLISECONDS);
}
private void submitData() {
final JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder();
appendPlatformDataConsumer.accept(baseJsonBuilder);
final JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder();
appendServiceDataConsumer.accept(serviceJsonBuilder);
JsonObjectBuilder.JsonObject[] chartData =
customCharts.stream()
.map(customChart -> customChart.getRequestJsonObject(errorLogger, logErrors))
.filter(Objects::nonNull)
.toArray(JsonObjectBuilder.JsonObject[]::new);
serviceJsonBuilder.appendField("id", serviceId);
serviceJsonBuilder.appendField("customCharts", chartData);
baseJsonBuilder.appendField("service", serviceJsonBuilder.build());
baseJsonBuilder.appendField("serverUUID", serverUuid);
baseJsonBuilder.appendField("metricsVersion", METRICS_VERSION);
JsonObjectBuilder.JsonObject data = baseJsonBuilder.build();
scheduler.execute(
() -> {
try {
// Send the data
sendData(data);
} catch (Exception e) {
// Something went wrong! :(
if (logErrors) {
errorLogger.accept("Could not submit bStats metrics data", e);
}
}
});
}
private void sendData(JsonObjectBuilder.JsonObject data) throws Exception {
if (logSentData) {
infoLogger.accept("Sent bStats metrics data: " + data.toString());
}
String url = String.format(REPORT_URL, platform);
HttpsURLConnection connection = (HttpsURLConnection) new URL(url).openConnection();
// Compress the data to save bandwidth
byte[] compressedData = compress(data.toString());
connection.setRequestMethod("POST");
connection.addRequestProperty("Accept", "application/json");
connection.addRequestProperty("Connection", "close");
connection.addRequestProperty("Content-Encoding", "gzip");
connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("User-Agent", "Metrics-Service/1");
connection.setDoOutput(true);
try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
outputStream.write(compressedData);
}
StringBuilder builder = new StringBuilder();
try (BufferedReader bufferedReader =
new BufferedReader(new InputStreamReader(connection.getInputStream()))) {
String line;
while ((line = bufferedReader.readLine()) != null) {
builder.append(line);
}
}
if (logResponseStatusText) {
infoLogger.accept("Sent data to bStats and received response: " + builder);
}
}
/** Checks that the class was properly relocated. */
private void checkRelocation() {
// You can use the property to disable the check in your test environment
if (System.getProperty("bstats.relocatecheck") == null
|| !System.getProperty("bstats.relocatecheck").equals("false")) {
// Maven's Relocate is clever and changes strings, too. So we have to use this little
// "trick" ... :D
final String defaultPackage =
new String(new byte[] {'o', 'r', 'g', '.', 'b', 's', 't', 'a', 't', 's'});
final String examplePackage =
new String(new byte[] {'y', 'o', 'u', 'r', '.', 'p', 'a', 'c', 'k', 'a', 'g', 'e'});
// We want to make sure no one just copy & pastes the example and uses the wrong package
// names
if (MetricsBase.class.getPackage().getName().startsWith(defaultPackage)
|| MetricsBase.class.getPackage().getName().startsWith(examplePackage)) {
throw new IllegalStateException("bStats Metrics class has not been relocated correctly!");
}
}
}
/**
* Gzips the given string.
*
* @param str The string to gzip.
* @return The gzipped string.
*/
private static byte[] compress(final String str) throws IOException {
if (str == null) {
return null;
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try (GZIPOutputStream gzip = new GZIPOutputStream(outputStream)) {
gzip.write(str.getBytes(StandardCharsets.UTF_8));
}
return outputStream.toByteArray();
}
}
public static class AdvancedBarChart extends CustomChart {
private final Callable<Map<String, int[]>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public AdvancedBarChart(String chartId, Callable<Map<String, int[]>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObjectBuilder.JsonObject getChartData() throws Exception {
JsonObjectBuilder valuesBuilder = new JsonObjectBuilder();
Map<String, int[]> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean allSkipped = true;
for (Map.Entry<String, int[]> entry : map.entrySet()) {
if (entry.getValue().length == 0) {
// Skip this invalid
continue;
}
allSkipped = false;
valuesBuilder.appendField(entry.getKey(), entry.getValue());
}
if (allSkipped) {
// Null = skip the chart
return null;
}
return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build();
}
}
public static class SimpleBarChart extends CustomChart {
private final Callable<Map<String, Integer>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public SimpleBarChart(String chartId, Callable<Map<String, Integer>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObjectBuilder.JsonObject getChartData() throws Exception {
JsonObjectBuilder valuesBuilder = new JsonObjectBuilder();
Map<String, Integer> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
valuesBuilder.appendField(entry.getKey(), new int[] {entry.getValue()});
}
return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build();
}
}
public static class MultiLineChart extends CustomChart {
private final Callable<Map<String, Integer>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public MultiLineChart(String chartId, Callable<Map<String, Integer>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObjectBuilder.JsonObject getChartData() throws Exception {
JsonObjectBuilder valuesBuilder = new JsonObjectBuilder();
Map<String, Integer> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean allSkipped = true;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
// Skip this invalid
continue;
}
allSkipped = false;
valuesBuilder.appendField(entry.getKey(), entry.getValue());
}
if (allSkipped) {
// Null = skip the chart
return null;
}
return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build();
}
}
public static class AdvancedPie extends CustomChart {
private final Callable<Map<String, Integer>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public AdvancedPie(String chartId, Callable<Map<String, Integer>> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObjectBuilder.JsonObject getChartData() throws Exception {
JsonObjectBuilder valuesBuilder = new JsonObjectBuilder();
Map<String, Integer> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean allSkipped = true;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue() == 0) {
// Skip this invalid
continue;
}
allSkipped = false;
valuesBuilder.appendField(entry.getKey(), entry.getValue());
}
if (allSkipped) {
// Null = skip the chart
return null;
}
return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build();
}
}
public abstract static class CustomChart {
private final String chartId;
protected CustomChart(String chartId) {
if (chartId == null) {
throw new IllegalArgumentException("chartId must not be null");
}
this.chartId = chartId;
}
public JsonObjectBuilder.JsonObject getRequestJsonObject(
BiConsumer<String, Throwable> errorLogger, boolean logErrors) {
JsonObjectBuilder builder = new JsonObjectBuilder();
builder.appendField("chartId", chartId);
try {
JsonObjectBuilder.JsonObject data = getChartData();
if (data == null) {
// If the data is null we don't send the chart.
return null;
}
builder.appendField("data", data);
} catch (Throwable t) {
if (logErrors) {
errorLogger.accept("Failed to get data for custom chart with id " + chartId, t);
}
return null;
}
return builder.build();
}
protected abstract JsonObjectBuilder.JsonObject getChartData() throws Exception;
}
public static class SingleLineChart extends CustomChart {
private final Callable<Integer> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public SingleLineChart(String chartId, Callable<Integer> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObjectBuilder.JsonObject getChartData() throws Exception {
int value = callable.call();
if (value == 0) {
// Null = skip the chart
return null;
}
return new JsonObjectBuilder().appendField("value", value).build();
}
}
public static class SimplePie extends CustomChart {
private final Callable<String> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public SimplePie(String chartId, Callable<String> callable) {
super(chartId);
this.callable = callable;
}
@Override
protected JsonObjectBuilder.JsonObject getChartData() throws Exception {
String value = callable.call();
if (value == null || value.isEmpty()) {
// Null = skip the chart
return null;
}
return new JsonObjectBuilder().appendField("value", value).build();
}
}
public static class DrilldownPie extends CustomChart {
private final Callable<Map<String, Map<String, Integer>>> callable;
/**
* Class constructor.
*
* @param chartId The id of the chart.
* @param callable The callable which is used to request the chart data.
*/
public DrilldownPie(String chartId, Callable<Map<String, Map<String, Integer>>> callable) {
super(chartId);
this.callable = callable;
}
@Override
public JsonObjectBuilder.JsonObject getChartData() throws Exception {
JsonObjectBuilder valuesBuilder = new JsonObjectBuilder();
Map<String, Map<String, Integer>> map = callable.call();
if (map == null || map.isEmpty()) {
// Null = skip the chart
return null;
}
boolean reallyAllSkipped = true;
for (Map.Entry<String, Map<String, Integer>> entryValues : map.entrySet()) {
JsonObjectBuilder valueBuilder = new JsonObjectBuilder();
boolean allSkipped = true;
for (Map.Entry<String, Integer> valueEntry : map.get(entryValues.getKey()).entrySet()) {
valueBuilder.appendField(valueEntry.getKey(), valueEntry.getValue());
allSkipped = false;
}
if (!allSkipped) {
reallyAllSkipped = false;
valuesBuilder.appendField(entryValues.getKey(), valueBuilder.build());
}
}
if (reallyAllSkipped) {
// Null = skip the chart
return null;
}
return new JsonObjectBuilder().appendField("values", valuesBuilder.build()).build();
}
}
/**
* An extremely simple JSON builder.
*
* <p>While this class is neither feature-rich nor the most performant one, it's sufficient enough
* for its use-case.
*/
public static class JsonObjectBuilder {
private StringBuilder builder = new StringBuilder();
private boolean hasAtLeastOneField = false;
public JsonObjectBuilder() {
builder.append("{");
}
/**
* Appends a null field to the JSON.
*
* @param key The key of the field.
* @return A reference to this object.
*/
public JsonObjectBuilder appendNull(String key) {
appendFieldUnescaped(key, "null");
return this;
}
/**
* Appends a string field to the JSON.
*
* @param key The key of the field.
* @param value The value of the field.
* @return A reference to this object.
*/
public JsonObjectBuilder appendField(String key, String value) {
if (value == null) {
throw new IllegalArgumentException("JSON value must not be null");
}
appendFieldUnescaped(key, "\"" + escape(value) + "\"");
return this;
}
/**
* Appends an integer field to the JSON.
*
* @param key The key of the field.
* @param value The value of the field.
* @return A reference to this object.
*/
public JsonObjectBuilder appendField(String key, int value) {
appendFieldUnescaped(key, String.valueOf(value));
return this;
}
/**
* Appends an object to the JSON.
*
* @param key The key of the field.
* @param object The object.
* @return A reference to this object.
*/
public JsonObjectBuilder appendField(String key, JsonObject object) {
if (object == null) {
throw new IllegalArgumentException("JSON object must not be null");
}
appendFieldUnescaped(key, object.toString());
return this;
}
/**
* Appends a string array to the JSON.
*
* @param key The key of the field.
* @param values The string array.
* @return A reference to this object.
*/
public JsonObjectBuilder appendField(String key, String[] values) {
if (values == null) {
throw new IllegalArgumentException("JSON values must not be null");
}
String escapedValues =
Arrays.stream(values)
.map(value -> "\"" + escape(value) + "\"")
.collect(Collectors.joining(","));
appendFieldUnescaped(key, "[" + escapedValues + "]");
return this;
}
/**
* Appends an integer array to the JSON.
*
* @param key The key of the field.
* @param values The integer array.
* @return A reference to this object.
*/
public JsonObjectBuilder appendField(String key, int[] values) {
if (values == null) {
throw new IllegalArgumentException("JSON values must not be null");
}
String escapedValues =
Arrays.stream(values).mapToObj(String::valueOf).collect(Collectors.joining(","));
appendFieldUnescaped(key, "[" + escapedValues + "]");
return this;
}
/**
* Appends an object array to the JSON.
*
* @param key The key of the field.
* @param values The integer array.
* @return A reference to this object.
*/
public JsonObjectBuilder appendField(String key, JsonObject[] values) {
if (values == null) {
throw new IllegalArgumentException("JSON values must not be null");
}
String escapedValues =
Arrays.stream(values).map(JsonObject::toString).collect(Collectors.joining(","));
appendFieldUnescaped(key, "[" + escapedValues + "]");
return this;
}
/**
* Appends a field to the object.
*
* @param key The key of the field.
* @param escapedValue The escaped value of the field.
*/
private void appendFieldUnescaped(String key, String escapedValue) {
if (builder == null) {
throw new IllegalStateException("JSON has already been built");
}
if (key == null) {
throw new IllegalArgumentException("JSON key must not be null");
}
if (hasAtLeastOneField) {
builder.append(",");
}
builder.append("\"").append(escape(key)).append("\":").append(escapedValue);
hasAtLeastOneField = true;
}
/**
* Builds the JSON string and invalidates this builder.
*
* @return The built JSON string.
*/
public JsonObject build() {
if (builder == null) {
throw new IllegalStateException("JSON has already been built");
}
JsonObject object = new JsonObject(builder.append("}").toString());
builder = null;
return object;
}
/**
* Escapes the given string like stated in https://www.ietf.org/rfc/rfc4627.txt.
*
* <p>This method escapes only the necessary characters '"', '\'. and '\u0000' - '\u001F'.
* Compact escapes are not used (e.g., '\n' is escaped as "\u000a" and not as "\n").
*
* @param value The value to escape.
* @return The escaped value.
*/
private static String escape(String value) {
final StringBuilder builder = new StringBuilder();
for (int i = 0; i < value.length(); i++) {
char c = value.charAt(i);
if (c == '"') {
builder.append("\\\"");
} else if (c == '\\') {
builder.append("\\\\");
} else if (c <= '\u000F') {
builder.append("\\u000").append(Integer.toHexString(c));
} else if (c <= '\u001F') {
builder.append("\\u00").append(Integer.toHexString(c));
} else {
builder.append(c);
}
}
return builder.toString();
}
/**
* A super simple representation of a JSON object.
*
* <p>This class only exists to make methods of the {@link JsonObjectBuilder} type-safe and not
* allow a raw string inputs for methods like {@link JsonObjectBuilder#appendField(String,
* JsonObject)}.
*/
public static class JsonObject {
private final String value;
private JsonObject(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
}
}
@@ -1,34 +0,0 @@
package com.idreesinc.celeste.utilities;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.Consumer;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
public class UpdateChecker {
private Plugin plugin;
private int resourceId;
public UpdateChecker(Plugin plugin, int resourceId) {
this.plugin = plugin;
this.resourceId = resourceId;
}
public void getVersion(final Consumer<String> consumer) {
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
try (InputStream inputStream = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream(); Scanner scanner = new Scanner(inputStream)) {
if (scanner.hasNext()) {
consumer.accept(scanner.next());
}
} catch (IOException exception) {
this.plugin.getLogger().info("Cannot look for updates: " + exception.getMessage());
}
});
}
}
@@ -0,0 +1,142 @@
package net.trueog.celeste;
import java.security.SecureRandom;
import java.util.List;
import org.bukkit.World;
import org.bukkit.scheduler.BukkitRunnable;
import net.trueog.celeste.config.CelesteConfig;
public class Astronomer extends BukkitRunnable {
private final Celeste celeste;
public Astronomer(Celeste celeste) {
this.celeste = celeste;
}
@Override
public void run() {
if (celeste.getServer().getOnlinePlayers().isEmpty()) {
return;
}
final List<World> worlds = celeste.getServer().getWorlds();
for (World world : worlds) {
float multiplier = 1;
final CelesteConfig config = celeste.configManager.getConfigForWorld(world.getName());
if (!celeste.configManager.doesWorldHaveOverrides(world.getName())
&& world.getEnvironment() != World.Environment.NORMAL)
{
// Ensure that Celeste-OG only runs on normal worlds unless override is
// specified
// in config
continue;
}
if (world.getPlayers().size() == 0) {
continue;
}
if (!(world.getTime() >= config.beginSpawningStarsTime && world.getTime() <= config.endSpawningStarsTime)) {
if (!config.starsDaylight) {
continue;
}
multiplier = config.dayMultiplier;
}
if (world.hasStorm()) {
continue;
}
final double shootingStarChance;
final double fallingStarChance;
final double shootingStarsPerMin;
final double fallingStarPerMin;
double adaptiveShootingStarsChance = 0;
double adaptiveFallingStarsChance = 0;
if (config.adaptiveShootingStars != 0) {
if (config.adaptiveGlobalPlayerCount) {
adaptiveShootingStarsChance = (celeste.getServer().getOnlinePlayers().size()
/ config.adaptiveShootingStars) * 0.1;
} else {
adaptiveShootingStarsChance = (world.getPlayers().size() / config.adaptiveShootingStars) * 0.1;
}
}
if (config.adaptiveFallingStars != 0) {
if (config.adaptiveGlobalPlayerCount) {
adaptiveFallingStarsChance = (celeste.getServer().getOnlinePlayers().size()
/ config.adaptiveFallingStars) * 0.1;
} else {
adaptiveFallingStarsChance = (world.getPlayers().size() / config.adaptiveFallingStars) * 0.1;
}
}
if (config.newMoonMeteorShower && (world.getFullTime() / 24000) % 8 == 4) {
shootingStarsPerMin = adaptiveShootingStarsChance + config.shootingStarsPerMinuteMeteorShower;
fallingStarPerMin = (adaptiveFallingStarsChance + config.fallingStarsPerMinuteMeteorShower)
* multiplier;
} else {
shootingStarsPerMin = adaptiveShootingStarsChance + config.shootingStarsPerMinute;
fallingStarPerMin = (adaptiveFallingStarsChance + config.fallingStarsPerMinute) * multiplier;
}
shootingStarChance = shootingStarsPerMin / 120d;
fallingStarChance = fallingStarPerMin / 120d;
if (config.shootingStarsEnabled && new SecureRandom().nextDouble() <= shootingStarChance) {
CelestialSphere.createShootingStar(celeste,
world.getPlayers().get(new SecureRandom().nextInt(world.getPlayers().size())));
}
if (config.fallingStarsEnabled && celeste.configManager.isFallingStarsAllowedInWorld(world.getName())
&& new SecureRandom().nextDouble() <= fallingStarChance)
{
CelestialSphere.createFallingStar(celeste,
world.getPlayers().get(new SecureRandom().nextInt(world.getPlayers().size())));
}
}
}
}
@@ -0,0 +1,44 @@
package net.trueog.celeste;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import net.trueog.celeste.commands.CommandCeleste;
import net.trueog.celeste.commands.CommandFallingStar;
import net.trueog.celeste.commands.CommandShootingStar;
import net.trueog.celeste.config.CelesteConfigManager;
public class Celeste extends JavaPlugin {
public CelesteConfigManager configManager = new CelesteConfigManager(this);
@Override
public void onEnable() {
this.saveDefaultConfig();
this.getCommand("celeste").setExecutor(new CommandCeleste(this));
this.getCommand("shootingstar").setExecutor(new CommandShootingStar(this));
this.getCommand("fallingstar").setExecutor(new CommandFallingStar(this));
configManager.processConfigs();
final BukkitRunnable stargazingTask = new Astronomer(this);
stargazingTask.runTaskTimer(this, 0, 10);
}
public void reload() {
reloadConfig();
configManager.processConfigs();
}
public static void getLogger(String message) {
Bukkit.getLogger().info("[Celeste-OG]" + message);
}
}
@@ -1,91 +1,135 @@
package com.idreesinc.celeste;
package net.trueog.celeste;
import java.math.RoundingMode;
import java.security.SecureRandom;
import java.text.DecimalFormat;
import java.util.Random;
import com.idreesinc.celeste.config.CelesteConfig;
import org.bukkit.Location;
import org.bukkit.Particle;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Random;
import net.trueog.celeste.config.CelesteConfig;
public class CelestialSphere {
public static void createShootingStar(Celeste celeste, Player player) {
createShootingStar(celeste, player, true);
}
public static void createShootingStar(Celeste celeste, Player player, boolean approximate) {
createShootingStar(celeste, player.getLocation(), approximate);
}
public static void createShootingStar(Celeste celeste, Location location) {
createShootingStar(celeste, location, true);
}
public static void createShootingStar(Celeste celeste, Location location, boolean approximate) {
Location starLocation;
CelesteConfig config = celeste.configManager.getConfigForWorld(location.getWorld().getName());
double w = 100 * Math.sqrt(new Random().nextDouble());
double t = 2d * Math.PI * new Random().nextDouble();
double x = w * Math.cos(t);
double range = Math.max(0, config.shootingStarsMaxHeight - config.shootingStarsMinHeight);
double y = Math.max(new Random().nextDouble() * range + config.shootingStarsMinHeight, location.getY() + 50);
double z = w * Math.sin(t);
final Location starLocation;
final CelesteConfig config = celeste.configManager.getConfigForWorld(location.getWorld().getName());
final double w = 100 * Math.sqrt(new SecureRandom().nextDouble());
final double t = 2d * Math.PI * new SecureRandom().nextDouble();
final double x = w * Math.cos(t);
final double range = Math.max(0, config.shootingStarsMaxHeight - config.shootingStarsMinHeight);
final double y = Math.max(new SecureRandom().nextDouble() * range + config.shootingStarsMinHeight,
location.getY() + 50);
final double z = w * Math.sin(t);
if (approximate) {
starLocation = new Location(location.getWorld(), location.getX() + x, y, location.getZ() + z);
} else {
starLocation = new Location(location.getWorld(), location.getX(), y, location.getZ());
}
Vector direction = new Vector(new Random().nextDouble() * 2 - 1, new Random().nextDouble() * -0.75d, new Random().nextDouble() * 2 - 1);
final Vector direction = new Vector(new Random().nextDouble() * 2 - 1, new Random().nextDouble() * -0.75d,
new Random().nextDouble() * 2 - 1);
direction.normalize();
double speed = new Random().nextDouble() * 2 + 0.75;
location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, starLocation, 0, direction.getX(),
direction.getY(), direction.getZ(), speed, null, true);
if (new Random().nextDouble() >= 0.5) {
final double speed = new SecureRandom().nextDouble() * 2 + 0.75;
location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, starLocation, 0, direction.getX(), direction.getY(),
direction.getZ(), speed, null, true);
if (new SecureRandom().nextDouble() >= 0.5) {
location.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, starLocation, 0, direction.getX(),
direction.getY(), direction.getZ(), speed, null, true);
}
if (celeste.getConfig().getBoolean("debug")) {
celeste.getLogger().info("Shooting star at " + stringifyLocation(starLocation) + " in world " + starLocation.getWorld().getName());
celeste.getLogger().info("Shooting star at " + stringifyLocation(starLocation) + " in world "
+ starLocation.getWorld().getName());
}
}
public static void createFallingStar(Celeste celeste, Player player) {
createFallingStar(celeste, player, true);
}
public static void createFallingStar(Celeste celeste, Player player, boolean approximate) {
createFallingStar(celeste, player.getLocation(), approximate);
}
public static void createFallingStar(Celeste celeste, final Location location) {
createFallingStar(celeste, location, true);
}
public static void createFallingStar(Celeste celeste, final Location location, boolean approximate) {
Location target = location;
CelesteConfig config = celeste.configManager.getConfigForWorld(location.getWorld().getName());
final CelesteConfig config = celeste.configManager.getConfigForWorld(location.getWorld().getName());
if (approximate) {
double fallingStarRadius = config.fallingStarsRadius;
double w = fallingStarRadius * Math.sqrt(new Random().nextDouble());
double t = 2d * Math.PI * new Random().nextDouble();
double x = w * Math.cos(t);
double z = w * Math.sin(t);
final double fallingStarRadius = config.fallingStarsRadius;
final double w = fallingStarRadius * Math.sqrt(new SecureRandom().nextDouble());
final double t = 2d * Math.PI * new SecureRandom().nextDouble();
final double x = w * Math.cos(t);
final double z = w * Math.sin(t);
target = new Location(location.getWorld(), location.getX() + x, location.getY(), location.getZ() + z);
}
BukkitRunnable fallingStarTask = new FallingStar(celeste, target);
final BukkitRunnable fallingStarTask = new FallingStar(celeste, target);
fallingStarTask.runTaskTimer(celeste, 0, 1);
if (celeste.getConfig().getBoolean("debug")) {
celeste.getLogger().info("Falling star at " + stringifyLocation(target) + " in world " + target.getWorld().getName());
celeste.getLogger()
.info("Falling star at " + stringifyLocation(target) + " in world " + target.getWorld().getName());
}
}
private static String stringifyLocation(Location location) {
DecimalFormat format = new DecimalFormat("##.00");
final DecimalFormat format = new DecimalFormat("##.00");
format.setRoundingMode(RoundingMode.HALF_UP);
return "x: " + format.format(location.getX()) + " y: " + format.format(location.getY()) + " z: " + format.format(location.getZ());
return "x: " + format.format(location.getX()) + " y: " + format.format(location.getY()) + " z: "
+ format.format(location.getZ());
}
}
}
@@ -1,6 +1,7 @@
package com.idreesinc.celeste;
package net.trueog.celeste;
import java.security.SecureRandom;
import com.idreesinc.celeste.config.CelesteConfig;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Particle;
@@ -11,7 +12,7 @@ import org.bukkit.entity.ExperienceOrb;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.Random;
import net.trueog.celeste.config.CelesteConfig;
public class FallingStar extends BukkitRunnable {
@@ -19,85 +20,124 @@ public class FallingStar extends BukkitRunnable {
private final Location location;
private final Location dropLoc;
private final CelesteConfig config;
private double y = 256;
private double y = 330;
private boolean soundPlayed = false;
private boolean lootDropped = false;
private int sparkTimer;
public FallingStar(Celeste celeste, Location location) {
this.celeste = celeste;
this.location = location;
config = celeste.configManager.getConfigForWorld(location.getWorld().getName());
sparkTimer = config.fallingStarsSparkTime;
dropLoc = new Location(location.getWorld(), location.getX(),
location.getWorld().getHighestBlockAt(location).getY() + 1, location.getZ());
y = celeste.getConfig().getDouble("falling-stars-max-height");
}
@Override
public void run() {
double step = 1;
location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location.getX(), y, location.getZ(),
0, 0, new Random().nextDouble(), 0,
0.2, null, true);
// Speed of fall increased to compensate for increased height.
final double step = 2;
location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location.getX(), y, location.getZ(), 0, 0,
new SecureRandom().nextDouble(), 0, 0.2, null, true);
location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location.getX(),
y + new Random().nextDouble() * step,
location.getZ(),
0, 0, -1, 0,
1, null, true);
y + new SecureRandom().nextDouble() * step, location.getZ(), 0, 0, -1, 0, 1, null, true);
if (y % (step * 2) == 0) {
location.getWorld().spawnParticle(Particle.LAVA, location.getX(), y + new Random().nextDouble(),
location.getZ(),
0, 0, new Random().nextDouble(), 0,
0.2, null, true);
location.getWorld().spawnParticle(Particle.LAVA, location.getX(), y + new SecureRandom().nextDouble(),
location.getZ(), 0, 0, new SecureRandom().nextDouble(), 0, 0.2, null, true);
}
if (config.fallingStarsSoundEnabled && !soundPlayed && y <= dropLoc.getY() + 75) {
if (config.fallingStarsSoundEnabled && !soundPlayed && y <= dropLoc.getY() + 75 * step) {
location.getWorld().playSound(dropLoc, Sound.BLOCK_BELL_RESONATE, (float) config.fallingStarsVolume, 0.5f);
soundPlayed = true;
}
if (y <= dropLoc.getY()) {
if (!lootDropped) {
// Note that both simple loot and loot tables will drop if both are configured because why not
// Note that both simple loot and loot tables will drop if both are configured
// because why not
if (config.fallingStarSimpleLoot != null && config.fallingStarSimpleLoot.entries.size() > 0) {
ItemStack drop = new ItemStack(Material.valueOf(config.fallingStarSimpleLoot.getRandom()), 1);
final ItemStack drop = new ItemStack(Material.valueOf(config.fallingStarSimpleLoot.getRandom()), 1);
location.getWorld().dropItem(dropLoc, drop);
if (celeste.getConfig().getBoolean("debug")) {
celeste.getLogger().info("Spawned simple falling star loot");
}
}
if (config.fallingStarLootTable != null) {
// Armor stands are used as markers are not compatible with 1.14
Entity marker = dropLoc.getWorld().spawnEntity(location, EntityType.ARMOR_STAND);
String command = String.format("execute at %s run loot spawn %s %s %s loot %s",
marker.getUniqueId(),
dropLoc.getX(),
dropLoc.getY(),
dropLoc.getZ(),
final Entity marker = dropLoc.getWorld().spawnEntity(location, EntityType.ARMOR_STAND);
final String command = "execute at %s run loot spawn %s %s %s loot %s".formatted(
marker.getUniqueId(), dropLoc.getX(), dropLoc.getY(), dropLoc.getZ(),
config.fallingStarLootTable);
celeste.getServer().dispatchCommand(celeste.getServer().getConsoleSender(), command);
marker.remove();
if (celeste.getConfig().getBoolean("debug")) {
celeste.getLogger().info("Spawned falling star loot from loot table '" + config.fallingStarLootTable + "'");
celeste.getLogger().info(
"Spawned falling star loot from loot table '" + config.fallingStarLootTable + "'");
}
}
if (config.fallingStarsExperience > 0) {
ExperienceOrb orb = (ExperienceOrb) dropLoc.getWorld().spawnEntity(dropLoc, EntityType.EXPERIENCE_ORB);
final ExperienceOrb orb = (ExperienceOrb) dropLoc.getWorld().spawnEntity(dropLoc,
EntityType.EXPERIENCE_ORB);
orb.setExperience(config.fallingStarsExperience);
if (celeste.getConfig().getBoolean("debug")) {
celeste.getLogger().info("Dropping experience orbs with value " + config.fallingStarsExperience);
celeste.getLogger()
.info("Dropping experience orbs with value " + config.fallingStarsExperience);
}
}
lootDropped = true;
}
if (y % (step * 5) == 0) {
location.getWorld().spawnParticle(Particle.LAVA, dropLoc,
0, 0, new Random().nextDouble(), 0,
1, null, true);
location.getWorld().spawnParticle(Particle.LAVA, dropLoc, 0, 0, new SecureRandom().nextDouble(), 0, 1,
null, true);
}
sparkTimer--;
if (sparkTimer <= 0) {
this.cancel();
}
}
y -= step;
}
}
@@ -0,0 +1,99 @@
package net.trueog.celeste.commands;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import net.trueog.celeste.Celeste;
public class CommandCeleste implements CommandExecutor {
Celeste celeste;
public CommandCeleste(Celeste celeste) {
this.celeste = celeste;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 1 && StringUtils.equalsIgnoreCase(args[0], "reload")) {
if (sender.hasPermission("celeste.reload")) {
celeste.reload();
sender.sendMessage("Celeste has been reloaded");
} else {
sender.sendMessage("You do not have permission to use this command");
}
return true;
} else if (args.length == 1 && StringUtils.equalsIgnoreCase(args[0], "info")) {
if (sender.hasPermission("celeste.info")) {
double fallingStarRate = 0;
final double adaptiveFallingStars = celeste.getConfig().getDouble("adaptive-falling-stars");
if (adaptiveFallingStars != 0) {
if (celeste.getConfig().getBoolean("adaptive-use-global-player-count")) {
fallingStarRate = (celeste.getServer().getOnlinePlayers().size() / adaptiveFallingStars) * 0.1;
} else {
final List<World> worlds = celeste.getServer().getWorlds();
double highestRate = 0;
for (World world : worlds) {
final double worldRate = (world.getPlayers().size() / adaptiveFallingStars) * 0.1;
if (highestRate < worldRate) {
highestRate = worldRate;
}
}
fallingStarRate = highestRate;
}
}
fallingStarRate = fallingStarRate + celeste.getConfig().getDouble("falling-stars-per-minute");
sender.sendMessage("Celeste-OG v" + celeste.getPluginMeta().getVersion());
sender.sendMessage("Shooting stars: "
+ (celeste.getConfig().getBoolean("shooting-stars-enabled") ? "Enabled" : "Disabled"));
sender.sendMessage("Falling stars: "
+ (celeste.getConfig().getBoolean("falling-stars-enabled") ? "Enabled" : "Disabled"));
sender.sendMessage("Falling stars rate (highest): " + fallingStarRate);
sender.sendMessage("Meteor showers: "
+ (celeste.getConfig().getBoolean("new-moon-meteor-shower") ? "Enabled" : "Disabled"));
} else {
sender.sendMessage("You do not have permission to use this command");
}
return true;
}
return false;
}
}
@@ -1,41 +1,61 @@
package com.idreesinc.celeste.commands;
package net.trueog.celeste.commands;
import com.idreesinc.celeste.Celeste;
import com.idreesinc.celeste.CelestialSphere;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import net.trueog.celeste.Celeste;
import net.trueog.celeste.CelestialSphere;
public class CommandFallingStar implements CommandExecutor {
Celeste celeste;
public CommandFallingStar(Celeste celeste) {
this.celeste = celeste;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length > 0) {
if (Bukkit.getPlayer(args[0]) == null) {
sender.sendMessage("\u00a7cError: Player not found.");
return true;
}
CelestialSphere.createFallingStar(celeste, Bukkit.getPlayer(args[0]), false);
} else {
if (sender instanceof Player) {
Player player = (Player) sender;
if (sender instanceof Player player) {
CelestialSphere.createFallingStar(celeste, player, false);
} else {
return false;
}
}
String message = this.celeste.getConfig().getString("falling-stars-summon-text");
final String message = this.celeste.getConfig().getString("falling-stars-summon-text");
if (message != null) {
sender.sendMessage(message);
}
return true;
}
}
}
@@ -1,41 +1,61 @@
package com.idreesinc.celeste.commands;
package net.trueog.celeste.commands;
import com.idreesinc.celeste.Celeste;
import com.idreesinc.celeste.CelestialSphere;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import net.trueog.celeste.Celeste;
import net.trueog.celeste.CelestialSphere;
public class CommandShootingStar implements CommandExecutor {
Celeste celeste;
public CommandShootingStar(Celeste celeste) {
this.celeste = celeste;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length > 0) {
if (Bukkit.getPlayer(args[0]) == null) {
sender.sendMessage("\u00a7cError: Player not found.");
return true;
}
CelestialSphere.createShootingStar(celeste, Bukkit.getPlayer(args[0]), false);
} else {
if (sender instanceof Player) {
Player player = (Player) sender;
if (sender instanceof Player player) {
CelestialSphere.createShootingStar(celeste, player, false);
} else {
return false;
}
}
String message = this.celeste.getConfig().getString("shooting-stars-summon-text");
final String message = this.celeste.getConfig().getString("shooting-stars-summon-text");
if (message != null) {
sender.sendMessage(message);
}
return true;
}
}
}
@@ -1,10 +1,14 @@
package com.idreesinc.celeste.config;
package net.trueog.celeste.config;
import com.idreesinc.celeste.utilities.WeightedRandomBag;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import net.trueog.celeste.Celeste;
import net.trueog.celeste.utilities.WeightedRandomBag;
public class CelesteConfig {
public boolean newMoonMeteorShower;
public int beginSpawningStarsTime;
public int endSpawningStarsTime;
@@ -16,6 +20,7 @@ public class CelesteConfig {
public int shootingStarsMaxHeight;
public boolean fallingStarsEnabled;
public double fallingStarsMaxHeight;
public double fallingStarsPerMinute;
public double fallingStarsPerMinuteMeteorShower;
public int fallingStarsRadius;
@@ -25,18 +30,28 @@ public class CelesteConfig {
public int fallingStarsExperience;
public WeightedRandomBag<String> fallingStarSimpleLoot;
public String fallingStarLootTable;
public double adaptiveFallingStars;
public double adaptiveShootingStars;
public boolean adaptiveGlobalPlayerCount;
public boolean starsDaylight;
public float dayMultiplier;
public CelesteConfig(ConfigurationSection section) {
// Used to build the global config
// Used to build the global config.
buildFromConfigurationSection(section);
}
public CelesteConfig(ConfigurationSection section, CelesteConfig globalConfig) {
// Used to build per-world configs
// Used to build per-world configs.
buildFromConfigurationSectionWithGlobal(section, globalConfig);
}
private void buildFromConfigurationSection(ConfigurationSection section) {
newMoonMeteorShower = section.getBoolean("new-moon-meteor-shower");
beginSpawningStarsTime = section.getInt("begin-spawning-stars-time");
endSpawningStarsTime = section.getInt("end-spawning-stars-time");
@@ -48,6 +63,7 @@ public class CelesteConfig {
shootingStarsMaxHeight = section.getInt("shooting-stars-max-height");
fallingStarsEnabled = section.getBoolean("falling-stars-enabled");
fallingStarsMaxHeight = section.getDouble("falling-stars-max-height");
fallingStarsPerMinute = section.getDouble("falling-stars-per-minute");
fallingStarsPerMinuteMeteorShower = section.getDouble("falling-stars-per-minute-during-meteor-showers");
fallingStarsRadius = section.getInt("falling-stars-radius");
@@ -58,54 +74,93 @@ public class CelesteConfig {
fallingStarLootTable = section.getString("falling-stars-loot-table");
if (section.isSet("falling-stars-loot")) {
fallingStarSimpleLoot = calculateSimpleLoot(section.getConfigurationSection("falling-stars-loot"));
}
adaptiveShootingStars = section.getDouble("adaptive-shooting-stars");
adaptiveFallingStars = section.getDouble("adaptive-falling-stars");
adaptiveGlobalPlayerCount = section.getBoolean("adaptive-use-global-player-count");
starsDaylight = section.getBoolean("falling-stars-daylight");
dayMultiplier = (float) section.getDouble("falling-stars-day-multiplicative");
}
private void buildFromConfigurationSectionWithGlobal(ConfigurationSection section, CelesteConfig globalConfig) {
newMoonMeteorShower = section.getBoolean("new-moon-meteor-shower", globalConfig.newMoonMeteorShower);
beginSpawningStarsTime = section.getInt("begin-spawning-stars-time", globalConfig.beginSpawningStarsTime);
endSpawningStarsTime = section.getInt("end-spawning-stars-time", globalConfig.endSpawningStarsTime);
shootingStarsEnabled = section.getBoolean("shooting-stars-enabled", globalConfig.shootingStarsEnabled);
shootingStarsPerMinute = section.getDouble("shooting-stars-per-minute", globalConfig.shootingStarsPerMinute);
shootingStarsPerMinuteMeteorShower = section.getDouble("shooting-stars-per-minute-during-meteor-showers", globalConfig.shootingStarsPerMinuteMeteorShower);
shootingStarsPerMinuteMeteorShower = section.getDouble("shooting-stars-per-minute-during-meteor-showers",
globalConfig.shootingStarsPerMinuteMeteorShower);
shootingStarsMinHeight = section.getInt("shooting-stars-min-height", globalConfig.shootingStarsMinHeight);
shootingStarsMaxHeight = section.getInt("shooting-stars-max-height", globalConfig.shootingStarsMaxHeight);
fallingStarsEnabled = section.getBoolean("falling-stars-enabled", globalConfig.fallingStarsEnabled);
fallingStarsMaxHeight = section.getDouble("falling-stars-max-height", globalConfig.fallingStarsMaxHeight);
fallingStarsPerMinute = section.getDouble("falling-stars-per-minute", globalConfig.fallingStarsPerMinute);
fallingStarsPerMinuteMeteorShower = section.getDouble("falling-stars-per-minute-during-meteor-showers", globalConfig.fallingStarsPerMinuteMeteorShower);
fallingStarsPerMinuteMeteorShower = section.getDouble("falling-stars-per-minute-during-meteor-showers",
globalConfig.fallingStarsPerMinuteMeteorShower);
fallingStarsRadius = section.getInt("falling-stars-radius", globalConfig.fallingStarsRadius);
fallingStarsSoundEnabled = section.getBoolean("falling-stars-sound-enabled", globalConfig.fallingStarsSoundEnabled);
fallingStarsSoundEnabled = section.getBoolean("falling-stars-sound-enabled",
globalConfig.fallingStarsSoundEnabled);
fallingStarsVolume = section.getDouble("falling-stars-volume", globalConfig.fallingStarsVolume);
fallingStarsSparkTime = section.getInt("falling-stars-spark-time", globalConfig.fallingStarsSparkTime);
fallingStarsExperience = section.getInt("falling-stars-experience", globalConfig.fallingStarsExperience);
adaptiveShootingStars = section.getDouble("adaptive-shooting-stars", globalConfig.adaptiveShootingStars);
adaptiveFallingStars = section.getDouble("adaptive-falling-stars", globalConfig.adaptiveFallingStars);
adaptiveGlobalPlayerCount = section.getBoolean("adaptive-use-global-player-count",
globalConfig.adaptiveGlobalPlayerCount);
starsDaylight = section.getBoolean("falling-stars-daylight", globalConfig.starsDaylight);
dayMultiplier = (float) section.getDouble("falling-stars-day-multiplicative", globalConfig.dayMultiplier);
if (section.isSet("falling-stars-loot") || section.isSet("falling-stars-loot-table")) {
// Ensure that neither type of loot is inherited from the global config if any overrides are used
// This means that even if the global config sets simple loot and the world config overrides just loot
// table, the end result will be a config with the loot table set and the simple table empty
// Ensure that neither type of loot is inherited from the global config if any
// overrides are used
// This means that even if the global config sets simple loot and the world
// config overrides just loot
// table, the end result will be a config with the loot table set and the simple
// table empty
fallingStarLootTable = section.getString("falling-stars-loot-table");
if (section.isSet("falling-stars-loot")) {
fallingStarSimpleLoot = calculateSimpleLoot(section.getConfigurationSection("falling-stars-loot"));
}
} else {
fallingStarLootTable = globalConfig.fallingStarLootTable;
fallingStarSimpleLoot = globalConfig.fallingStarSimpleLoot;
}
}
public WeightedRandomBag<String> calculateSimpleLoot(ConfigurationSection loot) {
WeightedRandomBag<String> fallingStarDrops = new WeightedRandomBag<>();
for (String key : loot.getKeys(false)) {
final WeightedRandomBag<String> fallingStarDrops = new WeightedRandomBag<>();
loot.getKeys(false).forEach(key -> {
try {
Material.valueOf(key.toUpperCase());
fallingStarDrops.addEntry(key.toUpperCase(), loot.getDouble(key));
Material.valueOf(StringUtils.upperCase(key));
fallingStarDrops.addEntry(StringUtils.upperCase(key), loot.getDouble(key));
} catch (IllegalArgumentException e) {
System.err.println("Error: Item with name " + key.toUpperCase() + " does not exist, skipping");
Celeste.getLogger("Error: Item with name " + StringUtils.upperCase(key) + " does not exist, skipping");
}
}
});
return fallingStarDrops;
}
}
}
@@ -0,0 +1,103 @@
package net.trueog.celeste.config;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import net.trueog.celeste.Celeste;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
public class CelesteConfigManager {
private final Celeste celeste;
private final Map<String, CelesteConfig> worldConfigs = new HashMap<>();
private final Set<String> fallingStarsWorldWhitelist = new HashSet<>();
private CelesteConfig globalConfig;
public CelesteConfigManager(Celeste celeste) {
this.celeste = celeste;
}
public void processConfigs() {
this.worldConfigs.clear();
this.fallingStarsWorldWhitelist.clear();
final FileConfiguration config = this.celeste.getConfig();
globalConfig = new CelesteConfig(config);
this.fallingStarsWorldWhitelist.addAll(config.getStringList("falling-stars-world-whitelist"));
final ConfigurationSection worlds = config.getConfigurationSection("world-overrides");
if (worlds != null) {
for (String world : worlds.getKeys(false)) {
final ConfigurationSection worldSettings = worlds.getConfigurationSection(world);
if (worldSettings == null) {
this.celeste.getLogger().severe("Your world override config for world '" + world
+ "' is malformed, please review example configs at https://github.com/IdreesInc/Celeste");
continue;
}
final CelesteConfig worldConfig = new CelesteConfig(worldSettings, globalConfig);
worldConfigs.put(world, worldConfig);
}
}
}
/**
* Get the config for the given world name (case-sensitive) or the global config
* if no overrides have been added
*
* @param worldName The name of the world
* @return The config that applies to the given world
*/
public CelesteConfig getConfigForWorld(String worldName) {
CelesteConfig config = worldConfigs.get(worldName);
if (config == null) {
config = globalConfig;
}
return config;
}
/**
* Check whether the world has been configured with specific overrides in the
* config file
*
* @return Whether the specified world's configuration has been modified
*/
public boolean doesWorldHaveOverrides(String worldName) {
return worldConfigs.containsKey(worldName);
}
/**
* Check whether falling stars are allowed to spawn in the given world. If the
* whitelist is empty it is treated as disabled and all worlds are allowed,
* otherwise only worlds listed in falling-stars-world-whitelist are allowed.
*
* @param worldName The name of the world (case-sensitive)
* @return Whether falling stars may spawn in the given world
*/
public boolean isFallingStarsAllowedInWorld(String worldName) {
return fallingStarsWorldWhitelist.isEmpty() || fallingStarsWorldWhitelist.contains(worldName);
}
}
@@ -1,6 +1,7 @@
package com.idreesinc.celeste.utilities;
//From https://gamedev.stackexchange.com/a/162987
package net.trueog.celeste.utilities;
// From https://gamedev.stackexchange.com/a/162987
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
@@ -8,30 +9,44 @@ import java.util.Random;
public class WeightedRandomBag<T extends Object> {
private class Entry {
double accumulatedWeight;
T object;
}
public List<Entry> entries = new ArrayList<Entry>();
public List<Entry> entries = new ArrayList<>();
private double accumulatedWeight;
private Random rand = new Random();
private Random rand = new SecureRandom();
public void addEntry(T object, double weight) {
accumulatedWeight += weight;
Entry e = new Entry();
final Entry e = new Entry();
e.object = object;
e.accumulatedWeight = accumulatedWeight;
entries.add(e);
}
public T getRandom() {
double r = rand.nextDouble() * accumulatedWeight;
for (Entry entry: entries) {
final double r = rand.nextDouble() * accumulatedWeight;
for (Entry entry : entries) {
if (entry.accumulatedWeight >= r) {
return entry.object;
}
}
// Should only happen when there are no entries
// Should only happen when there are no entries.
return null;
}
}
+31 -13
View File
@@ -1,24 +1,42 @@
check-for-updates: true
shooting-stars-enabled: true
falling-stars-enabled: true
begin-spawning-stars-time: 13000
end-spawning-stars-time: 23000
shooting-stars-per-minute: 6
shooting-stars-min-height: 130
shooting-stars-max-height: 160
falling-stars-per-minute: 0.2
shooting-stars-per-minute: 12
shooting-stars-min-height: 160
shooting-stars-max-height: 310
falling-stars-per-minute: 0.1
falling-stars-max-height: 300
falling-stars-radius: 75
falling-stars-sound-enabled: true
falling-stars-volume: 6
falling-stars-spark-time: 200
falling-stars-experience: 100
falling-stars-experience: 25
falling-stars-loot:
diamond: 60
emerald: 20
fire_charge: 20
diamond: 1
emerald: 0
fire_charge: 0
new-moon-meteor-shower: true
shooting-stars-per-minute-during-meteor-showers: 15
falling-stars-per-minute-during-meteor-showers: 0.3
shooting-stars-summon-text: "Make a wish!"
falling-stars-summon-text: "Make a wish!"
shooting-stars-per-minute-during-meteor-showers: 36
falling-stars-per-minute-during-meteor-showers: 0.4
shooting-stars-summon-text: "&eMake a wish!"
falling-stars-summon-text: "&eWish granted!"
debug: false
# Adaptive settings
# This settings will increase falling-stars-per-minute and shooting-stars-per-minute depending on player count.
# 0 is disabled, 1 will increase it by 0.1 for every player, 2 will increase it by 0.2 for every 2 players etc
adaptive-falling-stars: 0
adaptive-shooting-stars: 0
adaptive-use-global-player-count: true
# Allow falling stars to spawn during the day with a lower chance.
falling-stars-daylight: false
falling-stars-day-multiplicative: 0
# World whitelist for falling stars (case-sensitive world names).
# If empty, falling stars may spawn in any eligible world (default behavior).
# If non-empty, falling stars only spawn in the listed worlds.
# Example:
# falling-stars-world-whitelist:
# - world
# - world_nether
falling-stars-world-whitelist:
- world
+6 -8
View File
@@ -1,9 +1,8 @@
name: Celeste
version: 2.0
api-version: 1.14
author: Idrees
main: com.idreesinc.celeste.Celeste
name: Celeste-OG
version: '${version}'
api-version: '${apiVersion}'
authors: [Idrees, NotAlexNoyle]
main: net.trueog.celeste.Celeste
commands:
celeste:
description: Reloads the plugin configuration or prints runtime info
@@ -16,10 +15,9 @@ commands:
description: Creates a falling star near the player that summons it, or optionally near another player
usage: /<command> [player]
permission: celeste.fallingstar
permissions:
celeste.*:
description: Gives access to all Celeste commands
description: Gives access to all Celeste-OG commands
children:
celeste.reload: true
celeste.info: true