Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78ce8c44b0 | ||
|
|
570012207d | ||
|
|
3ced21898b | ||
|
|
47ffdcfec9 | ||
|
|
cb48e11a50 |
14
README.md
14
README.md
@@ -25,6 +25,11 @@
|
||||
network:
|
||||
send-null-entity-packets: true
|
||||
alternate-keepalive: false
|
||||
optimization:
|
||||
disable-vanish-api: false
|
||||
disable-player-stats: false
|
||||
disable-arm-swing-event: false
|
||||
disable-ensure-tick-thread-check: false
|
||||
gameplay:
|
||||
server-mod-name: Kaiiju
|
||||
shared-random-for-players: true
|
||||
@@ -35,6 +40,12 @@ world-settings:
|
||||
linear:
|
||||
compression-level: 1
|
||||
crash-on-broken-symlink: true
|
||||
optimization:
|
||||
shulker-box-drop-contents-when-destroyed: true
|
||||
enable-entity-throttling: false
|
||||
disable-achievements: false
|
||||
disable-creatures-spawn-events: false
|
||||
disable-dolphin-swim-to-treasure: false
|
||||
gameplay:
|
||||
fix-void-trading: true
|
||||
optimize-hoppers: true
|
||||
@@ -43,9 +54,6 @@ world-settings:
|
||||
fix-tripwire-state-inconsistency: true
|
||||
safe-teleportation: true
|
||||
sand-duplication: false
|
||||
optimization:
|
||||
shulker-box-drop-contents-when-destroyed: true
|
||||
enable-entity-throttling: false
|
||||
```
|
||||
Documentation: [Kaiiju Wiki](https://github.com/KaiijuMC/Kaiiju/wiki/Configuration)
|
||||
|
||||
|
||||
@@ -4,6 +4,18 @@ 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 b42a3466f145a92608c8746fd4beb529b4a60b01..7b56cc1275319cf07a4a25280e0ff900bdca8afa 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -206,4 +206,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
|
||||
|
||||
@@ -5,12 +5,12 @@ 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 b42a3466f145a92608c8746fd4beb529b4a60b01..6d0e1edfb7d3c020f70f6a194f16e836b462c4de 100644
|
||||
index 7b56cc1275319cf07a4a25280e0ff900bdca8afa..fdc4cdbf34ed10f6523dceac7c1931d3ca4eb522 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -206,4 +206,7 @@ public class KaiijuConfig {
|
||||
sendNullEntityPackets = getBoolean("network.send-null-entity-packets", sendNullEntityPackets);
|
||||
alternateKeepAlive = getBoolean("network.alternate-keepalive", alternateKeepAlive);
|
||||
@@ -209,4 +209,7 @@ public class KaiijuConfig {
|
||||
|
||||
private static void optimizationSettings() {
|
||||
}
|
||||
+
|
||||
+ private static void gameplaySettings() {
|
||||
|
||||
@@ -5,11 +5,11 @@ 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 6d0e1edfb7d3c020f70f6a194f16e836b462c4de..9fb33b35b4d6842ca8597f77a4116e3983ebfbcb 100644
|
||||
index fdc4cdbf34ed10f6523dceac7c1931d3ca4eb522..e1f50adfa216320bc53b460d11666064cb58c969 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -207,6 +207,9 @@ public class KaiijuConfig {
|
||||
alternateKeepAlive = getBoolean("network.alternate-keepalive", alternateKeepAlive);
|
||||
@@ -210,6 +210,9 @@ public class KaiijuConfig {
|
||||
private static void optimizationSettings() {
|
||||
}
|
||||
|
||||
+ public static String serverModName = "Kaiiju";
|
||||
|
||||
@@ -5,10 +5,10 @@ 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 9fb33b35b4d6842ca8597f77a4116e3983ebfbcb..51a49fc98147eef7bb50e7a2c71e0e8ed75e3dd6 100644
|
||||
index e1f50adfa216320bc53b460d11666064cb58c969..c934341c17caf4696065ac6c39bdfef570c62f13 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -208,8 +208,10 @@ public class KaiijuConfig {
|
||||
@@ -211,8 +211,10 @@ public class KaiijuConfig {
|
||||
}
|
||||
|
||||
public static String serverModName = "Kaiiju";
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
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 EntitySelector
|
||||
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/world/level/EntityGetter.java b/src/main/java/net/minecraft/world/level/EntityGetter.java
|
||||
index b1a6a66ed02706c1adc36dcedfa415f5a24a25a0..bed6f316f4186895fd2e72ff114c4db1e0f53cf1 100644
|
||||
--- a/src/main/java/net/minecraft/world/level/EntityGetter.java
|
||||
+++ b/src/main/java/net/minecraft/world/level/EntityGetter.java
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
46
patches/server/0027-Swap-distanceToSqr-and-target-test.patch
Normal file
46
patches/server/0027-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;
|
||||
}
|
||||
38
patches/server/0033-Option-to-disable-vanish-api.patch
Normal file
38
patches/server/0033-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 c934341c17caf4696065ac6c39bdfef570c62f13..f49510c999ce5241f26dc9ba90a6148bf31467c7 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -207,7 +207,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 24bd63c596c9f61f1e89ec5b001b7cb7a29a09ff..3fc2b4a91d2b9727972d6b43b6d2c04b1df3c698 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
||||
@@ -1350,7 +1350,11 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
||||
boolean flag = d1 <= d2 && this.entity.broadcastToPlayer(player);
|
||||
|
||||
// CraftBukkit start - respect vanish API
|
||||
- if (!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 (!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/0034-Option-to-disable-player-stats.patch
Normal file
34
patches/server/0034-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 f49510c999ce5241f26dc9ba90a6148bf31467c7..b23f2df433d7ebc871f4009081c28ed9054d91c7 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -208,9 +208,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 d58e8211fc765c61548ac2a180de87dd2934ba37..19642e7bf00dc9fdc157e70b4d6849a9898a2557 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -2081,6 +2081,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);
|
||||
173
patches/server/0035-Option-to-disable-achievements.patch
Normal file
173
patches/server/0035-Option-to-disable-achievements.patch
Normal file
@@ -0,0 +1,173 @@
|
||||
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 be32a516c1ee0f95790b8a96c465045ca4355c76..27a0f1d81161adb86339f4b829c3628c1022271b 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 enableEntityThrottling = false;
|
||||
+ public boolean disableAchievements = false;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
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 19642e7bf00dc9fdc157e70b4d6849a9898a2557..5e81fd3b1f88f33314f7b24b3e9ba2be21addd0c 100644
|
||||
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
||||
@@ -734,7 +734,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
|
||||
@@ -781,9 +781,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();
|
||||
@@ -858,7 +858,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
|
||||
@@ -887,7 +887,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;
|
||||
@@ -906,7 +906,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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1110,7 +1110,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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1228,7 +1228,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);
|
||||
}
|
||||
|
||||
@@ -1730,14 +1730,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
|
||||
@@ -1815,7 +1815,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()) {
|
||||
@@ -2101,7 +2101,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
|
||||
@@ -2230,14 +2230,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
|
||||
@@ -2248,7 +2248,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
|
||||
@@ -2808,7 +2808,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);
|
||||
}
|
||||
|
||||
@@ -2837,7 +2837,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/0036-Option-to-disable-arm-swing-event.patch
Normal file
43
patches/server/0036-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 b23f2df433d7ebc871f4009081c28ed9054d91c7..ec71f3f52cb8f7931aabd94619d2e7a24491d7ad 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -209,10 +209,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 b2ed157a17cada4887e543a23ee65642eb54637e..a238a3f62a92748d1dfb11fcf8938d33409b7a0c 100644
|
||||
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||
@@ -2647,6 +2647,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();
|
||||
@@ -2669,6 +2670,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Tic
|
||||
|
||||
if (event.isCancelled()) return;
|
||||
// CraftBukkit end
|
||||
+ } // Kaiiju
|
||||
this.player.swing(packet.getHand());
|
||||
}
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
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 27a0f1d81161adb86339f4b829c3628c1022271b..58b0725fea8d2216242a949b9ed2b3d9e93ef1f3 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 enableEntityThrottling = false;
|
||||
public boolean disableAchievements = false;
|
||||
+ public boolean disableCreaturesSpawnEvents = false;
|
||||
|
||||
private void optimizationSettings() {
|
||||
shulkerBoxDropContentsWhenDestroyed = getBoolean("optimization.shulker-box-drop-contents-when-destroyed", shulkerBoxDropContentsWhenDestroyed);
|
||||
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,38 @@
|
||||
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 58b0725fea8d2216242a949b9ed2b3d9e93ef1f3..87887a6d266767fd46f4d65d89dfb9d853089db4 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 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);
|
||||
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 501e6cb4aa83f81c1f657e41f4e7f11d19d46831..8240b8e27d5f5e941049f269718670db0510f497 100644
|
||||
--- a/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
|
||||
+++ b/src/main/java/net/minecraft/world/entity/animal/Dolphin.java
|
||||
@@ -160,7 +160,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));
|
||||
@@ -0,0 +1,84 @@
|
||||
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 ec71f3f52cb8f7931aabd94619d2e7a24491d7ad..900d319f4ddb17af2275c1a20824648b41d39aac 100644
|
||||
--- a/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
+++ b/src/main/java/dev/kaiijumc/kaiiju/KaiijuConfig.java
|
||||
@@ -210,11 +210,13 @@ public class KaiijuConfig {
|
||||
public static boolean disableVanishApi = false;
|
||||
public static boolean disablePlayerStats = false;
|
||||
public static boolean disableArmSwingEvent = false;
|
||||
+ public static boolean disableEnsureTickThreadCheck = 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);
|
||||
+ disableEnsureTickThreadCheck = getBoolean("optimization.disable-ensure-tick-thread-check", disableEnsureTickThreadCheck);
|
||||
}
|
||||
|
||||
public static String serverModName = "Kaiiju";
|
||||
diff --git a/src/main/java/io/papermc/paper/util/TickThread.java b/src/main/java/io/papermc/paper/util/TickThread.java
|
||||
index cb453dd110fc37fae75257a4576512126207763e..6d0c5aa38b6980c80c2021933c4758e2dabed9fd 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.disableEnsureTickThreadCheck) 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.disableEnsureTickThreadCheck) 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.disableEnsureTickThreadCheck) 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.disableEnsureTickThreadCheck) 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.disableEnsureTickThreadCheck) 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.disableEnsureTickThreadCheck) 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.disableEnsureTickThreadCheck) 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);
|
||||
Reference in New Issue
Block a user