Compare commits
200 Commits
build-21
...
ver/1.20.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2b7aec8f7 | ||
|
|
ad96ea2b9b | ||
|
|
4d0e6c8304 | ||
|
|
3c182ae67e | ||
|
|
95b2d636ab | ||
|
|
52e80e540b | ||
|
|
9cb7ff8b84 | ||
|
|
5897fbdfa6 | ||
|
|
042f11d759 | ||
|
|
1271516e58 | ||
|
|
0648cb49c8 | ||
|
|
35a7588d6d | ||
|
|
dc4931389b | ||
|
|
eb6be9f290 | ||
|
|
6d12ac828a | ||
|
|
baf0a46d91 | ||
|
|
32a11498b4 | ||
|
|
8eb4a79492 | ||
|
|
f8abc46b5e | ||
|
|
1594847f93 | ||
|
|
fd71bdebd5 | ||
|
|
a3c8b4a2b7 | ||
|
|
d514f5744a | ||
|
|
dbd96e6e84 | ||
|
|
6669139413 | ||
|
|
4327944b97 | ||
|
|
b869fc44e0 | ||
|
|
423b2078e8 | ||
|
|
a6cd4d115e | ||
|
|
7e70bc76d9 | ||
|
|
fd509ffe21 | ||
|
|
28de4d3178 | ||
|
|
67b061cda6 | ||
|
|
243f57f124 | ||
|
|
c66ed11b44 | ||
|
|
4edf6f9cd3 | ||
|
|
09e0f58125 | ||
|
|
a95080aaff | ||
|
|
794ce3b533 | ||
|
|
40d552627b | ||
|
|
6b0aab7b0b | ||
|
|
3ca4adc05e | ||
|
|
5df1740ff7 | ||
|
|
5c9fc7f289 | ||
|
|
195dfd4e3a | ||
|
|
755fa2e6a4 | ||
|
|
6392fde2e4 | ||
|
|
589b5f62c3 | ||
|
|
1f0e0e1863 | ||
|
|
449d1e5653 | ||
|
|
349ae3bcce | ||
|
|
8c562b0616 | ||
|
|
6657b9cb08 | ||
|
|
3176184ca6 | ||
|
|
bc3e578199 | ||
|
|
8ead6a39e8 | ||
|
|
78ce8c44b0 | ||
|
|
570012207d | ||
|
|
3ced21898b | ||
|
|
47ffdcfec9 | ||
|
|
cb48e11a50 | ||
|
|
47979cce0c | ||
|
|
5ee903fe44 | ||
|
|
66ca590e7d | ||
|
|
7303dafc78 | ||
|
|
7bbd7429a5 | ||
|
|
319347ed32 | ||
|
|
61f2cb81f4 | ||
|
|
9cd3a602bc | ||
|
|
7c29fb1beb | ||
|
|
f91b81c3a6 | ||
|
|
e6ad43eea4 | ||
|
|
fda258d608 | ||
|
|
3c6f042353 | ||
|
|
21321abd32 | ||
|
|
48ac9b311a | ||
|
|
dd425fd8f0 | ||
|
|
af7f63bf75 | ||
|
|
93f3978b49 | ||
|
|
8056d0c632 | ||
|
|
344af397be | ||
|
|
2ac3df7e8b | ||
|
|
d12a002f3c | ||
|
|
d9ad7304e6 | ||
|
|
087825eb26 | ||
|
|
efa1abc1d7 | ||
|
|
ccebb2b390 | ||
|
|
2ed10d07b0 | ||
|
|
160f0452d0 | ||
|
|
57d89067d7 | ||
|
|
1139843c98 | ||
|
|
fe414e027b | ||
|
|
ab7a79c7b7 | ||
|
|
3044e2a70d | ||
|
|
ee365adb62 | ||
|
|
d78112453c | ||
|
|
42d7d8a151 | ||
|
|
f936afbdfd | ||
|
|
e611832cb7 | ||
|
|
62951f0d92 | ||
|
|
73ab029e4c | ||
|
|
47b4ce394c | ||
|
|
6275320901 | ||
|
|
a113654b36 | ||
|
|
671522acdc | ||
|
|
2779390c6b | ||
|
|
4fc704f16a | ||
|
|
423f48684a | ||
|
|
c027a2e37f | ||
|
|
3ec9267550 | ||
|
|
57bd665a5e | ||
|
|
5faba7039e | ||
|
|
3d7011f7d7 | ||
|
|
74d3638155 | ||
|
|
2da29dfbc5 | ||
|
|
d422fc645c | ||
|
|
53851e72d4 | ||
|
|
7c618748c6 | ||
|
|
f63cf7c1fa | ||
|
|
ea9ab3f27c | ||
|
|
ae5526ff76 | ||
|
|
f6f2314be6 | ||
|
|
4e5feda68f | ||
|
|
b6729158b0 | ||
|
|
d4cd2cf5b3 | ||
|
|
c4741b284e | ||
|
|
65ee54da34 | ||
|
|
7ebfac20b8 | ||
|
|
fa210d634d | ||
|
|
91eaf9966d | ||
|
|
3bc1986806 | ||
|
|
3f3c9292bf | ||
|
|
6a994e5d50 | ||
|
|
034cf1e6d6 | ||
|
|
118cabf45c | ||
|
|
5562bd750f | ||
|
|
cedc442598 | ||
|
|
35983edbd3 | ||
|
|
8664b137ca | ||
|
|
94d5a28cc4 | ||
|
|
76890444db | ||
|
|
08dd766899 | ||
|
|
7fb8ff8fd0 | ||
|
|
32e02629a9 | ||
|
|
ef8af2f22a | ||
|
|
23b264963e | ||
|
|
95e8ffed83 | ||
|
|
e2b32c0b66 | ||
|
|
12d82f3aa5 | ||
|
|
e7b45be456 | ||
|
|
48a3fc55b7 | ||
|
|
29b6a8d59d | ||
|
|
f7a4bb691b | ||
|
|
34724b4471 | ||
|
|
660e911bbb | ||
|
|
092e4ddbd8 | ||
|
|
7fd3f17095 | ||
|
|
53fdedd162 | ||
|
|
e0f78402c8 | ||
|
|
d36d0dc5fc | ||
|
|
f6246f3349 | ||
|
|
b35f17f3e6 | ||
|
|
bc3c1437a0 | ||
|
|
1f2930b604 | ||
|
|
602212daff | ||
|
|
152dbba7b0 | ||
|
|
757de4f65f | ||
|
|
af98564be2 | ||
|
|
4d29274175 | ||
|
|
1c59e62414 | ||
|
|
d0103df33b | ||
|
|
34977e4e8a | ||
|
|
d2d7c120e5 | ||
|
|
7239362b4d | ||
|
|
83dc76521c | ||
|
|
51e1e75382 | ||
|
|
86c3a4e8de | ||
|
|
c40c8785cd | ||
|
|
e3a38f51cf | ||
|
|
a3812b6cef | ||
|
|
b8868beac9 | ||
|
|
835c7b10d8 | ||
|
|
e7823d7a0a | ||
|
|
e44b800bbe | ||
|
|
5705d55587 | ||
|
|
3c013f180c | ||
|
|
b5121bd590 | ||
|
|
2ac15d9c21 | ||
|
|
eafa041f07 | ||
|
|
89828085c6 | ||
|
|
9c397142c6 | ||
|
|
7e1ad9e37a | ||
|
|
d844c7c954 | ||
|
|
292f587834 | ||
|
|
cd442cc16b | ||
|
|
e6207392bf | ||
|
|
e817028ac1 | ||
|
|
ae74a9bb2c | ||
|
|
fc5216a070 | ||
|
|
2deb7e54f0 |
6
.github/workflows/build.yml
vendored
6
.github/workflows/build.yml
vendored
@@ -1,8 +1,8 @@
|
||||
name: Generate Jars
|
||||
on: [ push, pull_request ]
|
||||
env:
|
||||
version: '1.19.3'
|
||||
branch: ver/1.19.3
|
||||
version: '1.20.1'
|
||||
branch: ver/1.20.1
|
||||
jobs:
|
||||
paperclip:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
with:
|
||||
java-version: '17'
|
||||
cache: 'gradle'
|
||||
distribution: 'GraalVM'
|
||||
distribution: 'graalvm'
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version: 'latest'
|
||||
- name: Configure Git User Details
|
||||
|
||||
6
.github/workflows/release.yml
vendored
6
.github/workflows/release.yml
vendored
@@ -1,8 +1,8 @@
|
||||
name: Release Jars
|
||||
on: [push, workflow_dispatch]
|
||||
env:
|
||||
version: '1.19.3'
|
||||
branch: ver/1.19.3
|
||||
version: '1.20.1'
|
||||
branch: ver/1.20.1
|
||||
jobs:
|
||||
paperclip:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -14,7 +14,7 @@ jobs:
|
||||
with:
|
||||
java-version: '17'
|
||||
cache: 'gradle'
|
||||
distribution: 'GraalVM'
|
||||
distribution: 'graalvm'
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
version: 'latest'
|
||||
- name: Configure Git User Details
|
||||
|
||||
10
.github/workflows/upstream.yml
vendored
10
.github/workflows/upstream.yml
vendored
@@ -1,4 +1,4 @@
|
||||
name: Update Upstream (Purpur)
|
||||
name: Update Upstream (Folia)
|
||||
|
||||
on:
|
||||
schedule:
|
||||
@@ -7,9 +7,7 @@ on:
|
||||
|
||||
jobs:
|
||||
upstream:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Git Repository
|
||||
uses: actions/checkout@v2
|
||||
@@ -22,7 +20,7 @@ jobs:
|
||||
- name: Configure Git User Details
|
||||
run: git config --global user.email "actions@github.com" && git config --global user.name "Github Actions"
|
||||
- name: Update Upstream Commit Hash
|
||||
run: ./gradlew purpurRefLatest --stacktrace
|
||||
run: ./gradlew foliaRefLatest --stacktrace
|
||||
- name: Apply Patches
|
||||
run: ./gradlew applyPatches --stacktrace
|
||||
- name: Build Paperclip jar
|
||||
@@ -37,8 +35,8 @@ jobs:
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
commit-message: Update Upstream (Purpur)
|
||||
commit-message: Update Upstream (Folia)
|
||||
branch: update-upstream
|
||||
delete-branch: true
|
||||
title: 'Update Upstream (Purpur)'
|
||||
title: 'Update Upstream (Folia)'
|
||||
body: ''
|
||||
|
||||
80
README.md
80
README.md
@@ -1,9 +1,7 @@
|
||||
|
||||
<div align="center">
|
||||
<img src="https://github.com/kugge/Kaiiju/blob/ver/1.19.3/logo.png?" width="32%" height="32%"/>
|
||||
<h1>Kaiiju</h1>
|
||||
<h3>A Server Software Designed For Anarchy</h3>
|
||||
<h4>❗ [ Warning ] Work in progress, contributions are welcome ❗</h4>
|
||||
<h3>Folia fork, designed for vanilla/anarchy servers</h3>
|
||||
|
||||
[](LICENSE)
|
||||
[](https://github.com/kugge/Kaiiju/actions)
|
||||
@@ -13,17 +11,74 @@
|
||||
|
||||
## Features
|
||||
|
||||
### Additions
|
||||
- **Xymb Linear Format**: Saves about 50% of disk space in OW and Nether and 95% in The End.
|
||||
- **Lobotomize**: Lobotomize mobs and villagers without breaking vanilla mechanics.
|
||||
### Notable
|
||||
- **Xymb Linear Format**: A Region file format that reduces disk space usage by about 50%.
|
||||
- **Async Pathfinding**: Petal async pathfinding fixed & reworked.
|
||||
- **Technical Minecraft**: Enable Vanilla exploits such as sand duping, RNG manipulation...
|
||||
|
||||
### Other
|
||||
- **Small optimizations**: Increase server efficiency by disabling unnecessary features.
|
||||
- **Commands**: Restore few commands that were previously removed by Folia.
|
||||
|
||||
### Configuration
|
||||
|
||||
```yaml
|
||||
region-format:
|
||||
linear:
|
||||
flush-frequency: 10
|
||||
flush-max-threads: 1
|
||||
network:
|
||||
send-null-entity-packets: true
|
||||
alternate-keepalive: false
|
||||
kick-player-on-bad-packet: true
|
||||
optimization:
|
||||
disable-vanish-api: false
|
||||
disable-player-stats: false
|
||||
disable-arm-swing-event: false
|
||||
async-path-processing:
|
||||
enable: false
|
||||
max-threads: 0
|
||||
keepalive: 60
|
||||
gameplay:
|
||||
server-mod-name: Kaiiju
|
||||
shared-random-for-players: true
|
||||
unsupported:
|
||||
disable-ensure-tick-thread-checks: false
|
||||
global-event-synchronization: false
|
||||
world-settings:
|
||||
default:
|
||||
region-format:
|
||||
format: ANVIL
|
||||
linear:
|
||||
compression-level: 1
|
||||
crash-on-broken-symlink: true
|
||||
optimization:
|
||||
shulker-box-drop-contents-when-destroyed: true
|
||||
optimize-hoppers: true
|
||||
tick-when-empty: true
|
||||
enable-entity-throttling: false
|
||||
disable-achievements: false
|
||||
disable-creatures-spawn-events: false
|
||||
disable-dolphin-swim-to-treasure: false
|
||||
gameplay:
|
||||
fix-void-trading: true
|
||||
break-redstone-on-top-of-trap-doors-early: true
|
||||
fix-tripwire-state-inconsistency: true
|
||||
safe-teleportation: true
|
||||
sand-duplication: false
|
||||
teleport-async-on-high-velocity: false
|
||||
```
|
||||
Documentation: [Kaiiju Wiki](https://github.com/KaiijuMC/Kaiiju/wiki/Configuration)
|
||||
|
||||
### Roadmap
|
||||
- **Lithium**: Full implementation of Lithium.
|
||||
- **C2ME**: Full implementation of C2ME.
|
||||
- **VMP**: Full implementation of VMP.
|
||||
- **Stash deduplication**: Make giant dupe stashes possible and lagless.
|
||||
- **Multithreaded Tracker**: Rework Petal multithreaded tracker.
|
||||
|
||||
## Open to contributions
|
||||
- **Native world conversion**: Convert region file format at startup.
|
||||
- **Performance patch**: Any significative performance patch.
|
||||
|
||||
## Building
|
||||
In order to distribute and use this server software, you need a paperclip file:
|
||||
|
||||
```bash
|
||||
./gradlew applyPatches # Apply Kaiiju patches
|
||||
@@ -31,7 +86,4 @@ In order to distribute and use this server software, you need a paperclip file:
|
||||
```
|
||||
|
||||
## License
|
||||
Patches are licensed under GPL-3.0.
|
||||
All other files are licensed under MIT.
|
||||
|
||||
Made with <span style="color: #e25555;">♥</span> on Earth.
|
||||
Original patches are licensed under GPL-3.0.
|
||||
|
||||
@@ -3,8 +3,8 @@ import io.papermc.paperweight.util.constants.*
|
||||
|
||||
plugins {
|
||||
java
|
||||
id("com.github.johnrengelman.shadow") version "7.1.2"
|
||||
id("io.papermc.paperweight.patcher") version "1.5.1"
|
||||
id("com.github.johnrengelman.shadow") version "8.1.1"
|
||||
id("io.papermc.paperweight.patcher") version "1.5.4"
|
||||
}
|
||||
|
||||
allprojects {
|
||||
@@ -30,8 +30,8 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
remapper("net.fabricmc:tiny-remapper:0.8.6:fat")
|
||||
decompiler("net.minecraftforge:forgeflower:2.0.627.2")
|
||||
paperclip("io.papermc:paperclip:3.0.2")
|
||||
decompiler("net.minecraftforge:forgeflower:2.0.629.0")
|
||||
paperclip("io.papermc:paperclip:3.0.3")
|
||||
}
|
||||
|
||||
subprojects {
|
||||
@@ -58,12 +58,12 @@ paperweight {
|
||||
remapRepo.set(paperMavenPublicUrl)
|
||||
decompileRepo.set(paperMavenPublicUrl)
|
||||
|
||||
useStandardUpstream("Purpur") {
|
||||
url.set(github("PurpurMC", "Purpur"))
|
||||
ref.set(providers.gradleProperty("purpurRef"))
|
||||
useStandardUpstream("Folia") {
|
||||
url.set(github("PaperMC", "Folia"))
|
||||
ref.set(providers.gradleProperty("foliaRef"))
|
||||
|
||||
withStandardPatcher {
|
||||
baseName("Purpur")
|
||||
baseName("Folia")
|
||||
|
||||
apiPatchDir.set(layout.projectDirectory.dir("patches/api"))
|
||||
apiOutputDir.set(layout.projectDirectory.dir("kaiiju-api"))
|
||||
@@ -72,36 +72,35 @@ paperweight {
|
||||
serverOutputDir.set(layout.projectDirectory.dir("kaiiju-server"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tasks.register("purpurRefLatest") {
|
||||
// Update the purpurRef in gradle.properties to be the latest commit.
|
||||
val tempDir = layout.cacheDir("purpurRefLatest");
|
||||
val file = "gradle.properties";
|
||||
tasks.register("foliaRefLatest") {
|
||||
// Update the foliaRef in gradle.properties to be the latest commit.
|
||||
val tempDir = layout.cacheDir("foliaRefLatest");
|
||||
val file = "gradle.properties";
|
||||
|
||||
doFirst {
|
||||
data class GithubCommit(
|
||||
val sha: String
|
||||
)
|
||||
doFirst {
|
||||
data class GithubCommit(
|
||||
val sha: String
|
||||
)
|
||||
|
||||
val purpurLatestCommitJson = layout.cache.resolve("purpurLatestCommit.json");
|
||||
download.get().download("https://api.github.com/repos/PurpurMC/Purpur/commits/ver/1.19.3", purpurLatestCommitJson);
|
||||
val purpurLatestCommit = gson.fromJson<paper.libs.com.google.gson.JsonObject>(purpurLatestCommitJson)["sha"].asString;
|
||||
val foliaLatestCommitJson = layout.cache.resolve("foliaLatestCommit.json");
|
||||
download.get().download("https://api.github.com/repos/PaperMC/Folia/commits/master", foliaLatestCommitJson);
|
||||
val foliaLatestCommit = gson.fromJson<paper.libs.com.google.gson.JsonObject>(foliaLatestCommitJson)["sha"].asString;
|
||||
|
||||
copy {
|
||||
from(file)
|
||||
into(tempDir)
|
||||
filter { line: String ->
|
||||
line.replace("purpurRef = .*".toRegex(), "purpurRef = $purpurLatestCommit")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
doLast {
|
||||
copy {
|
||||
from(tempDir.file("gradle.properties"))
|
||||
into(project.file(file).parent)
|
||||
copy {
|
||||
from(file)
|
||||
into(tempDir)
|
||||
filter { line: String ->
|
||||
line.replace("foliaRef = .*".toRegex(), "foliaRef = $foliaLatestCommit")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
doLast {
|
||||
copy {
|
||||
from(tempDir.file("gradle.properties"))
|
||||
into(project.file(file).parent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
group = dev.kaiijumc.kaiiju
|
||||
version = 1.19.3-R0.1-SNAPSHOT
|
||||
mcVersion = 1.19.3
|
||||
version = 1.20.1-R0.1-SNAPSHOT
|
||||
mcVersion = 1.20.1
|
||||
|
||||
purpurRef = 9e436f732aae7f826c9acd5134a2948190c08b79
|
||||
foliaRef = edafbcef6884cffe493e62cd71f4957708fba7ff
|
||||
|
||||
org.gradle.caching=true
|
||||
org.gradle.parallel=true
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,5 +1,6 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
|
||||
networkTimeout=10000
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
||||
288
gradlew
vendored
288
gradlew
vendored
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env sh
|
||||
#!/bin/sh
|
||||
|
||||
#
|
||||
# Copyright 2015 the original author or authors.
|
||||
# Copyright © 2015-2021 the original authors.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -17,67 +17,98 @@
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
##
|
||||
## Gradle start up script for UN*X
|
||||
##
|
||||
#
|
||||
# Gradle start up script for POSIX generated by Gradle.
|
||||
#
|
||||
# Important for running:
|
||||
#
|
||||
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||
# noncompliant, but you have some other compliant shell such as ksh or
|
||||
# bash, then to run this script, type that shell name before the whole
|
||||
# command line, like:
|
||||
#
|
||||
# ksh Gradle
|
||||
#
|
||||
# Busybox and similar reduced shells will NOT work, because this script
|
||||
# requires all of these POSIX shell features:
|
||||
# * functions;
|
||||
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||
# * compound commands having a testable exit status, especially «case»;
|
||||
# * various built-in commands including «command», «set», and «ulimit».
|
||||
#
|
||||
# Important for patching:
|
||||
#
|
||||
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||
#
|
||||
# The "traditional" practice of packing multiple parameters into a
|
||||
# space-separated string is a well documented source of bugs and security
|
||||
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||
# options in "$@", and eventually passing that to Java.
|
||||
#
|
||||
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||
# see the in-line comments for details.
|
||||
#
|
||||
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
#
|
||||
##############################################################################
|
||||
|
||||
# Attempt to set APP_HOME
|
||||
|
||||
# Resolve links: $0 may be a link
|
||||
PRG="$0"
|
||||
# Need this for relative symlinks.
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG=`dirname "$PRG"`"/$link"
|
||||
fi
|
||||
app_path=$0
|
||||
|
||||
# Need this for daisy-chained symlinks.
|
||||
while
|
||||
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||
[ -h "$app_path" ]
|
||||
do
|
||||
ls=$( ls -ld "$app_path" )
|
||||
link=${ls#*' -> '}
|
||||
case $link in #(
|
||||
/*) app_path=$link ;; #(
|
||||
*) app_path=$APP_HOME$link ;;
|
||||
esac
|
||||
done
|
||||
SAVED="`pwd`"
|
||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
||||
APP_HOME="`pwd -P`"
|
||||
cd "$SAVED" >/dev/null
|
||||
|
||||
APP_NAME="Gradle"
|
||||
APP_BASE_NAME=`basename "$0"`
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD="maximum"
|
||||
MAX_FD=maximum
|
||||
|
||||
warn () {
|
||||
echo "$*"
|
||||
}
|
||||
} >&2
|
||||
|
||||
die () {
|
||||
echo
|
||||
echo "$*"
|
||||
echo
|
||||
exit 1
|
||||
}
|
||||
} >&2
|
||||
|
||||
# OS specific support (must be 'true' or 'false').
|
||||
cygwin=false
|
||||
msys=false
|
||||
darwin=false
|
||||
nonstop=false
|
||||
case "`uname`" in
|
||||
CYGWIN* )
|
||||
cygwin=true
|
||||
;;
|
||||
Darwin* )
|
||||
darwin=true
|
||||
;;
|
||||
MINGW* )
|
||||
msys=true
|
||||
;;
|
||||
NONSTOP* )
|
||||
nonstop=true
|
||||
;;
|
||||
case "$( uname )" in #(
|
||||
CYGWIN* ) cygwin=true ;; #(
|
||||
Darwin* ) darwin=true ;; #(
|
||||
MSYS* | MINGW* ) msys=true ;; #(
|
||||
NONSTOP* ) nonstop=true ;;
|
||||
esac
|
||||
|
||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
@@ -87,9 +118,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
JAVACMD=$JAVA_HOME/bin/java
|
||||
fi
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||
@@ -98,7 +129,7 @@ Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD="java"
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
@@ -106,80 +137,109 @@ location of your Java installation."
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
||||
MAX_FD_LIMIT=`ulimit -H -n`
|
||||
if [ $? -eq 0 ] ; then
|
||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
||||
MAX_FD="$MAX_FD_LIMIT"
|
||||
fi
|
||||
ulimit -n $MAX_FD
|
||||
if [ $? -ne 0 ] ; then
|
||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
||||
fi
|
||||
else
|
||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
||||
fi
|
||||
fi
|
||||
|
||||
# For Darwin, add options to specify how the application appears in the dock
|
||||
if $darwin; then
|
||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
||||
fi
|
||||
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
||||
|
||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
||||
|
||||
# We build the pattern for arguments to be converted via cygpath
|
||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
||||
SEP=""
|
||||
for dir in $ROOTDIRSRAW ; do
|
||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
||||
SEP="|"
|
||||
done
|
||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
||||
# Add a user-defined pattern to the cygpath arguments
|
||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
||||
fi
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
i=0
|
||||
for arg in "$@" ; do
|
||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
||||
|
||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
||||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=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=SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
fi
|
||||
|
||||
# Escape application args
|
||||
save () {
|
||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=`save "$@"`
|
||||
# Collect all arguments for the java command, stacking in reverse order:
|
||||
# * args from the command line
|
||||
# * the main class name
|
||||
# * -classpath
|
||||
# * -D...appname settings
|
||||
# * --module-path (only if needed)
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||
if "$cygwin" || "$msys" ; then
|
||||
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||
|
||||
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||
|
||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||
for arg do
|
||||
if
|
||||
case $arg in #(
|
||||
-*) false ;; # don't mess with options #(
|
||||
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||
[ -e "$t" ] ;; #(
|
||||
*) false ;;
|
||||
esac
|
||||
then
|
||||
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||
fi
|
||||
# Roll the args list around exactly as many times as the number of
|
||||
# args, so each arg winds up back in the position where it started, but
|
||||
# possibly modified.
|
||||
#
|
||||
# NB: a `for` loop captures its iteration list before it begins, so
|
||||
# changing the positional parameters here affects neither the number of
|
||||
# iterations, nor the values presented in `arg`.
|
||||
shift # remove old arg
|
||||
set -- "$@" "$arg" # push replacement arg
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# 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 $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
-classpath "$CLASSPATH" \
|
||||
org.gradle.wrapper.GradleWrapperMain \
|
||||
"$@"
|
||||
|
||||
# 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" "$@"
|
||||
|
||||
15
gradlew.bat
vendored
15
gradlew.bat
vendored
@@ -14,7 +14,7 @@
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%" == "" @echo off
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
@rem
|
||||
@rem Gradle startup script for Windows
|
||||
@@ -25,7 +25,8 @@
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%" == "" set DIRNAME=.
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@rem This is normally unused
|
||||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
||||
|
||||
set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if "%ERRORLEVEL%" == "0" goto execute
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
||||
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!
|
||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
||||
exit /b 1
|
||||
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
|
||||
|
||||
@@ -5,12 +5,12 @@ Subject: [PATCH] Kaiiju Configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java
|
||||
index e0f69edf603c2ec99bc92b16b18912272cc41bd9..b2c8c18437537eb2ea91bdeb9f715e01a182fbcb 100644
|
||||
index b6a8217b97842cd07af24fadb21e0e44226e5bb9..ce7dcbc0709839457df357484620f21c3d7c19c5 100644
|
||||
--- a/src/main/java/org/bukkit/Server.java
|
||||
+++ b/src/main/java/org/bukkit/Server.java
|
||||
@@ -1983,6 +1983,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
||||
@@ -2121,6 +2121,13 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi
|
||||
}
|
||||
// Purpur end
|
||||
// Paper end
|
||||
|
||||
+ // Kaiiju start
|
||||
+ @NotNull
|
||||
|
||||
18
patches/removed/0016-Fix-off-thread-raid-winners.patch
Normal file
18
patches/removed/0016-Fix-off-thread-raid-winners.patch
Normal file
@@ -0,0 +1,18 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Tue, 9 May 2023 15:11:56 +0300
|
||||
Subject: [PATCH] Fix off thread raid winners
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/raid/Raid.java b/src/main/java/net/minecraft/world/entity/raid/Raid.java
|
||||
index 359f1690497eac00899eb26c17308e0a6fe943ad..3cc320e854cbb9e70b6c63f1f950091c5195edae 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/raid/Raid.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/raid/Raid.java
|
||||
@@ -404,6 +404,7 @@ public class Raid {
|
||||
UUID uuid = (UUID) iterator.next();
|
||||
Entity entity = this.level.getEntity(uuid);
|
||||
|
||||
+ if (!io.papermc.paper.util.TickThread.isTickThreadFor(entity)) continue; // Kaiiju - Prevent give effect to player off thread
|
||||
if (entity instanceof LivingEntity && !entity.isSpectator()) {
|
||||
LivingEntity entityliving = (LivingEntity) entity;
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Wed, 10 May 2023 16:30:38 +0300
|
||||
Subject: [PATCH] Strip raytracing for EntityLiving#hasLineOfSight
|
||||
|
||||
This has been benchmarked on a huge gold farm.
|
||||
Resulting in significative performance improvements.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
index f636bdf1075fa784ce7ee25478d4d94bacb05677..2da522f89a7c44208ca1ba9139efe723a519fabc 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -3661,7 +3661,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||
Vec3 vec3d1 = new Vec3(entity.getX(), entity.getEyeY(), entity.getZ());
|
||||
|
||||
// Paper - diff on change - used in CraftLivingEntity#hasLineOfSight(Location) and CraftWorld#lineOfSightExists
|
||||
- return vec3d1.distanceToSqr(vec3d) > 128D * 128D ? false : this.level().clip(new ClipContext(vec3d, vec3d1, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, this)).getType() == HitResult.Type.MISS;
|
||||
+ return !(vec3d1.distanceToSqr(vec3d) > 128D * 128D) && this.level().rayTraceDirect(vec3d, vec3d1, net.minecraft.world.phys.shapes.CollisionContext.of(this)) == net.minecraft.world.phys.BlockHitResult.Type.MISS; // Paper - use distanceToSqr // Kaiiju - Pufferfish - Strip raytracing
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/BlockGetter.java b/src/main/java/net/minecraft/world/level/BlockGetter.java
|
||||
index 0e8746759752b692668886370181aa5db1fd0bb0..5e2f5e9c21009a71f671955df7a4135ce5cf5b08 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/BlockGetter.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/BlockGetter.java
|
||||
@@ -68,6 +68,17 @@ public interface BlockGetter extends LevelHeightAccessor {
|
||||
});
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Pufferfish - broken down variant of below rayTraceBlock, used by World#rayTraceDirect
|
||||
+ @Nullable
|
||||
+ default net.minecraft.world.phys.BlockHitResult.Type rayTraceBlockDirect(Vec3 vec3d, Vec3 vec3d1, BlockPos blockposition, BlockState iblockdata, net.minecraft.world.phys.shapes.CollisionContext voxelshapecoll) {
|
||||
+ if (iblockdata.isAir()) return null;
|
||||
+ VoxelShape voxelshape = ClipContext.Block.COLLIDER.get(iblockdata, this, blockposition, voxelshapecoll);
|
||||
+ net.minecraft.world.phys.BlockHitResult movingobjectpositionblock = this.clipWithInteractionOverride(vec3d, vec3d1, blockposition, voxelshape, iblockdata);
|
||||
+
|
||||
+ return movingobjectpositionblock == null ? null : movingobjectpositionblock.getType();
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
// CraftBukkit start - moved block handling into separate method for use by Block#rayTrace
|
||||
default BlockHitResult clip(ClipContext raytrace1, BlockPos blockposition) {
|
||||
// Paper start - Prevent raytrace from loading chunks
|
||||
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
||||
index fb71843793e699b2ccfaa3b7e4c2bb7d4826a706..42727a50ae11cd4d4aa65eb57638bfb164f1e4ac 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/Level.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
||||
@@ -432,6 +432,91 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
return null;
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Pufferfish - broken down method of raytracing for EntityLiving#hasLineOfSight, replaces IBlockAccess#rayTrace(RayTrace)
|
||||
+ public net.minecraft.world.phys.BlockHitResult.Type rayTraceDirect(net.minecraft.world.phys.Vec3 vec3d, net.minecraft.world.phys.Vec3 vec3d1, net.minecraft.world.phys.shapes.CollisionContext voxelshapecoll) {
|
||||
+ // most of this code comes from IBlockAccess#a(RayTrace, BiFunction, Function), but removes the needless functions
|
||||
+ if (vec3d.equals(vec3d1)) {
|
||||
+ return net.minecraft.world.phys.BlockHitResult.Type.MISS;
|
||||
+ }
|
||||
+
|
||||
+ double endX = Mth.lerp(-1.0E-7D, vec3d1.x, vec3d.x);
|
||||
+ double endY = Mth.lerp(-1.0E-7D, vec3d1.y, vec3d.y);
|
||||
+ double endZ = Mth.lerp(-1.0E-7D, vec3d1.z, vec3d.z);
|
||||
+
|
||||
+ double startX = Mth.lerp(-1.0E-7D, vec3d.x, vec3d1.x);
|
||||
+ double startY = Mth.lerp(-1.0E-7D, vec3d.y, vec3d1.y);
|
||||
+ double startZ = Mth.lerp(-1.0E-7D, vec3d.z, vec3d1.z);
|
||||
+
|
||||
+ int currentX = Mth.floor(startX);
|
||||
+ int currentY = Mth.floor(startY);
|
||||
+ int currentZ = Mth.floor(startZ);
|
||||
+
|
||||
+ BlockPos.MutableBlockPos currentBlock = new BlockPos.MutableBlockPos(currentX, currentY, currentZ);
|
||||
+
|
||||
+ LevelChunk chunk = this.getChunkIfLoaded(currentBlock);
|
||||
+ if (chunk == null) {
|
||||
+ return net.minecraft.world.phys.BlockHitResult.Type.MISS;
|
||||
+ }
|
||||
+
|
||||
+ net.minecraft.world.phys.BlockHitResult.Type initialCheck = this.rayTraceBlockDirect(vec3d, vec3d1, currentBlock, chunk.getBlockState(currentBlock), voxelshapecoll);
|
||||
+
|
||||
+ if (initialCheck != null) {
|
||||
+ return initialCheck;
|
||||
+ }
|
||||
+
|
||||
+ double diffX = endX - startX;
|
||||
+ double diffY = endY - startY;
|
||||
+ double diffZ = endZ - startZ;
|
||||
+
|
||||
+ int xDirection = Mth.sign(diffX);
|
||||
+ int yDirection = Mth.sign(diffY);
|
||||
+ int zDirection = Mth.sign(diffZ);
|
||||
+
|
||||
+ double normalizedX = xDirection == 0 ? Double.MAX_VALUE : (double) xDirection / diffX;
|
||||
+ double normalizedY = yDirection == 0 ? Double.MAX_VALUE : (double) yDirection / diffY;
|
||||
+ double normalizedZ = zDirection == 0 ? Double.MAX_VALUE : (double) zDirection / diffZ;
|
||||
+
|
||||
+ double normalizedXDirection = normalizedX * (xDirection > 0 ? 1.0D - Mth.frac(startX) : Mth.frac(startX));
|
||||
+ double normalizedYDirection = normalizedY * (yDirection > 0 ? 1.0D - Mth.frac(startY) : Mth.frac(startY));
|
||||
+ double normalizedZDirection = normalizedZ * (zDirection > 0 ? 1.0D - Mth.frac(startZ) : Mth.frac(startZ));
|
||||
+
|
||||
+ net.minecraft.world.phys.BlockHitResult.Type result;
|
||||
+
|
||||
+ do {
|
||||
+ if (normalizedXDirection > 1.0D && normalizedYDirection > 1.0D && normalizedZDirection > 1.0D) {
|
||||
+ return net.minecraft.world.phys.BlockHitResult.Type.MISS;
|
||||
+ }
|
||||
+
|
||||
+ if (normalizedXDirection < normalizedYDirection) {
|
||||
+ if (normalizedXDirection < normalizedZDirection) {
|
||||
+ currentX += xDirection;
|
||||
+ normalizedXDirection += normalizedX;
|
||||
+ } else {
|
||||
+ currentZ += zDirection;
|
||||
+ normalizedZDirection += normalizedZ;
|
||||
+ }
|
||||
+ } else if (normalizedYDirection < normalizedZDirection) {
|
||||
+ currentY += yDirection;
|
||||
+ normalizedYDirection += normalizedY;
|
||||
+ } else {
|
||||
+ currentZ += zDirection;
|
||||
+ normalizedZDirection += normalizedZ;
|
||||
+ }
|
||||
+
|
||||
+ currentBlock.set(currentX, currentY, currentZ);
|
||||
+ if (chunk.getPos().x != currentBlock.getX() >> 4 || chunk.getPos().z != currentBlock.getZ() >> 4) {
|
||||
+ chunk = this.getChunkIfLoaded(currentBlock);
|
||||
+ if (chunk == null) {
|
||||
+ return net.minecraft.world.phys.BlockHitResult.Type.MISS;
|
||||
+ }
|
||||
+ }
|
||||
+ result = this.rayTraceBlockDirect(vec3d, vec3d1, currentBlock, chunk.getBlockState(currentBlock), voxelshapecoll);
|
||||
+ } while (result == null);
|
||||
+
|
||||
+ return result;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
public boolean isInWorldBounds(BlockPos pos) {
|
||||
return pos.isInsideBuildHeightAndWorldBoundsHorizontal(this); // Paper - use better/optimized check
|
||||
}
|
||||
20
patches/removed/0018-Fix-off-thread-spider-addEffect.patch
Normal file
20
patches/removed/0018-Fix-off-thread-spider-addEffect.patch
Normal file
@@ -0,0 +1,20 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Wed, 10 May 2023 17:58:37 +0300
|
||||
Subject: [PATCH] Fix off thread spider addEffect
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/monster/Spider.java b/src/main/java/net/minecraft/world/entity/monster/Spider.java
|
||||
index 05432184077752b1d0cb764a5e39ed875748b2d6..74a68ae68e3c774a63d0a5478dfcda6e7894a514 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/monster/Spider.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/monster/Spider.java
|
||||
@@ -180,7 +180,9 @@ public class Spider extends Monster {
|
||||
MobEffect mobeffectlist = entityspider_groupdataspider.effect;
|
||||
|
||||
if (mobeffectlist != null) {
|
||||
+ this.getBukkitEntity().taskScheduler.schedule(task -> { // Kaiiju - Fix off thread spider add effect
|
||||
this.addEffect(new MobEffectInstance(mobeffectlist, -1), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.SPIDER_SPAWN); // CraftBukkit
|
||||
+ }, null, 1); // Kaiiju - Fix off thread spider add effect
|
||||
}
|
||||
}
|
||||
|
||||
18
patches/removed/0032-Fix-visual-respawn-issue.patch
Normal file
18
patches/removed/0032-Fix-visual-respawn-issue.patch
Normal file
@@ -0,0 +1,18 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Wed, 21 Jun 2023 04:15:44 +0300
|
||||
Subject: [PATCH] Fix visual respawn issue
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
index 10c7f5c6fc0e5cb8aafbe125dd68635a37b7b1b9..6f589e7e4bbed0b2fa87403c86f18d36672cf1d0 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -633,6 +633,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
|
||||
++this.deathTime;
|
||||
if (this.deathTime >= 20 && !this.level().isClientSide() && !this.isRemoved() && !this.broadcastedDeath) { // Folia - region threading
|
||||
this.level().broadcastEntityEvent(this, (byte) 60);
|
||||
+ this.broadcastedDeath = true; // Kaiiju - Fix respawn issue / Visual bug
|
||||
if (!(this instanceof ServerPlayer)) this.remove(Entity.RemovalReason.KILLED); // Folia - region threading - don't remove, we want the tick scheduler to be running
|
||||
if ((this instanceof ServerPlayer)) this.unRide(); // Folia - region threading - unmount player when dead
|
||||
}
|
||||
19
patches/removed/0039-Fix-teleportAsync-rotation-API.patch
Normal file
19
patches/removed/0039-Fix-teleportAsync-rotation-API.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: kugge <sofiane.djerbi38@gmail.com>
|
||||
Date: Thu, 22 Jun 2023 20:32:58 +0200
|
||||
Subject: [PATCH] Fix teleportAsync rotation API
|
||||
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
||||
index 76bcfda336e9cfa039d80ea3ccbebbc3d2b13f7f..24617b3994c0f148f1c17928e18aa1e1a784e6f5 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
|
||||
@@ -1329,7 +1329,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
||||
boolean success = nmsEntity.teleportAsync(
|
||||
((CraftWorld)locationClone.getWorld()).getHandle(),
|
||||
new net.minecraft.world.phys.Vec3(locationClone.getX(), locationClone.getY(), locationClone.getZ()),
|
||||
- null, null, net.minecraft.world.phys.Vec3.ZERO,
|
||||
+ locationClone.getYaw(), locationClone.getPitch(), net.minecraft.world.phys.Vec3.ZERO, // Kaiiju - fix teleportAsync() rotation
|
||||
cause == null ? TeleportCause.UNKNOWN : cause,
|
||||
Entity.TELEPORT_FLAG_LOAD_CHUNK | Entity.TELEPORT_FLAG_UNMOUNT, // preserve behavior with old API: dismount the entity so it can teleport
|
||||
(Entity entityTp) -> {
|
||||
@@ -0,0 +1,458 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Sauve <paul@technove.co>
|
||||
Date: Tue, 1 Aug 2023 03:38:09 +0200
|
||||
Subject: [PATCH] Improve container checking with a bitset
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/structs/ItemListWithBitset.java b/src/main/java/dev/kaiijumc/kaiiju/structs/ItemListWithBitset.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..ee32b7c4a1ae1e23149694ecba5ab7bd347d6ca6
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/structs/ItemListWithBitset.java
|
||||
@@ -0,0 +1,114 @@
|
||||
+package dev.kaiijumc.kaiiju.structs;
|
||||
+
|
||||
+
|
||||
+import net.minecraft.core.NonNullList;
|
||||
+import net.minecraft.world.item.ItemStack;
|
||||
+import org.apache.commons.lang.Validate;
|
||||
+import org.jetbrains.annotations.NotNull;
|
||||
+
|
||||
+import java.util.AbstractList;
|
||||
+import java.util.Arrays;
|
||||
+import java.util.List;
|
||||
+
|
||||
+public class ItemListWithBitset extends AbstractList<ItemStack> {
|
||||
+ public static ItemListWithBitset fromList(List<ItemStack> list) {
|
||||
+ if (list instanceof ItemListWithBitset ours) {
|
||||
+ return ours;
|
||||
+ }
|
||||
+ return new ItemListWithBitset(list);
|
||||
+ }
|
||||
+
|
||||
+ private static ItemStack[] createArray(int size) {
|
||||
+ ItemStack[] array = new ItemStack[size];
|
||||
+ Arrays.fill(array, ItemStack.EMPTY);
|
||||
+ return array;
|
||||
+ }
|
||||
+
|
||||
+ private final ItemStack[] items;
|
||||
+
|
||||
+ private long bitSet = 0;
|
||||
+ private final long allBits;
|
||||
+
|
||||
+ private static class OurNonNullList extends NonNullList<ItemStack> {
|
||||
+ protected OurNonNullList(List<ItemStack> delegate) {
|
||||
+ super(delegate, ItemStack.EMPTY);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public final NonNullList<ItemStack> nonNullList = new OurNonNullList(this);
|
||||
+
|
||||
+ private ItemListWithBitset(List<ItemStack> list) {
|
||||
+ this(list.size());
|
||||
+
|
||||
+ for (int i = 0; i < list.size(); i++) {
|
||||
+ this.set(i, list.get(i));
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public ItemListWithBitset(int size) {
|
||||
+ Validate.isTrue(size < Long.BYTES * 8, "size is too large");
|
||||
+
|
||||
+ this.items = createArray(size);
|
||||
+ this.allBits = ((1L << size) - 1);
|
||||
+ }
|
||||
+
|
||||
+ public boolean isCompletelyEmpty() {
|
||||
+ return this.bitSet == 0;
|
||||
+ }
|
||||
+
|
||||
+ public boolean hasFullStacks() {
|
||||
+ return (this.bitSet & this.allBits) == allBits;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public ItemStack set(int index, @NotNull ItemStack itemStack) {
|
||||
+ ItemStack existing = this.items[index];
|
||||
+
|
||||
+ this.items[index] = itemStack;
|
||||
+
|
||||
+ if (itemStack == ItemStack.EMPTY) {
|
||||
+ this.bitSet &= ~(1L << index);
|
||||
+ } else {
|
||||
+ this.bitSet |= 1L << index;
|
||||
+ }
|
||||
+
|
||||
+ return existing;
|
||||
+ }
|
||||
+
|
||||
+ @NotNull
|
||||
+ @Override
|
||||
+ public ItemStack get(int var0) {
|
||||
+ return this.items[var0];
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public int size() {
|
||||
+ return this.items.length;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public void clear() {
|
||||
+ Arrays.fill(this.items, ItemStack.EMPTY);
|
||||
+ }
|
||||
+
|
||||
+ // these are unsupported for block inventories which have a static size
|
||||
+ @Override
|
||||
+ public void add(int var0, ItemStack var1) {
|
||||
+ throw new UnsupportedOperationException();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public ItemStack remove(int var0) {
|
||||
+ throw new UnsupportedOperationException();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public String toString() {
|
||||
+ return "ItemListWithBitset{" +
|
||||
+ "items=" + Arrays.toString(items) +
|
||||
+ ", bitSet=" + Long.toString(bitSet, 2) +
|
||||
+ ", allBits=" + Long.toString(allBits, 2) +
|
||||
+ ", size=" + this.items.length +
|
||||
+ '}';
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/net/minecraft/world/CompoundContainer.java b/src/main/java/net/minecraft/world/CompoundContainer.java
|
||||
index 241fec02e6869c638d3a160819b32173a081467b..62848ca68f532fa14241320df76d180c13072c34 100644
|
||||
--- a/src/main/java/net/minecraft/world/CompoundContainer.java
|
||||
+++ b/src/main/java/net/minecraft/world/CompoundContainer.java
|
||||
@@ -64,6 +64,23 @@ public class CompoundContainer implements Container {
|
||||
this.container2 = second;
|
||||
}
|
||||
|
||||
+ // Kaiiju start - airplane - improve container checking with a bitset
|
||||
+ @Override
|
||||
+ public boolean hasEmptySlot(net.minecraft.core.Direction enumdirection) {
|
||||
+ return this.container1.hasEmptySlot(null) || this.container2.hasEmptySlot(null);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCompletelyFull(net.minecraft.core.Direction enumdirection) {
|
||||
+ return this.container1.isCompletelyFull(null) && this.container2.isCompletelyFull(null);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCompletelyEmpty(net.minecraft.core.Direction enumdirection) {
|
||||
+ return this.container1.isCompletelyEmpty(null) && this.container2.isCompletelyEmpty(null);
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
@Override
|
||||
public int getContainerSize() {
|
||||
return this.container1.getContainerSize() + this.container2.getContainerSize();
|
||||
diff --git a/src/main/java/net/minecraft/world/Container.java b/src/main/java/net/minecraft/world/Container.java
|
||||
index 04b1531572e8fff1e46fe1c94e7fc863841e0f66..ac1e21a4fc210424ea57c247d03914c54129de9c 100644
|
||||
--- a/src/main/java/net/minecraft/world/Container.java
|
||||
+++ b/src/main/java/net/minecraft/world/Container.java
|
||||
@@ -13,6 +13,63 @@ import org.bukkit.craftbukkit.entity.CraftHumanEntity;
|
||||
// CraftBukkit end
|
||||
|
||||
public interface Container extends Clearable {
|
||||
+ // Kaiiju start - airplane - allow the inventory to override and optimize these frequent calls
|
||||
+ default boolean hasEmptySlot(@org.jetbrains.annotations.Nullable net.minecraft.core.Direction enumdirection) { // there is a slot with 0 items in it
|
||||
+ if (this instanceof WorldlyContainer worldlyContainer) {
|
||||
+ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) {
|
||||
+ if (this.getItem(i).isEmpty()) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ int size = this.getContainerSize();
|
||||
+ for (int i = 0; i < size; i++) {
|
||||
+ if (this.getItem(i).isEmpty()) {
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ default boolean isCompletelyFull(@org.jetbrains.annotations.Nullable net.minecraft.core.Direction enumdirection) { // every stack is maxed
|
||||
+ if (this instanceof WorldlyContainer worldlyContainer) {
|
||||
+ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) {
|
||||
+ ItemStack itemStack = this.getItem(i);
|
||||
+ if (itemStack.getCount() < itemStack.getMaxStackSize()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ int size = this.getContainerSize();
|
||||
+ for (int i = 0; i < size; i++) {
|
||||
+ ItemStack itemStack = this.getItem(i);
|
||||
+ if (itemStack.getCount() < itemStack.getMaxStackSize()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ default boolean isCompletelyEmpty(@org.jetbrains.annotations.Nullable net.minecraft.core.Direction enumdirection) {
|
||||
+ if (this instanceof WorldlyContainer worldlyContainer) {
|
||||
+ for (int i : worldlyContainer.getSlotsForFace(enumdirection)) {
|
||||
+ if (!this.getItem(i).isEmpty()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ } else {
|
||||
+ int size = this.getContainerSize();
|
||||
+ for (int i = 0; i < size; i++) {
|
||||
+ if (!this.getItem(i).isEmpty()) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return true;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
|
||||
int LARGE_MAX_STACK_SIZE = 64;
|
||||
int DEFAULT_DISTANCE_LIMIT = 8;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java
|
||||
index 272095d7a09ab41227d741172735f66fd2798ce1..1f2e2d7726abd63bb46697697c91696387c819a2 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecartContainer.java
|
||||
@@ -28,6 +28,7 @@ import org.bukkit.inventory.InventoryHolder;
|
||||
public abstract class AbstractMinecartContainer extends AbstractMinecart implements ContainerEntity {
|
||||
|
||||
private NonNullList<ItemStack> itemStacks;
|
||||
+ private dev.kaiijumc.kaiiju.structs.ItemListWithBitset itemStacksOptimized; // Kaiiju - airplane - implement ItemListWithBitset
|
||||
@Nullable
|
||||
public ResourceLocation lootTable;
|
||||
public long lootTableSeed;
|
||||
@@ -89,12 +90,18 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme
|
||||
|
||||
protected AbstractMinecartContainer(EntityType<?> type, Level world) {
|
||||
super(type, world);
|
||||
- this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.itemStacksOptimized = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513
|
||||
+ this.itemStacks = this.itemStacksOptimized.nonNullList;
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
protected AbstractMinecartContainer(EntityType<?> type, double x, double y, double z, Level world) {
|
||||
super(type, world, x, y, z);
|
||||
- this.itemStacks = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY); // CraftBukkit - SPIGOT-3513
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.itemStacksOptimized = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513
|
||||
+ this.itemStacks = this.itemStacksOptimized.nonNullList;
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -156,6 +163,10 @@ public abstract class AbstractMinecartContainer extends AbstractMinecart impleme
|
||||
protected void readAdditionalSaveData(CompoundTag nbt) {
|
||||
super.readAdditionalSaveData(nbt);
|
||||
this.lootableData.loadNbt(nbt); // Paper
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.itemStacksOptimized = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(this.getContainerSize()); // CraftBukkit - SPIGOT-3513
|
||||
+ this.itemStacks = this.itemStacksOptimized.nonNullList;
|
||||
+ // Kaiiju end
|
||||
this.readChestVehicleSaveData(nbt);
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java
|
||||
index a71414397bd45ee7bcacfeef0041d80dfa25f114..67f69540e6c217070f8d2af8908d4eb6f2b5c1c1 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/ChestBlockEntity.java
|
||||
@@ -31,6 +31,7 @@ import org.bukkit.entity.HumanEntity;
|
||||
public class ChestBlockEntity extends RandomizableContainerBlockEntity implements LidBlockEntity {
|
||||
|
||||
private static final int EVENT_SET_OPEN_COUNT = 1;
|
||||
+ private dev.kaiijumc.kaiiju.structs.ItemListWithBitset optimizedItems; // Kaiiju - airplane - implement ItemListWithBitset
|
||||
private NonNullList<ItemStack> items;
|
||||
public final ContainerOpenersCounter openersCounter;
|
||||
private final ChestLidController chestLidController;
|
||||
@@ -65,9 +66,14 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement
|
||||
}
|
||||
// CraftBukkit end
|
||||
|
||||
+ private final boolean isNative = getClass().equals(ChestBlockEntity.class); // Kaiiju - airplane
|
||||
+
|
||||
protected ChestBlockEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
|
||||
super(type, pos, state);
|
||||
- this.items = NonNullList.withSize(27, ItemStack.EMPTY);
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.optimizedItems = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(27);
|
||||
+ this.items = this.optimizedItems.nonNullList;
|
||||
+ // Kaiiju end
|
||||
this.openersCounter = new ContainerOpenersCounter() {
|
||||
@Override
|
||||
protected void onOpen(Level world, BlockPos pos, BlockState state) {
|
||||
@@ -98,6 +104,23 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement
|
||||
this.chestLidController = new ChestLidController();
|
||||
}
|
||||
|
||||
+ // Kaiiju start - airplane - improve container checking with a bitset
|
||||
+ @Override
|
||||
+ public boolean hasEmptySlot(Direction enumdirection) {
|
||||
+ return isNative ? !this.optimizedItems.hasFullStacks() : super.hasEmptySlot(enumdirection);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCompletelyFull(Direction enumdirection) {
|
||||
+ return isNative ? this.optimizedItems.hasFullStacks() && super.isCompletelyFull(enumdirection) : super.isCompletelyFull(enumdirection);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCompletelyEmpty(Direction enumdirection) {
|
||||
+ return isNative && this.optimizedItems.isCompletelyEmpty() || super.isCompletelyEmpty(enumdirection);
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
public ChestBlockEntity(BlockPos pos, BlockState state) {
|
||||
this(BlockEntityType.CHEST, pos, state);
|
||||
}
|
||||
@@ -115,7 +138,10 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement
|
||||
@Override
|
||||
public void load(CompoundTag nbt) {
|
||||
super.load(nbt);
|
||||
- this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.optimizedItems = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(this.getContainerSize());
|
||||
+ this.items = this.optimizedItems.nonNullList;
|
||||
+ // Kaiiju end
|
||||
if (!this.tryLoadLootTable(nbt)) {
|
||||
ContainerHelper.loadAllItems(nbt, this.items);
|
||||
}
|
||||
@@ -187,7 +213,10 @@ public class ChestBlockEntity extends RandomizableContainerBlockEntity implement
|
||||
|
||||
@Override
|
||||
protected void setItems(NonNullList<ItemStack> list) {
|
||||
- this.items = list;
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.optimizedItems = dev.kaiijumc.kaiiju.structs.ItemListWithBitset.fromList(list);
|
||||
+ this.items = this.optimizedItems.nonNullList;
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||
index 8781a7cebf66007158286f265e2adbaf40c1d2ff..6d55a6687060bdb6b2286e294d09ef0093b1625e 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||
@@ -48,6 +48,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
public static final int MOVE_ITEM_SPEED = 8;
|
||||
public static final int HOPPER_CONTAINER_SIZE = 5;
|
||||
private NonNullList<ItemStack> items;
|
||||
+ private dev.kaiijumc.kaiiju.structs.ItemListWithBitset optimizedItems; // Kaiiju - airplane - implement ItemListWithBitset
|
||||
private int cooldownTime;
|
||||
private long tickedGameTime;
|
||||
|
||||
@@ -83,14 +84,37 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
|
||||
public HopperBlockEntity(BlockPos pos, BlockState state) {
|
||||
super(BlockEntityType.HOPPER, pos, state);
|
||||
- this.items = NonNullList.withSize(5, ItemStack.EMPTY);
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.optimizedItems = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(5);
|
||||
+ this.items = this.optimizedItems.nonNullList;
|
||||
+ // Kaiiju end
|
||||
this.cooldownTime = -1;
|
||||
}
|
||||
|
||||
+ // Kaiiju start - airplane - improve container checking with a bitset
|
||||
+ @Override
|
||||
+ public boolean hasEmptySlot(Direction enumdirection) {
|
||||
+ return !this.optimizedItems.hasFullStacks();
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCompletelyFull(Direction enumdirection) {
|
||||
+ return this.optimizedItems.hasFullStacks() && super.isCompletelyFull(enumdirection);
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCompletelyEmpty(Direction enumdirection) {
|
||||
+ return this.optimizedItems.isCompletelyEmpty() || super.isCompletelyEmpty(enumdirection);
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
@Override
|
||||
public void load(CompoundTag nbt) {
|
||||
super.load(nbt);
|
||||
- this.items = NonNullList.withSize(this.getContainerSize(), ItemStack.EMPTY);
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.optimizedItems = new dev.kaiijumc.kaiiju.structs.ItemListWithBitset(this.getContainerSize());
|
||||
+ this.items = this.optimizedItems.nonNullList;
|
||||
+ // Kaiiju end
|
||||
if (!this.tryLoadLootTable(nbt)) {
|
||||
ContainerHelper.loadAllItems(nbt, this.items);
|
||||
}
|
||||
@@ -162,7 +186,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
flag = HopperBlockEntity.ejectItems(world, pos, state, (Container) blockEntity, blockEntity); // CraftBukkit
|
||||
}
|
||||
|
||||
- if (!blockEntity.inventoryFull()) {
|
||||
+ if (!blockEntity.optimizedItems.hasFullStacks() || !blockEntity.inventoryFull()) { // Kaiiju - airplane
|
||||
flag |= booleansupplier.getAsBoolean();
|
||||
}
|
||||
|
||||
@@ -456,11 +480,11 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
}
|
||||
|
||||
private static boolean isFullContainer(Container inventory, Direction direction) {
|
||||
- return allMatch(inventory, direction, STACK_SIZE_TEST); // Paper - no streams
|
||||
+ return inventory.isCompletelyFull(direction); // Kaiiju - airplane - use bitsets
|
||||
}
|
||||
|
||||
private static boolean isEmptyContainer(Container inv, Direction facing) {
|
||||
- return allMatch(inv, facing, IS_EMPTY_TEST);
|
||||
+ return inv.isCompletelyEmpty(facing); // Kaiiju - airplane - use bitsets
|
||||
}
|
||||
|
||||
public static boolean suckInItems(Level world, Hopper hopper) {
|
||||
@@ -650,7 +674,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
|
||||
if (HopperBlockEntity.canPlaceItemInContainer(to, stack, slot, side)) {
|
||||
boolean flag = false;
|
||||
- boolean flag1 = to.isEmpty();
|
||||
+ boolean flag1 = to.isCompletelyEmpty(side); // Kaiiju - airplane - use bitsets
|
||||
|
||||
if (itemstack1.isEmpty()) {
|
||||
// Spigot start - SPIGOT-6693, InventorySubcontainer#setItem
|
||||
@@ -845,7 +869,10 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
|
||||
@Override
|
||||
protected void setItems(NonNullList<ItemStack> list) {
|
||||
- this.items = list;
|
||||
+ // Kaiiju start - airplane - use ItemListWithBitset
|
||||
+ this.optimizedItems = dev.kaiijumc.kaiiju.structs.ItemListWithBitset.fromList(list);
|
||||
+ this.items = this.optimizedItems.nonNullList;
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
public static void entityInside(Level world, BlockPos pos, BlockState state, Entity entity, HopperBlockEntity blockEntity) {
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java
|
||||
index 081691f9710ff1115e4308f79ed49fbc38941193..648e28c5fba5c62e65f83fbb5ebc8836ffb166a9 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity.java
|
||||
@@ -95,14 +95,7 @@ public abstract class RandomizableContainerBlockEntity extends BaseContainerBloc
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
this.unpackLootTable((Player)null);
|
||||
- // Paper start
|
||||
- for (final ItemStack itemStack : this.getItems()) {
|
||||
- if (!itemStack.isEmpty()) {
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
- return true;
|
||||
- // Paper end
|
||||
+ return this.isCompletelyEmpty(null); // Kaiiju - airplane - use super
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1,775 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 10 Feb 2023 02:58:46 +0200
|
||||
Subject: [PATCH] Kaiiju Rebranding
|
||||
|
||||
|
||||
diff --git a/build.gradle.kts b/build.gradle.kts
|
||||
index f25c0557cf984b97e0ab361f579eccbf46f82170..7f1f4988a25a5ebac36c25c045c51eefecab6862 100644
|
||||
--- a/build.gradle.kts
|
||||
+++ b/build.gradle.kts
|
||||
@@ -7,7 +7,7 @@ plugins {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
- implementation(project(":purpur-api")) // Purpur
|
||||
+ implementation(project(":kaiiju-api")) // Purpur // Kaiiju
|
||||
// Pufferfish start
|
||||
implementation("io.papermc.paper:paper-mojangapi:1.19.3-R0.1-SNAPSHOT") {
|
||||
exclude("io.papermc.paper", "paper-api")
|
||||
@@ -84,7 +84,7 @@ tasks.jar {
|
||||
attributes(
|
||||
"Main-Class" to "org.bukkit.craftbukkit.Main",
|
||||
"Implementation-Title" to "CraftBukkit",
|
||||
- "Implementation-Version" to "git-Purpur-$implementationVersion", // Purpur
|
||||
+ "Implementation-Version" to "git-Kaiiju-$implementationVersion", // Purpur // Kaiiju
|
||||
"Implementation-Vendor" to date, // Paper
|
||||
"Specification-Title" to "Bukkit",
|
||||
"Specification-Version" to project.version,
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java
|
||||
index 9713263c3bd34ab8a3bfc0a8797ba0b1b88ed733..0b95cd5305e4559d6dca59011869e5b203d51576 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/Metrics.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/Metrics.java
|
||||
@@ -593,7 +593,7 @@ public class Metrics {
|
||||
boolean logFailedRequests = config.getBoolean("logFailedRequests", false);
|
||||
// Only start Metrics, if it's enabled in the config
|
||||
if (config.getBoolean("enabled", true)) {
|
||||
- Metrics metrics = new Metrics("Purpur", serverUUID, logFailedRequests, Bukkit.getLogger()); // Purpur
|
||||
+ Metrics metrics = new Metrics("Kaiiju", serverUUID, logFailedRequests, Bukkit.getLogger()); // Purpur // Kaiiju
|
||||
|
||||
metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> {
|
||||
String minecraftVersion = Bukkit.getVersion();
|
||||
@@ -603,7 +603,7 @@ public class Metrics {
|
||||
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("players", () -> Bukkit.getOnlinePlayers().size()));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("online_mode", () -> Bukkit.getOnlineMode() ? "online" : (io.papermc.paper.configuration.GlobalConfiguration.get().proxies.isProxyOnlineMode() ? "bungee" : "offline"))); // Purpur
|
||||
- metrics.addCustomChart(new Metrics.SimplePie("purpur_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Purpur
|
||||
+ metrics.addCustomChart(new Metrics.SimplePie("kaiiju_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Purpur // Kaiiju
|
||||
|
||||
metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> {
|
||||
Map<String, Map<String, Integer>> map = new HashMap<>();
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
|
||||
index fba5dbdb7bcbb55400ef18342c9b54612972a718..8aaa2942d35d6447655f8355106841a30429b653 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
|
||||
@@ -20,7 +20,7 @@ import java.util.stream.StreamSupport;
|
||||
public class PaperVersionFetcher implements VersionFetcher {
|
||||
private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end
|
||||
// Purpur start
|
||||
- private static final String DOWNLOAD_PAGE = "https://purpurmc.org/downloads";
|
||||
+ private static final String DOWNLOAD_PAGE = "https://github.com/KaiijuMC/Kaiiju/releases"; // Kaiiju
|
||||
private static int distance = -2; public int distance() { return distance; }
|
||||
// Purpur end
|
||||
private static @Nullable String mcVer;
|
||||
@@ -33,8 +33,8 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
@Nonnull
|
||||
@Override
|
||||
public Component getVersionMessage(@Nonnull String serverVersion) {
|
||||
- String[] parts = serverVersion.substring("git-Purpur-".length()).split("[-\\s]"); // Purpur
|
||||
- final Component updateMessage = getUpdateStatusMessage("PurpurMC/Purpur", "ver/" + getMinecraftVersion(), parts[0]); // Purpur
|
||||
+ String[] parts = serverVersion.substring("git-Kaiiju-".length()).split("[-\\s]"); // Purpur // Kaiiju
|
||||
+ final Component updateMessage = getUpdateStatusMessage("KaiijuMC/Kaiiju", "ver/" + getMinecraftVersion(), parts[0]); // Purpur // Kaiiju
|
||||
final Component history = getHistory();
|
||||
|
||||
return history != null ? Component.join(net.kyori.adventure.text.JoinConfiguration.separator(Component.newline()), history, updateMessage) : updateMessage; // Purpur
|
||||
@@ -47,7 +47,7 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
String result = matcher.group();
|
||||
mcVer = result.substring(0, result.length() - 2); // strip 'R' anchor and trailing '-'
|
||||
} else {
|
||||
- org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to Purpur!"); // Purpur
|
||||
+ org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to Kaiiju!"); // Purpur // Kaiiju
|
||||
org.bukkit.Bukkit.getLogger().warning("Pattern: " + VER_PATTERN.toString());
|
||||
org.bukkit.Bukkit.getLogger().warning("Version: " + org.bukkit.Bukkit.getBukkitVersion());
|
||||
}
|
||||
@@ -58,6 +58,8 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
|
||||
private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) {
|
||||
//int distance; // Purpur - use field
|
||||
+ // Kaiiju start - disable jenkins/api checking
|
||||
+ /*
|
||||
try {
|
||||
int jenkinsBuild = Integer.parseInt(versionInfo);
|
||||
distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion());
|
||||
@@ -65,6 +67,10 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
versionInfo = versionInfo.replace("\"", "");
|
||||
distance = fetchDistanceFromGitHub(repo, branch, versionInfo);
|
||||
}
|
||||
+ */
|
||||
+ versionInfo = versionInfo.replace("\"", "");
|
||||
+ distance = fetchDistanceFromGitHub(repo, branch, versionInfo);
|
||||
+ // Kaiiju end
|
||||
|
||||
switch (distance) {
|
||||
case -1:
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
|
||||
index 3cb56595822799926a8141e60a42f5d1edfc6de5..7ae1c10ebfb8b61e7d0fa63c96ff2dee98294f4d 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
|
||||
@@ -17,7 +17,7 @@ public final class PaperConsole extends SimpleTerminalConsole {
|
||||
@Override
|
||||
protected LineReader buildReader(LineReaderBuilder builder) {
|
||||
builder
|
||||
- .appName("Purpur") // Purpur
|
||||
+ .appName("Kaiiju") // Purpur // Kaiiju
|
||||
.variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history"))
|
||||
.completer(new ConsoleCommandCompleter(this.server))
|
||||
.option(LineReader.Option.COMPLETE_IN_WORD, true);
|
||||
diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java
|
||||
index b5b6657e52e4f7a630229bd3ba433438af293e22..afda0d4198398de29a62159fae701b222969e9fa 100644
|
||||
--- a/src/main/java/net/minecraft/CrashReport.java
|
||||
+++ b/src/main/java/net/minecraft/CrashReport.java
|
||||
@@ -125,7 +125,7 @@ public class CrashReport {
|
||||
stringbuilder.append("---- Minecraft Crash Report ----\n");
|
||||
// Purpur start
|
||||
stringbuilder.append("// ");
|
||||
- stringbuilder.append("// DO NOT REPORT THIS TO PAPER! REPORT TO PURPUR INSTEAD!");
|
||||
+ stringbuilder.append("// DO NOT REPORT THIS TO PAPER/PURPUR! REPORT TO KAIIJU INSTEAD!"); // Kaiiju
|
||||
// Purpur end
|
||||
stringbuilder.append("// ");
|
||||
stringbuilder.append(CrashReport.getErrorComment());
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index cea4447aad2d64db56a76e4ba180dc7326d2e13b..40b4bd2f1a61c2d9a59c9c09b72713401969460b 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -927,7 +927,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
shutdownThread = Thread.currentThread();
|
||||
org.spigotmc.WatchdogThread.doStop(); // Paper
|
||||
if (!isSameThread()) {
|
||||
- MinecraftServer.LOGGER.info("Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PURPUR)"); // Purpur
|
||||
+ MinecraftServer.LOGGER.info("Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO KAIIJU)"); // Purpur // Kaiiju
|
||||
while (this.getRunningThread().isAlive()) {
|
||||
this.getRunningThread().stop();
|
||||
try {
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index c32e32005968b46d1f7d5162ab15c61e36f398f5..23f4edebbfa045716f956128703b58baced58f49 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -261,7 +261,7 @@ import javax.annotation.Nullable; // Paper
|
||||
import javax.annotation.Nonnull; // Paper
|
||||
|
||||
public final class CraftServer implements Server {
|
||||
- private final String serverName = "Purpur"; // Paper // Purpur
|
||||
+ private final String serverName = "Kaiiju"; // Paper // Purpur // Kaiiju
|
||||
private final String serverVersion;
|
||||
private final String bukkitVersion = Versioning.getBukkitVersion();
|
||||
private final Logger logger = Logger.getLogger("Minecraft");
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
index 78ac748859e21a61140e9bff67e4527a8d35b4b6..5e14153433f5c7854a357aad4776b2aad4cd6fa0 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
@@ -883,7 +883,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
||||
return EntityCategory.WATER;
|
||||
}
|
||||
|
||||
- throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Purpur."); // Purpur
|
||||
+ throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Kaiiju."); // Purpur // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
index 5402098dce0d64d3dceea51f248d7d366850a74f..2b7a67c339994c34296f7057ffc8822b4aa0036b 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
@@ -504,7 +504,7 @@ public class CraftScheduler implements BukkitScheduler {
|
||||
this.parsePending();
|
||||
} else {
|
||||
//this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
|
||||
- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Purpur"); // Paper // Purpur
|
||||
+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Kaiiju"); // Paper // Purpur // Kaiiju
|
||||
// We don't need to parse pending
|
||||
// (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
|
||||
}
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
|
||||
index fb87620c742ff7912f5e8ccd2a7930dd605576d9..0f56013165cd61023b4f30a4da424b701e14a8e2 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
|
||||
@@ -11,7 +11,7 @@ public final class Versioning {
|
||||
public static String getBukkitVersion() {
|
||||
String result = "Unknown-Version";
|
||||
|
||||
- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/org.purpurmc.purpur/purpur-api/pom.properties"); // Purpur
|
||||
+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/dev.kaiijumc.kaiiju/kaiiju-api/pom.properties"); // Purpur // Kaiiju
|
||||
Properties properties = new Properties();
|
||||
|
||||
if (stream != null) {
|
||||
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
index c7c0ed8dfe58c841faf684a1fe228eeda6cd57b7..410ce2dc98c48871d2ddfb0195f2885adc18cba8 100644
|
||||
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
||||
@@ -227,7 +227,7 @@ public class PurpurConfig {
|
||||
deathMessageOnlyBroadcastToAffectedPlayer = getBoolean("settings.broadcasts.death.only-broadcast-to-affected-player", deathMessageOnlyBroadcastToAffectedPlayer);
|
||||
}
|
||||
|
||||
- public static String serverModName = "Purpur";
|
||||
+ public static String serverModName = "Kaiiju"; // Kaiiju
|
||||
private static void serverModName() {
|
||||
serverModName = getString("settings.server-mod-name", serverModName);
|
||||
}
|
||||
diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
|
||||
index a810bfd3b8d6bd4d8f2ef8797e4281ae4fe8a67f..7e92d77edb448f2ec818bf4b876d3df56d6362cc 100644
|
||||
--- a/src/main/java/org/spigotmc/WatchdogThread.java
|
||||
+++ b/src/main/java/org/spigotmc/WatchdogThread.java
|
||||
@@ -155,14 +155,14 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
|
||||
if (isLongTimeout) {
|
||||
// Paper end
|
||||
log.log( Level.SEVERE, "------------------------------" );
|
||||
- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Purpur bug." ); // Paper // Purpur
|
||||
+ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Kaiiju bug." ); // Paper // Purpur // Kaiiju
|
||||
log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" );
|
||||
log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" );
|
||||
log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" );
|
||||
log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" );
|
||||
- log.log( Level.SEVERE, "If you are unsure or still think this is a Purpur bug, please report this to https://github.com/PurpurMC/Purpur/issues" ); // Purpur
|
||||
+ log.log( Level.SEVERE, "If you are unsure or still think this is a Kaiiju bug, please report this to https://github.com/KaiijuMC/Kaiiju/issues" ); // Purpur // Kaiiju
|
||||
log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" );
|
||||
- log.log( Level.SEVERE, "Purpur version: " + Bukkit.getServer().getVersion() ); // Purpur
|
||||
+ log.log( Level.SEVERE, "Kaiiju version: " + Bukkit.getServer().getVersion() ); // Purpur // Kaiiju
|
||||
//
|
||||
if ( net.minecraft.world.level.Level.lastPhysicsProblem != null )
|
||||
{
|
||||
@@ -185,12 +185,12 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
|
||||
// Paper end
|
||||
} else
|
||||
{
|
||||
- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur
|
||||
+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO KAIIJU - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Purpur // Kaiiju
|
||||
log.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump");
|
||||
}
|
||||
// Paper end - Different message for short timeout
|
||||
log.log( Level.SEVERE, "------------------------------" );
|
||||
- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Purpur!):" ); // Paper // Purpur
|
||||
+ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Kaiiju!):" ); // Paper // Purpur // Kaiiju
|
||||
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(isLongTimeout); // Paper // Paper - rewrite chunk system
|
||||
this.dumpTickingInfo(); // Paper - log detailed tick information
|
||||
WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
|
||||
@@ -206,7 +206,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
|
||||
WatchdogThread.dumpThread( thread, log );
|
||||
}
|
||||
} else {
|
||||
- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PURPUR - THIS IS NOT A BUG OR A CRASH ---"); // Purpur
|
||||
+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO KAIIJU - THIS IS NOT A BUG OR A CRASH ---"); // Purpur // Kaiiju
|
||||
}
|
||||
|
||||
log.log( Level.SEVERE, "------------------------------" );
|
||||
diff --git a/src/main/resources/logo.png b/src/main/resources/logo.png
|
||||
index 518591dd83289e041a16e2c2e7d7e7640d4b2e1b..d51e050fef81600d005e153c6a2a4c6ba7ff3388 100644
|
||||
GIT binary patch
|
||||
literal 17586
|
||||
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
|
||||
Ef}Ok25&!@I
|
||||
|
||||
literal 9260
|
||||
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
|
||||
HqBZh=dic2S
|
||||
|
||||
253
patches/server/0001-Rebranding.patch
Normal file
253
patches/server/0001-Rebranding.patch
Normal file
@@ -0,0 +1,253 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 10 Feb 2023 02:58:46 +0200
|
||||
Subject: [PATCH] Rebranding
|
||||
|
||||
|
||||
diff --git a/build.gradle.kts b/build.gradle.kts
|
||||
index 9ee90bc753e65f9dd532f28ec75cc16bf16486c8..4ce50523b1d5f2110fa873f4d3cfc9839ad606c7 100644
|
||||
--- a/build.gradle.kts
|
||||
+++ b/build.gradle.kts
|
||||
@@ -14,7 +14,7 @@ val alsoShade: Configuration by configurations.creating
|
||||
|
||||
dependencies {
|
||||
// Folia start
|
||||
- implementation(project(":folia-api"))
|
||||
+ implementation(project(":kaiiju-api")) // Kaiiju
|
||||
implementation("io.papermc.paper:paper-mojangapi:1.19.3-R0.1-SNAPSHOT") {
|
||||
exclude("io.papermc.paper", "paper-api")
|
||||
}
|
||||
@@ -76,7 +76,7 @@ tasks.jar {
|
||||
attributes(
|
||||
"Main-Class" to "org.bukkit.craftbukkit.Main",
|
||||
"Implementation-Title" to "CraftBukkit",
|
||||
- "Implementation-Version" to "git-Folia-$implementationVersion", // Folia
|
||||
+ "Implementation-Version" to "git-Kaiiju-$implementationVersion", // Folia // Kaiiju
|
||||
"Implementation-Vendor" to date, // Paper
|
||||
"Specification-Title" to "Bukkit",
|
||||
"Specification-Version" to project.version,
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/Metrics.java b/src/main/java/com/destroystokyo/paper/Metrics.java
|
||||
index cb60d58d4a7556dd896f31d0cd249f860bb3ef84..c9ccc016044f2b179c291d9d5b2a43967cca119a 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/Metrics.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/Metrics.java
|
||||
@@ -593,7 +593,7 @@ public class Metrics {
|
||||
boolean logFailedRequests = config.getBoolean("logFailedRequests", false);
|
||||
// Only start Metrics, if it's enabled in the config
|
||||
if (config.getBoolean("enabled", true)) {
|
||||
- Metrics metrics = new Metrics("Folia", serverUUID, logFailedRequests, Bukkit.getLogger()); // Folia - we have our own bstats page
|
||||
+ Metrics metrics = new Metrics("Kaiiju", serverUUID, logFailedRequests, Bukkit.getLogger()); // Folia - we have our own bstats page // Kaiiju
|
||||
|
||||
metrics.addCustomChart(new Metrics.SimplePie("minecraft_version", () -> {
|
||||
String minecraftVersion = Bukkit.getVersion();
|
||||
@@ -612,6 +612,7 @@ public class Metrics {
|
||||
paperVersion = "unknown";
|
||||
}
|
||||
metrics.addCustomChart(new Metrics.SimplePie("folia_version", () -> paperVersion)); // Folia - we have our own bstats page
|
||||
+ metrics.addCustomChart(new Metrics.SimplePie("kaiiju_version", () -> (org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() != null) ? org.bukkit.craftbukkit.Main.class.getPackage().getImplementationVersion() : "unknown")); // Kaiiju
|
||||
|
||||
metrics.addCustomChart(new Metrics.DrilldownPie("java_version", () -> {
|
||||
Map<String, Map<String, Integer>> map = new HashMap<>();
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
|
||||
index e2f704c115fd6e00960bb56bb0779f1100c89c17..95bc514df2022dde265b84490d3d0db002685024 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/PaperVersionFetcher.java
|
||||
@@ -20,9 +20,11 @@ import java.util.stream.StreamSupport;
|
||||
public class PaperVersionFetcher implements VersionFetcher {
|
||||
private static final java.util.regex.Pattern VER_PATTERN = java.util.regex.Pattern.compile("^([0-9\\.]*)\\-.*R"); // R is an anchor, will always give '-R' at end
|
||||
private static final String GITHUB_BRANCH_NAME = "master";
|
||||
- private static final String DOWNLOAD_PAGE = "https://papermc.io/downloads/paper";
|
||||
+ // Kaiiju start
|
||||
+ private static final String DOWNLOAD_PAGE = "https://github.com/KaiijuMC/Kaiiju/releases";
|
||||
+ private static int distance = -2; public int distance() { return distance; }
|
||||
+ // Kaiiju end
|
||||
private static @Nullable String mcVer;
|
||||
-
|
||||
@Override
|
||||
public long getCacheTime() {
|
||||
return 720000;
|
||||
@@ -31,8 +33,8 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
@Nonnull
|
||||
@Override
|
||||
public Component getVersionMessage(@Nonnull String serverVersion) {
|
||||
- String[] parts = serverVersion.substring("git-Folia-".length()).split("[-\\s]"); // Folia
|
||||
- final Component updateMessage = getUpdateStatusMessage("PaperMC/Folia", GITHUB_BRANCH_NAME, parts[0]); // Folia
|
||||
+ String[] parts = serverVersion.substring("git-Kaiiju-".length()).split("[-\\s]"); // Folia // Kaiiju
|
||||
+ final Component updateMessage = getUpdateStatusMessage("KaiijuMC/Kaiiju", "ver/" + getMinecraftVersion(), parts[0]); // Folia // Kaiiju
|
||||
final Component history = getHistory();
|
||||
|
||||
return history != null ? TextComponent.ofChildren(updateMessage, Component.newline(), history) : updateMessage;
|
||||
@@ -45,7 +47,7 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
String result = matcher.group();
|
||||
mcVer = result.substring(0, result.length() - 2); // strip 'R' anchor and trailing '-'
|
||||
} else {
|
||||
- org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to PaperMC!");
|
||||
+ org.bukkit.Bukkit.getLogger().warning("Unable to match version to pattern! Report to KaiijuMC!"); // Kaiiju
|
||||
org.bukkit.Bukkit.getLogger().warning("Pattern: " + VER_PATTERN.toString());
|
||||
org.bukkit.Bukkit.getLogger().warning("Version: " + org.bukkit.Bukkit.getBukkitVersion());
|
||||
}
|
||||
@@ -56,6 +58,7 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
|
||||
private static Component getUpdateStatusMessage(@Nonnull String repo, @Nonnull String branch, @Nonnull String versionInfo) {
|
||||
int distance;
|
||||
+ /* // Kaiiju - disable jenkins/api checking
|
||||
try {
|
||||
int jenkinsBuild = Integer.parseInt(versionInfo);
|
||||
distance = fetchDistanceFromSiteApi(jenkinsBuild, getMinecraftVersion());
|
||||
@@ -63,6 +66,11 @@ public class PaperVersionFetcher implements VersionFetcher {
|
||||
versionInfo = versionInfo.replace("\"", "");
|
||||
distance = fetchDistanceFromGitHub(repo, branch, versionInfo);
|
||||
}
|
||||
+ // Kaiiju start - disable jenkins/api checking
|
||||
+ */
|
||||
+ versionInfo = versionInfo.replace("\"", "");
|
||||
+ distance = fetchDistanceFromGitHub(repo, branch, versionInfo);
|
||||
+ // Kaiiju end
|
||||
|
||||
switch (distance) {
|
||||
case -1:
|
||||
diff --git a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
|
||||
index c5d5648f4ca603ef2b1df723b58f9caf4dd3c722..1c7b5d91e914efbcfb50c6137c7760787e38ad94 100644
|
||||
--- a/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
|
||||
+++ b/src/main/java/com/destroystokyo/paper/console/PaperConsole.java
|
||||
@@ -17,7 +17,7 @@ public final class PaperConsole extends SimpleTerminalConsole {
|
||||
@Override
|
||||
protected LineReader buildReader(LineReaderBuilder builder) {
|
||||
builder
|
||||
- .appName("Paper")
|
||||
+ .appName("Kaiiju") // Kaiiju
|
||||
.variable(LineReader.HISTORY_FILE, java.nio.file.Paths.get(".console_history"))
|
||||
.completer(new ConsoleCommandCompleter(this.server))
|
||||
.option(LineReader.Option.COMPLETE_IN_WORD, true);
|
||||
diff --git a/src/main/java/net/minecraft/CrashReport.java b/src/main/java/net/minecraft/CrashReport.java
|
||||
index abe37c7c3c6f5ab73afd738ec78f06d7e4d2ed96..52fc6bb99f6024273c7438d01314b576da66bd1a 100644
|
||||
--- a/src/main/java/net/minecraft/CrashReport.java
|
||||
+++ b/src/main/java/net/minecraft/CrashReport.java
|
||||
@@ -125,7 +125,7 @@ public class CrashReport {
|
||||
stringbuilder.append("---- Minecraft Crash Report ----\n");
|
||||
stringbuilder.append("// ");
|
||||
stringbuilder.append(CrashReport.getErrorComment());
|
||||
- stringbuilder.append("\n\n");
|
||||
+ stringbuilder.append("// DO NOT REPORT THIS TO PAPER/FOLIA! REPORT TO KAIIJU INSTEAD!"); // Kaiiju
|
||||
stringbuilder.append("Time: ");
|
||||
stringbuilder.append(CrashReport.DATE_TIME_FORMATTER.format(ZonedDateTime.now()));
|
||||
stringbuilder.append("\n");
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 75eb95c330d6ab7ac1e4a69da13695bbd40f894e..a6f1068884669cfedfe8df40506b011b8b411489 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -994,7 +994,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
shutdownThread = Thread.currentThread();
|
||||
org.spigotmc.WatchdogThread.doStop(); // Paper
|
||||
if (false && !isSameThread()) { // Folia - region threading
|
||||
- MinecraftServer.LOGGER.info("Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO PAPER)");
|
||||
+ MinecraftServer.LOGGER.info("Stopping main thread (Ignore any thread death message you see! - DO NOT REPORT THREAD DEATH TO KAIIJU)"); // Kaiiju
|
||||
while (this.getRunningThread().isAlive()) {
|
||||
this.getRunningThread().stop();
|
||||
try {
|
||||
@@ -1811,7 +1811,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
|
||||
@DontObfuscate
|
||||
public String getServerModName() {
|
||||
- return "Folia"; // Folia - Folia > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
|
||||
+ return "Kaiiju"; // Kaiiju - Kaiiju > // Folia - Folia > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
|
||||
}
|
||||
|
||||
public SystemReport fillSystemReport(SystemReport details) {
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index a8bf1f542ab20eb7c40c80b5e42b55982677373d..a96f743e479a05d3240884a3c0e871caec573bbe 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -265,7 +265,7 @@ import javax.annotation.Nullable; // Paper
|
||||
import javax.annotation.Nonnull; // Paper
|
||||
|
||||
public final class CraftServer implements Server {
|
||||
- private final String serverName = "Folia"; // Folia // Paper
|
||||
+ private final String serverName = "Kaiiju"; // Kaiiju // Folia // Paper
|
||||
private final String serverVersion;
|
||||
private final String bukkitVersion = Versioning.getBukkitVersion();
|
||||
private final Logger logger = Logger.getLogger("Minecraft");
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
index d2ab898c0f3902f5f0f9847232dac244b4095854..7c918d99c8629da0ef4242f0b6a1778a0fd696b6 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
|
||||
@@ -920,7 +920,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
|
||||
return EntityCategory.WATER;
|
||||
}
|
||||
|
||||
- throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Spigot.");
|
||||
+ throw new UnsupportedOperationException("Unsupported monster type: " + type + ". This is a bug, report this to Kaiiju."); // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
index eb84a8dd97f92de4a7dd3826d9e124a442cba565..e24d653fafcd88e01786b77539c506bcf3751c2c 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/scheduler/CraftScheduler.java
|
||||
@@ -501,7 +501,7 @@ public class CraftScheduler implements BukkitScheduler {
|
||||
this.parsePending();
|
||||
} else {
|
||||
// this.debugTail = this.debugTail.setNext(new CraftAsyncDebugger(currentTick + CraftScheduler.RECENT_TICKS, task.getOwner(), task.getTaskClass())); // Paper
|
||||
- task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Paper"); // Paper
|
||||
+ task.getOwner().getLogger().log(Level.SEVERE, "Unexpected Async Task in the Sync Scheduler. Report this to Kaiiju"); // Paper // Kaiiju
|
||||
// We don't need to parse pending
|
||||
// (async tasks must live with race-conditions if they attempt to cancel between these few lines of code)
|
||||
}
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
|
||||
index e9b6ca3aa25e140467ae866d572483050ea3fa0e..5df2b0fceebaaa863f4f143c8f29e808b7f0c49b 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/util/Versioning.java
|
||||
@@ -11,7 +11,7 @@ public final class Versioning {
|
||||
public static String getBukkitVersion() {
|
||||
String result = "Unknown-Version";
|
||||
|
||||
- InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/dev.folia/folia-api/pom.properties"); // Folia
|
||||
+ InputStream stream = Bukkit.class.getClassLoader().getResourceAsStream("META-INF/maven/dev.kaiijumc.kaiiju/kaiiju-api/pom.properties"); // Folia // Kaiiju
|
||||
Properties properties = new Properties();
|
||||
|
||||
if (stream != null) {
|
||||
diff --git a/src/main/java/org/spigotmc/WatchdogThread.java b/src/main/java/org/spigotmc/WatchdogThread.java
|
||||
index 98fba0288be9ed2cb18ffba5cf81148157dd4fcf..9c1477cfa1a8074c4b3b8a365bb03c44eaa62972 100644
|
||||
--- a/src/main/java/org/spigotmc/WatchdogThread.java
|
||||
+++ b/src/main/java/org/spigotmc/WatchdogThread.java
|
||||
@@ -155,14 +155,14 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
|
||||
if (isLongTimeout) {
|
||||
// Paper end
|
||||
log.log( Level.SEVERE, "------------------------------" );
|
||||
- log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Paper bug." ); // Paper
|
||||
+ log.log( Level.SEVERE, "The server has stopped responding! This is (probably) not a Kaiiju bug." ); // Paper // Kaiiju
|
||||
log.log( Level.SEVERE, "If you see a plugin in the Server thread dump below, then please report it to that author" );
|
||||
log.log( Level.SEVERE, "\t *Especially* if it looks like HTTP or MySQL operations are occurring" );
|
||||
log.log( Level.SEVERE, "If you see a world save or edit, then it means you did far more than your server can handle at once" );
|
||||
log.log( Level.SEVERE, "\t If this is the case, consider increasing timeout-time in spigot.yml but note that this will replace the crash with LARGE lag spikes" );
|
||||
- log.log( Level.SEVERE, "If you are unsure or still think this is a Paper bug, please report this to https://github.com/PaperMC/Paper/issues" );
|
||||
+ log.log( Level.SEVERE, "If you are unsure or still think this is a Kaiiju bug, please report this to https://github.com/KaiijuMC/Kaiiju/issues" ); // Kaiiju
|
||||
log.log( Level.SEVERE, "Be sure to include ALL relevant console errors and Minecraft crash reports" );
|
||||
- log.log( Level.SEVERE, "Paper version: " + Bukkit.getServer().getVersion() );
|
||||
+ log.log( Level.SEVERE, "Kaiiju version: " + Bukkit.getServer().getVersion() ); // Kaiiju
|
||||
//
|
||||
if ( net.minecraft.world.level.Level.lastPhysicsProblem != null )
|
||||
{
|
||||
@@ -185,12 +185,12 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
|
||||
// Paper end
|
||||
} else
|
||||
{
|
||||
- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---");
|
||||
+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO KAIIJU - THIS IS NOT A BUG OR A CRASH - " + Bukkit.getServer().getVersion() + " ---"); // Kaiiju
|
||||
log.log(Level.SEVERE, "The server has not responded for " + (currentTime - lastTick) / 1000 + " seconds! Creating thread dump");
|
||||
}
|
||||
// Paper end - Different message for short timeout
|
||||
log.log( Level.SEVERE, "------------------------------" );
|
||||
- log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Paper!):" ); // Paper
|
||||
+ log.log( Level.SEVERE, "Server thread dump (Look for plugins here before reporting to Kaiiju!):" ); // Paper // Kaiiju
|
||||
io.papermc.paper.chunk.system.scheduling.ChunkTaskScheduler.dumpAllChunkLoadInfo(isLongTimeout); // Paper // Paper - rewrite chunk system
|
||||
this.dumpTickingInfo(); // Paper - log detailed tick information
|
||||
WatchdogThread.dumpThread( ManagementFactory.getThreadMXBean().getThreadInfo( MinecraftServer.getServer().serverThread.getId(), Integer.MAX_VALUE ), log );
|
||||
@@ -206,7 +206,7 @@ public final class WatchdogThread extends io.papermc.paper.util.TickThread // Pa
|
||||
WatchdogThread.dumpThread( thread, log );
|
||||
}
|
||||
} else {
|
||||
- log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO PAPER - THIS IS NOT A BUG OR A CRASH ---");
|
||||
+ log.log(Level.SEVERE, "--- DO NOT REPORT THIS TO KAIIJU - THIS IS NOT A BUG OR A CRASH ---"); // Kaiiju
|
||||
}
|
||||
|
||||
log.log( Level.SEVERE, "------------------------------" );
|
||||
@@ -1,7 +1,7 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 10 Feb 2023 05:53:10 +0200
|
||||
Subject: [PATCH] Kaiiju Configuration
|
||||
Subject: [PATCH] Empty configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -207,7 +207,7 @@ index 0000000000000000000000000000000000000000..7da7e0aeb5eac9ac73a3570e716f1ceb
|
||||
+}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..dd4c3ca77acb3aeefc69b8eb948b8b202ff87a19
|
||||
index 0000000000000000000000000000000000000000..87ca934473f3b9553c1b9b3ed60e0fa07838c711
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -0,0 +1,125 @@
|
||||
@@ -336,13 +336,12 @@ index 0000000000000000000000000000000000000000..dd4c3ca77acb3aeefc69b8eb948b8b20
|
||||
+ return value.isEmpty() ? fallback : value;
|
||||
+ }
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java b/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..0dde8879856f8882f2840b4b8bfb5aa0b3f06b91
|
||||
index 0000000000000000000000000000000000000000..6fac162e0ec057af9f3336314d5663554cef0490
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java
|
||||
@@ -0,0 +1,68 @@
|
||||
@@ -0,0 +1,66 @@
|
||||
+package dev.kaiijumc.kaiiju.command;
|
||||
+
|
||||
+import dev.kaiijumc.kaiiju.KaiijuConfig;
|
||||
@@ -381,26 +380,24 @@ index 0000000000000000000000000000000000000000..0dde8879856f8882f2840b4b8bfb5aa0
|
||||
+ @Override
|
||||
+ public boolean execute(CommandSender sender, String commandLabel, String[] args) {
|
||||
+ if (!testPermission(sender)) return true;
|
||||
+ String prefix = ChatColor.of(Color.decode("#F25DF6")) + "Kaiiju » " + ChatColor.RESET;
|
||||
+
|
||||
+ if (args.length != 1) {
|
||||
+ sender.sendMessage(prefix + ChatColor.RED + "Usage: " + usageMessage);
|
||||
+ sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage);
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ if (args[0].equalsIgnoreCase("reload")) {
|
||||
+ Command.broadcastCommandMessage(sender, prefix + ChatColor.RED + "Please note that this command is not supported and may cause issues.");
|
||||
+ Command.broadcastCommandMessage(sender, prefix + ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server.");
|
||||
+ Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues.");
|
||||
+ Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server.");
|
||||
+
|
||||
+ MinecraftServer console = MinecraftServer.getServer();
|
||||
+ KaiijuConfig.reload((File) console.options.valueOf("kaiiju-settings"));
|
||||
+ for (ServerLevel level : console.getAllLevels()) {
|
||||
+ level.kaiijuConfig.reload();
|
||||
+ level.resetBreedingCooldowns();
|
||||
+ }
|
||||
+ console.server.reloadCount++;
|
||||
+
|
||||
+ Command.broadcastCommandMessage(sender, prefix + ChatColor.GREEN + "Kaiiju config reload complete.");
|
||||
+ Command.broadcastCommandMessage(sender, ChatColor.GREEN + "Kaiiju config reload complete.");
|
||||
+ } else if (args[0].equalsIgnoreCase("version")) {
|
||||
+ Command verCmd = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version");
|
||||
+ if (verCmd != null) {
|
||||
@@ -413,13 +410,13 @@ index 0000000000000000000000000000000000000000..0dde8879856f8882f2840b4b8bfb5aa0
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index fd1b0564d2d2b45128e6f2556fb93ee56bd683b5..948ae5f96b1d54e69b49f6314d11078f197c946e 100644
|
||||
index c5dfd99a38a79fd19a2bf85fa297a28e40612b51..99b3db382a164fbe3afddb08f5317d463ceda765 100644
|
||||
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -227,6 +227,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
}
|
||||
org.purpurmc.purpur.PurpurConfig.registerCommands();
|
||||
// Purpur end
|
||||
@@ -218,6 +218,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
thread.start(); // Paper - start console thread after MinecraftServer.console & PaperConfig are initialized
|
||||
io.papermc.paper.command.PaperCommands.registerCommands(this);
|
||||
com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics();
|
||||
+ // Kaiiju start
|
||||
+ try {
|
||||
+ dev.kaiijumc.kaiiju.KaiijuConfig.init((java.io.File) options.valueOf("kaiiju-settings"));
|
||||
@@ -433,56 +430,57 @@ index fd1b0564d2d2b45128e6f2556fb93ee56bd683b5..948ae5f96b1d54e69b49f6314d11078f
|
||||
io.papermc.paper.brigadier.PaperBrigadierProviderImpl.INSTANCE.getClass(); // init PaperBrigadierProvider
|
||||
// Paper end
|
||||
diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java
|
||||
index fef709fce7309795b6d62d33a220a2be2399efd3..213665dc92e572d7efc6e28d3ceaa74c733bc291 100644
|
||||
index 916df0c8d263f90e04564c5f512fd5ed5eaaa6d5..5ffe01a20e929554b4bde0b6d453472261686f54 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/Level.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/Level.java
|
||||
@@ -174,6 +174,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
@@ -166,6 +166,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
// Paper end
|
||||
|
||||
public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray
|
||||
public final org.purpurmc.purpur.PurpurWorldConfig purpurConfig; // Purpur
|
||||
+ public final dev.kaiijumc.kaiiju.KaiijuWorldConfig kaiijuConfig; // Kaiiju
|
||||
|
||||
+
|
||||
public final co.aikar.timings.WorldTimingsHandler timings; // Paper
|
||||
public static BlockPos lastPhysicsProblem; // Spigot
|
||||
@@ -330,6 +331,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
private org.spigotmc.TickLimiter entityLimiter;
|
||||
@@ -293,6 +295,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable {
|
||||
protected Level(WritableLevelData worlddatamutable, ResourceKey<Level> resourcekey, RegistryAccess iregistrycustom, Holder<DimensionType> holder, Supplier<ProfilerFiller> supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function<org.spigotmc.SpigotWorldConfig, io.papermc.paper.configuration.WorldConfiguration> paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - Async-Anti-Xray - Pass executor
|
||||
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot
|
||||
this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper
|
||||
this.purpurConfig = new org.purpurmc.purpur.PurpurWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), env); // Purpur
|
||||
+ this.kaiijuConfig = new dev.kaiijumc.kaiiju.KaiijuWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName(), env); // Kaiiju
|
||||
this.playerBreedingCooldowns = this.getNewBreedingCooldownCache(); // Purpur
|
||||
this.generator = gen;
|
||||
this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env);
|
||||
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
index e9cc9ff401233f50279bbc622050fd0894968ae1..a52ff5f8f883ba21f036b7d6830f7470567fe2b6 100644
|
||||
index a96f743e479a05d3240884a3c0e871caec573bbe..3167ef56973578bdeeee96d545b81d41629fe994 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
|
||||
@@ -976,6 +976,7 @@ public final class CraftServer implements Server {
|
||||
@@ -1098,6 +1098,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot
|
||||
this.console.paperConfigurations.reloadConfigs(this.console);
|
||||
org.purpurmc.purpur.PurpurConfig.init((File) console.options.valueOf("purpur-settings")); // Purpur
|
||||
+ dev.kaiijumc.kaiiju.KaiijuConfig.init((File) console.options.valueOf("kaiiju-settings")); // Kaiiju
|
||||
for (ServerLevel world : this.console.getAllLevels()) {
|
||||
// world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty
|
||||
world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean))
|
||||
@@ -992,6 +993,7 @@ public final class CraftServer implements Server {
|
||||
@@ -1113,6 +1114,7 @@ public final class CraftServer implements Server {
|
||||
}
|
||||
}
|
||||
world.spigotConfig.init(); // Spigot
|
||||
world.purpurConfig.init(); // Purpur
|
||||
+ world.kaiijuConfig.init(); // Kaiiju
|
||||
}
|
||||
|
||||
Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper
|
||||
@@ -1008,6 +1010,7 @@ public final class CraftServer implements Server {
|
||||
@@ -1128,6 +1130,7 @@ public final class CraftServer implements Server {
|
||||
this.reloadData();
|
||||
org.spigotmc.SpigotConfig.registerCommands(); // Spigot
|
||||
io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper
|
||||
org.purpurmc.purpur.PurpurConfig.registerCommands(); // Purpur
|
||||
+ dev.kaiijumc.kaiiju.KaiijuConfig.registerCommands(); // Kaiiju
|
||||
this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*");
|
||||
this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions");
|
||||
|
||||
@@ -2830,6 +2833,13 @@ public final class CraftServer implements Server {
|
||||
@@ -2975,6 +2978,13 @@ public final class CraftServer implements Server {
|
||||
return CraftServer.this.console.paperConfigurations.createLegacyObject(CraftServer.this.console);
|
||||
}
|
||||
// Purpur end
|
||||
|
||||
+ // Kaiiju start
|
||||
+ @Override
|
||||
@@ -495,12 +493,12 @@ index e9cc9ff401233f50279bbc622050fd0894968ae1..a52ff5f8f883ba21f036b7d6830f7470
|
||||
public void restart() {
|
||||
org.spigotmc.RestartCommand.restart();
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
index 576cd8e20982bb20d10213b6c7a229428eec1c2f..190b4bc55d8b1e9983f7b77fd3545a59fa39e6f8 100644
|
||||
index 776b7fc26fe96b69be260bbd36efae147d988640..a090c16d53fcb220687a18aa37ca82663f4660c7 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
@@ -180,6 +180,14 @@ public class Main {
|
||||
.describedAs("Yml file");
|
||||
// Purpur end
|
||||
@@ -173,6 +173,14 @@ public class Main {
|
||||
.describedAs("Jar file");
|
||||
// Paper end
|
||||
|
||||
+ // Purpur Start
|
||||
+ acceptsAll(asList("kaiiju", "kaiiju-settings"), "File for kaiiju settings")
|
||||
@@ -1,29 +1,30 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 10 Feb 2023 20:03:58 +0200
|
||||
Subject: [PATCH] Kaiiju RegionFormat Configuration
|
||||
Subject: [PATCH] Region format configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 7da7e0aeb5eac9ac73a3570e716f1ceb11fd7027..b86c90cc3601e666998cfa12f44515f605bb53eb 100644
|
||||
index 7da7e0aeb5eac9ac73a3570e716f1ceb11fd7027..f08bcc9ae1770fa847d8a5e873a554bef5485100 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -192,4 +192,10 @@ public class KaiijuConfig {
|
||||
@@ -192,4 +192,7 @@ public class KaiijuConfig {
|
||||
}
|
||||
return builder.build();
|
||||
}
|
||||
+
|
||||
+ public static boolean regionFormatDebug = false;
|
||||
+
|
||||
+ private static void regionFormatSettings() {
|
||||
+ regionFormatDebug = getBoolean("region-format.debug", regionFormatDebug);
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index dd4c3ca77acb3aeefc69b8eb948b8b202ff87a19..b194f4dbebcbbf5bb4e026a0169e2d24806b46ec 100644
|
||||
index 87ca934473f3b9553c1b9b3ed60e0fa07838c711..a6e7af5f4148e067660e9f5beeacde3a59a1de9c 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -4,9 +4,11 @@ import org.apache.commons.lang.BooleanUtils;
|
||||
@@ -1,12 +1,15 @@
|
||||
package dev.kaiijumc.kaiiju;
|
||||
|
||||
+import dev.kaiijumc.kaiiju.region.RegionFileFormat;
|
||||
import org.apache.commons.lang.BooleanUtils;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
|
||||
@@ -35,21 +36,20 @@ index dd4c3ca77acb3aeefc69b8eb948b8b202ff87a19..b194f4dbebcbbf5bb4e026a0169e2d24
|
||||
|
||||
import static dev.kaiijumc.kaiiju.KaiijuConfig.log;
|
||||
|
||||
@@ -122,4 +124,23 @@ public class KaiijuWorldConfig {
|
||||
@@ -122,4 +125,22 @@ public class KaiijuWorldConfig {
|
||||
final Map<String, Object> value = getMap("world-settings." + worldName + "." + path, null);
|
||||
return value.isEmpty() ? fallback : value;
|
||||
}
|
||||
+
|
||||
+ public List<String> regionFormatList = Arrays.asList("ANVIL", "LINEAR");
|
||||
+ public String regionFormatName = "ANVIL";
|
||||
+ public RegionFileFormat regionFormatName = RegionFileFormat.ANVIL;
|
||||
+ public int regionFormatLinearCompressionLevel = 1;
|
||||
+
|
||||
+ private void regionFormatSettings() {
|
||||
+ regionFormatName = getString("region-format.format", regionFormatName).toUpperCase();
|
||||
+ if (!regionFormatList.contains(regionFormatName)) {
|
||||
+ regionFormatName = RegionFileFormat.fromString(getString("region-format.format", regionFormatName.name()));
|
||||
+ if (regionFormatName.equals(RegionFileFormat.INVALID)) {
|
||||
+ log(Level.SEVERE, "Unknown region format in kaiiju.yml: " + regionFormatName);
|
||||
+ log(Level.SEVERE, "Falling back to ANVIL region file format.");
|
||||
+ regionFormatName = "ANVIL";
|
||||
+ regionFormatName = RegionFileFormat.ANVIL;
|
||||
+ }
|
||||
+ regionFormatLinearCompressionLevel = getInt("region-format.linear.compression-level", regionFormatLinearCompressionLevel);
|
||||
+ if (regionFormatLinearCompressionLevel > 23 || regionFormatLinearCompressionLevel < 1) {
|
||||
@@ -59,12 +59,33 @@ index dd4c3ca77acb3aeefc69b8eb948b8b202ff87a19..b194f4dbebcbbf5bb4e026a0169e2d24
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/region/RegionFileFormat.java b/src/main/java/dev/kaiijumc/kaiiju/region/RegionFileFormat.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..7164d9cd03186f0657783f83de3d6435cda2b17e
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/region/RegionFileFormat.java
|
||||
@@ -0,0 +1,16 @@
|
||||
+package dev.kaiijumc.kaiiju.region;
|
||||
+
|
||||
+public enum RegionFileFormat {
|
||||
+ ANVIL,
|
||||
+ LINEAR,
|
||||
+ INVALID;
|
||||
+
|
||||
+ public static RegionFileFormat fromString(String format) {
|
||||
+ for (RegionFileFormat rff : values()) {
|
||||
+ if (rff.name().equalsIgnoreCase(format)) {
|
||||
+ return rff;
|
||||
+ }
|
||||
+ }
|
||||
+ return RegionFileFormat.INVALID;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index c1b88ae704b3d2b8ebbad28c0291a4ad12e6d5d9..ae4dd7db4e4e32fe8100309d770307fccf31110d 100644
|
||||
index a6f1068884669cfedfe8df40506b011b8b411489..7243443d4bf24ad0b32b8a76d9b8701cca8612a7 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -855,7 +855,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -892,7 +892,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
// Paper start - rewrite chunk system
|
||||
worldserver.save((ProgressListener) null, flush, worldserver.noSave && !force, close);
|
||||
if (flush) {
|
||||
@@ -73,7 +94,7 @@ index c1b88ae704b3d2b8ebbad28c0291a4ad12e6d5d9..ae4dd7db4e4e32fe8100309d770307fc
|
||||
}
|
||||
// Paper end - rewrite chunk system
|
||||
}
|
||||
@@ -879,7 +879,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
@@ -916,7 +916,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
//MinecraftServer.LOGGER.info("ThreadedAnvilChunkStorage ({}): All chunks are saved", worldserver2.getChunkSource().chunkMap.getStorageName()); // Paper - move up
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,19 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sat, 11 Feb 2023 02:10:20 +0200
|
||||
Subject: [PATCH] Kaiiju Lobotomize Configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index b194f4dbebcbbf5bb4e026a0169e2d24806b46ec..907fdfb368c87bfe7b4374bb0b5f49d5ff095339 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -143,4 +143,7 @@ public class KaiijuWorldConfig {
|
||||
regionFormatLinearCompressionLevel = 1;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ private void lobotomizeSettings() {
|
||||
+ }
|
||||
}
|
||||
\ No newline at end of file
|
||||
@@ -1,16 +1,16 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 16 Feb 2023 01:38:59 +0200
|
||||
Subject: [PATCH] Kaiiju Network Configuration
|
||||
Subject: [PATCH] Network configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index b86c90cc3601e666998cfa12f44515f605bb53eb..7c6d43d8a360530344ef296f4477750c8a298607 100644
|
||||
index b7f43cce80742aa0cd523e930772ff84946f3eef..fa829cef4033625470dfae29ddf777e6c5ab8c55 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -198,4 +198,7 @@ public class KaiijuConfig {
|
||||
private static void regionFormatSettings() {
|
||||
regionFormatDebug = getBoolean("region-format.debug", regionFormatDebug);
|
||||
@@ -203,4 +203,7 @@ public class KaiijuConfig {
|
||||
else
|
||||
linearFlushThreads = Math.max(linearFlushThreads, 1);
|
||||
}
|
||||
+
|
||||
+ private static void networkSettings() {
|
||||
@@ -1,358 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sat, 11 Feb 2023 06:29:15 +0200
|
||||
Subject: [PATCH] Kaiiju Lobotomize Animal
|
||||
|
||||
Inspired by "Lobotomized animals" by @KioProject123
|
||||
Checks might be a nuisance to performance.
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 907fdfb368c87bfe7b4374bb0b5f49d5ff095339..b99b438b92587f23c77c5321d5d23e76dc5450de 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -144,6 +144,17 @@ public class KaiijuWorldConfig {
|
||||
}
|
||||
}
|
||||
|
||||
+ public boolean lobotomizeAnimalEnabled = false;
|
||||
+ public int lobotomizeAnimalCheckInterval = 100;
|
||||
+ public boolean lobotomizeAnimalCheckCanJump = true;
|
||||
+ public boolean lobotomizeAnimalLookAtPlayer = false;
|
||||
+ public boolean lobotomizeAnimalFloat = true;
|
||||
+
|
||||
private void lobotomizeSettings() {
|
||||
+ lobotomizeAnimalEnabled = getBoolean("lobotomize.animal.enabled", lobotomizeAnimalEnabled);
|
||||
+ lobotomizeAnimalCheckInterval = getInt("lobotomize.animal.check-interval", lobotomizeAnimalCheckInterval);
|
||||
+ lobotomizeAnimalCheckCanJump = getBoolean("lobotomize.animal.check-can-jump", lobotomizeAnimalCheckCanJump);
|
||||
+ lobotomizeAnimalLookAtPlayer = getBoolean("lobotomize.animal.look-at-player", lobotomizeAnimalLookAtPlayer);
|
||||
+ lobotomizeAnimalFloat = getBoolean("lobotomize.animal.float", lobotomizeAnimalFloat);
|
||||
}
|
||||
}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/entity/Lobotomized.java b/src/main/java/dev/kaiijumc/kaiiju/entity/Lobotomized.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..805df3e27cfbbdf3525c96942afca12d50abc350
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/entity/Lobotomized.java
|
||||
@@ -0,0 +1,73 @@
|
||||
+package dev.kaiijumc.kaiiju.entity;
|
||||
+
|
||||
+import net.minecraft.core.BlockPos;
|
||||
+import net.minecraft.world.entity.LivingEntity;
|
||||
+import net.minecraft.world.level.Level;
|
||||
+import net.minecraft.world.level.block.state.BlockState;
|
||||
+import net.minecraft.world.level.pathfinder.PathComputationType;
|
||||
+
|
||||
+public class Lobotomized {
|
||||
+ private boolean isLobotomized = false;
|
||||
+ private int notLobotomizedCount = 0;
|
||||
+
|
||||
+ public boolean isLobotomized() {
|
||||
+ return this.isLobotomized;
|
||||
+ }
|
||||
+
|
||||
+ public void setLobotomized(boolean b) {
|
||||
+ this.isLobotomized = b;
|
||||
+ }
|
||||
+
|
||||
+ public boolean checkLobotomized(LivingEntity entity) {
|
||||
+ Level level = entity.getLevel();
|
||||
+ int interval = level.kaiijuConfig.lobotomizeAnimalCheckInterval;
|
||||
+ if (this.notLobotomizedCount > 3) {
|
||||
+ // check half as often if not lobotomized for the last 3+ consecutive checks
|
||||
+ interval *= 2;
|
||||
+ }
|
||||
+ if ((entity.getId() + entity.tickCount) % interval == 0) {
|
||||
+ this.isLobotomized = entity.isOnGround() && !canTravelFrom(entity, level, entity.getBbHeight() <= 1.0F);
|
||||
+
|
||||
+ if (this.isLobotomized) {
|
||||
+ this.notLobotomizedCount = 0;
|
||||
+ } else {
|
||||
+ this.notLobotomizedCount++;
|
||||
+ }
|
||||
+ }
|
||||
+ return this.isLobotomized;
|
||||
+ }
|
||||
+
|
||||
+ private boolean canTravelFrom(LivingEntity entity, Level level, boolean ignoreTop) {
|
||||
+ BlockPos pos = new BlockPos(entity.getX(), entity.getY() + 0.5D, entity.getZ());
|
||||
+ return canTravelTo(entity, pos.east(), level, ignoreTop)
|
||||
+ || canTravelTo(entity, pos.west(), level, ignoreTop)
|
||||
+ || canTravelTo(entity, pos.north(), level, ignoreTop)
|
||||
+ || canTravelTo(entity, pos.south(), level, ignoreTop);
|
||||
+ }
|
||||
+
|
||||
+ private boolean canTravelTo(LivingEntity entity, BlockPos pos, Level level, boolean ignoreTop) {
|
||||
+ BlockState top;
|
||||
+ // Check if mob can jump over block
|
||||
+ if (level.kaiijuConfig.lobotomizeAnimalCheckCanJump && canJump(entity, level, ignoreTop)) {
|
||||
+ top = level.getBlockStateIfLoaded(pos.above());
|
||||
+ if (top == null) return false;
|
||||
+ if (top.isPathfindable(level, pos, net.minecraft.world.level.pathfinder.PathComputationType.LAND)) {
|
||||
+ if (ignoreTop) return true;
|
||||
+ net.minecraft.world.level.block.state.BlockState above = level.getBlockState(pos.above(2));
|
||||
+ if (above.isPathfindable(level, pos, net.minecraft.world.level.pathfinder.PathComputationType.LAND)) return true;
|
||||
+ }
|
||||
+ }
|
||||
+ BlockState bottom = level.getBlockStateIfLoaded(pos);
|
||||
+ if (bottom == null) return false; // Chunk not loaded
|
||||
+ if (!bottom.isPathfindable(level, pos, PathComputationType.LAND)) return false;
|
||||
+ if (ignoreTop) return true;
|
||||
+ top = level.getBlockState(pos.above());
|
||||
+ return top.isPathfindable(level, pos, PathComputationType.LAND);
|
||||
+ }
|
||||
+
|
||||
+ private boolean canJump(LivingEntity entity, Level level, boolean ignoreTop) {
|
||||
+ BlockPos pos = new BlockPos(entity.getX(), entity.getY() + 2.5D, entity.getZ());
|
||||
+ net.minecraft.world.level.block.Block above = level.getBlockIfLoaded(pos);
|
||||
+ return !above.hasCollision;
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
index b2e4b5c463ceb19356da18e7fc52d20801b674cd..32ea0b1542ef374db3290e01978d7965715b9de6 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||||
@@ -308,6 +308,8 @@ public abstract class LivingEntity extends Entity {
|
||||
this.brain = this.makeBrain(new Dynamic(dynamicopsnbt, (Tag) dynamicopsnbt.createMap((Map) ImmutableMap.of(dynamicopsnbt.createString("memories"), (Tag) dynamicopsnbt.emptyMap()))));
|
||||
}
|
||||
|
||||
+ public boolean isLobotomized() { return false; } // Kaiiju
|
||||
+
|
||||
protected void initAttributes() {}// Purpur
|
||||
|
||||
public Brain<?> getBrain() {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
|
||||
index 7093c62be53fe99ed9880fc8ddaa07440fe4f715..2acbb26af2c24b2f4c569d55e8ba44a068fd9d86 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/FloatGoal.java
|
||||
@@ -16,6 +16,7 @@ public class FloatGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
+ if (!this.mob.getLevel().kaiijuConfig.lobotomizeAnimalFloat && this.mob.isLobotomized()) return false; // Kaiiju
|
||||
return this.mob.isInWater() && this.mob.getFluidHeight(FluidTags.WATER) > this.mob.getFluidJumpThreshold() || this.mob.isInLava();
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/FollowParentGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/FollowParentGoal.java
|
||||
index a668d5263586f955a5656ac66bcc7fe8cc51fe00..c195e60a7773f106775cded4f1c3ed51a69ca2f5 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/FollowParentGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/FollowParentGoal.java
|
||||
@@ -21,6 +21,7 @@ public class FollowParentGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
+ if (this.animal.isLobotomized()) return false; // Kaiiju
|
||||
if (this.animal.getAge() >= 0) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -51,6 +52,7 @@ public class FollowParentGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
+ if (this.animal.isLobotomized()) return false; // Kaiiju
|
||||
if (this.animal.getAge() >= 0) {
|
||||
return false;
|
||||
} else if (!this.parent.isAlive()) {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java
|
||||
index 8b189d7587303263efa1790066e5a83edd45f9d7..1304fc96834e4ce7156076fd893993a0aa75cbbc 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.java
|
||||
@@ -48,6 +48,7 @@ public class LookAtPlayerGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
+ if (!mob.getLevel().kaiijuConfig.lobotomizeAnimalLookAtPlayer && this.mob.isLobotomized()) return false; // Kaiiju
|
||||
if (this.mob.getRandom().nextFloat() >= this.probability) {
|
||||
return false;
|
||||
} else {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/PanicGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/PanicGoal.java
|
||||
index 268b7457c2a93af6d36c1c5f623c5856f94a7af1..f1469e424f7bdf4e5813f250c0eae673db0b9049 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/PanicGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/PanicGoal.java
|
||||
@@ -29,6 +29,7 @@ public class PanicGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
if (!this.shouldPanic()) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -81,6 +82,7 @@ public class PanicGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
// CraftBukkit start - introduce a temporary timeout hack until this is fixed properly
|
||||
if ((this.mob.tickCount - this.mob.lastHurtByMobTimestamp) > 100) {
|
||||
this.mob.setLastHurtByMob((LivingEntity) null);
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/RandomStrollGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/RandomStrollGoal.java
|
||||
index 216929c838446c3c14d9b9906ffa625ef35fcbc8..3ea2e7c44018ec63b8f17fd3e5e3a23e2b1f72e4 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/RandomStrollGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/RandomStrollGoal.java
|
||||
@@ -35,6 +35,7 @@ public class RandomStrollGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
if (this.mob.isVehicle()) {
|
||||
return false;
|
||||
} else {
|
||||
@@ -68,6 +69,7 @@ public class RandomStrollGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
return !this.mob.getNavigation().isDone() && !this.mob.isVehicle();
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java b/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java
|
||||
index 2cbc9adc8e417def48be03d08174a5833068ec65..3234d5bf3b9ae01dbe8e26a0a3f21ff875fe6769 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/goal/TemptGoal.java
|
||||
@@ -43,6 +43,7 @@ public class TemptGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canUse() {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
if (this.calmDown > 0) {
|
||||
--this.calmDown;
|
||||
return false;
|
||||
@@ -67,6 +68,7 @@ public class TemptGoal extends Goal {
|
||||
|
||||
@Override
|
||||
public boolean canContinueToUse() {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
if (this.canScare()) {
|
||||
if (this.mob.distanceToSqr((Entity) this.player) < 36.0D) {
|
||||
if (this.player.distanceToSqr(this.px, this.py, this.pz) > 0.010000000000000002D) {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
|
||||
index 2f2d9bb31194618ef5bba39cd1cbe7c4919e82c5..0d8f1f063b76357374022e4496ce0646757b150e 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/navigation/PathNavigation.java
|
||||
@@ -197,6 +197,7 @@ public abstract class PathNavigation {
|
||||
// Paper end
|
||||
|
||||
public boolean moveTo(Entity entity, double speed) {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
// Paper start - Pathfinding optimizations
|
||||
if (this.pathfindFailures > 10 && this.path == null && net.minecraft.server.MinecraftServer.currentTick < this.lastFailure + 40) {
|
||||
return false;
|
||||
@@ -217,6 +218,7 @@ public abstract class PathNavigation {
|
||||
}
|
||||
|
||||
public boolean moveTo(@Nullable Path path, double speed) {
|
||||
+ if (this.mob.isLobotomized()) return false; // Kaiiju
|
||||
if (path == null) {
|
||||
this.path = null;
|
||||
return false;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Animal.java b/src/main/java/net/minecraft/world/entity/animal/Animal.java
|
||||
index 2ac88f06ebb79e515cd9934ac1e3e2c8003d9e3c..d89c0db4c4173d8558dc4f8b15ddb5815ef7c09e 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Animal.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Animal.java
|
||||
@@ -13,7 +13,6 @@ import net.minecraft.tags.BlockTags;
|
||||
import net.minecraft.util.RandomSource;
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.InteractionResult;
|
||||
-import net.minecraft.world.damagesource.DamageSource;
|
||||
import net.minecraft.world.entity.AgeableMob;
|
||||
import net.minecraft.world.entity.EntityType;
|
||||
import net.minecraft.world.entity.ExperienceOrb;
|
||||
@@ -39,6 +38,7 @@ public abstract class Animal extends AgeableMob {
|
||||
@Nullable
|
||||
public UUID loveCause;
|
||||
public ItemStack breedItem; // CraftBukkit - Add breedItem variable
|
||||
+ protected dev.kaiijumc.kaiiju.entity.Lobotomized lobotomized = new dev.kaiijumc.kaiiju.entity.Lobotomized(); // Kaiiju
|
||||
public abstract int getPurpurBreedTime(); // Purpur
|
||||
|
||||
protected Animal(EntityType<? extends Animal> type, Level world) {
|
||||
@@ -74,8 +74,32 @@ public abstract class Animal extends AgeableMob {
|
||||
}
|
||||
}
|
||||
|
||||
+ this.lobotomized.checkLobotomized(this); // Kaiiju
|
||||
}
|
||||
|
||||
+ // Kaiiju start
|
||||
+ @Override
|
||||
+ public void travel(net.minecraft.world.phys.Vec3 vec3) {
|
||||
+ if (!this.isLobotomized() || net.minecraft.server.MinecraftServer.currentTick % 100 == 0) {
|
||||
+ super.travel(vec3);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isCollidable(boolean ignoreClimbing) {
|
||||
+ if (!this.isLobotomized() || net.minecraft.server.MinecraftServer.currentTick % 20 == 0) {
|
||||
+ return super.isCollidable(ignoreClimbing);
|
||||
+ }
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ @Override
|
||||
+ public boolean isLobotomized() {
|
||||
+ if (!this.level.kaiijuConfig.lobotomizeAnimalEnabled) return false;
|
||||
+ return this.lobotomized.isLobotomized();
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
/* CraftBukkit start
|
||||
// Function disabled as it has no special function anymore after
|
||||
// setSitting is disabled.
|
||||
@@ -102,6 +126,7 @@ public abstract class Animal extends AgeableMob {
|
||||
if (this.loveCause != null) {
|
||||
nbt.putUUID("LoveCause", this.loveCause);
|
||||
}
|
||||
+ nbt.putBoolean("Kaiiju.Lobotomized", this.lobotomized.isLobotomized()); // Kaiiju
|
||||
|
||||
}
|
||||
|
||||
@@ -115,6 +140,13 @@ public abstract class Animal extends AgeableMob {
|
||||
super.readAdditionalSaveData(nbt);
|
||||
this.inLove = nbt.getInt("InLove");
|
||||
this.loveCause = nbt.hasUUID("LoveCause") ? nbt.getUUID("LoveCause") : null;
|
||||
+ // Kaiiju start
|
||||
+ boolean isLobotomized = nbt.getBoolean("Kaiiju.Lobotomized");
|
||||
+ this.lobotomized.setLobotomized(isLobotomized);
|
||||
+ if (isLobotomized) {
|
||||
+ this.onGround = true;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
public static boolean checkAnimalSpawnRules(EntityType<? extends Animal> type, LevelAccessor world, MobSpawnType spawnReason, BlockPos pos, RandomSource random) {
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Bee.java b/src/main/java/net/minecraft/world/entity/animal/Bee.java
|
||||
index 87bd7991a81a2e30ecfccb60e614d7f13acd3744..1c2db953155498606f1e052580e7aa9ca846a53c 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Bee.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Bee.java
|
||||
@@ -1047,6 +1047,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
|
||||
@Override
|
||||
public boolean canBeeUse() {
|
||||
+ if (Bee.this.isLobotomized()) return false; // Kaiiju
|
||||
return Bee.this.remainingCooldownBeforeLocatingNewHive == 0 && !Bee.this.hasHive() && Bee.this.wantsToEnterHive();
|
||||
}
|
||||
|
||||
@@ -1113,6 +1114,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
|
||||
@Override
|
||||
public boolean canBeeUse() {
|
||||
+ if (Bee.this.isLobotomized()) return false; // Kaiiju
|
||||
return Bee.this.hivePos != null && !Bee.this.hasRestriction() && Bee.this.wantsToEnterHive() && !this.hasReachedTarget(Bee.this.hivePos) && Bee.this.level.getBlockState(Bee.this.hivePos).is(BlockTags.BEEHIVES);
|
||||
}
|
||||
|
||||
@@ -1229,6 +1231,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
|
||||
@Override
|
||||
public boolean canBeeUse() {
|
||||
+ if (Bee.this.isLobotomized()) return false; // Kaiiju
|
||||
return Bee.this.savedFlowerPos != null && !Bee.this.hasRestriction() && this.wantsToGoToKnownFlower() && Bee.this.isFlowerValid(Bee.this.savedFlowerPos) && !Bee.this.closerThan(Bee.this.savedFlowerPos, 2);
|
||||
}
|
||||
|
||||
@@ -1281,6 +1284,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal {
|
||||
|
||||
@Override
|
||||
public boolean canBeeUse() {
|
||||
+ if (Bee.this.isLobotomized()) return false; // Kaiiju
|
||||
return Bee.this.getCropsGrownSincePollination() >= 10 ? false : (Bee.this.random.nextFloat() < 0.3F ? false : Bee.this.hasNectar() && Bee.this.isHiveValid());
|
||||
}
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 16 Feb 2023 01:49:54 +0200
|
||||
Subject: [PATCH] Purpur Network Send Null Entity Packets
|
||||
Subject: [PATCH] Send null entity packets
|
||||
|
||||
This is from Purpur. Don't send null entity packets.
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 7c6d43d8a360530344ef296f4477750c8a298607..ab08e11f13921163b8ff1ff51ff9e9b86d2b47c7 100644
|
||||
index fa829cef4033625470dfae29ddf777e6c5ab8c55..47e23a196ae5e44600a64184b69141c00235baca 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -198,7 +198,10 @@ public class KaiijuConfig {
|
||||
private static void regionFormatSettings() {
|
||||
regionFormatDebug = getBoolean("region-format.debug", regionFormatDebug);
|
||||
@@ -203,7 +203,10 @@ public class KaiijuConfig {
|
||||
else
|
||||
linearFlushThreads = Math.max(linearFlushThreads, 1);
|
||||
}
|
||||
+
|
||||
+ public static boolean sendNullEntityPackets = true;
|
||||
@@ -20,12 +21,12 @@ index 7c6d43d8a360530344ef296f4477750c8a298607..ab08e11f13921163b8ff1ff51ff9e9b8
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerEntity.java b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
||||
index 0f9a3a6c05fee59c29764f0c0d7a6cb8a2a861b1..9d0a52bf600583ecbf80c2233a01ff43e609266f 100644
|
||||
index 81d0b2933040a451441f660f9e46199ae3b111e3..cdbc4be679d7e096c1005eaf84b74c4877479c43 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerEntity.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerEntity.java
|
||||
@@ -186,6 +186,11 @@ public class ServerEntity {
|
||||
this.teleportDelay = 0;
|
||||
packet1 = new ClientboundTeleportEntityPacket(this.entity);
|
||||
@@ -201,6 +201,11 @@ public class ServerEntity {
|
||||
flag4 = true;
|
||||
flag5 = true;
|
||||
}
|
||||
+ // Kaiiju start - Don't send null move entity packets
|
||||
+ if (!dev.kaiijumc.kaiiju.KaiijuConfig.sendNullEntityPackets && isNullMovePacket(packet1)) {
|
||||
@@ -35,8 +36,8 @@ index 0f9a3a6c05fee59c29764f0c0d7a6cb8a2a861b1..9d0a52bf600583ecbf80c2233a01ff43
|
||||
}
|
||||
|
||||
if ((this.trackDelta || this.entity.hasImpulse || this.entity instanceof LivingEntity && ((LivingEntity) this.entity).isFallFlying()) && this.tickCount > 0) {
|
||||
@@ -252,6 +257,20 @@ public class ServerEntity {
|
||||
|
||||
@@ -273,6 +278,20 @@ public class ServerEntity {
|
||||
});
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Don't send null move entity packets
|
||||
@@ -52,7 +53,7 @@ index 0f9a3a6c05fee59c29764f0c0d7a6cb8a2a861b1..9d0a52bf600583ecbf80c2233a01ff43
|
||||
+ return false;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
+
|
||||
public void removePairing(ServerPlayer player) {
|
||||
this.entity.stopSeenByPlayer(player);
|
||||
player.connection.send(new ClientboundRemoveEntitiesPacket(new int[]{this.entity.getId()}));
|
||||
73
patches/server/0007-Alternate-Keepalive.patch
Normal file
73
patches/server/0007-Alternate-Keepalive.patch
Normal file
@@ -0,0 +1,73 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 31 Mar 2023 01:52:44 +0300
|
||||
Subject: [PATCH] Alternate Keepalive
|
||||
|
||||
Don't kick players because 1 keepalive is lost.
|
||||
This patch is from Purpur.
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 47e23a196ae5e44600a64184b69141c00235baca..95b53b50606ea0ad47f407bebbb9e2bd445c0e66 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -205,8 +205,10 @@ public class KaiijuConfig {
|
||||
}
|
||||
|
||||
public static boolean sendNullEntityPackets = true;
|
||||
+ public static boolean alternateKeepAlive = false;
|
||||
|
||||
private static void networkSettings() {
|
||||
sendNullEntityPackets = getBoolean("network.send-null-entity-packets", sendNullEntityPackets);
|
||||
+ alternateKeepAlive = getBoolean("network.alternate-keepalive", alternateKeepAlive);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
index 678bba9d636a0eb34270a2d26b5b3d0d6d900115..564b2e668d50f05863080288d20bd54077588db9 100644
|
||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -265,6 +265,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||
private long keepAliveTime = Util.getMillis();
|
||||
private boolean keepAlivePending;
|
||||
private long keepAliveChallenge;
|
||||
+ private it.unimi.dsi.fastutil.longs.LongList keepAlives = new it.unimi.dsi.fastutil.longs.LongArrayList(); // Kaiiju
|
||||
// CraftBukkit start - multithreaded fields
|
||||
private final AtomicInteger chatSpamTickCount = new AtomicInteger();
|
||||
private final java.util.concurrent.atomic.AtomicInteger tabSpamLimiter = new java.util.concurrent.atomic.AtomicInteger(); // Paper - configurable tab spam limits
|
||||
@@ -357,6 +358,20 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||
long currentTime = Util.getMillis();
|
||||
long elapsedTime = currentTime - this.keepAliveTime;
|
||||
|
||||
+ // Kaiiju start
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.alternateKeepAlive) {
|
||||
+ if (elapsedTime >= 1000L) { // 1 second
|
||||
+ if (!processedDisconnect && keepAlives.size() * 1000L >= KEEPALIVE_LIMIT) {
|
||||
+ LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName());
|
||||
+ disconnect(Component.translatable("disconnect.timeout"), org.bukkit.event.player.PlayerKickEvent.Cause.TIMEOUT);
|
||||
+ } else {
|
||||
+ keepAliveTime = currentTime; // hijack this field for 1 second intervals
|
||||
+ keepAlives.add(currentTime); // currentTime is ID
|
||||
+ send(new ClientboundKeepAlivePacket(currentTime));
|
||||
+ }
|
||||
+ }
|
||||
+ } else
|
||||
+ // Kaiiju end
|
||||
if (this.keepAlivePending) {
|
||||
if (!this.processedDisconnect && elapsedTime >= KEEPALIVE_LIMIT) { // check keepalive limit, don't fire if already disconnected
|
||||
ServerGamePacketListenerImpl.LOGGER.warn("{} was kicked due to keepalive timeout!", this.player.getScoreboardName()); // more info
|
||||
@@ -3610,6 +3625,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||
|
||||
@Override
|
||||
public void handleKeepAlive(ServerboundKeepAlivePacket packet) {
|
||||
+ // Kaiiju start
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.alternateKeepAlive) {
|
||||
+ long id = packet.getId();
|
||||
+ if (keepAlives.size() > 0 && keepAlives.contains(id)) {
|
||||
+ int ping = (int) (Util.getMillis() - id);
|
||||
+ player.latency = (player.latency * 3 + ping) / 4;
|
||||
+ keepAlives.clear(); // we got a valid response, lets roll with it and forget the rest
|
||||
+ }
|
||||
+ } else
|
||||
+ // Kaiiju end
|
||||
//PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel()); // CraftBukkit // Paper - This shouldn't be on the main thread
|
||||
if (this.keepAlivePending && packet.getId() == this.keepAliveChallenge) {
|
||||
int i = (int) (Util.getMillis() - this.keepAliveTime);
|
||||
@@ -1,176 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: kugge <sofiane.djerbi38@gmail.com>
|
||||
Date: Mon, 13 Feb 2023 00:53:40 +0100
|
||||
Subject: [PATCH] Kaiiju Lobotomize Villager
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index b99b438b92587f23c77c5321d5d23e76dc5450de..104f19cced8fb3b692e3a4772360d9eba3bdd6f2 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -149,6 +149,13 @@ public class KaiijuWorldConfig {
|
||||
public boolean lobotomizeAnimalCheckCanJump = true;
|
||||
public boolean lobotomizeAnimalLookAtPlayer = false;
|
||||
public boolean lobotomizeAnimalFloat = true;
|
||||
+ public boolean lobotomizeVillagerEnabled = false;
|
||||
+ public int lobotomizeVillagerCheckInterval = 100;
|
||||
+ public boolean lobotomizeVillagerDoRaids = true;
|
||||
+ public boolean lobotomizeVillagerCheckCanJump = true;
|
||||
+ public boolean lobotomizeVillagerCheckOnBed = true;
|
||||
+ public boolean lobotomizeVillagerCheckJobSite = true;
|
||||
+ public boolean lobotomizeVillagerCheckBedNearby = true;
|
||||
|
||||
private void lobotomizeSettings() {
|
||||
lobotomizeAnimalEnabled = getBoolean("lobotomize.animal.enabled", lobotomizeAnimalEnabled);
|
||||
@@ -156,5 +163,12 @@ public class KaiijuWorldConfig {
|
||||
lobotomizeAnimalCheckCanJump = getBoolean("lobotomize.animal.check-can-jump", lobotomizeAnimalCheckCanJump);
|
||||
lobotomizeAnimalLookAtPlayer = getBoolean("lobotomize.animal.look-at-player", lobotomizeAnimalLookAtPlayer);
|
||||
lobotomizeAnimalFloat = getBoolean("lobotomize.animal.float", lobotomizeAnimalFloat);
|
||||
+ lobotomizeVillagerEnabled = getBoolean("lobotomize.villager.enabled", lobotomizeVillagerEnabled);
|
||||
+ lobotomizeVillagerDoRaids = getBoolean("lobotomize.villager.do-raids", lobotomizeVillagerDoRaids);
|
||||
+ lobotomizeVillagerCheckInterval = getInt("lobotomize.villager.check-interval", lobotomizeVillagerCheckInterval);
|
||||
+ lobotomizeVillagerCheckCanJump = getBoolean("lobotomize.villager.check-can-jump", lobotomizeVillagerCheckCanJump);
|
||||
+ lobotomizeVillagerCheckOnBed = getBoolean("lobotomize.villager.check-on-bed", lobotomizeVillagerCheckOnBed);
|
||||
+ lobotomizeVillagerCheckJobSite = getBoolean("lobotomize.villager.check-job-site", lobotomizeVillagerCheckJobSite);
|
||||
+ lobotomizeVillagerCheckBedNearby = getBoolean("lobotomize.villager.check-bed-nearby", lobotomizeVillagerCheckBedNearby);
|
||||
}
|
||||
}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/npc/Villager.java b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||||
index aed1d9ccffe471b6c2a1d52d2d3d097f6431318b..f1a66bda9949eff5f8e420d28d23f47aec3d4587 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/npc/Villager.java
|
||||
@@ -200,14 +200,14 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
}
|
||||
|
||||
private boolean checkLobotomized() {
|
||||
- int interval = this.level.purpurConfig.villagerLobotomizeCheckInterval;
|
||||
+ int interval = this.level.kaiijuConfig.lobotomizeVillagerCheckInterval; // Kaiiju
|
||||
if (this.notLobotomizedCount > 3) {
|
||||
// check half as often if not lobotomized for the last 3+ consecutive checks
|
||||
interval *= 2;
|
||||
}
|
||||
- if (this.level.getGameTime() % interval == 0) {
|
||||
+ if ((this.getId() + this.tickCount) % interval == 0) { // Kaiiju - Avoid check lags
|
||||
// offset Y for short blocks like dirt_path/farmland
|
||||
- this.isLobotomized = !canTravelFrom(new BlockPos(getX(), getY() + 0.0625D, getZ()));
|
||||
+ this.isLobotomized = needLobotomy(); // Kaiiju - Override
|
||||
|
||||
if (this.isLobotomized) {
|
||||
this.notLobotomizedCount = 0;
|
||||
@@ -219,9 +219,80 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
}
|
||||
|
||||
private boolean canTravelFrom(BlockPos pos) {
|
||||
- return canTravelTo(pos.east()) || canTravelTo(pos.west()) || canTravelTo(pos.north()) || canTravelTo(pos.south());
|
||||
+ return canInteractAt(pos.east()) || canInteractAt(pos.west()) || canInteractAt(pos.north()) || canInteractAt(pos.south()); // Kaiiju
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Customize canTravelTo checks
|
||||
+ private boolean needLobotomy() {
|
||||
+ if (this.isSleeping()) return false;
|
||||
+ if (this.level.kaiijuConfig.lobotomizeVillagerCheckOnBed && isOnBed()) return false;
|
||||
+ return !canTravelFrom(new BlockPos(getX(), getY() + 0.5D, getZ()));
|
||||
+ }
|
||||
+
|
||||
+ private boolean canInteractAt(BlockPos pos) {
|
||||
+ net.minecraft.world.level.block.state.BlockState top = null;
|
||||
+ // Check if mob can jump over block
|
||||
+ if (this.level.kaiijuConfig.lobotomizeVillagerCheckCanJump && this.canJump()) {
|
||||
+ top = this.level.getBlockStateIfLoaded(pos.above());
|
||||
+ if (top == null) return false;
|
||||
+ if (top.isPathfindable(level, pos, net.minecraft.world.level.pathfinder.PathComputationType.LAND)) {
|
||||
+ net.minecraft.world.level.block.state.BlockState above = this.level.getBlockState(pos.above(2));
|
||||
+ if (above.isPathfindable(level, pos, net.minecraft.world.level.pathfinder.PathComputationType.LAND)) return true;
|
||||
+ }
|
||||
+ }
|
||||
+ // Otherwise, check if mob can interact with bottom block
|
||||
+ net.minecraft.world.level.block.state.BlockState bottom = this.level.getBlockStateIfLoaded(pos);
|
||||
+ if (bottom == null) return false;
|
||||
+ net.minecraft.world.level.block.Block bottomBlock = bottom.getBlock();
|
||||
+ if (isTallBlock(bottomBlock)) return false;
|
||||
+ if (this.level.kaiijuConfig.lobotomizeVillagerCheckBedNearby && isBed(bottomBlock)) return true;
|
||||
+ if (this.level.kaiijuConfig.lobotomizeVillagerCheckJobSite && isInteractiveJobSite(bottomBlock, this.getVillagerData().getProfession())) return true;
|
||||
+ // If he can't interact, check if he can travel
|
||||
+ if (!bottom.isPathfindable(level, pos, net.minecraft.world.level.pathfinder.PathComputationType.LAND)) return false;
|
||||
+ if (top == null) top = this.level.getBlockState(pos.above());
|
||||
+ return top.isPathfindable(level, pos, net.minecraft.world.level.pathfinder.PathComputationType.LAND);
|
||||
+ }
|
||||
+
|
||||
+ private boolean canJump() {
|
||||
+ BlockPos pos = new BlockPos(getX(), getY() + 2.5D, getZ());
|
||||
+ net.minecraft.world.level.block.Block above = this.level.getBlockIfLoaded(pos);
|
||||
+ return !above.hasCollision;
|
||||
+ }
|
||||
+
|
||||
+ private boolean isOnBed() {
|
||||
+ BlockPos pos = new BlockPos(getX(), getY() - 0.5D, getZ());
|
||||
+ net.minecraft.world.level.block.Block below = this.level.getBlockIfLoaded(pos);
|
||||
+ return isBed(below);
|
||||
+ }
|
||||
+
|
||||
+ private static boolean isBed(net.minecraft.world.level.block.Block block) {
|
||||
+ return block instanceof net.minecraft.world.level.block.BedBlock;
|
||||
+ }
|
||||
+
|
||||
+ private boolean isInteractiveJobSite(net.minecraft.world.level.block.Block block, VillagerProfession profession) {
|
||||
+ if (this.lastTradedPlayer == null) return false;
|
||||
+ return (block instanceof net.minecraft.world.level.block.BlastFurnaceBlock && profession != VillagerProfession.ARMORER) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.SmokerBlock && profession != VillagerProfession.BUTCHER) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.CartographyTableBlock && profession != VillagerProfession.CARTOGRAPHER) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.BrewingStandBlock && profession != VillagerProfession.CLERIC) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.ComposterBlock && profession != VillagerProfession.FARMER) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.BarrelBlock && profession != VillagerProfession.FISHERMAN) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.FletchingTableBlock && profession != VillagerProfession.FLETCHER) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.CauldronBlock && profession != VillagerProfession.LEATHERWORKER) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.LecternBlock && profession != VillagerProfession.LIBRARIAN) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.StonecutterBlock && profession != VillagerProfession.MASON) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.LoomBlock && profession != VillagerProfession.SHEPHERD) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.SmithingTableBlock && profession != VillagerProfession.TOOLSMITH) ||
|
||||
+ (block instanceof net.minecraft.world.level.block.GrindstoneBlock && profession != VillagerProfession.WEAPONSMITH);
|
||||
+ }
|
||||
+
|
||||
+ private static boolean isTallBlock(net.minecraft.world.level.block.Block block) {
|
||||
+ return block instanceof net.minecraft.world.level.block.FenceBlock ||
|
||||
+ block instanceof net.minecraft.world.level.block.FenceGateBlock ||
|
||||
+ block instanceof net.minecraft.world.level.block.WallBlock;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
private boolean canTravelTo(BlockPos pos) {
|
||||
net.minecraft.world.level.block.state.BlockState state = this.level.getBlockStateIfLoaded(pos);
|
||||
if (state == null) {
|
||||
@@ -337,7 +408,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
protected void mobTick(boolean inactive) {
|
||||
//this.level.getProfiler().push("villagerBrain"); // Purpur
|
||||
// Purpur start
|
||||
- if (this.level.purpurConfig.villagerLobotomizeEnabled) {
|
||||
+ if (this.level.kaiijuConfig.lobotomizeVillagerEnabled) { // Kaiiju - Override
|
||||
// treat as inactive if lobotomized
|
||||
inactive = inactive || checkLobotomized();
|
||||
} else {
|
||||
@@ -380,7 +451,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
this.lastTradedPlayer = null;
|
||||
}
|
||||
|
||||
- if (!inactive && !this.isNoAi() && this.random.nextInt(100) == 0) { // Paper
|
||||
+ if ((!inactive || (this.level.kaiijuConfig.lobotomizeVillagerDoRaids && this.isLobotomized)) && !this.isNoAi() && this.random.nextInt(100) == 0) { // Paper // Kaiiju
|
||||
Raid raid = ((ServerLevel) this.level).getRaidAt(this.blockPosition());
|
||||
|
||||
if (raid != null && raid.isActive() && !raid.isOver()) {
|
||||
@@ -647,6 +718,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
if (this.assignProfessionWhenSpawned) {
|
||||
nbt.putBoolean("AssignProfessionWhenSpawned", true);
|
||||
}
|
||||
+ nbt.putBoolean("Kaiiju.Lobotomized", this.isLobotomized()); // Kaiiju
|
||||
|
||||
}
|
||||
|
||||
@@ -687,6 +759,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
|
||||
if (nbt.contains("AssignProfessionWhenSpawned")) {
|
||||
this.assignProfessionWhenSpawned = nbt.getBoolean("AssignProfessionWhenSpawned");
|
||||
}
|
||||
+ this.isLobotomized = nbt.getBoolean("Kaiiju.Lobotomized"); // Kaiiju
|
||||
|
||||
}
|
||||
|
||||
30
patches/server/0008-Optimization-Configuration.patch
Normal file
30
patches/server/0008-Optimization-Configuration.patch
Normal file
@@ -0,0 +1,30 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: kugge <sofiane.djerbi38@gmail.com>
|
||||
Date: Wed, 21 Jun 2023 17:26:24 +0200
|
||||
Subject: [PATCH] Optimization Configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 95b53b50606ea0ad47f407bebbb9e2bd445c0e66..8aab072a21b0775338b8235a84f5f675f385cf37 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -211,4 +211,7 @@ public class KaiijuConfig {
|
||||
sendNullEntityPackets = getBoolean("network.send-null-entity-packets", sendNullEntityPackets);
|
||||
alternateKeepAlive = getBoolean("network.alternate-keepalive", alternateKeepAlive);
|
||||
}
|
||||
+
|
||||
+ private static void optimizationSettings() {
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index a6e7af5f4148e067660e9f5beeacde3a59a1de9c..6bd14857e0b0ef233f17f1a6e3e0fb313d59f641 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -143,4 +143,7 @@ public class KaiijuWorldConfig {
|
||||
regionFormatLinearCompressionLevel = 1;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ private void optimizationSettings() {
|
||||
+ }
|
||||
}
|
||||
30
patches/server/0009-Gameplay-Configuration.patch
Normal file
30
patches/server/0009-Gameplay-Configuration.patch
Normal file
@@ -0,0 +1,30 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sat, 8 Apr 2023 23:32:34 +0300
|
||||
Subject: [PATCH] Gameplay Configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 8aab072a21b0775338b8235a84f5f675f385cf37..46ae5b84ee5b87b0ed0b93e920689e44288a50d2 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -214,4 +214,7 @@ public class KaiijuConfig {
|
||||
|
||||
private static void optimizationSettings() {
|
||||
}
|
||||
+
|
||||
+ private static void gameplaySettings() {
|
||||
+ }
|
||||
}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 6bd14857e0b0ef233f17f1a6e3e0fb313d59f641..05f9c01131e78927d88f1170c3eda4adf25ac8ba 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -146,4 +146,7 @@ public class KaiijuWorldConfig {
|
||||
|
||||
private void optimizationSettings() {
|
||||
}
|
||||
+
|
||||
+ private void gameplaySettings() {
|
||||
+ }
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 16 Feb 2023 21:28:49 +0200
|
||||
Subject: [PATCH] Kaiiju Lithium Configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 6f16786e6107b9e9b52cdbd052c633e757fe351f..913f2f26b1d022e8a812af7caa5dfca5fa548782 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -204,4 +204,9 @@ public class KaiijuConfig {
|
||||
private static void networkSettings() {
|
||||
sendNullEntityPackets = getBoolean("network.send-null-entity-packets", sendNullEntityPackets);
|
||||
}
|
||||
+
|
||||
+ public static boolean lithiumEnable = true;
|
||||
+ private static void lithiumSettings() {
|
||||
+ lithiumEnable = getBoolean("lithium.enable", lithiumEnable);
|
||||
+ }
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Sat, 8 Apr 2023 23:38:13 +0300
|
||||
Subject: [PATCH] Shulker drop contents when destroyed
|
||||
|
||||
Don't drop shulker contents when shulker items are destroyed (by cactus,
|
||||
lava..)
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 05f9c01131e78927d88f1170c3eda4adf25ac8ba..55dcbb48450b24f80e0a04bedeb54f64e94ebb9e 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -144,7 +144,10 @@ public class KaiijuWorldConfig {
|
||||
}
|
||||
}
|
||||
|
||||
+ public boolean shulkerBoxDropContentsWhenDestroyed = true;
|
||||
+
|
||||
private void optimizationSettings() {
|
||||
+ shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
}
|
||||
|
||||
private void gameplaySettings() {
|
||||
diff --git a/src/main/java/net/minecraft/world/item/BlockItem.java b/src/main/java/net/minecraft/world/item/BlockItem.java
|
||||
index ebee8de2ed831755b6fd154f6cc77ac993839bb9..ce5faefe3b67087509833800f0472f14131f2011 100644
|
||||
--- a/src/main/java/net/minecraft/world/item/BlockItem.java
|
||||
+++ b/src/main/java/net/minecraft/world/item/BlockItem.java
|
||||
@@ -288,7 +288,7 @@ public class BlockItem extends Item {
|
||||
|
||||
@Override
|
||||
public void onDestroyed(ItemEntity entity) {
|
||||
- if (this.block instanceof ShulkerBoxBlock) {
|
||||
+ if (this.block instanceof ShulkerBoxBlock && entity.level().kaiijuConfig.shulkerBoxDropContentsWhenDestroyed) { // Kaiiju
|
||||
ItemStack itemstack = entity.getItem();
|
||||
CompoundTag nbttagcompound = BlockItem.getBlockEntityData(itemstack);
|
||||
|
||||
@@ -1,125 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 16 Feb 2023 21:34:37 +0200
|
||||
Subject: [PATCH] Lithium Math FastUtil
|
||||
|
||||
Author: JellySquid
|
||||
Licence: LGPL-3.0
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 913f2f26b1d022e8a812af7caa5dfca5fa548782..95742b2ec27156071867a9467669b350f3ad4280 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -206,7 +206,9 @@ public class KaiijuConfig {
|
||||
}
|
||||
|
||||
public static boolean lithiumEnable = true;
|
||||
+ public static boolean lithiumMathFastUtil = true;
|
||||
private static void lithiumSettings() {
|
||||
lithiumEnable = getBoolean("lithium.enable", lithiumEnable);
|
||||
+ lithiumMathFastUtil = getBoolean("lithium.math.fast-util", lithiumMathFastUtil) && lithiumEnable;
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/core/AxisCycle.java b/src/main/java/net/minecraft/core/AxisCycle.java
|
||||
index b5d8a60dc78a76c0a55bfc30cc49d26857bd914a..dd8d98acf21bb676e86f9befb45fd09e1b14a01d 100644
|
||||
--- a/src/main/java/net/minecraft/core/AxisCycle.java
|
||||
+++ b/src/main/java/net/minecraft/core/AxisCycle.java
|
||||
@@ -35,6 +35,18 @@ public enum AxisCycle {
|
||||
|
||||
@Override
|
||||
public Direction.Axis cycle(Direction.Axis axis) {
|
||||
+ // Kaiiju start - Lithium
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathFastUtil){
|
||||
+ switch (axis.ordinal()) {
|
||||
+ case 0: //X
|
||||
+ return Direction.Axis.Y;
|
||||
+ case 1: //Y
|
||||
+ return Direction.Axis.Z;
|
||||
+ case 2: //Z
|
||||
+ return Direction.Axis.X;
|
||||
+ }
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
return AXIS_VALUES[Math.floorMod(axis.ordinal() + 1, 3)];
|
||||
}
|
||||
|
||||
@@ -56,6 +68,18 @@ public enum AxisCycle {
|
||||
|
||||
@Override
|
||||
public Direction.Axis cycle(Direction.Axis axis) {
|
||||
+ // Kaiiju start - Lithium
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathFastUtil){
|
||||
+ switch (axis.ordinal()) {
|
||||
+ case 0: //X
|
||||
+ return Direction.Axis.Z;
|
||||
+ case 1: //Y
|
||||
+ return Direction.Axis.X;
|
||||
+ case 2: //Z
|
||||
+ return Direction.Axis.Y;
|
||||
+ }
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
return AXIS_VALUES[Math.floorMod(axis.ordinal() - 1, 3)];
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/core/Direction.java b/src/main/java/net/minecraft/core/Direction.java
|
||||
index a4dc96b1a3bf309584657e3a1e7dfaea967f9425..09c1989dc3b12d9488b8869e71f2a4890656cc36 100644
|
||||
--- a/src/main/java/net/minecraft/core/Direction.java
|
||||
+++ b/src/main/java/net/minecraft/core/Direction.java
|
||||
@@ -191,6 +191,7 @@ public enum Direction implements StringRepresentable {
|
||||
}
|
||||
|
||||
public Direction getOpposite() {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathFastUtil) return VALUES[this.oppositeIndex]; // Kaiiju
|
||||
return from3DDataValue(this.oppositeIndex);
|
||||
}
|
||||
|
||||
@@ -453,6 +454,7 @@ public enum Direction implements StringRepresentable {
|
||||
}
|
||||
|
||||
public static Direction getRandom(RandomSource random) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathFastUtil) return VALUES[random.nextInt(VALUES.length)]; // Kaiiju
|
||||
return Util.getRandom(VALUES, random);
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/phys/AABB.java b/src/main/java/net/minecraft/world/phys/AABB.java
|
||||
index cfb2e46b34b2982d6724f18214557fc80cf4adfa..4fae201f57dc23ed0e25f17739f97133a7f7534c 100644
|
||||
--- a/src/main/java/net/minecraft/world/phys/AABB.java
|
||||
+++ b/src/main/java/net/minecraft/world/phys/AABB.java
|
||||
@@ -81,10 +81,36 @@ public class AABB {
|
||||
}
|
||||
|
||||
public double min(Direction.Axis axis) {
|
||||
+ // Kaiiju start - Lithium
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathFastUtil){
|
||||
+ switch (axis.ordinal()) {
|
||||
+ case 0: //X
|
||||
+ return this.minX;
|
||||
+ case 1: //Y
|
||||
+ return this.minY;
|
||||
+ case 2: //Z
|
||||
+ return this.minZ;
|
||||
+ }
|
||||
+ throw new IllegalArgumentException();
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
return axis.choose(this.minX, this.minY, this.minZ);
|
||||
}
|
||||
|
||||
public double max(Direction.Axis axis) {
|
||||
+ // Kaiiju start - Lithium
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathFastUtil){
|
||||
+ switch (axis.ordinal()) {
|
||||
+ case 0: //X
|
||||
+ return this.maxX;
|
||||
+ case 1: //Y
|
||||
+ return this.maxY;
|
||||
+ case 2: //Z
|
||||
+ return this.maxZ;
|
||||
+ }
|
||||
+ throw new IllegalArgumentException();
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
return axis.choose(this.maxX, this.maxY, this.maxZ);
|
||||
}
|
||||
|
||||
33
patches/server/0011-Server-mod-name.patch
Normal file
33
patches/server/0011-Server-mod-name.patch
Normal file
@@ -0,0 +1,33 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 9 Apr 2023 17:06:46 +0300
|
||||
Subject: [PATCH] Server mod name
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 46ae5b84ee5b87b0ed0b93e920689e44288a50d2..778de435ca3c13ccc2f2d86030e3529436a2d945 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -215,6 +215,9 @@ public class KaiijuConfig {
|
||||
private static void optimizationSettings() {
|
||||
}
|
||||
|
||||
+ public static String serverModName = "Kaiiju";
|
||||
+
|
||||
private static void gameplaySettings() {
|
||||
+ serverModName = getString("gameplay.server-mod-name", serverModName);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index 7243443d4bf24ad0b32b8a76d9b8701cca8612a7..3a358d159532faaf29af0118ecbfc255d9610969 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -1811,7 +1811,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
|
||||
|
||||
@DontObfuscate
|
||||
public String getServerModName() {
|
||||
- return "Kaiiju"; // Kaiiju - Kaiiju > // Folia - Folia > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
|
||||
+ return dev.kaiijumc.kaiiju.KaiijuConfig.serverModName; // Kaiiju - Kaiiju > // Folia - Folia > // Paper - Paper > // Spigot - Spigot > // CraftBukkit - cb > vanilla!
|
||||
}
|
||||
|
||||
public SystemReport fillSystemReport(SystemReport details) {
|
||||
227
patches/server/0012-Crash-on-broken-symlink.patch
Normal file
227
patches/server/0012-Crash-on-broken-symlink.patch
Normal file
@@ -0,0 +1,227 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Fri, 14 Apr 2023 02:12:58 +0200
|
||||
Subject: [PATCH] Crash on broken symlink
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 55dcbb48450b24f80e0a04bedeb54f64e94ebb9e..f3f824d0ab1a2a72825c40b67192386479a0b34c 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -127,6 +127,7 @@ public class KaiijuWorldConfig {
|
||||
}
|
||||
|
||||
public RegionFileFormat regionFormatName = RegionFileFormat.ANVIL;
|
||||
+ public boolean linearCrashOnBrokenSymlink = true;
|
||||
public int regionFormatLinearCompressionLevel = 1;
|
||||
|
||||
private void regionFormatSettings() {
|
||||
@@ -142,6 +143,7 @@ public class KaiijuWorldConfig {
|
||||
log(Level.SEVERE, "Falling back to compression level 1.");
|
||||
regionFormatLinearCompressionLevel = 1;
|
||||
}
|
||||
+ linearCrashOnBrokenSymlink = getBoolean("region-format.linear.crash-on-broken-symlink", linearCrashOnBrokenSymlink);
|
||||
}
|
||||
|
||||
public boolean shulkerBoxDropContentsWhenDestroyed = true;
|
||||
diff --git a/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java b/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java
|
||||
index abf5e2a06af9853b58ac9107cd6e9787c4185c66..389c68c0becd2f69dc1004d0b383f1a8784214c0 100644
|
||||
--- a/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java
|
||||
+++ b/src/main/java/io/papermc/paper/world/ThreadedWorldUpgrader.java
|
||||
@@ -87,10 +87,11 @@ public class ThreadedWorldUpgrader {
|
||||
// Kaiiju start
|
||||
dev.kaiijumc.kaiiju.region.RegionFileFormat formatName = ((org.bukkit.craftbukkit.CraftWorld) org.bukkit.Bukkit.getWorld(worldName)).getHandle().kaiijuConfig.regionFormatName;
|
||||
int linearCompression = ((org.bukkit.craftbukkit.CraftWorld) org.bukkit.Bukkit.getWorld(worldName)).getHandle().kaiijuConfig.regionFormatLinearCompressionLevel;
|
||||
+ boolean linearCrashOnBrokenSymlink = ((org.bukkit.craftbukkit.CraftWorld) org.bukkit.Bukkit.getWorld(worldName)).getHandle().kaiijuConfig.linearCrashOnBrokenSymlink;
|
||||
LOGGER.info("Using format " + formatName + " (" + linearCompression + ")");
|
||||
// Kaiiju end
|
||||
final WorldInfo info = new WorldInfo(() -> worldPersistentData,
|
||||
- new ChunkStorage(formatName, linearCompression, regionFolder.toPath(), this.dataFixer, false), this.removeCaches, this.dimensionType, this.generatorKey); // Kaiiju
|
||||
+ new ChunkStorage(formatName, linearCompression, linearCrashOnBrokenSymlink, regionFolder.toPath(), this.dataFixer, false), this.removeCaches, this.dimensionType, this.generatorKey); // Kaiiju
|
||||
|
||||
long expectedChunks = (long)regionFiles.length * (32L * 32L);
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
index c4d28d887b4cc71dc713b1e3f46bc80f4484a95d..f50507ab85282d261985ce9b186581f5a7a50f79 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -269,7 +269,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
// Paper end
|
||||
|
||||
public ChunkMap(ServerLevel world, LevelStorageSource.LevelStorageAccess session, DataFixer dataFixer, StructureTemplateManager structureTemplateManager, Executor executor, BlockableEventLoop<Runnable> mainThreadExecutor, LightChunkGetter chunkProvider, ChunkGenerator chunkGenerator, ChunkProgressListener worldGenerationProgressListener, ChunkStatusUpdateListener chunkStatusChangeListener, Supplier<DimensionDataStorage> persistentStateManagerFactory, int viewDistance, boolean dsync) {
|
||||
- super(world.getLevel().kaiijuConfig.regionFormatName, world.getLevel().kaiijuConfig.regionFormatLinearCompressionLevel, session.getDimensionPath(world.dimension()).resolve("region"), dataFixer, dsync); // Kaiiju
|
||||
+ super(world.getLevel().kaiijuConfig.regionFormatName, world.getLevel().kaiijuConfig.regionFormatLinearCompressionLevel, world.getLevel().kaiijuConfig.linearCrashOnBrokenSymlink, session.getDimensionPath(world.dimension()).resolve("region"), dataFixer, dsync); // Kaiiju
|
||||
// Paper - rewrite chunk system
|
||||
this.tickingGenerated = new AtomicInteger();
|
||||
//this.playerMap = new PlayerMap(); // Folia - region threading
|
||||
@@ -314,7 +314,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
this.lightEngine = new ThreadedLevelLightEngine(chunkProvider, this, this.level.dimensionType().hasSkyLight(), null, null); // Paper - rewrite chunk system
|
||||
this.distanceManager = new ChunkMap.ChunkDistanceManager(executor, mainThreadExecutor);
|
||||
this.overworldDataStorage = persistentStateManagerFactory;
|
||||
- this.poiManager = new PoiManager(this.level.kaiijuConfig.regionFormatName, this.level.kaiijuConfig.regionFormatLinearCompressionLevel, path.resolve("poi"), dataFixer, dsync, iregistrycustom, world); // Kaiiju
|
||||
+ this.poiManager = new PoiManager(this.level.kaiijuConfig.regionFormatName, this.level.kaiijuConfig.regionFormatLinearCompressionLevel, this.level.kaiijuConfig.linearCrashOnBrokenSymlink, path.resolve("poi"), dataFixer, dsync, iregistrycustom, world); // Kaiiju
|
||||
this.setViewDistance(viewDistance);
|
||||
// Paper start
|
||||
this.dataRegionManager = new io.papermc.paper.chunk.SingleThreadChunkRegionManager(this.level, 2, (1.0 / 3.0), 1, 6, "Data", DataRegionData::new, DataRegionSectionData::new);
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
index e6e985e8e2c7cccb2c3395ae3fbc30072e1d48f0..ad896c8a3060f5c8d85a8b5707317de646bf9cae 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -453,8 +453,8 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
|
||||
private static final class EntityRegionFileStorage extends net.minecraft.world.level.chunk.storage.RegionFileStorage {
|
||||
|
||||
- public EntityRegionFileStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, Path directory, boolean dsync) { // Kaiiju
|
||||
- super(format, linearCompression, directory, dsync); // Kaiiju
|
||||
+ public EntityRegionFileStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path directory, boolean dsync) { // Kaiiju
|
||||
+ super(format, linearCompression, linearCrashOnBrokenSymlink, directory, dsync); // Kaiiju
|
||||
}
|
||||
|
||||
protected void write(ChunkPos pos, net.minecraft.nbt.CompoundTag nbt) throws IOException {
|
||||
@@ -693,7 +693,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
// CraftBukkit end
|
||||
boolean flag2 = minecraftserver.forceSynchronousWrites();
|
||||
DataFixer datafixer = minecraftserver.getFixerUpper();
|
||||
- this.entityStorage = new EntityRegionFileStorage(this.getLevel().kaiijuConfig.regionFormatName, this.getLevel().kaiijuConfig.regionFormatLinearCompressionLevel, convertable_conversionsession.getDimensionPath(resourcekey).resolve("entities"), flag2); // Paper - rewrite chunk system //EntityPersistentStorage<Entity> entitypersistentstorage = new EntityStorage(this, convertable_conversionsession.getDimensionPath(resourcekey).resolve("entities"), datafixer, flag2, minecraftserver); // Kaiiju
|
||||
+ this.entityStorage = new EntityRegionFileStorage(this.getLevel().kaiijuConfig.regionFormatName, this.getLevel().kaiijuConfig.regionFormatLinearCompressionLevel, this.getLevel().kaiijuConfig.linearCrashOnBrokenSymlink, convertable_conversionsession.getDimensionPath(resourcekey).resolve("entities"), flag2); // Paper - rewrite chunk system //EntityPersistentStorage<Entity> entitypersistentstorage = new EntityStorage(this, convertable_conversionsession.getDimensionPath(resourcekey).resolve("entities"), datafixer, flag2, minecraftserver); // Kaiiju
|
||||
|
||||
// this.entityManager = new PersistentEntitySectionManager<>(Entity.class, new ServerLevel.EntityCallbacks(), entitypersistentstorage, this.entitySliceManager); // Paper // Paper - rewrite chunk system
|
||||
StructureTemplateManager structuretemplatemanager = minecraftserver.getStructureManager();
|
||||
diff --git a/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java b/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java
|
||||
index ac35e7eb8cb5f19391a18eb9d6b5ba26769ce2f6..a9c6ca7c621bb2431bcf0ae879b192f748bf931b 100644
|
||||
--- a/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java
|
||||
+++ b/src/main/java/net/minecraft/util/worldupdate/WorldUpgrader.java
|
||||
@@ -120,7 +120,8 @@ public class WorldUpgrader {
|
||||
String worldName = this.levelStorage.getLevelId();
|
||||
dev.kaiijumc.kaiiju.region.RegionFileFormat formatName = ((org.bukkit.craftbukkit.CraftWorld) org.bukkit.Bukkit.getWorld(worldName)).getHandle().kaiijuConfig.regionFormatName;
|
||||
int linearCompression = ((org.bukkit.craftbukkit.CraftWorld) org.bukkit.Bukkit.getWorld(worldName)).getHandle().kaiijuConfig.regionFormatLinearCompressionLevel;
|
||||
- builder1.put(resourcekey1, new ChunkStorage(formatName, linearCompression, path.resolve("region"), this.dataFixer, true));
|
||||
+ boolean linearCrashOnBrokenSymlink = ((org.bukkit.craftbukkit.CraftWorld) org.bukkit.Bukkit.getWorld(worldName)).getHandle().kaiijuConfig.linearCrashOnBrokenSymlink;
|
||||
+ builder1.put(resourcekey1, new ChunkStorage(formatName, linearCompression, linearCrashOnBrokenSymlink, path.resolve("region"), this.dataFixer, true));
|
||||
// Kaiiju end
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/village/poi/PoiManager.java b/src/main/java/net/minecraft/world/entity/ai/village/poi/PoiManager.java
|
||||
index 187ff795192c7eb56dffafa1ff6fa3068ac341c3..b9cf3b9f2cdb554d267c6dc3436e011c7e607228 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/village/poi/PoiManager.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/village/poi/PoiManager.java
|
||||
@@ -59,8 +59,8 @@ public class PoiManager extends SectionStorage<PoiSection> {
|
||||
// Paper end - rewrite chunk system
|
||||
|
||||
|
||||
- public PoiManager(dev.kaiijumc.kaiiju.region.RegionFileFormat formatName, int linearCompression, Path path, DataFixer dataFixer, boolean dsync, RegistryAccess registryManager, LevelHeightAccessor world) { // Kaiiju
|
||||
- super(formatName, linearCompression, path, PoiSection::codec, PoiSection::new, dataFixer, DataFixTypes.POI_CHUNK, dsync, registryManager, world); // Kaiiju
|
||||
+ public PoiManager(dev.kaiijumc.kaiiju.region.RegionFileFormat formatName, int linearCompression, boolean linearCrashOnBrokenSymlink, Path path, DataFixer dataFixer, boolean dsync, RegistryAccess registryManager, LevelHeightAccessor world) { // Kaiiju
|
||||
+ super(formatName, linearCompression, linearCrashOnBrokenSymlink, path, PoiSection::codec, PoiSection::new, dataFixer, DataFixTypes.POI_CHUNK, dsync, registryManager, world); // Kaiiju
|
||||
this.world = (net.minecraft.server.level.ServerLevel)world; // Paper - rewrite chunk system
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
|
||||
index 1d880f27dd147da683fc30ed6f1bfa43ecdb7d93..41598adf6d49a44bcaadfff3797221460a6d93ba 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
|
||||
@@ -37,11 +37,11 @@ public class ChunkStorage implements AutoCloseable {
|
||||
public final RegionFileStorage regionFileCache;
|
||||
// Paper end - async chunk loading
|
||||
|
||||
- public ChunkStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, Path directory, DataFixer dataFixer, boolean dsync) { // Kaiiju
|
||||
+ public ChunkStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path directory, DataFixer dataFixer, boolean dsync) { // Kaiiju
|
||||
this.fixerUpper = dataFixer;
|
||||
// Paper start - async chunk io
|
||||
// remove IO worker
|
||||
- this.regionFileCache = new RegionFileStorage(format, linearCompression, directory, dsync, true); // Paper - nuke IOWorker // Paper
|
||||
+ this.regionFileCache = new RegionFileStorage(format, linearCompression, linearCrashOnBrokenSymlink, directory, dsync, true); // Paper - nuke IOWorker // Paper
|
||||
// Paper end - async chunk io
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
||||
index e91e8aef8b63ea9d94e0ecb3e4a62655a8c77ce1..bbc6a0c70cbafbfa411ab418e4fec11ad101ae91 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
||||
@@ -20,6 +20,7 @@ import net.minecraft.world.level.ChunkPos;
|
||||
|
||||
public class RegionFileStorage implements AutoCloseable {
|
||||
|
||||
+ private static final org.slf4j.Logger LOGGER = com.mojang.logging.LogUtils.getLogger(); // Kaiiju
|
||||
public static final String ANVIL_EXTENSION = ".mca";
|
||||
private static final int MAX_CACHE_SIZE = 256;
|
||||
public final Long2ObjectLinkedOpenHashMap<dev.kaiijumc.kaiiju.region.AbstractRegionFile> regionCache = new Long2ObjectLinkedOpenHashMap(); // Kaiiju
|
||||
@@ -28,6 +29,7 @@ public class RegionFileStorage implements AutoCloseable {
|
||||
// Kaiiju start - Per world chunk format
|
||||
public final dev.kaiijumc.kaiiju.region.RegionFileFormat format;
|
||||
public final int linearCompression;
|
||||
+ public final boolean linearCrashOnBrokenSymlink;
|
||||
// Kaiiju end
|
||||
private final boolean isChunkData; // Paper
|
||||
|
||||
@@ -60,14 +62,15 @@ public class RegionFileStorage implements AutoCloseable {
|
||||
}
|
||||
// Paper end - cache regionfile does not exist state
|
||||
|
||||
- protected RegionFileStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, Path directory, boolean dsync) { // Paper - protected constructor
|
||||
+ protected RegionFileStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path directory, boolean dsync) { // Paper - protected constructor
|
||||
// Paper start - add isChunkData param
|
||||
- this(format, linearCompression, directory, dsync, false);
|
||||
+ this(format, linearCompression, linearCrashOnBrokenSymlink, directory, dsync, false);
|
||||
}
|
||||
- RegionFileStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, Path directory, boolean dsync, boolean isChunkData) { // Kaiiju
|
||||
+ RegionFileStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path directory, boolean dsync, boolean isChunkData) { // Kaiiju
|
||||
// Kaiiju start
|
||||
this.format = format;
|
||||
this.linearCompression = linearCompression;
|
||||
+ this.linearCrashOnBrokenSymlink = linearCrashOnBrokenSymlink;
|
||||
// Kaiiju end
|
||||
this.isChunkData = isChunkData;
|
||||
// Paper end - add isChunkData param
|
||||
@@ -111,6 +114,20 @@ public class RegionFileStorage implements AutoCloseable {
|
||||
return regionfile != null ? regionfile.hasChunk(pos) : false;
|
||||
}
|
||||
|
||||
+ // Kaiiju start
|
||||
+ private void guardAgainstBrokenSymlinks(Path path) throws IOException {
|
||||
+ if (!linearCrashOnBrokenSymlink) return;
|
||||
+ if (!this.format.equals("LINEAR")) return;
|
||||
+ if (!java.nio.file.Files.isSymbolicLink(path)) return;
|
||||
+ Path link = java.nio.file.Files.readSymbolicLink(path);
|
||||
+ if (!java.nio.file.Files.exists(link) || !java.nio.file.Files.isReadable(link)) {
|
||||
+ LOGGER.error("Linear region file {} is a broken symbolic link, crashing to prevent data loss", path);
|
||||
+ net.minecraft.server.MinecraftServer.getServer().halt(false);
|
||||
+ throw new IOException("Linear region file " + path + " is a broken symbolic link, crashing to prevent data loss");
|
||||
+ }
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
public synchronized dev.kaiijumc.kaiiju.region.AbstractRegionFile getRegionFile(ChunkPos chunkcoordintpair, boolean existingOnly) throws IOException { // CraftBukkit // Kaiiju
|
||||
return this.getRegionFile(chunkcoordintpair, existingOnly, false);
|
||||
}
|
||||
@@ -146,6 +163,7 @@ public class RegionFileStorage implements AutoCloseable {
|
||||
if (existingOnly) {
|
||||
Path anvil = path.resolve("r." + j + "." + chunkcoordintpair.getRegionZ() + ".mca");
|
||||
Path linear = path.resolve("r." + j + "." + chunkcoordintpair.getRegionZ() + ".linear");
|
||||
+ guardAgainstBrokenSymlinks(linear);
|
||||
if (java.nio.file.Files.exists(anvil)) path1 = anvil;
|
||||
else if (java.nio.file.Files.exists(linear)) path1 = linear;
|
||||
else {
|
||||
@@ -161,6 +179,7 @@ public class RegionFileStorage implements AutoCloseable {
|
||||
};
|
||||
path1 = path.resolve("r." + j + "." + chunkcoordintpair.getRegionZ() + "." + extension);
|
||||
// Kaiiju end
|
||||
+ guardAgainstBrokenSymlinks(path1); // Kaiiju - Crash on broken symlink
|
||||
this.createRegionFile(regionPos);
|
||||
}
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java
|
||||
index 9394d191c56aab78e63fd3f283efedd69384e323..dcfe4a285cc5865be3b0c1b8104b722895135dd0 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/SectionStorage.java
|
||||
@@ -47,8 +47,8 @@ public class SectionStorage<R> extends RegionFileStorage implements AutoCloseabl
|
||||
public final RegistryAccess registryAccess; // Paper - rewrite chunk system
|
||||
protected final LevelHeightAccessor levelHeightAccessor;
|
||||
|
||||
- public SectionStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, Path path, Function<Runnable, Codec<R>> codecFactory, Function<Runnable, R> factory, DataFixer dataFixer, DataFixTypes dataFixTypes, boolean dsync, RegistryAccess dynamicRegistryManager, LevelHeightAccessor world) { // Kaiiju
|
||||
- super(format, linearCompression, path, dsync); // Paper - remove mojang I/O thread // Kaiiju
|
||||
+ public SectionStorage(dev.kaiijumc.kaiiju.region.RegionFileFormat format, int linearCompression, boolean linearCrashOnBrokenSymlink, Path path, Function<Runnable, Codec<R>> codecFactory, Function<Runnable, R> factory, DataFixer dataFixer, DataFixTypes dataFixTypes, boolean dsync, RegistryAccess dynamicRegistryManager, LevelHeightAccessor world) { // Kaiiju
|
||||
+ super(format, linearCompression, linearCrashOnBrokenSymlink, path, dsync); // Paper - remove mojang I/O thread // Kaiiju
|
||||
this.codec = codecFactory;
|
||||
this.factory = factory;
|
||||
this.fixerUpper = dataFixer;
|
||||
@@ -1,144 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 17 Feb 2023 00:34:31 +0200
|
||||
Subject: [PATCH] Lithium Math SineLut
|
||||
|
||||
Author: JellySquid
|
||||
Licence: LGPL-3.0
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 95742b2ec27156071867a9467669b350f3ad4280..8c713b71156375f248d97e2b117d22826eccdcca 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -207,8 +207,10 @@ public class KaiijuConfig {
|
||||
|
||||
public static boolean lithiumEnable = true;
|
||||
public static boolean lithiumMathFastUtil = true;
|
||||
+ public static boolean lithiumMathSineLut = true;
|
||||
private static void lithiumSettings() {
|
||||
lithiumEnable = getBoolean("lithium.enable", lithiumEnable);
|
||||
lithiumMathFastUtil = getBoolean("lithium.math.fast-util", lithiumMathFastUtil) && lithiumEnable;
|
||||
+ lithiumMathSineLut = getBoolean("lithium.math.sine-lut", lithiumMathSineLut) && lithiumEnable;
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/me/jellysquid/mods/lithium/common/util/math/CompactSineLUT.java b/src/main/java/me/jellysquid/mods/lithium/common/util/math/CompactSineLUT.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..ccb45e94ea6d1a627df786fb88baec7edd1f2427
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/me/jellysquid/mods/lithium/common/util/math/CompactSineLUT.java
|
||||
@@ -0,0 +1,90 @@
|
||||
+package me.jellysquid.mods.lithium.common.util.math;
|
||||
+
|
||||
+import net.minecraft.util.Mth;
|
||||
+
|
||||
+/**
|
||||
+ * A replacement for the sine angle lookup table used in {@link MathHelper}, both reducing the size of LUT and improving
|
||||
+ * the access patterns for common paired sin/cos operations.
|
||||
+ *
|
||||
+ * sin(-x) = -sin(x)
|
||||
+ * ... to eliminate negative angles from the LUT.
|
||||
+ *
|
||||
+ * sin(x) = sin(pi/2 - x)
|
||||
+ * ... to eliminate supplementary angles from the LUT.
|
||||
+ *
|
||||
+ * Using these identities allows us to reduce the LUT from 64K entries (256 KB) to just 16K entries (64 KB), enabling
|
||||
+ * it to better fit into the CPU's caches at the expense of some cycles on the fast path. The implementation has been
|
||||
+ * tightly optimized to avoid branching where possible and to use very quick integer operations.
|
||||
+ *
|
||||
+ * Generally speaking, reducing the size of a lookup table is always a good optimization, but since we need to spend
|
||||
+ * extra CPU cycles trying to maintain parity with vanilla, there is the potential risk that this implementation ends
|
||||
+ * up being slower than vanilla when the lookup table is able to be kept in cache memory.
|
||||
+ *
|
||||
+ * Unlike other "fast math" implementations, the values returned by this class are *bit-for-bit identical* with those
|
||||
+ * from {@link MathHelper}. Validation is performed during runtime to ensure that the table is correct.
|
||||
+ *
|
||||
+ * @author coderbot16 Author of the original (and very clever) implementation in Rust:
|
||||
+ * https://gitlab.com/coderbot16/i73/-/tree/master/i73-trig/src
|
||||
+ * @author jellysquid3 Additional optimizations, port to Java
|
||||
+ */
|
||||
+public class CompactSineLUT {
|
||||
+ private static final int[] SINE_TABLE_INT = new int[16384 + 1];
|
||||
+ private static final float SINE_TABLE_MIDPOINT;
|
||||
+
|
||||
+ static {
|
||||
+ final float[] SINE_TABLE = Mth.getSinTable();
|
||||
+ // Copy the sine table, covering to raw int bits
|
||||
+ for (int i = 0; i < SINE_TABLE_INT.length; i++) {
|
||||
+ SINE_TABLE_INT[i] = Float.floatToRawIntBits(SINE_TABLE[i]);
|
||||
+ }
|
||||
+
|
||||
+ SINE_TABLE_MIDPOINT = SINE_TABLE[SINE_TABLE.length / 2];
|
||||
+
|
||||
+ // Test that the lookup table is correct during runtime
|
||||
+ for (int i = 0; i < SINE_TABLE.length; i++) {
|
||||
+ float expected = SINE_TABLE[i];
|
||||
+ float value = lookup(i);
|
||||
+
|
||||
+ if (expected != value) {
|
||||
+ throw new IllegalArgumentException(String.format("LUT error at index %d (expected: %s, found: %s)", i, expected, value));
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ // [VanillaCopy] MathHelper#sin(float)
|
||||
+ public static float sin(float f) {
|
||||
+ return lookup((int) (f * 10430.378f) & 0xFFFF);
|
||||
+ }
|
||||
+
|
||||
+ // [VanillaCopy] MathHelper#cos(float)
|
||||
+ public static float cos(float f) {
|
||||
+ return lookup((int) (f * 10430.378f + 16384.0f) & 0xFFFF);
|
||||
+ }
|
||||
+
|
||||
+ private static float lookup(int index) {
|
||||
+ // A special case... Is there some way to eliminate this?
|
||||
+ if (index == 32768) {
|
||||
+ return SINE_TABLE_MIDPOINT;
|
||||
+ }
|
||||
+
|
||||
+ // Trigonometric identity: sin(-x) = -sin(x)
|
||||
+ // Given a domain of 0 <= x <= 2*pi, just negate the value if x > pi.
|
||||
+ // This allows the sin table size to be halved.
|
||||
+ int neg = (index & 0x8000) << 16;
|
||||
+
|
||||
+ // All bits set if (pi/2 <= x), none set otherwise
|
||||
+ // Extracts the 15th bit from 'half'
|
||||
+ int mask = (index << 17) >> 31;
|
||||
+
|
||||
+ // Trigonometric identity: sin(x) = sin(pi/2 - x)
|
||||
+ int pos = (0x8001 & mask) + (index ^ mask);
|
||||
+
|
||||
+ // Wrap the position in the table. Moving this down to immediately before the array access
|
||||
+ // seems to help the Hotspot compiler optimize the bit math better.
|
||||
+ pos &= 0x7fff;
|
||||
+
|
||||
+ // Fetch the corresponding value from the LUT and invert the sign bit as needed
|
||||
+ // This directly manipulate the sign bit on the float bits to simplify logic
|
||||
+ return Float.intBitsToFloat(SINE_TABLE_INT[pos] ^ neg);
|
||||
+ }
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/net/minecraft/util/Mth.java b/src/main/java/net/minecraft/util/Mth.java
|
||||
index 618f19d70a61062ed5989ec6cf0c036f2e047466..dd320f3a3f2b51a723a2fcc65d477a22c0901455 100644
|
||||
--- a/src/main/java/net/minecraft/util/Mth.java
|
||||
+++ b/src/main/java/net/minecraft/util/Mth.java
|
||||
@@ -45,11 +45,19 @@ public class Mth {
|
||||
return (float)((int)(value * f)) / f;
|
||||
}
|
||||
|
||||
+ // Kaiiju start
|
||||
+ public static float[] getSinTable() {
|
||||
+ return SIN;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
public static float sin(float value) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathSineLut) return me.jellysquid.mods.lithium.common.util.math.CompactSineLUT.sin(value); // Kaiiju
|
||||
return SIN[(int)(value * 10430.378F) & '\uffff'];
|
||||
}
|
||||
|
||||
public static float cos(float value) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.lithiumMathSineLut) return me.jellysquid.mods.lithium.common.util.math.CompactSineLUT.cos(value); // Kaiiju
|
||||
return SIN[(int)(value * 10430.378F + 16384.0F) & '\uffff'];
|
||||
}
|
||||
|
||||
36
patches/server/0013-Toggle-void-trading.patch
Normal file
36
patches/server/0013-Toggle-void-trading.patch
Normal file
@@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 23 Apr 2023 15:34:30 +0300
|
||||
Subject: [PATCH] Toggle void trading
|
||||
|
||||
Don't close trading windows when the villager is unloaded.
|
||||
You should set chunk-unloads to 0s in paper config file to enable void
|
||||
trading. Or use Kaiivoid plugin.
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index f3f824d0ab1a2a72825c40b67192386479a0b34c..95ed6cb7b94797187d1011cab344e187b39d9193 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -152,6 +152,9 @@ public class KaiijuWorldConfig {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
}
|
||||
|
||||
+ public boolean fixVoidTrading = true;
|
||||
+
|
||||
private void gameplaySettings() {
|
||||
+ fixVoidTrading = getBoolean("gameplay.fix-void-trading", fixVoidTrading);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
index ad896c8a3060f5c8d85a8b5707317de646bf9cae..0df4672abb5e87587da8712b6febf6312e241cda 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -2865,7 +2865,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
// Spigot Start
|
||||
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message
|
||||
// Paper start
|
||||
- if (entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) {
|
||||
+ if (entity.level().kaiijuConfig.fixVoidTrading && entity.getBukkitEntity() instanceof org.bukkit.inventory.Merchant merchant && merchant.getTrader() != null) { // Kaiiju
|
||||
merchant.getTrader().closeInventory(org.bukkit.event.inventory.InventoryCloseEvent.Reason.UNLOADED);
|
||||
}
|
||||
// Paper end
|
||||
219
patches/server/0014-Toggle-optimize-hoppers.patch
Normal file
219
patches/server/0014-Toggle-optimize-hoppers.patch
Normal file
@@ -0,0 +1,219 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 27 Apr 2023 03:49:08 +0300
|
||||
Subject: [PATCH] Toggle optimize hoppers
|
||||
|
||||
Paper optimize hoppers patch break a lot of technical redstone farms because of piston updates. (Example: twiti888 wood farm)
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 95ed6cb7b94797187d1011cab344e187b39d9193..6d7356cc07da58b1cef8d8963e790251d765de2c 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -147,9 +147,11 @@ public class KaiijuWorldConfig {
|
||||
}
|
||||
|
||||
public boolean shulkerBoxDropContentsWhenDestroyed = true;
|
||||
+ public boolean optimizeHoppers = true;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
+ optimizeHoppers = getBoolean("optimization.optimize-hoppers", optimizeHoppers);
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||
index 81d8de7c80bac16d874faf990cb08f1556a46adc..0735ee186b4e81231201ef6f8ddb02995b64259d 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
|
||||
@@ -441,49 +441,51 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
if (HopperBlockEntity.isFullContainer(iinventory1, enumdirection)) {
|
||||
return false;
|
||||
} else {
|
||||
+ // Kaiiju start - Toggle paper broken redstone
|
||||
// Paper start - replace logic; MAKE SURE TO CHECK FOR DIFFS ON UPDATES
|
||||
- return hopperPush(world, iinventory1, enumdirection, hopper);
|
||||
- // for (int i = 0; i < iinventory.getContainerSize(); ++i) {
|
||||
- // if (!iinventory.getItem(i).isEmpty()) {
|
||||
- // ItemStack itemstack = iinventory.getItem(i).copy();
|
||||
- // // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.removeItem(i, 1), enumdirection);
|
||||
-
|
||||
- // // CraftBukkit start - Call event when pushing items into other inventories
|
||||
- // CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
|
||||
-
|
||||
- // Inventory destinationInventory;
|
||||
- // // Have to special case large chests as they work oddly
|
||||
- // if (iinventory1 instanceof CompoundContainer) {
|
||||
- // destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((CompoundContainer) iinventory1);
|
||||
- // } else if (iinventory1.getOwner() != null) {
|
||||
- // destinationInventory = iinventory1.getOwner().getInventory();
|
||||
- // } else {
|
||||
- // destinationInventory = new CraftInventory(iinventory);
|
||||
- // }
|
||||
-
|
||||
- // InventoryMoveItemEvent event = new InventoryMoveItemEvent(iinventory.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
|
||||
- // world.getCraftServer().getPluginManager().callEvent(event);
|
||||
- // if (event.isCancelled()) {
|
||||
- // hopper.setItem(i, itemstack);
|
||||
- // hopper.setCooldown(world.spigotConfig.hopperTransfer); // Spigot
|
||||
- // return false;
|
||||
- // }
|
||||
- // int origCount = event.getItem().getAmount(); // Spigot
|
||||
- // ItemStack itemstack1 = HopperBlockEntity.addItem(iinventory, iinventory1, CraftItemStack.asNMSCopy(event.getItem()), enumdirection);
|
||||
+ if (world.kaiijuConfig.optimizeHoppers) return hopperPush(world, iinventory1, enumdirection, hopper);
|
||||
+ for (int i = 0; i < iinventory.getContainerSize(); ++i) {
|
||||
+ if (!iinventory.getItem(i).isEmpty()) {
|
||||
+ ItemStack itemstack = iinventory.getItem(i).copy();
|
||||
+ // ItemStack itemstack1 = addItem(iinventory, iinventory1, iinventory.removeItem(i, 1), enumdirection);
|
||||
+
|
||||
+ // CraftBukkit start - Call event when pushing items into other inventories
|
||||
+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
|
||||
+
|
||||
+ Inventory destinationInventory;
|
||||
+ // Have to special case large chests as they work oddly
|
||||
+ if (iinventory1 instanceof CompoundContainer) {
|
||||
+ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((CompoundContainer) iinventory1);
|
||||
+ } else if (iinventory1.getOwner() != null) {
|
||||
+ destinationInventory = iinventory1.getOwner().getInventory();
|
||||
+ } else {
|
||||
+ destinationInventory = new CraftInventory(iinventory);
|
||||
+ }
|
||||
+
|
||||
+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(iinventory.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true);
|
||||
+ world.getCraftServer().getPluginManager().callEvent(event);
|
||||
+ if (event.isCancelled()) {
|
||||
+ hopper.setItem(i, itemstack);
|
||||
+ hopper.setCooldown(world.spigotConfig.hopperTransfer); // Spigot
|
||||
+ return false;
|
||||
+ }
|
||||
+ int origCount = event.getItem().getAmount(); // Spigot
|
||||
+ ItemStack itemstack1 = HopperBlockEntity.addItem(iinventory, iinventory1, CraftItemStack.asNMSCopy(event.getItem()), enumdirection);
|
||||
// CraftBukkit end
|
||||
|
||||
- // if (itemstack1.isEmpty()) {
|
||||
- // iinventory1.setChanged();
|
||||
- // return true;
|
||||
- // }
|
||||
+ if (itemstack1.isEmpty()) {
|
||||
+ iinventory1.setChanged();
|
||||
+ return true;
|
||||
+ }
|
||||
|
||||
- // itemstack.shrink(origCount - itemstack1.getCount()); // Spigot
|
||||
- // iinventory.setItem(i, itemstack);
|
||||
- // }
|
||||
- // }
|
||||
+ itemstack.shrink(origCount - itemstack1.getCount()); // Spigot
|
||||
+ iinventory.setItem(i, itemstack);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
- // return false;
|
||||
+ return false;
|
||||
// Paper end
|
||||
+ // Kaiiju end
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -525,6 +527,12 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
if (iinventory != null) {
|
||||
Direction enumdirection = Direction.DOWN;
|
||||
|
||||
+ // Kaiiju start - toggle paper broken redstone
|
||||
+ if (!world.kaiijuConfig.optimizeHoppers)
|
||||
+ return HopperBlockEntity.isEmptyContainer(iinventory, enumdirection) ? false : HopperBlockEntity.getSlots(iinventory, enumdirection).anyMatch((i) -> {
|
||||
+ return HopperBlockEntity.a(hopper, iinventory, i, enumdirection, world); // Spigot
|
||||
+ });
|
||||
+ // Kaiiju end
|
||||
// Paper start - optimize hoppers and remove streams
|
||||
worldData.skipPullModeEventFire = worldData.skipHopperEvents; // Folia - region threading
|
||||
// merge container isEmpty check and move logic into one loop
|
||||
@@ -571,48 +579,50 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
||||
private static boolean a(Hopper ihopper, Container iinventory, int i, Direction enumdirection, Level world) { // Spigot
|
||||
ItemStack itemstack = iinventory.getItem(i);
|
||||
|
||||
+ // Kaiiju start - toggle paper broken redstone
|
||||
// Paper start - replace pull logic; MAKE SURE TO CHECK FOR DIFFS WHEN UPDATING
|
||||
if (!itemstack.isEmpty() && HopperBlockEntity.canTakeItemFromContainer(ihopper, iinventory, itemstack, i, enumdirection)) { // If this logic changes, update above. this is left unused incase reflective plugins
|
||||
- return hopperPull(world, ihopper, iinventory, itemstack, i);
|
||||
- // ItemStack itemstack1 = itemstack.copy();
|
||||
- // // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.removeItem(i, 1), (EnumDirection) null);
|
||||
- // // CraftBukkit start - Call event on collection of items from inventories into the hopper
|
||||
- // CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
|
||||
-
|
||||
- // Inventory sourceInventory;
|
||||
- // // Have to special case large chests as they work oddly
|
||||
- // if (iinventory instanceof CompoundContainer) {
|
||||
- // sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((CompoundContainer) iinventory);
|
||||
- // } else if (iinventory.getOwner() != null) {
|
||||
- // sourceInventory = iinventory.getOwner().getInventory();
|
||||
- // } else {
|
||||
- // sourceInventory = new CraftInventory(iinventory);
|
||||
- // }
|
||||
-
|
||||
- // InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false);
|
||||
-
|
||||
- // Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
- // if (event.isCancelled()) {
|
||||
- // iinventory.setItem(i, itemstack1);
|
||||
-
|
||||
- // if (ihopper instanceof HopperBlockEntity) {
|
||||
- // ((HopperBlockEntity) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot
|
||||
- // }
|
||||
-
|
||||
- // return false;
|
||||
- // }
|
||||
- // int origCount = event.getItem().getAmount(); // Spigot
|
||||
- // ItemStack itemstack2 = HopperBlockEntity.addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null);
|
||||
- // // CraftBukkit end
|
||||
-
|
||||
- // if (itemstack2.isEmpty()) {
|
||||
- // iinventory.setChanged();
|
||||
- // return true;
|
||||
- // }
|
||||
-
|
||||
- // itemstack1.shrink(origCount - itemstack2.getCount()); // Spigot
|
||||
- // iinventory.setItem(i, itemstack1);
|
||||
+ if (world.kaiijuConfig.optimizeHoppers) return hopperPull(world, ihopper, iinventory, itemstack, i);
|
||||
+ ItemStack itemstack1 = itemstack.copy();
|
||||
+ // ItemStack itemstack2 = addItem(iinventory, ihopper, iinventory.removeItem(i, 1), (EnumDirection) null);
|
||||
+ // CraftBukkit start - Call event on collection of items from inventories into the hopper
|
||||
+ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.removeItem(i, world.spigotConfig.hopperAmount)); // Spigot
|
||||
+
|
||||
+ Inventory sourceInventory;
|
||||
+ // Have to special case large chests as they work oddly
|
||||
+ if (iinventory instanceof CompoundContainer) {
|
||||
+ sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((CompoundContainer) iinventory);
|
||||
+ } else if (iinventory.getOwner() != null) {
|
||||
+ sourceInventory = iinventory.getOwner().getInventory();
|
||||
+ } else {
|
||||
+ sourceInventory = new CraftInventory(iinventory);
|
||||
+ }
|
||||
+
|
||||
+ InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false);
|
||||
+
|
||||
+ Bukkit.getServer().getPluginManager().callEvent(event);
|
||||
+ if (event.isCancelled()) {
|
||||
+ iinventory.setItem(i, itemstack1);
|
||||
+
|
||||
+ if (ihopper instanceof HopperBlockEntity) {
|
||||
+ ((HopperBlockEntity) ihopper).setCooldown(world.spigotConfig.hopperTransfer); // Spigot
|
||||
+ }
|
||||
+
|
||||
+ return false;
|
||||
+ }
|
||||
+ int origCount = event.getItem().getAmount(); // Spigot
|
||||
+ ItemStack itemstack2 = HopperBlockEntity.addItem(iinventory, ihopper, CraftItemStack.asNMSCopy(event.getItem()), null);
|
||||
+ // CraftBukkit end
|
||||
+
|
||||
+ if (itemstack2.isEmpty()) {
|
||||
+ iinventory.setChanged();
|
||||
+ return true;
|
||||
+ }
|
||||
+
|
||||
+ itemstack1.shrink(origCount - itemstack2.getCount()); // Spigot
|
||||
+ iinventory.setItem(i, itemstack1);
|
||||
// Paper end
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
return false;
|
||||
36
patches/server/0015-Toggle-tick-level-when-empty.patch
Normal file
36
patches/server/0015-Toggle-tick-level-when-empty.patch
Normal file
@@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 4 May 2023 19:53:33 +0300
|
||||
Subject: [PATCH] Toggle tick level when empty
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 6d7356cc07da58b1cef8d8963e790251d765de2c..601b9867d839f4928ba993ee8f00df9c330a0fe3 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -148,10 +148,12 @@ public class KaiijuWorldConfig {
|
||||
|
||||
public boolean shulkerBoxDropContentsWhenDestroyed = true;
|
||||
public boolean optimizeHoppers = true;
|
||||
+ public boolean tickWhenEmpty = true;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
optimizeHoppers = getBoolean("optimization.optimize-hoppers", optimizeHoppers);
|
||||
+ tickWhenEmpty = getBoolean("optimization.tick-when-empty", tickWhenEmpty);
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
index 0df4672abb5e87587da8712b6febf6312e241cda..1818c5ae88c331fb900470436f72049165c9e9f4 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -825,7 +825,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
timings.doSounds.stopTiming(); // Spigot
|
||||
regionizedWorldData.setHandlingTick(false); // Folia - regionised ticking
|
||||
gameprofilerfiller.pop();
|
||||
- boolean flag = true || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players
|
||||
+ boolean flag = kaiijuConfig.tickWhenEmpty || !this.players.isEmpty() || !this.getForcedChunks().isEmpty(); // CraftBukkit - this prevents entity cleanup, other issues on servers with no players // Kaiiju - i don't think so
|
||||
|
||||
if (flag) {
|
||||
this.resetEmptyTime();
|
||||
@@ -0,0 +1,42 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 7 May 2023 20:04:06 +0300
|
||||
Subject: [PATCH] Toggle break redstone on top of trap doors early
|
||||
|
||||
That patch break vanilla mechanics such as portal slicing.
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 601b9867d839f4928ba993ee8f00df9c330a0fe3..e7ee85b09aa4438868e068551280b13e84cdfdb8 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -157,8 +157,10 @@ public class KaiijuWorldConfig {
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
+ public boolean breakRedstoneOnTopOfTrapDoorsEarly = true;
|
||||
|
||||
private void gameplaySettings() {
|
||||
fixVoidTrading = getBoolean("gameplay.fix-void-trading", fixVoidTrading);
|
||||
+ breakRedstoneOnTopOfTrapDoorsEarly = getBoolean("gameplay.break-redstone-on-top-of-trap-doors-early", breakRedstoneOnTopOfTrapDoorsEarly);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
|
||||
index b9e3c9cd709d42bced85436720ccc7b9c7e49552..5e6d64408a5da3f337d32bb8ac5ac2532b04490c 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/TrapDoorBlock.java
|
||||
@@ -125,6 +125,7 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW
|
||||
}
|
||||
// CraftBukkit end
|
||||
boolean open = (Boolean) state.getValue(TrapDoorBlock.OPEN) != flag1; // Paper - break redstone on trapdoors early
|
||||
+ if (world.kaiijuConfig.breakRedstoneOnTopOfTrapDoorsEarly) { // Kaiiju - trigger break redstone on trapdoors early
|
||||
// Paper start - break redstone on trapdoors early
|
||||
// note: this must run before any state for this block/its neighborus are written to the world
|
||||
// we allow the redstone event to fire so that plugins can block
|
||||
@@ -143,6 +144,7 @@ public class TrapDoorBlock extends HorizontalDirectionalBlock implements SimpleW
|
||||
}
|
||||
}
|
||||
// Paper end - break redstone on trapdoors early
|
||||
+ } // Kaiiju - trigger break redstone on trapdoors early
|
||||
if (open) { // Paper - break redstone on trapdoors early
|
||||
state = (BlockState) state.setValue(TrapDoorBlock.OPEN, flag1);
|
||||
this.playSound((Player) null, world, pos, flag1);
|
||||
141
patches/server/0017-Add-SIMD-utilities.patch
Normal file
141
patches/server/0017-Add-SIMD-utilities.patch
Normal file
@@ -0,0 +1,141 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 11 May 2023 05:02:40 +0300
|
||||
Subject: [PATCH] Add SIMD utilities
|
||||
|
||||
Patch from Pufferfish
|
||||
|
||||
diff --git a/build.gradle.kts b/build.gradle.kts
|
||||
index 99f31c4f5bf3064e483d5f387778c05742197e49..d73a4d547ad7768513773535d8cf15619c8079b0 100644
|
||||
--- a/build.gradle.kts
|
||||
+++ b/build.gradle.kts
|
||||
@@ -68,6 +68,12 @@ dependencies {
|
||||
}
|
||||
|
||||
val craftbukkitPackageVersion = "1_20_R1" // Paper
|
||||
+// Kaiiju start - Pufferfish - SIMD utilities
|
||||
+tasks.withType<JavaCompile> {
|
||||
+ val compilerArgs = options.compilerArgs
|
||||
+ compilerArgs.add("--add-modules=jdk.incubator.vector")
|
||||
+}
|
||||
+// Kaiiju end
|
||||
tasks.jar {
|
||||
archiveClassifier.set("dev")
|
||||
|
||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..586b4cd007b3b106966524e2697edddf88e3ac9d
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDChecker.java
|
||||
@@ -0,0 +1,59 @@
|
||||
+package gg.pufferfish.pufferfish.simd;
|
||||
+
|
||||
+import org.bukkit.Bukkit;
|
||||
+import java.util.logging.Level;
|
||||
+import java.util.logging.Logger;
|
||||
+import jdk.incubator.vector.FloatVector;
|
||||
+import jdk.incubator.vector.IntVector;
|
||||
+import jdk.incubator.vector.VectorSpecies;
|
||||
+
|
||||
+/**
|
||||
+ * Basically, java is annoying and we have to push this out to its own class.
|
||||
+ */
|
||||
+public class SIMDChecker {
|
||||
+
|
||||
+ public static boolean canEnable(Logger logger) {
|
||||
+ try {
|
||||
+ if (SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19) {
|
||||
+ return false;
|
||||
+ } else {
|
||||
+ SIMDDetection.testRun = true;
|
||||
+
|
||||
+ VectorSpecies<Integer> ISPEC = IntVector.SPECIES_PREFERRED;
|
||||
+ VectorSpecies<Float> FSPEC = FloatVector.SPECIES_PREFERRED;
|
||||
+
|
||||
+ logger.log(Level.INFO, "Max SIMD vector size on this system is " + ISPEC.vectorBitSize() + " bits (int)");
|
||||
+ logger.log(Level.INFO, "Max SIMD vector size on this system is " + FSPEC.vectorBitSize() + " bits (float)");
|
||||
+
|
||||
+ if (ISPEC.elementSize() < 2 || FSPEC.elementSize() < 2) {
|
||||
+ logger.log(Level.WARNING, "SIMD is not properly supported on this system!");
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ return true;
|
||||
+ }
|
||||
+ } catch (NoClassDefFoundError | Exception ignored) {} // Basically, we don't do anything. This lets us detect if it's not functional and disable it.
|
||||
+ return false;
|
||||
+ }
|
||||
+
|
||||
+ public static void simdWarning() {
|
||||
+ // Attempt to detect vectorization
|
||||
+ try {
|
||||
+ SIMDDetection.isEnabled = SIMDDetection.canEnable(Bukkit.getLogger());
|
||||
+ SIMDDetection.versionLimited = SIMDDetection.getJavaVersion() != 17 && SIMDDetection.getJavaVersion() != 18 && SIMDDetection.getJavaVersion() != 19;
|
||||
+ } catch (NoClassDefFoundError | Exception ignored) {
|
||||
+ ignored.printStackTrace();
|
||||
+ }
|
||||
+
|
||||
+ if (SIMDDetection.isEnabled) {
|
||||
+ Bukkit.getLogger().info("SIMD operations detected as functional. Will replace some operations with faster versions.");
|
||||
+ } else if (SIMDDetection.versionLimited) {
|
||||
+ Bukkit.getLogger().warning("Will not enable SIMD! These optimizations are only safely supported on Java 17, Java 18, and Java 19.");
|
||||
+ } else {
|
||||
+ Bukkit.getLogger().warning("SIMD operations are available for your server, but are not configured!");
|
||||
+ Bukkit.getLogger().warning("To enable additional optimizations, add \"--add-modules=jdk.incubator.vector\" to your startup flags, BEFORE the \"-jar\".");
|
||||
+ Bukkit.getLogger().warning("If you have already added this flag, then SIMD operations are not supported on your JVM or CPU.");
|
||||
+ Bukkit.getLogger().warning("Debug: Java: " + System.getProperty("java.version") + ", test run: " + SIMDDetection.testRun);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..758fa97304a32bf17935c86dc03cbf50606935d8
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/gg/pufferfish/pufferfish/simd/SIMDDetection.java
|
||||
@@ -0,0 +1,32 @@
|
||||
+package gg.pufferfish.pufferfish.simd;
|
||||
+
|
||||
+import java.util.logging.Logger;
|
||||
+
|
||||
+public class SIMDDetection {
|
||||
+
|
||||
+ public static boolean isEnabled = false;
|
||||
+ public static boolean versionLimited = false;
|
||||
+ public static boolean testRun = false;
|
||||
+
|
||||
+ public static boolean canEnable(Logger logger) {
|
||||
+ try {
|
||||
+ return SIMDChecker.canEnable(logger);
|
||||
+ } catch (NoClassDefFoundError | Exception ignored) {
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public static int getJavaVersion() {
|
||||
+ // https://stackoverflow.com/a/2591122
|
||||
+ String version = System.getProperty("java.version");
|
||||
+ if(version.startsWith("1.")) {
|
||||
+ version = version.substring(2, 3);
|
||||
+ } else {
|
||||
+ int dot = version.indexOf(".");
|
||||
+ if(dot != -1) { version = version.substring(0, dot); }
|
||||
+ }
|
||||
+ version = version.split("-")[0]; // Azul is stupid
|
||||
+ return Integer.parseInt(version);
|
||||
+ }
|
||||
+
|
||||
+}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index ee75d828174ac1c84931bc087472fefd76073bdb..991e4c19763a34a6fead88363e007c2d11aad836 100644
|
||||
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -225,6 +225,7 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
DedicatedServer.LOGGER.error("Unable to load server configuration", e);
|
||||
return false;
|
||||
}
|
||||
+ gg.pufferfish.pufferfish.simd.SIMDChecker.simdWarning();
|
||||
dev.kaiijumc.kaiiju.KaiijuConfig.registerCommands();
|
||||
// Kaiiju end
|
||||
com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // load version history now
|
||||
37
patches/server/0018-Toggle-shared-random-for-players.patch
Normal file
37
patches/server/0018-Toggle-shared-random-for-players.patch
Normal file
@@ -0,0 +1,37 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 11 May 2023 17:12:34 +0300
|
||||
Subject: [PATCH] Toggle shared random for players
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 778de435ca3c13ccc2f2d86030e3529436a2d945..cac747a46cccf8b115917a72340e9b81e7a437c9 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -216,8 +216,10 @@ public class KaiijuConfig {
|
||||
}
|
||||
|
||||
public static String serverModName = "Kaiiju";
|
||||
+ public static boolean sharedRandomForPlayers = true;
|
||||
|
||||
private static void gameplaySettings() {
|
||||
serverModName = getString("gameplay.server-mod-name", serverModName);
|
||||
+ sharedRandomForPlayers = getBoolean("gameplay.shared-random-for-players", sharedRandomForPlayers);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index fa35d2c1c8de225acd68e08f15976c92f7ab82aa..455f9aeac15123201d2677cdc8ba159d36229e91 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -567,6 +567,11 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
this.bb = Entity.INITIAL_AABB;
|
||||
this.stuckSpeedMultiplier = Vec3.ZERO;
|
||||
this.nextStep = 1.0F;
|
||||
+ // Kaiiju start - Toggle shared random for players
|
||||
+ if (!dev.kaiijumc.kaiiju.KaiijuConfig.sharedRandomForPlayers && this instanceof Player)
|
||||
+ this.random = RandomSource.create();
|
||||
+ else
|
||||
+ // Kaiiju end
|
||||
this.random = SHARED_RANDOM; // Paper
|
||||
this.remainingFireTicks = -this.getFireImmuneTicks();
|
||||
this.fluidHeight = new Object2DoubleArrayMap(2);
|
||||
42
patches/server/0019-Kick-player-instead-of-crashing.patch
Normal file
42
patches/server/0019-Kick-player-instead-of-crashing.patch
Normal file
@@ -0,0 +1,42 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 14 May 2023 18:50:57 +0300
|
||||
Subject: [PATCH] Kick player instead of crashing
|
||||
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java
|
||||
index c5df121d6194a97b20dc390698991b9c72dba538..9990fccc741a139c57528f70157ae63dbe3fd8e8 100644
|
||||
--- a/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java
|
||||
+++ b/src/main/java/io/papermc/paper/chunk/system/RegionizedPlayerChunkLoader.java
|
||||
@@ -485,7 +485,12 @@ public class RegionizedPlayerChunkLoader {
|
||||
new ChunkPos(chunkX, chunkZ), new MutableObject<>(), false, true); // unloaded, loaded
|
||||
return;
|
||||
}
|
||||
- throw new IllegalStateException();
|
||||
+ // Kaiiju - Kick player instead of crashing
|
||||
+ String errorMsg = "Already sent chunk [" + chunkX + ", " + chunkZ + "] in world " + this.world;
|
||||
+ this.player.getBukkitEntity().kickPlayer(errorMsg);
|
||||
+ org.bukkit.Bukkit.getLogger().severe(errorMsg);
|
||||
+ // throw new IllegalStateException();
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
private void sendUnloadChunk(final int chunkX, final int chunkZ) {
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ChunkHolder.java b/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
||||
index 18f438eec03cabc1614ab807081cff6b18fb09a8..df3869d7aee9c1c880319251b40879c8802c72b4 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ChunkHolder.java
|
||||
@@ -129,7 +129,12 @@ public class ChunkHolder {
|
||||
|
||||
public void addPlayer(ServerPlayer player) {
|
||||
if (!this.playersSentChunkTo.add(player)) {
|
||||
- throw new IllegalStateException("Already sent chunk " + this.pos + " in world '" + this.chunkMap.level.getWorld().getName() + "' to player " + player);
|
||||
+ // Kaiiju start - Kick player instead of crashing
|
||||
+ String errorMsg = "Already sent chunk " + this.pos + " in world " + this.chunkMap.level.getWorld().getName();
|
||||
+ player.getBukkitEntity().kickPlayer(errorMsg);
|
||||
+ org.bukkit.Bukkit.getLogger().severe(errorMsg);
|
||||
+ //throw new IllegalStateException("Already sent chunk " + this.pos + " in world '" + this.chunkMap.level.getWorld().getName() + "' to player " + player);
|
||||
+ // Kaiiju end
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 18 May 2023 15:50:40 +0300
|
||||
Subject: [PATCH] Toggle fix TripWire state inconsistency
|
||||
|
||||
This allow string duplication
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index e7ee85b09aa4438868e068551280b13e84cdfdb8..8d7821d8b1a3615eaef1073d9dab690559b85f81 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -158,9 +158,11 @@ public class KaiijuWorldConfig {
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
public boolean breakRedstoneOnTopOfTrapDoorsEarly = true;
|
||||
+ public boolean fixTripWireStateInconsistency = true;
|
||||
|
||||
private void gameplaySettings() {
|
||||
fixVoidTrading = getBoolean("gameplay.fix-void-trading", fixVoidTrading);
|
||||
breakRedstoneOnTopOfTrapDoorsEarly = getBoolean("gameplay.break-redstone-on-top-of-trap-doors-early", breakRedstoneOnTopOfTrapDoorsEarly);
|
||||
+ fixTripWireStateInconsistency = getBoolean("gameplay.fix-tripwire-state-inconsistency", fixTripWireStateInconsistency);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/TripWireBlock.java b/src/main/java/net/minecraft/world/level/block/TripWireBlock.java
|
||||
index cb2ff8d94308c637a498d2737f86f6af4c9c1b83..84c407dfd19924d12f1c25addbb613e607445fd9 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/TripWireBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/TripWireBlock.java
|
||||
@@ -78,7 +78,7 @@ public class TripWireBlock extends Block {
|
||||
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean moved) {
|
||||
if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableTripwireUpdates) return; // Paper - prevent adjacent tripwires from updating
|
||||
if (!moved && !state.is(newState.getBlock())) {
|
||||
- this.updateSource(world, pos, (BlockState) state.setValue(TripWireBlock.POWERED, true), true); // Paper - fix state inconsistency
|
||||
+ this.updateSource(world, pos, (BlockState) state.setValue(TripWireBlock.POWERED, true), world.kaiijuConfig.fixTripWireStateInconsistency); // Paper - fix state inconsistency // Kaiiju - Toggle this
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,370 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Sun, 21 May 2023 15:55:04 +0200
|
||||
Subject: [PATCH] Entity ticking throttling & removal to prevent lag.
|
||||
|
||||
|
||||
diff --git a/build.gradle.kts b/build.gradle.kts
|
||||
index d73a4d547ad7768513773535d8cf15619c8079b0..f29c4621b3ab04aec026c9062c979a659d620738 100644
|
||||
--- a/build.gradle.kts
|
||||
+++ b/build.gradle.kts
|
||||
@@ -23,6 +23,7 @@ dependencies {
|
||||
implementation("com.github.luben:zstd-jni:1.5.4-1")
|
||||
implementation("org.lz4:lz4-java:1.8.0")
|
||||
// Kaiiju end
|
||||
+ implementation("io.github.classgraph:classgraph:4.8.158") // Kaiiju - Entity throttling & Removal
|
||||
// Paper start
|
||||
implementation("org.jline:jline-terminal-jansi:3.21.0")
|
||||
implementation("net.minecrell:terminalconsoleappender:1.3.0")
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuEntityLimits.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuEntityLimits.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..887ea85ca2a03796bfa5bf62f27d1a7abd7fbc29
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuEntityLimits.java
|
||||
@@ -0,0 +1,139 @@
|
||||
+package dev.kaiijumc.kaiiju;
|
||||
+
|
||||
+import java.io.File;
|
||||
+import java.io.IOException;
|
||||
+import java.util.Map;
|
||||
+import java.util.HashMap;
|
||||
+import java.util.logging.Level;
|
||||
+
|
||||
+import com.google.common.base.Throwables;
|
||||
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||
+import io.github.classgraph.ClassGraph;
|
||||
+import io.github.classgraph.ClassInfo;
|
||||
+import io.github.classgraph.ScanResult;
|
||||
+import org.slf4j.Logger;
|
||||
+
|
||||
+import com.mojang.logging.LogUtils;
|
||||
+import net.minecraft.world.entity.Entity;
|
||||
+import org.bukkit.Bukkit;
|
||||
+import org.bukkit.configuration.InvalidConfigurationException;
|
||||
+import org.bukkit.configuration.file.YamlConfiguration;
|
||||
+
|
||||
+@SuppressWarnings("unused")
|
||||
+public class KaiijuEntityLimits {
|
||||
+ private static final Logger LOGGER = LogUtils.getLogger();
|
||||
+
|
||||
+ protected static final String HEADER =
|
||||
+ "Per region entity limits for Kaiiju.\n"
|
||||
+ + "If there are more of particular entity type in a region than limit, entity ticking will be throttled.\n"
|
||||
+ + "Example: for Wither limit 100 & 300 Withers in a region -> 100 Withers tick every tick & every Wither ticks every 3 ticks.\n"
|
||||
+ + "Available entities: GlowSquid, Ambient, Bat, Animal, Bee, Cat, Chicken, Cod, Cow, Dolphin, Fish, FishSchool, Fox, Golem, IronGolem, "
|
||||
+ + "MushroomCow, Ocelot, Panda, Parrot, Perchable, Pig, PolarBear, PufferFish, Rabbit, Salmon, Sheep, Snowman, Squid, TropicalFish, Turtle, "
|
||||
+ + "WaterAnimal, Wolf, Allay, Axolotl, Camel, Frog, Tadpole, Goat, Horse, HorseAbstract, HorseChestedAbstract, HorseDonkey, HorseMule, "
|
||||
+ + "HorseSkeleton, HorseZombie, Llama, LlamaTrader, Sniffer, EnderCrystal, EnderDragon, Wither, ArmorStand, Hanging, ItemFrame, Leash, "
|
||||
+ + "Painting, GlowItemFrame, FallingBlock, Item, TNTPrimed, Blaze, CaveSpider, Creeper, Drowned, Enderman, Endermite, Evoker, Ghast, "
|
||||
+ + "GiantZombie, Guardian, GuardianElder, IllagerAbstract, IllagerIllusioner, IllagerWizard, MagmaCube, Monster, MonsterPatrolling, Phantom, "
|
||||
+ + "PigZombie, Pillager, Ravager, Shulker, Silverfish, Skeleton, SkeletonAbstract, SkeletonStray, SkeletonWither, Slime, Spider, Strider, Vex, "
|
||||
+ + "Vindicator, Witch, Zoglin, Zombie, ZombieHusk, ZombieVillager, Hoglin, Piglin, PiglinAbstract, PiglinBrute, Warden, Villager, "
|
||||
+ + "VillagerTrader, Arrow, DragonFireball, Egg, EnderPearl, EnderSignal, EvokerFangs, Fireball, FireballFireball, Fireworks, FishingHook, "
|
||||
+ + "LargeFireball, LlamaSpit, Potion, Projectile, ProjectileThrowable, ShulkerBullet, SmallFireball, Snowball, SpectralArrow, ThrownExpBottle, "
|
||||
+ + "ThrownTrident, TippedArrow, WitherSkull, Raider, ChestBoat, Boat, MinecartAbstract, MinecartChest, MinecartCommandBlock, MinecartContainer, "
|
||||
+ + "MinecartFurnace, MinecartHopper, MinecartMobSpawner, MinecartRideable, MinecartTNT\n";
|
||||
+ protected static File ENTITY_LIMITS_FILE;
|
||||
+ public static YamlConfiguration entityLimitsConfig;
|
||||
+
|
||||
+ protected static Map<Class<? extends Entity>, EntityLimit> entityLimits;
|
||||
+
|
||||
+ static final String ENTITY_PREFIX = "Entity";
|
||||
+
|
||||
+ public static void init(File entityLimitsFile) {
|
||||
+ init(entityLimitsFile, true);
|
||||
+ }
|
||||
+
|
||||
+ public static void reload(File entityLimitsFile) {
|
||||
+ init(entityLimitsFile, false);
|
||||
+ }
|
||||
+
|
||||
+ private static void init(File entityLimitsFile, boolean setup) {
|
||||
+ ENTITY_LIMITS_FILE = entityLimitsFile;
|
||||
+ entityLimitsConfig = new YamlConfiguration();
|
||||
+
|
||||
+ if (entityLimitsFile.exists()) {
|
||||
+ try {
|
||||
+ entityLimitsConfig.load(ENTITY_LIMITS_FILE);
|
||||
+ } catch (InvalidConfigurationException ex) {
|
||||
+ Bukkit.getLogger().log(Level.SEVERE, "Could not load kaiiju_entity_limits.yml, please correct your syntax errors", ex);
|
||||
+ throw Throwables.propagate(ex);
|
||||
+ } catch (IOException ignore) {}
|
||||
+ } else {
|
||||
+ if (setup) {
|
||||
+ entityLimitsConfig.options().header(HEADER);
|
||||
+ entityLimitsConfig.options().copyDefaults(true);
|
||||
+ entityLimitsConfig.set("Wither.limit", 1000);
|
||||
+ entityLimitsConfig.set("Wither.removal", 5000);
|
||||
+ entityLimitsConfig.set("Axolotl.limit", 1000);
|
||||
+ entityLimitsConfig.set("Axolotl.removal", 5000);
|
||||
+ try {
|
||||
+ entityLimitsConfig.save(ENTITY_LIMITS_FILE);
|
||||
+ } catch (IOException ex) {
|
||||
+ Bukkit.getLogger().log(Level.SEVERE, "Could not save " + ENTITY_LIMITS_FILE, ex);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ entityLimits = new Object2ObjectOpenHashMap<>();
|
||||
+ try (ScanResult scanResult = new ClassGraph().enableAllInfo().acceptPackages("net.minecraft.world.entity").scan()) {
|
||||
+ Map<String, ClassInfo> entityClasses = new HashMap<>();
|
||||
+ for (ClassInfo classInfo : scanResult.getAllClasses()) {
|
||||
+ Class<?> entityClass = Class.forName(classInfo.getName());
|
||||
+ if (Entity.class.isAssignableFrom(entityClass)) {
|
||||
+ String entityName = extractEntityName(entityClass.getSimpleName());
|
||||
+ entityClasses.put(entityName, classInfo);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ for (String key : entityLimitsConfig.getKeys(false)) {
|
||||
+ if (!entityClasses.containsKey(key)) {
|
||||
+ LOGGER.error("Unknown entity '" + key + "' in kaiiju-entity-limits.yml, skipping");
|
||||
+ continue;
|
||||
+ }
|
||||
+ int limit = entityLimitsConfig.getInt(key + ".limit");
|
||||
+ int removal = entityLimitsConfig.getInt(key + ".removal");
|
||||
+
|
||||
+ if (limit < 1) {
|
||||
+ LOGGER.error(key + " has a limit less than the minimum of 1, ignoring");
|
||||
+ continue;
|
||||
+ }
|
||||
+ if (removal <= limit && removal != -1) {
|
||||
+ LOGGER.error(key + " has a removal limit that is less than or equal to its limit, setting removal to limit * 10");
|
||||
+ removal = limit * 10;
|
||||
+ }
|
||||
+
|
||||
+ entityLimits.put((Class<? extends Entity>) Class.forName(entityClasses.get(key).getName()), new EntityLimit(limit, removal));
|
||||
+ }
|
||||
+ } catch (ClassNotFoundException e) {
|
||||
+ e.printStackTrace();
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public static EntityLimit getEntityLimit(Entity entity) {
|
||||
+ return entityLimits.get(entity.getClass());
|
||||
+ }
|
||||
+
|
||||
+ private static String extractEntityName(String input) {
|
||||
+ int prefixLength = ENTITY_PREFIX.length();
|
||||
+
|
||||
+ if (input.length() <= prefixLength || !input.startsWith(ENTITY_PREFIX)) {
|
||||
+ return input;
|
||||
+ } else {
|
||||
+ return input.substring(prefixLength);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public record EntityLimit(int limit, int removal) {
|
||||
+ @Override
|
||||
+ public String toString() {
|
||||
+ return "EntityLimit{limit=" + limit + ", removal=" + removal + "}";
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuEntityThrottler.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuEntityThrottler.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..eb690efacf083e4ff3e321578b12c534e6a40196
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuEntityThrottler.java
|
||||
@@ -0,0 +1,84 @@
|
||||
+package dev.kaiijumc.kaiiju;
|
||||
+
|
||||
+import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
||||
+import net.minecraft.world.entity.Entity;
|
||||
+import io.papermc.paper.threadedregions.RegionizedWorldData;
|
||||
+
|
||||
+public class KaiijuEntityThrottler {
|
||||
+ private static class TickInfo {
|
||||
+ int currentTick;
|
||||
+ int continueFrom;
|
||||
+ int toTick;
|
||||
+ int toRemove;
|
||||
+ }
|
||||
+
|
||||
+ public static class EntityThrottlerReturn {
|
||||
+ public boolean skip;
|
||||
+ public boolean remove;
|
||||
+ }
|
||||
+
|
||||
+ private final Object2ObjectOpenHashMap<KaiijuEntityLimits.EntityLimit, TickInfo> entityLimitTickInfoMap = new Object2ObjectOpenHashMap<>();
|
||||
+
|
||||
+ public void tickLimiterStart() {
|
||||
+ for (TickInfo tickInfo : entityLimitTickInfoMap.values()) {
|
||||
+ tickInfo.currentTick = 0;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public EntityThrottlerReturn tickLimiterShouldSkip(Entity entity) {
|
||||
+ EntityThrottlerReturn retVal = new EntityThrottlerReturn();
|
||||
+ if (entity.isRemoved()) return retVal;
|
||||
+ KaiijuEntityLimits.EntityLimit entityLimit = KaiijuEntityLimits.getEntityLimit(entity);
|
||||
+
|
||||
+ if (entityLimit != null) {
|
||||
+ TickInfo tickInfo = entityLimitTickInfoMap.computeIfAbsent(entityLimit, el -> {
|
||||
+ TickInfo newTickInfo = new TickInfo();
|
||||
+ newTickInfo.toTick = entityLimit.limit();
|
||||
+ return newTickInfo;
|
||||
+ });
|
||||
+
|
||||
+ tickInfo.currentTick++;
|
||||
+ if (tickInfo.currentTick <= tickInfo.toRemove && entityLimit.removal() > 0) {
|
||||
+ retVal.skip = false;
|
||||
+ retVal.remove = true;
|
||||
+ return retVal;
|
||||
+ }
|
||||
+
|
||||
+ if (tickInfo.currentTick < tickInfo.continueFrom) {
|
||||
+ retVal.skip = true;
|
||||
+ return retVal;
|
||||
+ }
|
||||
+ if (tickInfo.currentTick - tickInfo.continueFrom < tickInfo.toTick) {
|
||||
+ retVal.skip = false;
|
||||
+ return retVal;
|
||||
+ }
|
||||
+ retVal.skip = true;
|
||||
+ return retVal;
|
||||
+ } else {
|
||||
+ retVal.skip = false;
|
||||
+ return retVal;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ public void tickLimiterFinish(RegionizedWorldData regionizedWorldData) {
|
||||
+ for (var entry : entityLimitTickInfoMap.entrySet()) {
|
||||
+ KaiijuEntityLimits.EntityLimit entityLimit = entry.getKey();
|
||||
+ TickInfo tickInfo = entry.getValue();
|
||||
+
|
||||
+ int additionals = 0;
|
||||
+ int nextContinueFrom = tickInfo.continueFrom + tickInfo.toTick;
|
||||
+ if (nextContinueFrom >= tickInfo.currentTick) {
|
||||
+ additionals = entityLimit.limit() - (tickInfo.currentTick - tickInfo.continueFrom);
|
||||
+ nextContinueFrom = 0;
|
||||
+ }
|
||||
+ tickInfo.continueFrom = nextContinueFrom;
|
||||
+ tickInfo.toTick = entityLimit.limit() + additionals;
|
||||
+
|
||||
+ if (tickInfo.toRemove == 0 && tickInfo.currentTick > entityLimit.removal()) {
|
||||
+ tickInfo.toRemove = tickInfo.currentTick - entityLimit.removal();
|
||||
+ } else if (tickInfo.toRemove != 0) {
|
||||
+ tickInfo.toRemove = 0;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 8d7821d8b1a3615eaef1073d9dab690559b85f81..816db23fa64aab69e3034484c00645ebd0479978 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -149,11 +149,13 @@ public class KaiijuWorldConfig {
|
||||
public boolean shulkerBoxDropContentsWhenDestroyed = true;
|
||||
public boolean optimizeHoppers = true;
|
||||
public boolean tickWhenEmpty = true;
|
||||
+ public boolean enableEntityThrottling = false;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
optimizeHoppers = getBoolean("optimization.optimize-hoppers", optimizeHoppers);
|
||||
tickWhenEmpty = getBoolean("optimization.tick-when-empty", tickWhenEmpty);
|
||||
+ enableEntityThrottling = getBoolean("optimization.enable-entity-throttling", enableEntityThrottling);
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java b/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java
|
||||
index 6fac162e0ec057af9f3336314d5663554cef0490..efecc7e132c67577577c99bfcf98e2b4ddae14ab 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/command/KaiijuCommand.java
|
||||
@@ -1,6 +1,7 @@
|
||||
package dev.kaiijumc.kaiiju.command;
|
||||
|
||||
import dev.kaiijumc.kaiiju.KaiijuConfig;
|
||||
+import dev.kaiijumc.kaiiju.KaiijuEntityLimits;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.level.ServerLevel;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
@@ -48,6 +49,7 @@ public class KaiijuCommand extends Command {
|
||||
|
||||
MinecraftServer console = MinecraftServer.getServer();
|
||||
KaiijuConfig.reload((File) console.options.valueOf("kaiiju-settings"));
|
||||
+ KaiijuEntityLimits.reload((File) console.options.valueOf("kaiiju-entity-limits"));
|
||||
for (ServerLevel level : console.getAllLevels()) {
|
||||
level.kaiijuConfig.reload();
|
||||
}
|
||||
diff --git a/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java b/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java
|
||||
index 65c4e158d81ac5c5788cf4dcb379061aebd23dcd..223bf699d76e53b131b47256df288db60141fd9e 100644
|
||||
--- a/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java
|
||||
+++ b/src/main/java/io/papermc/paper/threadedregions/RegionizedWorldData.java
|
||||
@@ -296,6 +296,7 @@ public final class RegionizedWorldData {
|
||||
private final ReferenceList<Entity> allEntities = new ReferenceList<>();
|
||||
private final IteratorSafeOrderedReferenceSet<Entity> entityTickList = new IteratorSafeOrderedReferenceSet<>();
|
||||
private final IteratorSafeOrderedReferenceSet<Mob> navigatingMobs = new IteratorSafeOrderedReferenceSet<>();
|
||||
+ public final dev.kaiijumc.kaiiju.KaiijuEntityThrottler entityThrottler = new dev.kaiijumc.kaiiju.KaiijuEntityThrottler(); // Kaiiju
|
||||
|
||||
// block ticking
|
||||
private final ObjectLinkedOpenHashSet<BlockEventData> blockEvents = new ObjectLinkedOpenHashSet<>();
|
||||
diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
index 991e4c19763a34a6fead88363e007c2d11aad836..24a2d3f496727790f63cb66a2534d4423555fa3c 100644
|
||||
--- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java
|
||||
@@ -225,6 +225,12 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface
|
||||
DedicatedServer.LOGGER.error("Unable to load server configuration", e);
|
||||
return false;
|
||||
}
|
||||
+ try {
|
||||
+ dev.kaiijumc.kaiiju.KaiijuEntityLimits.init((java.io.File) options.valueOf("kaiiju-entity-limits"));
|
||||
+ } catch (Exception e) {
|
||||
+ DedicatedServer.LOGGER.error("Unable to load entity limits", e);
|
||||
+ return false;
|
||||
+ }
|
||||
gg.pufferfish.pufferfish.simd.SIMDChecker.simdWarning();
|
||||
dev.kaiijumc.kaiiju.KaiijuConfig.registerCommands();
|
||||
// Kaiiju end
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
index 1818c5ae88c331fb900470436f72049165c9e9f4..7115a481bc8805333aa36af334132f98da9d8742 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerLevel.java
|
||||
@@ -849,6 +849,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
} // Folia end - region threading
|
||||
}
|
||||
|
||||
+ if (kaiijuConfig.enableEntityThrottling) regionizedWorldData.entityThrottler.tickLimiterStart(); // Kaiiju
|
||||
org.spigotmc.ActivationRange.activateEntities(this); // Spigot
|
||||
timings.entityTick.startTiming(); // Spigot
|
||||
regionizedWorldData.forEachTickingEntity((entity) -> { // Folia - regionised ticking
|
||||
@@ -871,6 +872,13 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
entity.stopRiding();
|
||||
}
|
||||
|
||||
+ // Kaiiju start
|
||||
+ if (kaiijuConfig.enableEntityThrottling) {
|
||||
+ dev.kaiijumc.kaiiju.KaiijuEntityThrottler.EntityThrottlerReturn throttle = regionizedWorldData.entityThrottler.tickLimiterShouldSkip(entity);
|
||||
+ if (throttle.remove && !entity.hasCustomName()) entity.remove(Entity.RemovalReason.DISCARDED);
|
||||
+ if (throttle.skip) return;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
gameprofilerfiller.push("tick");
|
||||
this.guardEntityTick(this::tickNonPassenger, entity);
|
||||
gameprofilerfiller.pop();
|
||||
@@ -878,6 +886,7 @@ public class ServerLevel extends Level implements WorldGenLevel {
|
||||
}
|
||||
}
|
||||
});
|
||||
+ if (kaiijuConfig.enableEntityThrottling) regionizedWorldData.entityThrottler.tickLimiterFinish(regionizedWorldData); // Kaiiju
|
||||
timings.entityTick.stopTiming(); // Spigot
|
||||
timings.tickEntities.stopTiming(); // Spigot
|
||||
gameprofilerfiller.pop();
|
||||
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
index a090c16d53fcb220687a18aa37ca82663f4660c7..adad8d0cfec6c1b2be2c11ce847f64a92d39e1ec 100644
|
||||
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
|
||||
@@ -179,6 +179,11 @@ public class Main {
|
||||
.ofType(File.class)
|
||||
.defaultsTo(new File("kaiiju.yml"))
|
||||
.describedAs("Yml file");
|
||||
+ acceptsAll(asList("kaiiju", "kaiiju-entity-limits"), "File for kaiiju's entity limits")
|
||||
+ .withRequiredArg()
|
||||
+ .ofType(File.class)
|
||||
+ .defaultsTo(new File("kaiiju-entity-limits.yml"))
|
||||
+ .describedAs("Yml file");
|
||||
// Purpur end
|
||||
|
||||
// Paper start
|
||||
53
patches/server/0022-Toggle-safe-teleportation.patch
Normal file
53
patches/server/0022-Toggle-safe-teleportation.patch
Normal file
@@ -0,0 +1,53 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Thu, 18 May 2023 20:05:49 +0300
|
||||
Subject: [PATCH] Toggle safe teleportation
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 816db23fa64aab69e3034484c00645ebd0479978..7c6c74f95c2534624a928ccf6b0a4b9d2a5486ad 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -161,10 +161,12 @@ public class KaiijuWorldConfig {
|
||||
public boolean fixVoidTrading = true;
|
||||
public boolean breakRedstoneOnTopOfTrapDoorsEarly = true;
|
||||
public boolean fixTripWireStateInconsistency = true;
|
||||
+ public boolean safeTeleporting = true;
|
||||
|
||||
private void gameplaySettings() {
|
||||
fixVoidTrading = getBoolean("gameplay.fix-void-trading", fixVoidTrading);
|
||||
breakRedstoneOnTopOfTrapDoorsEarly = getBoolean("gameplay.break-redstone-on-top-of-trap-doors-early", breakRedstoneOnTopOfTrapDoorsEarly);
|
||||
fixTripWireStateInconsistency = getBoolean("gameplay.fix-tripwire-state-inconsistency", fixTripWireStateInconsistency);
|
||||
+ safeTeleporting = getBoolean("gameplay.safe-teleportation", safeTeleporting);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index 455f9aeac15123201d2677cdc8ba159d36229e91..4f8abe7cc8a687e7b55108a9b78b12a1f3deecd3 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -3944,6 +3944,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
|
||||
protected boolean tryEndPortal() {
|
||||
io.papermc.paper.util.TickThread.ensureTickThread(this, "Cannot portal entity async");
|
||||
+ if (!this.level.kaiijuConfig.safeTeleporting && !(this instanceof net.minecraft.world.entity.player.Player)) return false; // Kaiiju - Unsafe teleportation
|
||||
BlockPos pos = this.portalBlock;
|
||||
ServerLevel world = this.portalWorld;
|
||||
this.portalBlock = null;
|
||||
diff --git a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
|
||||
index 41d7cff39fc37955877668337689b4b26cd8c7cf..fe21ef0a2c451564694de915f6f4e61dbfeed712 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/block/EndPortalBlock.java
|
||||
@@ -53,6 +53,13 @@ public class EndPortalBlock extends BaseEntityBlock {
|
||||
// return; // CraftBukkit - always fire event in case plugins wish to change it
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Unsafe teleportation
|
||||
+ if (!entity.level().kaiijuConfig.safeTeleporting && !(entity instanceof net.minecraft.world.entity.player.Player)) {
|
||||
+ entity.endPortalLogicAsync();
|
||||
+ return;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
// Paper start - move all of this logic into portal tick
|
||||
entity.portalWorld = ((ServerLevel)world);
|
||||
entity.portalBlock = pos.immutable();
|
||||
46
patches/server/0023-Toggle-sand-duplication.patch
Normal file
46
patches/server/0023-Toggle-sand-duplication.patch
Normal file
@@ -0,0 +1,46 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 28 May 2023 01:51:52 +0300
|
||||
Subject: [PATCH] Toggle sand duplication
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 7c6c74f95c2534624a928ccf6b0a4b9d2a5486ad..9f0095f2196133a8bcffd5306aa9ac0b99b2f8d7 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -162,11 +162,13 @@ public class KaiijuWorldConfig {
|
||||
public boolean breakRedstoneOnTopOfTrapDoorsEarly = true;
|
||||
public boolean fixTripWireStateInconsistency = true;
|
||||
public boolean safeTeleporting = true;
|
||||
+ public boolean sandDuplication = false;
|
||||
|
||||
private void gameplaySettings() {
|
||||
fixVoidTrading = getBoolean("gameplay.fix-void-trading", fixVoidTrading);
|
||||
breakRedstoneOnTopOfTrapDoorsEarly = getBoolean("gameplay.break-redstone-on-top-of-trap-doors-early", breakRedstoneOnTopOfTrapDoorsEarly);
|
||||
fixTripWireStateInconsistency = getBoolean("gameplay.fix-tripwire-state-inconsistency", fixTripWireStateInconsistency);
|
||||
safeTeleporting = getBoolean("gameplay.safe-teleportation", safeTeleporting);
|
||||
+ sandDuplication = getBoolean("gameplay.sand-duplication", sandDuplication);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
|
||||
index 34b3541603b8cca16c7d62f3981d7ce3e8be0dbe..87d08f4d5bdec0ef96c0e4a91a2f595d2b0f0026 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java
|
||||
@@ -133,7 +133,7 @@ public class FallingBlockEntity extends Entity {
|
||||
@Override
|
||||
public void tick() {
|
||||
// Paper start - fix sand duping
|
||||
- if (this.isRemoved()) {
|
||||
+ if (!this.level().kaiijuConfig.sandDuplication && this.isRemoved()) { // Kaiiju - Toggle sand duplication
|
||||
return;
|
||||
}
|
||||
// Paper end - fix sand duping
|
||||
@@ -150,7 +150,7 @@ public class FallingBlockEntity extends Entity {
|
||||
this.move(MoverType.SELF, this.getDeltaMovement());
|
||||
|
||||
// Paper start - fix sand duping
|
||||
- if (this.isRemoved()) {
|
||||
+ if (!this.level().kaiijuConfig.sandDuplication && this.isRemoved()) { // Kaiiju - Toggle sand duplication
|
||||
return;
|
||||
}
|
||||
// Paper end - fix sand duping
|
||||
50
patches/server/0024-Vanilla-end-portal-teleportation.patch
Normal file
50
patches/server/0024-Vanilla-end-portal-teleportation.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Fri, 19 May 2023 03:38:03 +0300
|
||||
Subject: [PATCH] Vanilla end portal teleportation
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index 4f8abe7cc8a687e7b55108a9b78b12a1f3deecd3..7c57675adc33d7c5525cdf8ebfd696a0e756c9a7 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -4030,12 +4030,17 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
targetPos, 16, // load 16 blocks to be safe from block physics
|
||||
ca.spottedleaf.concurrentutil.executor.standard.PrioritisedExecutor.Priority.HIGH,
|
||||
(chunks) -> {
|
||||
- ServerLevel.makeObsidianPlatform(destination, null, targetPos);
|
||||
+ //ServerLevel.makeObsidianPlatform(destination, null, targetPos); // Kaiiju - Vanilla end teleportation - moved down
|
||||
|
||||
+ // Kaiiju start - Vanilla end teleportation
|
||||
+ Vec3 finalPos;
|
||||
+ if (this instanceof Player) finalPos = Vec3.atBottomCenterOf(targetPos.below());
|
||||
+ else finalPos = Vec3.atBottomCenterOf(targetPos);
|
||||
+ // Kaiiju end
|
||||
// the portal obsidian is placed at targetPos.y - 2, so if we want to place the entity
|
||||
// on the obsidian, we need to spawn at targetPos.y - 1
|
||||
portalInfoCompletable.complete(
|
||||
- new PortalInfo(Vec3.atBottomCenterOf(targetPos.below()), Vec3.ZERO, 90.0f, 0.0f, destination, null)
|
||||
+ new PortalInfo(finalPos, this.getDeltaMovement(), 90.0f, 0.0f, destination, null) // Kaiiju - Vanilla end teleportation
|
||||
);
|
||||
}
|
||||
);
|
||||
@@ -4222,6 +4227,10 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
if (!this.canPortalAsync(takePassengers)) {
|
||||
return false;
|
||||
}
|
||||
+ // Kaiiju start - sync end platform spawning & entity teleportation
|
||||
+ final java.util.function.Consumer<Entity> tpComplete = type == PortalType.END && destination.getTypeKey() == LevelStem.END ?
|
||||
+ e -> ServerLevel.makeObsidianPlatform(destination, null, ServerLevel.END_SPAWN_POINT) : teleportComplete;
|
||||
+ // Kaiiju end
|
||||
|
||||
Vec3 initialPosition = this.position();
|
||||
ChunkPos initialPositionChunk = new ChunkPos(
|
||||
@@ -4280,7 +4289,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
// place
|
||||
passengerTree.root.placeInAsync(
|
||||
originWorld, destination, Entity.TELEPORT_FLAG_LOAD_CHUNK | (takePassengers ? Entity.TELEPORT_FLAG_TELEPORT_PASSENGERS : 0L),
|
||||
- passengerTree, teleportComplete
|
||||
+ passengerTree, tpComplete // Kaiiju - vanilla end teleportation
|
||||
);
|
||||
});
|
||||
|
||||
46
patches/server/0025-Swap-distanceToSqr-and-target-test.patch
Normal file
46
patches/server/0025-Swap-distanceToSqr-and-target-test.patch
Normal file
@@ -0,0 +1,46 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Sat, 17 Jun 2023 19:52:29 +0300
|
||||
Subject: [PATCH] Swap distanceToSqr and target test
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java
|
||||
index b1a6a66ed02706c1adc36dcedfa415f5a24a25a0..97a5eca200fd606d6102e40f9b8c32c2e7652cf9 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/EntityGetter.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/EntityGetter.java
|
||||
@@ -99,9 +99,9 @@ public interface EntityGetter {
|
||||
Player player = null;
|
||||
|
||||
for(Player player2 : this.getLocalPlayers()) { // Folia - region threading
|
||||
- if (targetPredicate == null || targetPredicate.test(player2)) {
|
||||
+ if (true || targetPredicate == null || targetPredicate.test(player2)) { // Kaiiju - Move this down
|
||||
double e = player2.distanceToSqr(x, y, z);
|
||||
- if ((maxDistance < 0.0D || e < maxDistance * maxDistance) && (d == -1.0D || e < d)) {
|
||||
+ if ((maxDistance < 0.0D || e < maxDistance * maxDistance) && (d == -1.0D || e < d) && (targetPredicate == null || targetPredicate.test(player2))) { // Kaiiju
|
||||
d = e;
|
||||
player = player2;
|
||||
}
|
||||
@@ -147,9 +147,10 @@ public interface EntityGetter {
|
||||
// Paper start
|
||||
default boolean hasNearbyAlivePlayerThatAffectsSpawning(double x, double y, double z, double range) {
|
||||
for (Player player : this.getLocalPlayers()) { // Folia - region threading
|
||||
- if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) { // combines NO_SPECTATORS and LIVING_ENTITY_STILL_ALIVE with an "affects spawning" check
|
||||
+ if (true || EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) { // combines NO_SPECTATORS and LIVING_ENTITY_STILL_ALIVE with an "affects spawning" check // Kaiiju - Move this down
|
||||
double distanceSqr = player.distanceToSqr(x, y, z);
|
||||
if (range < 0.0D || distanceSqr < range * range) {
|
||||
+ if (EntitySelector.PLAYER_AFFECTS_SPAWNING.test(player)) // Kaiiju
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -199,9 +200,9 @@ public interface EntityGetter {
|
||||
T livingEntity = null;
|
||||
|
||||
for(T livingEntity2 : entityList) {
|
||||
- if (targetPredicate.test(entity, livingEntity2)) {
|
||||
+ if (true || targetPredicate.test(entity, livingEntity2)) { // Kaiiju - Move this down
|
||||
double e = livingEntity2.distanceToSqr(x, y, z);
|
||||
- if (d == -1.0D || e < d) {
|
||||
+ if ((d == -1.0D || e < d) && targetPredicate.test(entity, livingEntity2)) { // Kaiiju
|
||||
d = e;
|
||||
livingEntity = livingEntity2;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Sat, 17 Jun 2023 21:03:04 +0300
|
||||
Subject: [PATCH] Use Math.floor instead of fastfloor
|
||||
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/util/MCUtil.java b/src/main/java/io/papermc/paper/util/MCUtil.java
|
||||
index cadb91c7f5ef80aac8513f246fdf481947fa0a17..c1a2d67cb62af94c8bb4dff97f4fcb47542562dd 100644
|
||||
--- a/src/main/java/io/papermc/paper/util/MCUtil.java
|
||||
+++ b/src/main/java/io/papermc/paper/util/MCUtil.java
|
||||
@@ -168,13 +168,19 @@ public final class MCUtil {
|
||||
}
|
||||
|
||||
public static int fastFloor(double x) {
|
||||
- int truncated = (int)x;
|
||||
- return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ // Kaiiju start - Use Math.floor instead of fastfloor
|
||||
+ return (int)Math.floor(x); // Kaiiju
|
||||
+ //int truncated = (int)x;
|
||||
+ //return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
public static int fastFloor(float x) {
|
||||
- int truncated = (int)x;
|
||||
- return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ // Kaiiju start - Use Math.floor instead of fastfloor
|
||||
+ return (int)Math.floor(x); // Kaiiju
|
||||
+ //int truncated = (int)x;
|
||||
+ //return x < (double)truncated ? truncated - 1 : truncated;
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
public static float normalizeYaw(float f) {
|
||||
@@ -0,0 +1,27 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 18 Jun 2023 18:10:19 +0300
|
||||
Subject: [PATCH] Allow user to enable moving into unloaded chunks
|
||||
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
|
||||
index 571c18117d7f85eddff31d535c09b46e0e9e4341..afaaa7fc06b4c0c1a355fdd3280003cfed40429e 100644
|
||||
--- a/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
|
||||
+++ b/src/main/java/io/papermc/paper/configuration/WorldConfiguration.java
|
||||
@@ -463,14 +463,14 @@ public class WorldConfiguration extends ConfigurationPart {
|
||||
public class Chunks extends Post {
|
||||
@Override
|
||||
public void postProcess() {
|
||||
- this.preventMovingIntoUnloadedChunks = true;
|
||||
+ //this.preventMovingIntoUnloadedChunks = true; // Kaiiju - Don't
|
||||
}
|
||||
// Folia end - region threading - force prevent moving into unloaded chunks
|
||||
|
||||
public AutosavePeriod autoSaveInterval = AutosavePeriod.def();
|
||||
public int maxAutoSaveChunksPerTick = 24;
|
||||
public int fixedChunkInhabitedTime = -1;
|
||||
- public boolean preventMovingIntoUnloadedChunks = false;
|
||||
+ public boolean preventMovingIntoUnloadedChunks = true; // Kaiiju - True not False
|
||||
public Duration delayChunkUnloadsBy = Duration.of("10s");
|
||||
public Reference2IntMap<EntityType<?>> entityPerChunkSaveLimit = Util.make(new Reference2IntOpenHashMap<>(BuiltInRegistries.ENTITY_TYPE.size()), map -> {
|
||||
map.defaultReturnValue(-1);
|
||||
20
patches/server/0028-Don-t-pathfind-outside-region.patch
Normal file
20
patches/server/0028-Don-t-pathfind-outside-region.patch
Normal file
@@ -0,0 +1,20 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Mon, 19 Jun 2023 01:49:00 +0300
|
||||
Subject: [PATCH] Don't pathfind outside region
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java b/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java
|
||||
index 1ab77f3518d1df30f66ae44d7d4fa69e5b32d93a..98bf17441da3169d49de55fe89d79ebe250a2b7e 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/MoveToTargetSink.java
|
||||
@@ -107,7 +107,9 @@ public class MoveToTargetSink extends Behavior<Mob> {
|
||||
|
||||
private boolean tryComputePath(Mob entity, WalkTarget walkTarget, long time) {
|
||||
BlockPos blockPos = walkTarget.getTarget().currentBlockPosition();
|
||||
+ if (io.papermc.paper.util.TickThread.isTickThreadFor((ServerLevel) entity.level(), blockPos)) // Kaiiju - Don't pathfind outside region
|
||||
this.path = entity.getNavigation().createPath(blockPos, 0);
|
||||
+ else this.path = null; // Kaiiju - Don't pathfind outside region
|
||||
this.speedModifier = walkTarget.getSpeedModifier();
|
||||
Brain<?> brain = entity.getBrain();
|
||||
if (this.reachedTarget(entity, walkTarget)) {
|
||||
@@ -0,0 +1,32 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Mon, 19 Jun 2023 21:30:19 +0300
|
||||
Subject: [PATCH] Don't spam recipe changes on update
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/PlayerAdvancements.java b/src/main/java/net/minecraft/server/PlayerAdvancements.java
|
||||
index acc49f66bf34e2507d0ee6fec0a56b11bfc68f46..6c705189b84542db584039763821b222df03e5d1 100644
|
||||
--- a/src/main/java/net/minecraft/server/PlayerAdvancements.java
|
||||
+++ b/src/main/java/net/minecraft/server/PlayerAdvancements.java
|
||||
@@ -147,7 +147,7 @@ public class PlayerAdvancements {
|
||||
if (advancement == null) {
|
||||
// CraftBukkit start
|
||||
if (entry.getKey().getNamespace().equals("minecraft")) {
|
||||
- PlayerAdvancements.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", entry.getKey(), this.playerSavePath);
|
||||
+ //PlayerAdvancements.LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", entry.getKey(), this.playerSavePath); // Kaiiju - We already know, don't spam.
|
||||
}
|
||||
// CraftBukkit end
|
||||
} else {
|
||||
diff --git a/src/main/java/net/minecraft/stats/ServerRecipeBook.java b/src/main/java/net/minecraft/stats/ServerRecipeBook.java
|
||||
index ea29e07a105f3ba6a878bdccf36e7eaf66280280..8bbb5feea4190344fd6b3a3ae9f1c3cae578b9a6 100644
|
||||
--- a/src/main/java/net/minecraft/stats/ServerRecipeBook.java
|
||||
+++ b/src/main/java/net/minecraft/stats/ServerRecipeBook.java
|
||||
@@ -125,7 +125,7 @@ public class ServerRecipeBook extends RecipeBook {
|
||||
Optional<? extends Recipe<?>> optional = recipeManager.byKey(minecraftkey);
|
||||
|
||||
if (!optional.isPresent()) {
|
||||
- ServerRecipeBook.LOGGER.error("Tried to load unrecognized recipe: {} removed now.", minecraftkey);
|
||||
+ //ServerRecipeBook.LOGGER.error("Tried to load unrecognized recipe: {} removed now.", minecraftkey); // Kaiiju - We already know, don't spam.
|
||||
} else {
|
||||
handler.accept((Recipe) optional.get());
|
||||
}
|
||||
38
patches/server/0030-Option-to-disable-vanish-api.patch
Normal file
38
patches/server/0030-Option-to-disable-vanish-api.patch
Normal file
@@ -0,0 +1,38 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:14:47 +0200
|
||||
Subject: [PATCH] Option to disable vanish api
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index cac747a46cccf8b115917a72340e9b81e7a437c9..a3c15f1009dad095b9411242e2d0347a6141984b 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -212,7 +212,10 @@ public class KaiijuConfig {
|
||||
alternateKeepAlive = getBoolean("network.alternate-keepalive", alternateKeepAlive);
|
||||
}
|
||||
|
||||
+ public static boolean disableVanishApi = false;
|
||||
+
|
||||
private static void optimizationSettings() {
|
||||
+ disableVanishApi = getBoolean("optimization.disable-vanish-api", disableVanishApi);
|
||||
}
|
||||
|
||||
public static String serverModName = "Kaiiju";
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
index 2b9ec3e7ddb5f5d18553bf82717405552f441f45..96ee7b65f292ac86ffa8c5d371e283eba9bd1133 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -1362,7 +1362,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
// Folia end - region threading
|
||||
|
||||
// CraftBukkit start - respect vanish API
|
||||
- if (flag && !io.papermc.paper.util.TickThread.isTickThreadFor(player) || !player.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { // Folia - region threading
|
||||
+ // Kaiiju start - don't respect vanish API >:D
|
||||
+ boolean canSee = true;
|
||||
+ if (flag && !dev.kaiijumc.kaiiju.KaiijuConfig.disableVanishApi) canSee = player.getBukkitEntity().canSee(this.entity.getBukkitEntity());
|
||||
+ if (!io.papermc.paper.util.TickThread.isTickThreadFor(player) || !canSee) { // Folia - region threading
|
||||
+ // Kaiiju end
|
||||
flag = false;
|
||||
}
|
||||
// CraftBukkit end
|
||||
34
patches/server/0031-Option-to-disable-player-stats.patch
Normal file
34
patches/server/0031-Option-to-disable-player-stats.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:17:57 +0200
|
||||
Subject: [PATCH] Option to disable player stats
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index a3c15f1009dad095b9411242e2d0347a6141984b..8c872b2ad341f0105275209201fda03706535161 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -213,9 +213,11 @@ public class KaiijuConfig {
|
||||
}
|
||||
|
||||
public static boolean disableVanishApi = false;
|
||||
+ public static boolean disablePlayerStats = false;
|
||||
|
||||
private static void optimizationSettings() {
|
||||
disableVanishApi = getBoolean("optimization.disable-vanish-api", disableVanishApi);
|
||||
+ disablePlayerStats = getBoolean("optimization.disable-player-stats", disablePlayerStats);
|
||||
}
|
||||
|
||||
public static String serverModName = "Kaiiju";
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
index 7cb6a0b99c8e51f7f767b704071473c5d8bded7d..e0e7e0a2f60aff5bc8c625988860036722707da8 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -2143,6 +2143,7 @@ public class ServerPlayer extends Player {
|
||||
|
||||
@Override
|
||||
public void awardStat(Stat<?> stat, int amount) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disablePlayerStats) return; // Kaiiju - Disable player stats
|
||||
this.stats.increment(this, stat, amount);
|
||||
this.level().getCraftServer().getScoreboardManager().getScoreboardScores(stat, this.getScoreboardName(), (scoreboardscore) -> { // CraftBukkit - Get our scores instead
|
||||
scoreboardscore.add(amount);
|
||||
175
patches/server/0032-Option-to-disable-achievements.patch
Normal file
175
patches/server/0032-Option-to-disable-achievements.patch
Normal file
@@ -0,0 +1,175 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:32:36 +0200
|
||||
Subject: [PATCH] Option to disable achievements
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 9f0095f2196133a8bcffd5306aa9ac0b99b2f8d7..31d66bb2fcf4bb7262df2d8006e307fee92660ea 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -150,12 +150,14 @@ public class KaiijuWorldConfig {
|
||||
public boolean optimizeHoppers = true;
|
||||
public boolean tickWhenEmpty = true;
|
||||
public boolean enableEntityThrottling = false;
|
||||
+ public boolean disableAchievements = false;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
optimizeHoppers = getBoolean("optimization.optimize-hoppers", optimizeHoppers);
|
||||
tickWhenEmpty = getBoolean("optimization.tick-when-empty", tickWhenEmpty);
|
||||
enableEntityThrottling = getBoolean("optimization.enable-entity-throttling", enableEntityThrottling);
|
||||
+ disableAchievements = getBoolean("optimization.disable-achievements", disableAchievements);
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
index e0e7e0a2f60aff5bc8c625988860036722707da8..6f1878a8a0c904322286079f500592a268a269e9 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -792,7 +792,7 @@ public class ServerPlayer extends Player {
|
||||
|
||||
@Override
|
||||
protected void onInsideBlock(BlockState state) {
|
||||
- CriteriaTriggers.ENTER_BLOCK.trigger(this, state);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.ENTER_BLOCK.trigger(this, state); // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -839,9 +839,9 @@ public class ServerPlayer extends Player {
|
||||
}
|
||||
}
|
||||
|
||||
- CriteriaTriggers.TICK.trigger(this);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.TICK.trigger(this); // Kaiiju
|
||||
if (this.levitationStartPos != null) {
|
||||
- CriteriaTriggers.LEVITATION.trigger(this, this.levitationStartPos, this.tickCount - this.levitationStartTime);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.LEVITATION.trigger(this, this.levitationStartPos, this.tickCount - this.levitationStartTime); // Kaiiju
|
||||
}
|
||||
|
||||
this.trackStartFallingPosition();
|
||||
@@ -916,7 +916,7 @@ public class ServerPlayer extends Player {
|
||||
}
|
||||
|
||||
if (this.tickCount % 20 == 0) {
|
||||
- CriteriaTriggers.LOCATION.trigger(this);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.LOCATION.trigger(this); // Kaiiju
|
||||
}
|
||||
|
||||
// CraftBukkit start - initialize oldLevel, fire PlayerLevelChangeEvent, and tick client-sided world border
|
||||
@@ -945,7 +945,7 @@ public class ServerPlayer extends Player {
|
||||
@Override
|
||||
public void resetFallDistance() {
|
||||
if (this.getHealth() > 0.0F && this.startingToFallPosition != null) {
|
||||
- CriteriaTriggers.FALL_FROM_HEIGHT.trigger(this, this.startingToFallPosition);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.FALL_FROM_HEIGHT.trigger(this, this.startingToFallPosition); // Kaiiju
|
||||
}
|
||||
|
||||
this.startingToFallPosition = null;
|
||||
@@ -964,7 +964,7 @@ public class ServerPlayer extends Player {
|
||||
if (this.enteredLavaOnVehiclePosition == null) {
|
||||
this.enteredLavaOnVehiclePosition = this.position();
|
||||
} else {
|
||||
- CriteriaTriggers.RIDE_ENTITY_IN_LAVA_TRIGGER.trigger(this, this.enteredLavaOnVehiclePosition);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.RIDE_ENTITY_IN_LAVA_TRIGGER.trigger(this, this.enteredLavaOnVehiclePosition); // Kaiiju
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1168,7 +1168,7 @@ public class ServerPlayer extends Player {
|
||||
|
||||
this.handleTeamKill(s, s1, ObjectiveCriteria.TEAM_KILL);
|
||||
this.handleTeamKill(s1, s, ObjectiveCriteria.KILLED_BY_TEAM);
|
||||
- CriteriaTriggers.PLAYER_KILLED_ENTITY.trigger(this, entityKilled, damageSource);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.PLAYER_KILLED_ENTITY.trigger(this, entityKilled, damageSource); // Kaiiju
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1286,7 +1286,7 @@ public class ServerPlayer extends Player {
|
||||
this.wonGame = false;
|
||||
|
||||
this.respawn((player) -> {
|
||||
- CriteriaTriggers.CHANGED_DIMENSION.trigger(player, Level.END, Level.OVERWORLD);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.CHANGED_DIMENSION.trigger(player, Level.END, Level.OVERWORLD); // Kaiiju
|
||||
}, true);
|
||||
}
|
||||
|
||||
@@ -1787,14 +1787,14 @@ public class ServerPlayer extends Player {
|
||||
maindimensionkey1 = resourcekey1;
|
||||
}
|
||||
// Paper end
|
||||
- CriteriaTriggers.CHANGED_DIMENSION.trigger(this, maindimensionkey, maindimensionkey1);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.CHANGED_DIMENSION.trigger(this, maindimensionkey, maindimensionkey1); // Kaiiju
|
||||
if (maindimensionkey != resourcekey || maindimensionkey1 != resourcekey1) {
|
||||
- CriteriaTriggers.CHANGED_DIMENSION.trigger(this, resourcekey, resourcekey1);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.CHANGED_DIMENSION.trigger(this, resourcekey, resourcekey1); // Kaiiju
|
||||
}
|
||||
|
||||
if (maindimensionkey == Level.NETHER && maindimensionkey1 == Level.OVERWORLD && this.enteredNetherPosition != null) {
|
||||
// CraftBukkit end
|
||||
- CriteriaTriggers.NETHER_TRAVEL.trigger(this, this.enteredNetherPosition);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.NETHER_TRAVEL.trigger(this, this.enteredNetherPosition); // Kaiiju
|
||||
}
|
||||
|
||||
if (maindimensionkey1 != Level.NETHER) { // CraftBukkit
|
||||
@@ -1872,7 +1872,7 @@ public class ServerPlayer extends Player {
|
||||
{
|
||||
Either<Player.BedSleepingProblem, Unit> either = super.startSleepInBed(blockposition, force).ifRight((unit) -> {
|
||||
this.awardStat(Stats.SLEEP_IN_BED);
|
||||
- CriteriaTriggers.SLEPT_IN_BED.trigger(this);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.SLEPT_IN_BED.trigger(this); // Kaiiju
|
||||
});
|
||||
|
||||
if (!this.serverLevel().canSleepThroughNights()) {
|
||||
@@ -2163,7 +2163,7 @@ public class ServerPlayer extends Player {
|
||||
|
||||
@Override
|
||||
public void triggerRecipeCrafted(Recipe<?> recipe, List<ItemStack> ingredients) {
|
||||
- CriteriaTriggers.RECIPE_CRAFTED.trigger(this, recipe.getId(), ingredients);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.RECIPE_CRAFTED.trigger(this, recipe.getId(), ingredients); // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2292,14 +2292,14 @@ public class ServerPlayer extends Player {
|
||||
this.levitationStartPos = this.position();
|
||||
}
|
||||
|
||||
- CriteriaTriggers.EFFECTS_CHANGED.trigger(this, source);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.EFFECTS_CHANGED.trigger(this, source); // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEffectUpdated(MobEffectInstance effect, boolean reapplyEffect, @Nullable Entity source) {
|
||||
super.onEffectUpdated(effect, reapplyEffect, source);
|
||||
this.connection.send(new ClientboundUpdateMobEffectPacket(this.getId(), effect));
|
||||
- CriteriaTriggers.EFFECTS_CHANGED.trigger(this, source);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.EFFECTS_CHANGED.trigger(this, source); // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2310,7 +2310,7 @@ public class ServerPlayer extends Player {
|
||||
this.levitationStartPos = null;
|
||||
}
|
||||
|
||||
- CriteriaTriggers.EFFECTS_CHANGED.trigger(this, (Entity) null);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.EFFECTS_CHANGED.trigger(this, (Entity) null); // Kaiiju
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2870,7 +2870,7 @@ public class ServerPlayer extends Player {
|
||||
|
||||
@Override
|
||||
protected void updateUsingItem(ItemStack stack) {
|
||||
- CriteriaTriggers.USING_ITEM.trigger(this, stack);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.USING_ITEM.trigger(this, stack); // Kaiiju
|
||||
super.updateUsingItem(stack);
|
||||
}
|
||||
|
||||
@@ -2899,7 +2899,7 @@ public class ServerPlayer extends Player {
|
||||
Entity entity = item.getOwner();
|
||||
|
||||
if (entity != null) {
|
||||
- CriteriaTriggers.THROWN_ITEM_PICKED_UP_BY_PLAYER.trigger(this, item.getItem(), entity);
|
||||
+ if (!this.level().kaiijuConfig.disableAchievements) CriteriaTriggers.THROWN_ITEM_PICKED_UP_BY_PLAYER.trigger(this, item.getItem(), entity); // Kaiiju
|
||||
}
|
||||
|
||||
}
|
||||
43
patches/server/0033-Option-to-disable-arm-swing-event.patch
Normal file
43
patches/server/0033-Option-to-disable-arm-swing-event.patch
Normal file
@@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:37:27 +0200
|
||||
Subject: [PATCH] Option to disable arm swing event
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 8c872b2ad341f0105275209201fda03706535161..9b118a6e22264c88c0460016822b1920631fff85 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -214,10 +214,12 @@ public class KaiijuConfig {
|
||||
|
||||
public static boolean disableVanishApi = false;
|
||||
public static boolean disablePlayerStats = false;
|
||||
+ public static boolean disableArmSwingEvent = false;
|
||||
|
||||
private static void optimizationSettings() {
|
||||
disableVanishApi = getBoolean("optimization.disable-vanish-api", disableVanishApi);
|
||||
disablePlayerStats = getBoolean("optimization.disable-player-stats", disablePlayerStats);
|
||||
+ disableArmSwingEvent = getBoolean("optimization.disable-arm-swing-event", disableArmSwingEvent);
|
||||
}
|
||||
|
||||
public static String serverModName = "Kaiiju";
|
||||
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
index 564b2e668d50f05863080288d20bd54077588db9..78ac2b47335961b15a8dd8851d17b79c249bc275 100644
|
||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -2705,6 +2705,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
||||
if (this.player.isImmobile()) return; // CraftBukkit
|
||||
this.player.resetLastActionTime();
|
||||
+ if (!dev.kaiijumc.kaiiju.KaiijuConfig.disableArmSwingEvent) { // Kaiiju
|
||||
// CraftBukkit start - Raytrace to look for 'rogue armswings'
|
||||
float f1 = this.player.getXRot();
|
||||
float f2 = this.player.getYRot();
|
||||
@@ -2737,6 +2738,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||
|
||||
if (event.isCancelled()) return;
|
||||
// CraftBukkit end
|
||||
+ } // Kaiiju
|
||||
this.player.swing(packet.getHand());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:47:57 +0200
|
||||
Subject: [PATCH] Option to disable creatures spawn events
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index 31d66bb2fcf4bb7262df2d8006e307fee92660ea..c9830912019079369268bfbf2c95de18ad598f52 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -151,6 +151,7 @@ public class KaiijuWorldConfig {
|
||||
public boolean tickWhenEmpty = true;
|
||||
public boolean enableEntityThrottling = false;
|
||||
public boolean disableAchievements = false;
|
||||
+ public boolean disableCreaturesSpawnEvents = false;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
@@ -158,6 +159,7 @@ public class KaiijuWorldConfig {
|
||||
tickWhenEmpty = getBoolean("optimization.tick-when-empty", tickWhenEmpty);
|
||||
enableEntityThrottling = getBoolean("optimization.enable-entity-throttling", enableEntityThrottling);
|
||||
disableAchievements = getBoolean("optimization.disable-achievements", disableAchievements);
|
||||
+ disableCreaturesSpawnEvents = getBoolean("optimization.disable-creatures-spawn-events", disableCreaturesSpawnEvents);
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
diff --git a/src/main/java/net/minecraft/server/level/ServerChunkCache.java b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||
index af35fd63b090aa3d89bc60cb9cb7694b5f502681..e5dded0363b14608e834e63e678563b1423d66e7 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerChunkCache.java
|
||||
@@ -486,21 +486,29 @@ public class ServerChunkCache extends ChunkSource {
|
||||
chunkRange = (chunkRange > viewDistance) ? (byte)viewDistance : chunkRange;
|
||||
chunkRange = (chunkRange > DistanceManager.MOB_SPAWN_RANGE) ? DistanceManager.MOB_SPAWN_RANGE : chunkRange;
|
||||
|
||||
- com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(player.getBukkitEntity(), (byte)chunkRange);
|
||||
+ // Kaiiju start - disable creatures spawn events
|
||||
+ com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent event = null;
|
||||
+ if (!this.level.kaiijuConfig.disableCreaturesSpawnEvents) {
|
||||
+ event = new com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent(player.getBukkitEntity(), (byte)chunkRange);
|
||||
+ // Kaiiju end
|
||||
event.callEvent();
|
||||
if (event.isCancelled() || event.getSpawnRadius() < 0) { // Folia - region threading
|
||||
player.lastEntitySpawnRadiusSquared = -1.0; player.playerNaturallySpawnedEvent = null; // Folia - region threading
|
||||
regionizedWorldData.mobSpawnMap.remove(player); // Folia - region threading
|
||||
continue;
|
||||
}
|
||||
+ // Kaiiju start - disable creatures spawn events
|
||||
+ chunkRange = Math.min(event.getSpawnRadius(), 32);
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
|
||||
- int range = Math.min(event.getSpawnRadius(), 32); // limit to max view distance
|
||||
+ int range = chunkRange; // limit to max view distance // Kaiiju
|
||||
int chunkX = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getX());
|
||||
int chunkZ = io.papermc.paper.util.MCUtil.getChunkCoordinate(player.getZ());
|
||||
|
||||
regionizedWorldData.mobSpawnMap.addOrUpdate(player, chunkX, chunkZ, range); // Folia - region threading
|
||||
player.lastEntitySpawnRadiusSquared = (double)((range << 4) * (range << 4)); // used in anyPlayerCloseEnoughForSpawning
|
||||
- player.playerNaturallySpawnedEvent = event;
|
||||
+ if (!this.level.kaiijuConfig.disableCreaturesSpawnEvents) player.playerNaturallySpawnedEvent = event; // Kaiiju
|
||||
}
|
||||
// Paper end - optimize isOutisdeRange
|
||||
LevelData worlddata = this.level.getLevelData();
|
||||
@@ -0,0 +1,39 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:52:00 +0200
|
||||
Subject: [PATCH] Option to disable dolphin swim to treasure
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index c9830912019079369268bfbf2c95de18ad598f52..e2fb7d7a7b3126d386b46442c115085d1974ac4e 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -152,6 +152,7 @@ public class KaiijuWorldConfig {
|
||||
public boolean enableEntityThrottling = false;
|
||||
public boolean disableAchievements = false;
|
||||
public boolean disableCreaturesSpawnEvents = false;
|
||||
+ public boolean disableDolphinSwimToTreasure = false;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
@@ -160,6 +161,7 @@ public class KaiijuWorldConfig {
|
||||
enableEntityThrottling = getBoolean("optimization.enable-entity-throttling", enableEntityThrottling);
|
||||
disableAchievements = getBoolean("optimization.disable-achievements", disableAchievements);
|
||||
disableCreaturesSpawnEvents = getBoolean("optimization.disable-creatures-spawn-events", disableCreaturesSpawnEvents);
|
||||
+ disableDolphinSwimToTreasure = getBoolean("optimization.disable-dolphin-swim-to-treasure", disableDolphinSwimToTreasure);
|
||||
}
|
||||
|
||||
public boolean fixVoidTrading = true;
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
|
||||
index 8448c5d778998390cf2b683f36e4e18ca7ffdc34..8438ae5194bba7cad22af5e350c5a288529cbcdb 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
|
||||
@@ -164,7 +164,7 @@ public class Dolphin extends WaterAnimal {
|
||||
protected void registerGoals() {
|
||||
this.goalSelector.addGoal(0, new BreathAirGoal(this));
|
||||
this.goalSelector.addGoal(0, new TryFindWaterGoal(this));
|
||||
- this.goalSelector.addGoal(1, new Dolphin.DolphinSwimToTreasureGoal(this));
|
||||
+ if (!this.level().kaiijuConfig.disableDolphinSwimToTreasure) this.goalSelector.addGoal(1, new Dolphin.DolphinSwimToTreasureGoal(this)); // Kaiiju
|
||||
this.goalSelector.addGoal(2, new Dolphin.DolphinSwimWithPlayerGoal(this, 4.0D));
|
||||
this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 1.0D, 10));
|
||||
this.goalSelector.addGoal(4, new RandomLookAroundGoal(this));
|
||||
18
patches/server/0036-Unsupported-configuration.patch
Normal file
18
patches/server/0036-Unsupported-configuration.patch
Normal file
@@ -0,0 +1,18 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Kugge <sofiane.djerbi38@gmail.com>
|
||||
Date: Mon, 28 Aug 2023 16:30:36 +0200
|
||||
Subject: [PATCH] Unsupported configuration
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 9b118a6e22264c88c0460016822b1920631fff85..8232ff317f44c698cac94656e4a910d75b73f402 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -229,4 +229,7 @@ public class KaiijuConfig {
|
||||
serverModName = getString("gameplay.server-mod-name", serverModName);
|
||||
sharedRandomForPlayers = getBoolean("gameplay.shared-random-for-players", sharedRandomForPlayers);
|
||||
}
|
||||
+
|
||||
+ private static void unsupportedSettings() {
|
||||
+ }
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Thu, 22 Jun 2023 00:55:17 +0200
|
||||
Subject: [PATCH] Option to disable ensure tick thread checks
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 8232ff317f44c698cac94656e4a910d75b73f402..12738605442b9cdd086b2b29ff372d12552993b8 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -230,6 +230,9 @@ public class KaiijuConfig {
|
||||
sharedRandomForPlayers = getBoolean("gameplay.shared-random-for-players", sharedRandomForPlayers);
|
||||
}
|
||||
|
||||
+ public static boolean disableEnsureTickThreadChecks = false;
|
||||
+
|
||||
private static void unsupportedSettings() {
|
||||
+ disableEnsureTickThreadChecks = getBoolean("unsupported.disable-ensure-tick-thread-checks", disableEnsureTickThreadChecks);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/io/papermc/paper/util/TickThread.java b/src/main/java/io/papermc/paper/util/TickThread.java
|
||||
index cb453dd110fc37fae75257a4576512126207763e..492e6a512343001d3d772d2d8b427d2d84e89da5 100644
|
||||
--- a/src/main/java/io/papermc/paper/util/TickThread.java
|
||||
+++ b/src/main/java/io/papermc/paper/util/TickThread.java
|
||||
@@ -46,6 +46,7 @@ public class TickThread extends Thread {
|
||||
*/
|
||||
@Deprecated
|
||||
public static void ensureTickThread(final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThread()) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
@@ -53,6 +54,7 @@ public class TickThread extends Thread {
|
||||
}
|
||||
|
||||
public static void ensureTickThread(final ServerLevel world, final BlockPos pos, final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThreadFor(world, pos)) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
@@ -60,6 +62,7 @@ public class TickThread extends Thread {
|
||||
}
|
||||
|
||||
public static void ensureTickThread(final ServerLevel world, final ChunkPos pos, final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThreadFor(world, pos)) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
@@ -67,6 +70,7 @@ public class TickThread extends Thread {
|
||||
}
|
||||
|
||||
public static void ensureTickThread(final ServerLevel world, final int chunkX, final int chunkZ, final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThreadFor(world, chunkX, chunkZ)) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
@@ -74,6 +78,7 @@ public class TickThread extends Thread {
|
||||
}
|
||||
|
||||
public static void ensureTickThread(final Entity entity, final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThreadFor(entity)) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
@@ -81,6 +86,7 @@ public class TickThread extends Thread {
|
||||
}
|
||||
|
||||
public static void ensureTickThread(final ServerLevel world, final AABB aabb, final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThreadFor(world, aabb)) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
@@ -88,6 +94,7 @@ public class TickThread extends Thread {
|
||||
}
|
||||
|
||||
public static void ensureTickThread(final ServerLevel world, final double blockX, final double blockZ, final String reason) {
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.disableEnsureTickThreadChecks) return; // Kaiiju
|
||||
if (!isTickThreadFor(world, blockX, blockZ)) {
|
||||
MinecraftServer.LOGGER.error("Thread " + Thread.currentThread().getName() + " failed main thread check: " + reason, new Throwable());
|
||||
throw new IllegalStateException(reason);
|
||||
46
patches/server/0038-Don-t-kick-player-on-bad-packet.patch
Normal file
46
patches/server/0038-Don-t-kick-player-on-bad-packet.patch
Normal file
@@ -0,0 +1,46 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 2 Jul 2023 19:13:14 +0300
|
||||
Subject: [PATCH] Don't kick player on bad packet
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 12738605442b9cdd086b2b29ff372d12552993b8..c0432bb14df86fe070c90deb33aa8c535cfe46f3 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -206,10 +206,12 @@ public class KaiijuConfig {
|
||||
|
||||
public static boolean sendNullEntityPackets = true;
|
||||
public static boolean alternateKeepAlive = false;
|
||||
+ public static boolean kickPlayerOnBadPacket = true;
|
||||
|
||||
private static void networkSettings() {
|
||||
sendNullEntityPackets = getBoolean("network.send-null-entity-packets", sendNullEntityPackets);
|
||||
alternateKeepAlive = getBoolean("network.alternate-keepalive", alternateKeepAlive);
|
||||
+ kickPlayerOnBadPacket = getBoolean("network.kick-player-on-bad-packet", kickPlayerOnBadPacket);
|
||||
}
|
||||
|
||||
public static boolean disableVanishApi = false;
|
||||
diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
|
||||
index f6ccb6eab566b44c3460376d46df1f2cf3d7b19d..13e5aeb0c04d27408ffbc6b11582426a7f2eb0f0 100644
|
||||
--- a/src/main/java/net/minecraft/network/Connection.java
|
||||
+++ b/src/main/java/net/minecraft/network/Connection.java
|
||||
@@ -271,12 +271,18 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
|
||||
ConnectionProtocol enumprotocol = this.getCurrentProtocol();
|
||||
Packet<?> packet = enumprotocol == ConnectionProtocol.LOGIN ? new ClientboundLoginDisconnectPacket(ichatmutablecomponent) : new ClientboundDisconnectPacket(ichatmutablecomponent);
|
||||
|
||||
+ // Kaiiju start - Don't kick player on bad packet
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.kickPlayerOnBadPacket
|
||||
+ || throwable instanceof io.netty.channel.unix.Errors.NativeIoException) {
|
||||
+ // Kaiiju end
|
||||
this.send((Packet) packet, PacketSendListener.thenRun(() -> {
|
||||
this.disconnect(ichatmutablecomponent);
|
||||
}));
|
||||
this.setReadOnly();
|
||||
+ } // Kaiiju - Don't kick player on bad packet
|
||||
} else {
|
||||
Connection.LOGGER.debug("Double fault", throwable);
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.kickPlayerOnBadPacket) // Kaiiju - Don't kick player on bad packet
|
||||
this.disconnect(ichatmutablecomponent);
|
||||
}
|
||||
}
|
||||
34
patches/server/0039-Skip-event-if-no-listeners.patch
Normal file
34
patches/server/0039-Skip-event-if-no-listeners.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: foss-mc <69294560+foss-mc@users.noreply.github.com>
|
||||
Date: Sat, 8 Jul 2023 01:31:10 +0300
|
||||
Subject: [PATCH] Skip event if no listeners
|
||||
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
||||
index 7ce9ebba8ce304d1f3f21d4f15ee5f3560d7700b..d0f6d4e6ab3a7a4bd6cb8e27c90c7c7300f204a5 100644
|
||||
--- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
||||
+++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
||||
@@ -36,14 +36,21 @@ class PaperEventManager {
|
||||
|
||||
// SimplePluginManager
|
||||
public void callEvent(@NotNull Event event) {
|
||||
+ // Kaiiju start - Skip event of no listeners
|
||||
+ HandlerList handlers = event.getHandlers();
|
||||
+ RegisteredListener[] listeners = handlers.getRegisteredListeners();
|
||||
+ if (listeners.length == 0) return;
|
||||
+ // Kaiiju end
|
||||
if (event.isAsynchronous() && this.server.isPrimaryThread()) {
|
||||
throw new IllegalStateException(event.getEventName() + " may only be triggered asynchronously.");
|
||||
} else if (!event.isAsynchronous() && !this.server.isPrimaryThread() && !this.server.isStopping()) {
|
||||
throw new IllegalStateException(event.getEventName() + " may only be triggered synchronously.");
|
||||
}
|
||||
|
||||
- HandlerList handlers = event.getHandlers();
|
||||
- RegisteredListener[] listeners = handlers.getRegisteredListeners();
|
||||
+ // Kaiiju start - Moved up
|
||||
+ //HandlerList handlers = event.getHandlers();
|
||||
+ //RegisteredListener[] listeners = handlers.getRegisteredListeners();
|
||||
+ // Kaiiju end
|
||||
|
||||
for (RegisteredListener registration : listeners) {
|
||||
if (!registration.getPlugin().isEnabled()) {
|
||||
@@ -0,0 +1,75 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sat, 8 Jul 2023 03:31:04 +0300
|
||||
Subject: [PATCH] Teleport async if we cannot move entity off-main
|
||||
|
||||
Entities with huge velocity (100k+ velocity anarchy travel exploit) might disappear / crash the server because they travel a region each tick.
|
||||
TODO: Entities with huge velocity still throw stacktraces because they are ticked in "null" regions.
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
index e2fb7d7a7b3126d386b46442c115085d1974ac4e..44f5540a6a5733cf6f10f6b04fc9611ac4e53685 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuWorldConfig.java
|
||||
@@ -169,6 +169,7 @@ public class KaiijuWorldConfig {
|
||||
public boolean fixTripWireStateInconsistency = true;
|
||||
public boolean safeTeleporting = true;
|
||||
public boolean sandDuplication = false;
|
||||
+ public boolean teleportAsyncOnHighVelocity = false;
|
||||
|
||||
private void gameplaySettings() {
|
||||
fixVoidTrading = getBoolean("gameplay.fix-void-trading", fixVoidTrading);
|
||||
@@ -176,5 +177,6 @@ public class KaiijuWorldConfig {
|
||||
fixTripWireStateInconsistency = getBoolean("gameplay.fix-tripwire-state-inconsistency", fixTripWireStateInconsistency);
|
||||
safeTeleporting = getBoolean("gameplay.safe-teleportation", safeTeleporting);
|
||||
sandDuplication = getBoolean("gameplay.sand-duplication", sandDuplication);
|
||||
+ teleportAsyncOnHighVelocity = getBoolean("gameplay.teleport-async-on-high-velocity", teleportAsyncOnHighVelocity);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
index 7c57675adc33d7c5525cdf8ebfd696a0e756c9a7..69abd1a59a5d2855c6dd264c0e8e483eccba0132 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||||
@@ -1127,7 +1127,20 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
}
|
||||
}
|
||||
|
||||
+ try { // Kaiiju - Teleport async if we cannot move entity off-main
|
||||
this.setPos(this.getX() + vec3d1.x, this.getY() + vec3d1.y, this.getZ() + vec3d1.z);
|
||||
+ // Kaiiju start - Teleport async if we cannot move entity off-main
|
||||
+ } catch (IllegalStateException e) {
|
||||
+ if (this.level().kaiijuConfig.teleportAsyncOnHighVelocity)
|
||||
+ this.teleportAsync((ServerLevel) this.level(), this.position().add(vec3d1),
|
||||
+ this.getYRot(), this.getXRot(),
|
||||
+ null, PlayerTeleportEvent.TeleportCause.UNKNOWN,
|
||||
+ Entity.TELEPORT_FLAG_LOAD_CHUNK | Entity.TELEPORT_FLAG_TELEPORT_PASSENGERS,
|
||||
+ null
|
||||
+ );
|
||||
+ else LOGGER.error("High velocity entity caused off-main setPos: ", e);
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
}
|
||||
|
||||
this.level().getProfiler().pop();
|
||||
@@ -3869,13 +3882,15 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
|
||||
// check for same region
|
||||
if (destination == this.level()) {
|
||||
Vec3 currPos = this.position();
|
||||
- if (
|
||||
- destination.regioniser.getRegionAtUnsynchronised(
|
||||
- io.papermc.paper.util.CoordinateUtils.getChunkX(currPos), io.papermc.paper.util.CoordinateUtils.getChunkZ(currPos)
|
||||
- ) == destination.regioniser.getRegionAtUnsynchronised(
|
||||
- io.papermc.paper.util.CoordinateUtils.getChunkX(pos), io.papermc.paper.util.CoordinateUtils.getChunkZ(pos)
|
||||
- )
|
||||
- ) {
|
||||
+ // Kaiiju start - We shouldn't teleport when regions are null
|
||||
+ io.papermc.paper.threadedregions.ThreadedRegionizer.ThreadedRegion<io.papermc.paper.threadedregions.TickRegions.TickRegionData,
|
||||
+ io.papermc.paper.threadedregions.TickRegions.TickRegionSectionData>
|
||||
+ currRegion = destination.regioniser.getRegionAtUnsynchronised(io.papermc.paper.util.CoordinateUtils.getChunkX(currPos), io.papermc.paper.util.CoordinateUtils.getChunkZ(currPos));
|
||||
+ io.papermc.paper.threadedregions.ThreadedRegionizer.ThreadedRegion<io.papermc.paper.threadedregions.TickRegions.TickRegionData,
|
||||
+ io.papermc.paper.threadedregions.TickRegions.TickRegionSectionData>
|
||||
+ destRegion = destination.regioniser.getRegionAtUnsynchronised(io.papermc.paper.util.CoordinateUtils.getChunkX(pos), io.papermc.paper.util.CoordinateUtils.getChunkZ(pos));
|
||||
+ if (currRegion == destRegion && currRegion != null) {
|
||||
+ // Kaiiju end
|
||||
EntityTreeNode passengerTree = this.detachPassengers();
|
||||
// Note: The client does not accept position updates for controlled entities. So, we must
|
||||
// perform a lot of tracker updates here to make it all work out.
|
||||
19
patches/server/0041-Add-back-worldborder-command.patch
Normal file
19
patches/server/0041-Add-back-worldborder-command.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 9 Jul 2023 19:17:40 +0300
|
||||
Subject: [PATCH] Add back worldborder command
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
||||
index 681cd79ce24fe5d952e987d46e2fd8df07a0f8a1..68af43ed4d667648df0e45ffc899d3e4b7b1a69d 100644
|
||||
--- a/src/main/java/net/minecraft/commands/Commands.java
|
||||
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
||||
@@ -199,7 +199,7 @@ public class Commands {
|
||||
TitleCommand.register(this.dispatcher);
|
||||
//TriggerCommand.register(this.dispatcher); // Folia - region threading - TODO later
|
||||
WeatherCommand.register(this.dispatcher);
|
||||
- //WorldBorderCommand.register(this.dispatcher); // Folia - region threading - TODO later
|
||||
+ WorldBorderCommand.register(this.dispatcher); // Folia - region threading - TODO later // Kaiiju
|
||||
if (JvmProfiler.INSTANCE.isAvailable()) {
|
||||
JfrCommand.register(this.dispatcher);
|
||||
}
|
||||
19
patches/server/0042-Add-back-data-command.patch
Normal file
19
patches/server/0042-Add-back-data-command.patch
Normal file
@@ -0,0 +1,19 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Sun, 9 Jul 2023 19:18:42 +0300
|
||||
Subject: [PATCH] Add back data command
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/commands/Commands.java b/src/main/java/net/minecraft/commands/Commands.java
|
||||
index 68af43ed4d667648df0e45ffc899d3e4b7b1a69d..44576310cc5b89c287b0ab7ba1a99d76b67f33dd 100644
|
||||
--- a/src/main/java/net/minecraft/commands/Commands.java
|
||||
+++ b/src/main/java/net/minecraft/commands/Commands.java
|
||||
@@ -148,7 +148,7 @@ public class Commands {
|
||||
ClearInventoryCommands.register(this.dispatcher, commandRegistryAccess);
|
||||
//CloneCommands.register(this.dispatcher, commandRegistryAccess); // Folia - region threading - TODO
|
||||
DamageCommand.register(this.dispatcher, commandRegistryAccess);
|
||||
- //DataCommands.register(this.dispatcher); // Folia - region threading - TODO
|
||||
+ DataCommands.register(this.dispatcher); // Folia - region threading - TODO // Kaiiju
|
||||
//DataPackCommand.register(this.dispatcher); // Folia - region threading - TODO
|
||||
//DebugCommand.register(this.dispatcher); // Folia - region threading - TODO
|
||||
DefaultGameModeCommands.register(this.dispatcher);
|
||||
1314
patches/server/0043-Async-path-processing.patch
Normal file
1314
patches/server/0043-Async-path-processing.patch
Normal file
File diff suppressed because it is too large
Load Diff
50
patches/server/0044-Global-event-synchronization.patch
Normal file
50
patches/server/0044-Global-event-synchronization.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xymb <xymb@endcrystal.me>
|
||||
Date: Mon, 28 Aug 2023 16:57:55 +0200
|
||||
Subject: [PATCH] Global event synchronization
|
||||
|
||||
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
index 7ae19ea532ee0d15774466899d33cb1f130bd9a7..dd6a9ca1c6a2feada31829d0c8ada4e67fdf0cf6 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -248,8 +248,10 @@ public class KaiijuConfig {
|
||||
}
|
||||
|
||||
public static boolean disableEnsureTickThreadChecks = false;
|
||||
+ public static boolean globalEventSynchronization = false;
|
||||
|
||||
private static void unsupportedSettings() {
|
||||
disableEnsureTickThreadChecks = getBoolean("unsupported.disable-ensure-tick-thread-checks", disableEnsureTickThreadChecks);
|
||||
+ globalEventSynchronization = getBoolean("unsupported.global-event-synchronization", globalEventSynchronization);
|
||||
}
|
||||
}
|
||||
diff --git a/src/main/java/dev/kaiijumc/kaiiju/lock/GlobalPluginSynchronizer.java b/src/main/java/dev/kaiijumc/kaiiju/lock/GlobalPluginSynchronizer.java
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..406b241c8d4998b9977a43b8c1b628c7a27a927d
|
||||
--- /dev/null
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/lock/GlobalPluginSynchronizer.java
|
||||
@@ -0,0 +1,5 @@
|
||||
+package dev.kaiijumc.kaiiju.lock;
|
||||
+
|
||||
+public class GlobalPluginSynchronizer {
|
||||
+ public static final Object lock = new Object();
|
||||
+}
|
||||
diff --git a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
||||
index d0f6d4e6ab3a7a4bd6cb8e27c90c7c7300f204a5..03b8f704de1e9a798391297d3daf3c49bf599a56 100644
|
||||
--- a/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
||||
+++ b/src/main/java/io/papermc/paper/plugin/manager/PaperEventManager.java
|
||||
@@ -58,6 +58,13 @@ class PaperEventManager {
|
||||
}
|
||||
|
||||
try {
|
||||
+ // Kaiiju start - Global Event Synchronization
|
||||
+ if (dev.kaiijumc.kaiiju.KaiijuConfig.globalEventSynchronization) {
|
||||
+ synchronized (dev.kaiijumc.kaiiju.lock.GlobalPluginSynchronizer.lock) {
|
||||
+ registration.callEvent(event);
|
||||
+ }
|
||||
+ } else
|
||||
+ // Kaiiju end
|
||||
registration.callEvent(event);
|
||||
} catch (AuthorNagException ex) {
|
||||
Plugin plugin = registration.getPlugin();
|
||||
101
patches/todo/0012-Static-Distance-WIP.patch
Normal file
101
patches/todo/0012-Static-Distance-WIP.patch
Normal file
@@ -0,0 +1,101 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "Sofiane H. Djerbi" <46628754+kugge@users.noreply.github.com>
|
||||
Date: Wed, 19 Apr 2023 02:37:04 +0300
|
||||
Subject: [PATCH] Static Distance WIP
|
||||
|
||||
|
||||
diff --git a/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java b/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java
|
||||
index e77972c4c264100ffdd824bfa2dac58dbbc6d678..cddacd6d5bbe97641bd23f5c067012907d9c5c01 100644
|
||||
--- a/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java
|
||||
+++ b/src/main/java/io/papermc/paper/chunk/PlayerChunkLoader.java
|
||||
@@ -75,6 +75,17 @@ public final class PlayerChunkLoader {
|
||||
return data.getTargetSendViewDistance();
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Static distance
|
||||
+ public static int getStaticDistance(final ServerPlayer player) {
|
||||
+ final ServerLevel level = (ServerLevel)player.level;
|
||||
+ final PlayerLoaderData data = level.chunkSource.chunkMap.playerChunkManager.getData(player);
|
||||
+ if (data == null) {
|
||||
+ return level.chunkSource.chunkMap.playerChunkManager.getTargetStaticDistance();
|
||||
+ }
|
||||
+ return data.getTargetSendViewDistance();
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
protected final ChunkMap chunkMap;
|
||||
protected final Reference2ObjectLinkedOpenHashMap<ServerPlayer, PlayerLoaderData> playerMap = new Reference2ObjectLinkedOpenHashMap<>(512, 0.7f);
|
||||
protected final ReferenceLinkedOpenHashSet<PlayerLoaderData> chunkSendQueue = new ReferenceLinkedOpenHashSet<>(512, 0.7f);
|
||||
@@ -132,6 +143,12 @@ public final class PlayerChunkLoader {
|
||||
|
||||
// no throttling is applied below this VD for loading
|
||||
|
||||
+ // Kaiiju start - Static distance
|
||||
+ public final PlayerAreaMap staticMap;
|
||||
+ protected int rawStaticDistance = -1;
|
||||
+ // Kaiiju end
|
||||
+
|
||||
+
|
||||
/**
|
||||
* The chunks to be sent to players, provided they're send-ready. Send-ready means the chunk and its 1 radius neighbours are loaded.
|
||||
*/
|
||||
@@ -190,6 +207,12 @@ public final class PlayerChunkLoader {
|
||||
return this.rawSendDistance == -1 ? this.getLoadDistance() : this.rawSendDistance;
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Static distance
|
||||
+ public int getTargetStaticDistance() {
|
||||
+ return this.rawStaticDistance == -1 ? this.getStaticDistance() : this.rawStaticDistance;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
public void setTargetSendDistance(final int distance) {
|
||||
this.setSendDistance(distance);
|
||||
}
|
||||
@@ -231,6 +254,16 @@ public final class PlayerChunkLoader {
|
||||
this.rawTickDistance = distance;
|
||||
}
|
||||
|
||||
+ // Kaiiju start - Static distance
|
||||
+ public void setStaticDistance(final int distance) {
|
||||
+ this.rawStaticDistance = distance;
|
||||
+ }
|
||||
+
|
||||
+ public int getStaticDistance() {
|
||||
+ return this.rawStaticDistance;
|
||||
+ }
|
||||
+ // Kaiiju end
|
||||
+
|
||||
/*
|
||||
Players have 3 different types of view distance:
|
||||
1. Sending view distance
|
||||
@@ -256,7 +289,13 @@ public final class PlayerChunkLoader {
|
||||
|
||||
public PlayerChunkLoader(final ChunkMap chunkMap, final PooledLinkedHashSets<ServerPlayer> pooledHashSets) {
|
||||
this.chunkMap = chunkMap;
|
||||
+ // Kaiiju start - Static distance
|
||||
this.broadcastMap = new PlayerAreaMap(pooledHashSets,
|
||||
+ null,
|
||||
+ (ServerPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ,
|
||||
+ com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> newState) -> {});
|
||||
+ // Kaiiju end
|
||||
+ this.staticMap = new PlayerAreaMap(pooledHashSets,
|
||||
null,
|
||||
(ServerPlayer player, int rangeX, int rangeZ, int currPosX, int currPosZ, int prevPosX, int prevPosZ,
|
||||
com.destroystokyo.paper.util.misc.PooledLinkedHashSets.PooledObjectLinkedOpenHashSet<ServerPlayer> newState) -> {
|
||||
@@ -807,6 +846,7 @@ public final class PlayerChunkLoader {
|
||||
protected int sendViewDistance = -1;
|
||||
protected int loadViewDistance = -1;
|
||||
protected int tickViewDistance = -1;
|
||||
+ protected int staticViewDistance = -1; // Kaiiju
|
||||
|
||||
protected long nextChunkSendTarget;
|
||||
|
||||
@@ -932,6 +972,7 @@ public final class PlayerChunkLoader {
|
||||
this.loader.loadMap.remove(this.player);
|
||||
this.loader.loadTicketCleanup.remove(this.player);
|
||||
this.loader.tickMap.remove(this.player);
|
||||
+ this.loader.staticMap.remove(this.player); // Kaiiju
|
||||
}
|
||||
|
||||
protected int getClientViewDistance() {
|
||||
Reference in New Issue
Block a user