Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2b0fff4051
|
||
|
|
3a8a20946a
|
||
|
|
750400f2d1 | ||
|
|
dfaa19b376 | ||
|
|
569730a8e2 | ||
|
|
7583decfbb | ||
|
|
189078220c | ||
|
|
797243c91e | ||
|
|
79c05999fe | ||
|
|
e3b7824928 | ||
|
|
58c71bd309 | ||
|
|
77aaa5a3be | ||
|
|
6194938b77 | ||
|
|
0fce8bafac | ||
|
|
ef3e7282ef | ||
|
|
d848ad106a | ||
|
|
5e17a5c0c5 | ||
|
|
9c6008219b | ||
|
|
769a1d0df1 | ||
|
|
74b9b29fa3 | ||
|
|
2214c80c2a | ||
|
|
d66d8100a8 | ||
|
|
07062c394b | ||
|
|
939acae421 | ||
|
|
c18f2b77b2 | ||
|
|
85b9d33a51 | ||
|
|
a0587fe2f0 | ||
|
|
bef6e29943 | ||
|
|
3af37487bc | ||
|
|
fb9bbec21b | ||
|
|
e1002437be | ||
|
|
41be698750 | ||
|
|
519ce529e9 |
No files matched your search
@@ -0,0 +1 @@
|
||||
.gitea/CODEOWNERS linguist-detectable=false
|
||||
@@ -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
@@ -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
|
||||
@@ -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
|
||||
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 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)
|
||||
@@ -0,0 +1 @@
|
||||
/main/
|
||||
@@ -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.
|
||||
}
|
||||
@@ -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*"Not yet implemented"\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="(?<!\w)fail\s*\(\s*"Not yet implemented"\s*\)\s*;"/>
|
||||
<property name="message" value="Remove placeholder fail() and implement the test."/>
|
||||
<property name="severity" value="warning"/>
|
||||
</module>
|
||||
|
||||
</module>
|
||||
|
||||
@@ -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>
|
||||
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
+7
@@ -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
|
||||
@@ -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
@@ -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
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+74
-30
@@ -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());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+71
-31
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+27
-7
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+27
-7
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
+73
-18
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+23
-8
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user