Allow enabling sand duping (#10191)

Because this exploit has been widely known for years and has not been fixed by Mojang, we decided that it was worth allowing people to toggle it on/off due to how easy it is to make it configurable.

It should be noted that this decision does not promise all future exploits will be configurable.
This commit is contained in:
Owen 2024-03-03 17:05:34 -05:00 committed by GitHub
parent b21eb4d9a4
commit 89d51d5f29
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
673 changed files with 157 additions and 189 deletions

View file

@ -0,0 +1,73 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Lukas Planz <lukas.planz@web.de>
Date: Tue, 5 Sep 2023 20:34:20 +0200
Subject: [PATCH] Add experience points API
diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java
index e92cb12a04827c2afc0662a26320458527aa2bd4..020b74065f7489a46b70ac52e5abbdb22132f8d8 100644
--- a/src/main/java/net/minecraft/world/entity/player/Player.java
+++ b/src/main/java/net/minecraft/world/entity/player/Player.java
@@ -1834,7 +1834,7 @@ public abstract class Player extends LivingEntity {
}
public int getXpNeededForNextLevel() {
- return this.experienceLevel >= 30 ? 112 + (this.experienceLevel - 30) * 9 : (this.experienceLevel >= 15 ? 37 + (this.experienceLevel - 15) * 5 : 7 + this.experienceLevel * 2);
+ return this.experienceLevel >= 30 ? 112 + (this.experienceLevel - 30) * 9 : (this.experienceLevel >= 15 ? 37 + (this.experienceLevel - 15) * 5 : 7 + this.experienceLevel * 2); // Paper - diff on change; calculateTotalExperiencePoints
}
// Paper start - send while respecting visibility
private static void sendSoundEffect(Player fromEntity, double x, double y, double z, SoundEvent soundEffect, SoundSource soundCategory, float volume, float pitch) {
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 0b34a90d275534a84bea7d7d9cce08b41ea7a698..e874d76437fc4c86fd4ed2d03e416dd1ff528b76 100644
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -1824,6 +1824,49 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
Preconditions.checkArgument(exp >= 0, "Total experience points must not be negative (%s)", exp);
this.getHandle().totalExperience = exp;
}
+ // Paper start
+ @Override
+ public int calculateTotalExperiencePoints() {
+ return calculateTotalExperiencePoints(this.getLevel()) + Math.round(this.getExperiencePointsNeededForNextLevel() * getExp());
+ }
+
+ @Override
+ public void setExperienceLevelAndProgress(final int totalExperience) {
+ Preconditions.checkArgument(totalExperience >= 0, "Total experience points must not be negative (%s)", totalExperience);
+ int level = calculateLevelsForExperiencePoints(totalExperience);
+ int remainingPoints = totalExperience - calculateTotalExperiencePoints(level);
+
+ this.getHandle().experienceLevel = level;
+ this.getHandle().experienceProgress = (float) remainingPoints / this.getExperiencePointsNeededForNextLevel();
+ this.getHandle().lastSentExp = -1;
+ }
+
+ @Override
+ public int getExperiencePointsNeededForNextLevel() {
+ return this.getHandle().getXpNeededForNextLevel();
+ }
+
+ // See https://minecraft.wiki/w/Experience#Leveling_up for reference
+ private int calculateTotalExperiencePoints(int level) {
+ if (level <= 16) {
+ return (int) (Math.pow(level, 2) + 6 * level);
+ } else if (level <= 31) {
+ return (int) (2.5 * Math.pow(level, 2) - 40.5 * level + 360.0);
+ } else {
+ return (int) (4.5 * Math.pow(level, 2) - 162.5 * level + 2220.0);
+ }
+ }
+
+ private int calculateLevelsForExperiencePoints(int points) {
+ if (points <= 352) { // Level 0-16
+ return (int) Math.floor(Math.sqrt(points + 9) - 3);
+ } else if (points <= 1507) { // Level 17-31
+ return (int) Math.floor(8.1 + Math.sqrt(0.4 * (points - (7839.0 / 40.0))));
+ } else { // 32+
+ return (int) Math.floor((325.0 / 18.0) + Math.sqrt((2.0 / 9.0) * (points - (54215.0 / 72.0))));
+ }
+ }
+ // Paper end
@Override
public void sendExperienceChange(float progress) {