Skip to content

Commit 1ae6b07

Browse files
committed
Add support for Minecraft 1.21.11
1 parent 96e367e commit 1ae6b07

File tree

19 files changed

+401
-187
lines changed

19 files changed

+401
-187
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@
173173
<dependency>
174174
<groupId>io.papermc.paper</groupId>
175175
<artifactId>paper-api</artifactId>
176-
<version>1.21.9-R0.1-SNAPSHOT</version>
176+
<version>1.21.11-R0.1-SNAPSHOT</version>
177177
</dependency>
178178

179179
<!-- Used for storing and retreiving Constructs in a storage transparent medium: JSONs -->

src/main/java/com/laytonsmith/abstraction/MCWorld.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.laytonsmith.abstraction.enums.MCDifficulty;
1111
import com.laytonsmith.abstraction.enums.MCEffect;
1212
import com.laytonsmith.abstraction.enums.MCEntityType;
13-
import com.laytonsmith.abstraction.enums.MCGameRule;
1413
import com.laytonsmith.abstraction.enums.MCParticle;
1514
import com.laytonsmith.abstraction.enums.MCSound;
1615
import com.laytonsmith.abstraction.enums.MCSoundCategory;
@@ -58,9 +57,11 @@ public interface MCWorld extends MCMetadatable {
5857

5958
String[] getGameRules();
6059

61-
Object getGameRuleValue(MCGameRule gameRule);
60+
boolean isGameRule(String gameRule);
6261

63-
boolean setGameRuleValue(MCGameRule gameRule, Object value);
62+
Object getGameRuleValue(String gameRule);
63+
64+
boolean setGameRuleValue(String gameRule, Object value);
6465

6566
MCWorldBorder getWorldBorder();
6667

src/main/java/com/laytonsmith/abstraction/blocks/MCMaterial.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1848,7 +1848,26 @@ public enum MCVanillaMaterial {
18481848
OAK_SHELF(MCVersion.MC1_21_9),
18491849
PALE_OAK_SHELF(MCVersion.MC1_21_9),
18501850
SPRUCE_SHELF(MCVersion.MC1_21_9),
1851-
WARPED_SHELF(MCVersion.MC1_21_9);
1851+
WARPED_SHELF,
1852+
1853+
// 1.21.11 additions
1854+
CAMEL_HUSK_SPAWN_EGG(MCVersion.MC1_21_11),
1855+
COPPER_NAUTILUS_ARMOR(MCVersion.MC1_21_11),
1856+
COPPER_SPEAR(MCVersion.MC1_21_11),
1857+
DIAMOND_NAUTILUS_ARMOR(MCVersion.MC1_21_11),
1858+
DIAMOND_SPEAR(MCVersion.MC1_21_11),
1859+
GOLDEN_NAUTILUS_ARMOR(MCVersion.MC1_21_11),
1860+
GOLDEN_SPEAR(MCVersion.MC1_21_11),
1861+
IRON_NAUTILUS_ARMOR(MCVersion.MC1_21_11),
1862+
IRON_SPEAR(MCVersion.MC1_21_11),
1863+
NAUTILUS_SPAWN_EGG(MCVersion.MC1_21_11),
1864+
NETHERITE_HORSE_ARMOR(MCVersion.MC1_21_11),
1865+
NETHERITE_NAUTILUS_ARMOR(MCVersion.MC1_21_11),
1866+
NETHERITE_SPEAR(MCVersion.MC1_21_11),
1867+
PARCHED_SPAWN_EGG(MCVersion.MC1_21_11),
1868+
STONE_SPEAR(MCVersion.MC1_21_11),
1869+
WOODEN_SPEAR(MCVersion.MC1_21_11),
1870+
ZOMBIE_NAUTILUS_SPAWN_EGG(MCVersion.MC1_21_11);
18521871

18531872
private final MCVersion since;
18541873
private final MCVersion until;

src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCWorld.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import com.laytonsmith.abstraction.enums.MCDifficulty;
3131
import com.laytonsmith.abstraction.enums.MCEffect;
3232
import com.laytonsmith.abstraction.enums.MCEntityType;
33-
import com.laytonsmith.abstraction.enums.MCGameRule;
3433
import com.laytonsmith.abstraction.enums.MCParticle;
3534
import com.laytonsmith.abstraction.enums.MCSound;
3635
import com.laytonsmith.abstraction.enums.MCSoundCategory;
@@ -58,7 +57,9 @@
5857
import org.bukkit.GameRule;
5958
import org.bukkit.HeightMap;
6059
import org.bukkit.Location;
60+
import org.bukkit.NamespacedKey;
6161
import org.bukkit.Particle;
62+
import org.bukkit.Registry;
6263
import org.bukkit.SoundCategory;
6364
import org.bukkit.World;
6465
import org.bukkit.block.BlockFace;
@@ -190,17 +191,31 @@ public String[] getGameRules() {
190191
}
191192

192193
@Override
193-
public Object getGameRuleValue(MCGameRule gameRule) {
194-
GameRule gr = GameRule.getByName(gameRule.getRuleName());
194+
public boolean isGameRule(String gameRule) {
195+
if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_21_11)) {
196+
// Paper and Spigot differ in GameRule interfaces/implementation
197+
// This forces Spigot to be as case-sensitive as Paper for new rule names
198+
NamespacedKey key = NamespacedKey.fromString(gameRule);
199+
if(key == null) {
200+
return false;
201+
}
202+
return Registry.GAME_RULE.get(key) != null;
203+
}
204+
return w.isGameRule(gameRule);
205+
}
206+
207+
@Override
208+
public Object getGameRuleValue(String gameRule) {
209+
GameRule gr = GameRule.getByName(gameRule);
195210
if(gr == null) {
196211
return null;
197212
}
198213
return w.getGameRuleValue(gr);
199214
}
200215

201216
@Override
202-
public boolean setGameRuleValue(MCGameRule gameRule, Object value) {
203-
GameRule gr = GameRule.getByName(gameRule.getRuleName());
217+
public boolean setGameRuleValue(String gameRule, Object value) {
218+
GameRule gr = GameRule.getByName(gameRule);
204219
if(gr == null) {
205220
return false;
206221
}

src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCPlayer.java

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,8 @@ public MCEntity getSpectatorTarget() {
430430
private static Class gameProfileClass = null;
431431
private static Class opListEntryClass = null;
432432
private static Class nameAndIdClass = null;
433+
private static Class levelBasedPermissionSetClass = null;
434+
private static Object opPermissionSet = null;
433435
private static Map<String, Object> opMap = null;
434436

435437
private static void SetupTempOp() throws ClassNotFoundException {
@@ -445,38 +447,43 @@ private static void SetupTempOp() throws ClassNotFoundException {
445447
String getPlayerList = "getPlayerList";
446448
String map = "map";
447449
String serverOpListEntry = ".ServerOpListEntry";
450+
String owner = "OWNER";
448451
if(!isPaper) {
449452
ops = "o";
450-
getPlayerList = "am";
453+
getPlayerList = "aj";
451454
map = "e";
452455
serverOpListEntry = ".OpListEntry";
456+
owner = "e";
453457
}
454458

455459
MCVersion mcversion = Static.getServer().getMinecraftVersion();
456-
if(mcversion.lt(MCVersion.MC1_21_9)) {
457-
ops = isPaper ? "ops" : "p";
458-
getPlayerList = isPaper ? "getPlayerList" : "ag";
459-
map = "d";
460-
serverOpListEntry = ".OpListEntry";
461-
if(mcversion.lt(MCVersion.MC1_21_3)) {
462-
getPlayerList = isPaper ? "getPlayerList" : "ah";
463-
if(mcversion.lt(MCVersion.MC1_20_6)) {
464-
getPlayerList = "ae";
465-
if(mcversion.lt(MCVersion.MC1_20_4)) {
466-
getPlayerList = "ac";
467-
if(mcversion.lt(MCVersion.MC1_20_2)) {
468-
ops = "o";
469-
if(mcversion.equals(MCVersion.MC1_19_3)) {
470-
getPlayerList = "ab";
471-
} else if(mcversion.lt(MCVersion.MC1_19_1)) {
472-
ops = "n";
473-
if(mcversion.lt(MCVersion.MC1_18)) {
474-
getPlayerList = "getPlayerList";
475-
if(mcversion.lt(MCVersion.MC1_17)) {
476-
String version = ((BukkitMCServer) Static.getServer()).getCraftBukkitPackage().split("\\.")[3];
477-
nms = "net.minecraft.server." + version;
478-
playersPackage = nms;
479-
ops = "operators";
460+
if(mcversion.lt(MCVersion.MC1_21_11)) {
461+
getPlayerList = isPaper ? "getPlayerList" : "am";
462+
if(mcversion.lt(MCVersion.MC1_21_9)) {
463+
ops = isPaper ? "ops" : "p";
464+
getPlayerList = isPaper ? "getPlayerList" : "ag";
465+
map = "d";
466+
serverOpListEntry = ".OpListEntry";
467+
if(mcversion.lt(MCVersion.MC1_21_3)) {
468+
getPlayerList = isPaper ? "getPlayerList" : "ah";
469+
if(mcversion.lt(MCVersion.MC1_20_6)) {
470+
getPlayerList = "ae";
471+
if(mcversion.lt(MCVersion.MC1_20_4)) {
472+
getPlayerList = "ac";
473+
if(mcversion.lt(MCVersion.MC1_20_2)) {
474+
ops = "o";
475+
if(mcversion.equals(MCVersion.MC1_19_3)) {
476+
getPlayerList = "ab";
477+
} else if(mcversion.lt(MCVersion.MC1_19_1)) {
478+
ops = "n";
479+
if(mcversion.lt(MCVersion.MC1_18)) {
480+
getPlayerList = "getPlayerList";
481+
if(mcversion.lt(MCVersion.MC1_17)) {
482+
String version = ((BukkitMCServer) Static.getServer()).getCraftBukkitPackage().split("\\.")[3];
483+
nms = "net.minecraft.server." + version;
484+
playersPackage = nms;
485+
ops = "operators";
486+
}
480487
}
481488
}
482489
}
@@ -496,6 +503,10 @@ private static void SetupTempOp() throws ClassNotFoundException {
496503
/*com.mojang.authlib.GameProfile*/ gameProfileClass = Class.forName("com.mojang.authlib.GameProfile");
497504
if(mcversion.gte(MCVersion.MC1_21_9)) {
498505
nameAndIdClass = Class.forName(playersPackage + ".NameAndId");
506+
if(mcversion.gte(MCVersion.MC1_21_11)) {
507+
levelBasedPermissionSetClass = Class.forName(nms + ".permissions.LevelBasedPermissionSet");
508+
opPermissionSet = ReflectionUtils.get(levelBasedPermissionSetClass, null, owner);
509+
}
499510
}
500511
}
501512

@@ -509,9 +520,15 @@ public void setTempOp(Boolean value) throws ClassNotFoundException {
509520
Object nameAndId = ReflectionUtils.newInstance(nameAndIdClass,
510521
new Class[]{gameProfileClass},
511522
new Object[]{gameProfile});
512-
opListEntry = ReflectionUtils.newInstance(opListEntryClass,
513-
new Class[]{nameAndIdClass, int.class, boolean.class},
514-
new Object[]{nameAndId, 4, false});
523+
if(opPermissionSet != null) {
524+
opListEntry = ReflectionUtils.newInstance(opListEntryClass,
525+
new Class[]{nameAndIdClass, levelBasedPermissionSetClass, boolean.class},
526+
new Object[]{nameAndId, opPermissionSet, false});
527+
} else {
528+
opListEntry = ReflectionUtils.newInstance(opListEntryClass,
529+
new Class[]{nameAndIdClass, int.class, boolean.class},
530+
new Object[]{nameAndId, 4, false});
531+
}
515532
} else {
516533
opListEntry = ReflectionUtils.newInstance(opListEntryClass,
517534
new Class[]{gameProfileClass, int.class, boolean.class},

src/main/java/com/laytonsmith/abstraction/enums/MCEnchantment.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ public enum MCVanillaEnchantment {
142142
BREACH(MCVersion.MC1_20_6),
143143
DENSITY(MCVersion.MC1_20_6),
144144
WIND_BURST(MCVersion.MC1_20_6),
145+
LUNGE(MCVersion.MC1_21_11),
145146
UNKNOWN(MCVersion.NEVER);
146147

147148
private final MCVersion since;

src/main/java/com/laytonsmith/abstraction/enums/MCEnterBedResult.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public enum MCEnterBedResult {
1010
OK,
1111
OTHER_PROBLEM,
1212
TOO_FAR_AWAY,
13-
OBSTRUCTED // Paper
13+
OBSTRUCTED, // Paper
14+
EXPLOSION, // Paper
1415
}

src/main/java/com/laytonsmith/abstraction/enums/MCEntityEffect.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public enum MCEntityEffect {
1111
SNOWBALL_BREAK, // deprecated for PROJECTILE_CRACK
1212
PROJECTILE_CRACK,
1313
ENTITY_DEATH,
14+
HIT,
1415
HURT,
1516
SHEEP_EAT, // deprecated for SHEEP_EAT_GRASS, TNT_MINECART_IGNITE
1617
SHEEP_EAT_GRASS,

src/main/java/com/laytonsmith/abstraction/enums/MCEntityType.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ public enum MCVanillaEntityType {
171171
BREEZE(true, MCVersion.MC1_20_4),
172172
BREEZE_WIND_CHARGE(true, MCVersion.MC1_20_6),
173173
CAMEL(true, MCVersion.MC1_19_3),
174+
CAMEL_HUSK(true, MCVersion.MC1_21_11),
174175
CAT(true, MCVersion.MC1_14),
175176
CAVE_SPIDER,
176177
CHICKEN,
@@ -233,10 +234,12 @@ public enum MCVanillaEntityType {
233234
MINECART_TNT,
234235
MULE,
235236
MUSHROOM_COW,
237+
NAUTILUS(true, MCVersion.MC1_21_11),
236238
OCELOT,
237239
OMINOUS_ITEM_SPAWNER(true, MCVersion.MC1_20_6),
238240
PAINTING,
239241
PANDA(true, MCVersion.MC1_14),
242+
PARCHED(true, MCVersion.MC1_21_11),
240243
PARROT,
241244
PHANTOM,
242245
PIG,
@@ -288,6 +291,7 @@ public enum MCVanillaEntityType {
288291
ZOGLIN(true, MCVersion.MC1_16),
289292
ZOMBIE,
290293
ZOMBIE_HORSE,
294+
ZOMBIE_NAUTILUS(true, MCVersion.MC1_21_11),
291295
ZOMBIE_VILLAGER,
292296
ZOMBIFIED_PIGLIN(true, MCVersion.MC1_16),
293297
/**

0 commit comments

Comments
 (0)