diff --git a/DynmapCore/src/main/java/org/dynmap/hdmap/ChunkStatusHDShader.java b/DynmapCore/src/main/java/org/dynmap/hdmap/ChunkStatusHDShader.java
index c23b63480..db13fd342 100644
--- a/DynmapCore/src/main/java/org/dynmap/hdmap/ChunkStatusHDShader.java
+++ b/DynmapCore/src/main/java/org/dynmap/hdmap/ChunkStatusHDShader.java
@@ -43,9 +43,10 @@ private static class ChunkStatusMap {
new ChunkStatusMap("carvers", 0xFFEFD5);
new ChunkStatusMap("liquid_carvers", 0xF0E68C);
new ChunkStatusMap("features", 0xBDB76B);
+ new ChunkStatusMap("initialize_light", 0xAAA0AA);
new ChunkStatusMap("light", 0xDDA0DD);
- new ChunkStatusMap("spawn", 0xFF00FF);
new ChunkStatusMap("heightmaps", 0x9370DB);
+ new ChunkStatusMap("spawn", 0xFF00FF);
new ChunkStatusMap("full", 0x32CD32);
}
diff --git a/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java b/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java
index 577ed2fc2..d4250eacd 100644
--- a/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java
+++ b/DynmapCore/src/main/java/org/dynmap/storage/aws_s3/AWSS3MapStorage.java
@@ -138,9 +138,9 @@ public boolean write(long hash, BufferOutputStream encImage, long timestamp) {
s3.deleteObject(req);
}
else {
- PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(map.getImageFormat().getEncoding().getContentType())
+ PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(map.getImageFormat().getEncoding().getContentType())
.addMetadata("x-dynmap-hash", Long.toHexString(hash)).addMetadata("x-dynmap-ts", Long.toString(timestamp)).build();
- s3.putObject(req, RequestBody.fromBytes(encImage.buf));
+ s3.putObject(req, RequestBody.fromBytes(Arrays.copyOf(encImage.buf, encImage.len)));
}
done = true;
} catch (S3Exception x) {
@@ -407,7 +407,7 @@ private void processEnumMapTiles(DynmapWorld world, MapType map, ImageVariant va
}
if (result.isTruncated()) { // If more, build continuiation request
req = ListObjectsV2Request.builder().bucketName(bucketname)
- .prefix(basekey).delimiter("").maxKeys(1000).continuationToken(result.getContinuationToken()).encodingType("url").requestPayer("requester").build();
+ .prefix(basekey).delimiter("").maxKeys(1000).continuationToken(result.getNextContinuationToken()).encodingType("url").requestPayer("requester").build();
}
else { // Else, we're done
done = true;
@@ -480,7 +480,7 @@ private void processPurgeMapTiles(DynmapWorld world, MapType map, ImageVariant v
}
if (result.isTruncated()) { // If more, build continuiation request
req = ListObjectsV2Request.builder().bucketName(bucketname)
- .prefix(basekey).delimiter("").maxKeys(1000).continuationToken(result.getContinuationToken()).encodingType("url").requestPayer("requester").build();
+ .prefix(basekey).delimiter("").maxKeys(1000).continuationToken(result.getNextContinuationToken()).encodingType("url").requestPayer("requester").build();
}
else { // Else, we're done
done = true;
@@ -529,7 +529,7 @@ public boolean setPlayerFaceImage(String playername, FaceType facetype,
}
else {
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("image/png").build();
- s3.putObject(req, RequestBody.fromBytes(encImage.buf));
+ s3.putObject(req, RequestBody.fromBytes(Arrays.copyOf(encImage.buf, encImage.len)));
}
done = true;
} catch (S3Exception x) {
@@ -582,7 +582,7 @@ public boolean setMarkerImage(String markerid, BufferOutputStream encImage) {
}
else {
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("image/png").build();
- s3.putObject(req, RequestBody.fromBytes(encImage.buf));
+ s3.putObject(req, RequestBody.fromBytes(Arrays.copyOf(encImage.buf, encImage.len)));
}
done = true;
} catch (S3Exception x) {
@@ -611,8 +611,8 @@ public boolean setMarkerFile(String world, String content) {
s3.deleteObject(delreq);
}
else {
- PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("application/json").build();
- s3.putObject(req, RequestBody.fromBytes(content.getBytes(StandardCharsets.UTF_8)));
+ PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType("application/json").build();
+ s3.putObject(req, RequestBody.fromString(content));
}
done = true;
} catch (S3Exception x) {
@@ -745,7 +745,7 @@ else if (fileid.endsWith(".js")) {
ct = "application/x-javascript";
}
PutObjectRequest req = PutObjectRequest.builder().bucketName(bucketname).key(baseKey).contentType(ct).build();
- s3.putObject(req, RequestBody.fromBytes(content.buf));
+ s3.putObject(req, RequestBody.fromBytes(Arrays.copyOf(content.buf, content.len)));
standalone_cache.put(fileid, digest);
}
done = true;
diff --git a/DynmapCore/src/main/resources/extracted/web/css/dynmap_style.css b/DynmapCore/src/main/resources/extracted/web/css/dynmap_style.css
index 489c49185..b679b1d9f 100644
--- a/DynmapCore/src/main/resources/extracted/web/css/dynmap_style.css
+++ b/DynmapCore/src/main/resources/extracted/web/css/dynmap_style.css
@@ -1,3 +1,22 @@
+:root {
+ --colour-highlight: oklch(0.56 0.16 142.24);
+ --smokey-white: oklch(0.99 0 0);
+ --gunmetal: oklch(0.29 0.02 277.99);
+ --charcoal-grey: oklch(0.34 0.03 273.24);
+ --ship-grey: oklch(0.36 0.02 278.37);
+ --vampire-grey: oklch(0.45 0.02 278.64);
+ --cool-grey: oklch(0.72 0.02 270.22);
+ --slate-grey: oklch(0.6 0.02 264.54);
+ --status-error: oklch(0.51 0.12 22.01);
+}
+
+.montserrat-font {
+ font-family: "Montserrat", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+}
+
/* TILE DEBUGGING */
/*.leaflet-tile {
margin: -1;
@@ -1019,46 +1038,227 @@
/* Login/register panel */
.dynmaplogin {
- text-align: center;
- width: 100%;
- font-weight: bold;
- color: #FFFFFF;
+ display: grid;
+ width: 100%;
+ height: 100%;
+ place-items: center;
+ width: 100%;
+ font-weight: bold;
+ color: #FFFFFF;
+ background: var(--vampire-grey);
+ font-family: "Montserrat", sans-serif;
+ font-optical-sizing: auto;
+ font-weight: 400;
+ font-style: normal;
+ box-sizing: border-box;
+
+ & * {
+ box-sizing: border-box;
+ }
+
+ .container {
+ --outer-margin: 2rem;
+ container-type: inline-size;
+ container-name: container;
+ position: relative;
+ width: calc(100% - var(--outer-margin) * 2);
+ max-width: 960px;
+ padding: 3rem;
+ margin: var(--outer-margin);
+ padding-block-start: 3rem;
+ border-radius: 20px;
+ /*background-image: url("https://wallpapersok.com/images/file/minecraft-landscape-with-cloudy-sky-b9nxzmdukp1j51zq.jpg"); */
+ background-color: var(--gunmetal);
+ box-shadow: 0px 30px 30px -5px var(--ship-grey);
+
+ &::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 0;
+ content: '';
+ display: flex;
+ width: 100%;
+ height: 100%;
+ background: url("https://cdn.modrinth.com/data/fRQREgAc/2eaa1e6a6fa03e485a319a628d6b29ba382855b4_96.webp");
+ background-position: right 1rem;
+ background-repeat: no-repeat;
+ background-size: 25%;
+ pointer-events: none;
+ opacity: 0.4;
+ mix-blend-mode: overlay;
+ }
+ }
+
+ h2 {
+ margin: 0;
+ font-size: 2rem;
+ font-weight: 700;
+ color: var(--smokey-white);
+
+ span {
+ color: var(--colour-highlight);
+ }
+ }
+ h3 {
+ margin: 0;
+ margin-block-end: 5rem;
+ padding-right: 40px;
+ font-size: 1rem;
+ font-weight: 700;
+ color: var(--cool-grey);
+ text-transform: uppercase;
+ text-decoration: underline;
+ text-decoration-thickness: 1px;
+ text-underline-offset: 5px;
+ text-decoration-color: var(--colour-highlight);
+
+ &:has(~ .statusmessage > div) {
+ margin-block-end: 3rem;
+ }
+ }
+
+ p {
+ line-height: 1.4;
+ }
+
+ a {
+ color: var(--colour-highlight);
+ }
+
+ code {
+ font-family: 'Courier New', Courier, monospace;
+ font-size: 14px;
+ padding: 4px 6px;
background: #000000;
-}
+ border-radius: 5px;
+ }
-table.loginregister {
- color: #ffffff;
- border: 1px solid rgba(64,64,64,0.6);
- background: #bbb;
- font-weight: bold;
- margin: auto;
-}
+ .loginregister {
+ font-size: 1rem;
-td.login {
- vertical-align: top;
- color: #000000;
- background-color: #bbb;
- border: 1px solid rgba(64,64,64,0.6);
- font-weight: bold;
- margin: 2em;
- width: 40em;
-}
+ &:has(#register-form:target) #login-form {
+ display: none;
+ }
-td.register {
- vertical-align: top;
- color: #000000;
- background-color: #bbb;
- border: 1px solid rgba(64,64,64,0.6);
- font-weight: bold;
- margin: 2em;
- width: 40em;
+ #login-form { }
+
+ #register-form {
+ display: none;
+ &:target {
+ display: block;
+ }
+ }
+ input {
+ width: 100%;
+ padding: 0;
+ font-size: 1rem;
+ color: var(--smokey-white);
+ border: none;
+ background: transparent;
+ font-family: inherit;
+ font-weight: 500;
+ &::placeholder {
+ opacity: 0.1;
+ color: var(--smokey-white);
+
+ }
+ &:focus-visible {
+ background: none;
+ border: none;
+ outline: none;
+ }
+ &:is(:-webkit-autofill, :autofill) {
+ border: none;
+ }
+
+ &[type="submit"] {
+ max-width: 20ch;
+ padding-block: 1rem;
+ padding-inline: 2rem;
+ background-color: var(--colour-highlight);
+ border-radius: calc(infinity * 1px);
+ border: 2px solid transparent;
+ cursor: pointer;
+ transition: .2s background ease;
+ &:hover {
+ background-color: oklch(from var(--colour-highlight) calc(l - 0.04) c h);
+ }
+ &:focus-visible {
+ border: 2px solid var(--smokey-white);
+ }
+ }
+ }
+
+ label {
+ margin-block-end: .2rem;
+ color: var(--slate-grey);
+ font-size: 0.813rem;
+ font-weight: 400;
+ }
+ }
+
+ form {
+ display: grid;
+ grid-template-columns: minmax(100px, 1fr);
+ gap: 2rem;
+ max-width: 60ch;
+
+ p {
+ grid-column: 1 / -1;
+ }
+ }
+ .form-item {
+ position: relative;
+ grid-column: 1 / -1;
+ display: flex;
+ flex-direction: column;
+ padding-block: 1rem;
+ padding-inline: 2rem;
+ background-color: var(--charcoal-grey);
+ border-radius: 10px;
+ border: 2px solid transparent;
+ transition: border .5s ease;
+ &:focus-within {
+ border: 2px solid var(--colour-highlight);
+ color: black;
+ }
+ }
+
+ @container (width > 400px) {
+ form {
+ grid-template-columns: repeat(2, minmax(100px, 1fr));
+
+ }
+
+ .form-item.shortened {
+ grid-column: 1;
+ + .shortened {
+ grid-column: 2;
+ }
+ }
+
+ h3 {
+ padding: 0;
+ }
+ }
}
div.statusmessage {
- color: #FF0000;
- font-weight: bold;
- font-size: 24px;
-
+ position: relative;
+ z-index: 2;
+ &:empty {
+ display: none;
+ }
+ > div {
+ margin-block-end: 2rem;
+ padding: 1rem;
+ color: var(--smokey-white);
+ font-weight: bold;
+ font-size: 16px;
+ background: linear-gradient(90deg, var(--status-error) 30%, transparent 80%);
+ font-weight: 300;
+ border-radius: 5px;
}
.logincontainer {
diff --git a/DynmapCore/src/main/resources/extracted/web/login.html b/DynmapCore/src/main/resources/extracted/web/login.html
index 6ddfcff55..6b44d23d7 100644
--- a/DynmapCore/src/main/resources/extracted/web/login.html
+++ b/DynmapCore/src/main/resources/extracted/web/login.html
@@ -2,14 +2,17 @@
-
+
Minecraft Dynamic Map - Login/Register
+
+
+
@@ -55,48 +58,50 @@
-
Minecraft Dynamic Map - Login/Register
-
-
-| Existing User: |
-|
-
-
- |
-| Register New User: |
-
-|
-
- |
-
-
+
+
Minecraft Dynamic Map
+
+
+
+
+
diff --git a/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_register.php b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_register.php
new file mode 100644
index 000000000..1af07600f
--- /dev/null
+++ b/DynmapCore/src/main/resources/extracted/web/standalone/PostgreSQL_register.php
@@ -0,0 +1,88 @@
+ bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+ while (iter.hasNext()) {
+ IBlockData bs = iter.next();
+ Block b = bs.b();
+ // If this is new block vs last, it's the base block state
+ if (b != baseb) {
+ baseb = b;
+ continue;
+ }
+ MinecraftKey id = BuiltInRegistries.e.b(b); // BuiltInRegistries.BLOCK.getKey(b)
+ String bn = id.toString();
+ if (bn != null) {
+ names.add(bn);
+ Log.info("block=" + bn);
+ }
+ }
+ return names.toArray(new String[0]);
+ }
+
+ private static IRegistry reg = null;
+
+ private static IRegistry getBiomeReg() {
+ if (reg == null) {
+ reg = MinecraftServer.getServer().bg().f(Registries.aN); // MinecraftServer.registryAccess().lookupOrThrow(Registries.BIOME)
+ }
+ return reg;
+ }
+
+ private Object[] biomelist;
+ /**
+ * Get list of defined biomebase objects
+ */
+ @Override
+ public Object[] getBiomeBaseList() {
+ if (biomelist == null) {
+ biomelist = new BiomeBase[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b); // iRegistry.getId
+ if (bidx >= biomelist.length) {
+ biomelist = Arrays.copyOf(biomelist, bidx + biomelist.length);
+ }
+ biomelist[bidx] = b;
+ }
+ }
+ return biomelist;
+ }
+
+ /** Get ID from biomebase */
+ @Override
+ public int getBiomeBaseID(Object bb) {
+ return getBiomeReg().a((BiomeBase)bb);
+ }
+
+ public static IdentityHashMap dataToState;
+
+ /**
+ * Initialize block states (org.dynmap.blockstate.DynmapBlockState)
+ */
+ @Override
+ public void initializeBlockStates() {
+ dataToState = new IdentityHashMap();
+ HashMap lastBlockState = new HashMap();
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+
+ // Loop through block data states
+ DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
+ while (iter.hasNext()) {
+ IBlockData bd = iter.next();
+ Block b = bd.b();
+ MinecraftKey id = BuiltInRegistries.e.b(b);
+ String bname = id.toString();
+ DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one
+ int idx = 0;
+ if (lastbs != null) { // Yes
+ idx = lastbs.getStateCount(); // Get number of states so far, since this is next
+ }
+ // Build state name
+ String sb = "";
+ String fname = bd.toString();
+ int off1 = fname.indexOf('[');
+ if (off1 >= 0) {
+ int off2 = fname.indexOf(']');
+ sb = fname.substring(off1+1, off2);
+ }
+ int lightAtten = bd.g(); // BlockBehaviour$BlockStateBase.getLightBlock
+ //Log.info("statename=" + bname + "[" + sb + "], lightAtten=" + lightAtten);
+ // Fill in base attributes
+ bld.setBaseState(lastbs).setStateIndex(idx).setBlockName(bname).setStateName(sb).setAttenuatesLight(lightAtten);
+ if (bd.e()) { bld.setSolid(); } // BlockBehaviour$BlockStateBase.isSolid
+ if (bd.l()) { bld.setAir(); } // BlockBehaviour$BlockStateBase.isAir
+ if (bd.a(TagsBlock.av)) { bld.setLog(); } // BlockBehaviour$BlockStateBase.is(BlockTags.OVERWORLD_NATURAL_LOGS)
+ if (bd.a(TagsBlock.M)) { bld.setLeaves(); } // BlockBehaviour$BlockStateBase.is(BlockTags.LEAVES)
+ // BlockBehaviour$BlockStateBase.getFluidState.isEmpty(), BlockBehaviour$BlockStateBase.getBlock
+ if (!bd.y().c() && !(bd.b() instanceof BlockFluids)) { // Test if fluid type for block is not empty
+ bld.setWaterlogged();
+ //Log.info("statename=" + bname + "[" + sb + "] = waterlogged");
+ }
+ DynmapBlockState dbs = bld.build(); // Build state
+
+ dataToState.put(bd, dbs);
+ lastBlockState.put(bname, (lastbs == null) ? dbs : lastbs);
+ Log.verboseinfo("blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + dbs.isWaterlogged());
+ }
+ }
+ /**
+ * Create chunk cache for given chunks of given world
+ * @param dw - world
+ * @param chunks - chunk list
+ * @return cache
+ */
+ @Override
+ public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) {
+ MapChunkCache121_10 c = new MapChunkCache121_10(gencache);
+ c.setChunks(dw, chunks);
+ return c;
+ }
+
+ /**
+ * Get biome base water multiplier
+ */
+ @Override
+ public int getBiomeBaseWaterMult(Object bb) {
+ BiomeBase biome = (BiomeBase) bb;
+ return biome.j(); // Biome.getWaterColor
+ }
+
+ /** Get temperature from biomebase */
+ @Override
+ public float getBiomeBaseTemperature(Object bb) {
+ return ((BiomeBase)bb).h(); // Biome.getBaseTemperature
+ }
+
+ /** Get humidity from biomebase */
+ @Override
+ public float getBiomeBaseHumidity(Object bb) {
+ String vals = ((BiomeBase)bb).i.toString(); // Biome.climateSettings
+ float humidity = 0.5F;
+ int idx = vals.indexOf("downfall=");
+ if (idx >= 0) {
+ humidity = Float.parseFloat(vals.substring(idx+9, vals.indexOf(']', idx)));
+ }
+ return humidity;
+ }
+
+ @Override
+ public Polygon getWorldBorder(World world) {
+ Polygon p = null;
+ WorldBorder wb = world.getWorldBorder();
+ if (wb != null) {
+ Location c = wb.getCenter();
+ double size = wb.getSize();
+ if ((size > 1) && (size < 1E7)) {
+ size = size / 2;
+ p = new Polygon();
+ p.addVertex(c.getX()-size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()+size);
+ p.addVertex(c.getX()-size, c.getZ()+size);
+ }
+ }
+ return p;
+ }
+ // Send title/subtitle to user
+ public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) {
+ if (p != null) {
+ p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks);
+ }
+ }
+
+ /**
+ * Get material map by block ID
+ */
+ @Override
+ public BukkitMaterial[] getMaterialList() {
+ return new BukkitMaterial[4096]; // Not used
+ }
+
+ @Override
+ public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) {
+ Log.severe("unloadChunkNoSave not implemented");
+ }
+
+ private String[] biomenames;
+ @Override
+ public String[] getBiomeNames() {
+ if (biomenames == null) {
+ biomenames = new String[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b);
+ if (bidx >= biomenames.length) {
+ biomenames = Arrays.copyOf(biomenames, bidx + biomenames.length);
+ }
+ biomenames[bidx] = b.toString();
+ }
+ }
+ return biomenames;
+ }
+
+ @Override
+ public String getStateStringByCombinedId(int blkid, int meta) {
+ Log.severe("getStateStringByCombinedId not implemented");
+ return null;
+ }
+ @Override
+ /** Get ID string from biomebase */
+ public String getBiomeBaseIDString(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).a(); // MinecraftKey.getPath()
+ }
+ @Override
+ public String getBiomeBaseResourceLocsation(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).toString();
+ }
+
+ @Override
+ public Object getUnloadQueue(World world) {
+ Log.warning("getUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isInUnloadQueue(Object unloadqueue, int x, int z) {
+ Log.warning("isInUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Object[] getBiomeBaseFromSnapshot(ChunkSnapshot css) {
+ Log.warning("getBiomeBaseFromSnapshot not implemented yet");
+ // TODO Auto-generated method stub
+ return new Object[256];
+ }
+
+ @Override
+ public long getInhabitedTicks(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).w(); // ChunkStatus.FULL ; IChunkAccess.getInhabitedTime
+ }
+
+ @Override
+ public Map, ?> getTileEntitiesForChunk(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).j; // ChunkStatus.FULL ; IChunkAccess.blockEntities
+ }
+
+ @Override
+ public int getTileEntityX(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aD_().u(); // TileEntity.getBlockPos ; Vec3i.getX
+ }
+
+ @Override
+ public int getTileEntityY(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aD_().v(); // TileEntity.getBlockPos ; Vec3i.getY
+ }
+
+ @Override
+ public int getTileEntityZ(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aD_().w(); // TileEntity.getBlockPos ; Vec3i.getZ
+ }
+
+ @Override
+ public Object readTileEntityNBT(Object te, World w) {
+ TileEntity tileent = (TileEntity) te;
+ CraftWorld cw = (CraftWorld) w;
+ return tileent.d(cw.getHandle().L_()); // TileEntity.saveCustomOnly ; LevelReader.registryAccess
+ }
+
+ @Override
+ public Object getFieldValue(Object nbt, String field) {
+ NBTTagCompound rec = (NBTTagCompound) nbt;
+ NBTBase val = rec.a(field); // NBTTagCompound.get
+ if(val == null) return null;
+ if(val instanceof NBTTagByte) {
+ return ((NBTTagByte)val).n(); // NBTTagByte.value
+ }
+ else if(val instanceof NBTTagShort) {
+ return ((NBTTagShort)val).n(); // NBTTagShort.value
+ }
+ else if(val instanceof NBTTagInt) {
+ return ((NBTTagInt)val).n(); // NBTTagInt.value
+ }
+ else if(val instanceof NBTTagLong) {
+ return ((NBTTagLong)val).n(); // NBTTagLong.value
+ }
+ else if(val instanceof NBTTagFloat) {
+ return ((NBTTagFloat)val).n(); // NBTTagFloat.value
+ }
+ else if(val instanceof NBTTagDouble) {
+ return ((NBTTagDouble)val).n(); // NBTTagDouble.value
+ }
+ else if(val instanceof NBTTagByteArray) {
+ return ((NBTTagByteArray)val).e(); // NBTTagByteArray.getAsByteArray
+ }
+ else if(val instanceof NBTTagString) {
+ return ((NBTTagString)val).k(); // NBTTagString.value
+ }
+ else if(val instanceof NBTTagIntArray) {
+ return ((NBTTagIntArray)val).g(); // NBTTagIntArray.getAsIntArray
+ }
+ return null;
+ }
+
+ @Override
+ public Player[] getOnlinePlayers() {
+ Collection extends Player> p = Bukkit.getServer().getOnlinePlayers();
+ return p.toArray(new Player[0]);
+ }
+
+ @Override
+ public double getHealth(Player p) {
+ return p.getHealth();
+ }
+
+ private static final Gson gson = new GsonBuilder().create();
+
+ /**
+ * Get skin URL for player
+ * @param player
+ */
+ @Override
+ public String getSkinURL(Player player) {
+ String url = null;
+ CraftPlayer cp = (CraftPlayer)player;
+ GameProfile profile = cp.getProfile();
+ if (profile != null) {
+ PropertyMap pm = profile.properties();
+ if (pm != null) {
+ Collection txt = pm.get("textures");
+ Property textureProperty = Iterables.getFirst(pm.get("textures"), null);
+ if (textureProperty != null) {
+ String val = textureProperty.value();
+ if (val != null) {
+ TexturesPayload result = null;
+ try {
+ String json = new String(Base64.getDecoder().decode(val), StandardCharsets.UTF_8);
+ result = gson.fromJson(json, TexturesPayload.class);
+ } catch (JsonParseException e) {
+ } catch (IllegalArgumentException x) {
+ Log.warning("Malformed response from skin URL check: " + val);
+ }
+ if ((result != null) && (result.textures != null) && (result.textures.containsKey("SKIN"))) {
+ url = result.textures.get("SKIN").url;
+ }
+ }
+ }
+ }
+ }
+ return url;
+ }
+ // Get minY for world
+ @Override
+ public int getWorldMinY(World w) {
+ CraftWorld cw = (CraftWorld) w;
+ return cw.getMinHeight();
+ }
+ @Override
+ public boolean useGenericCache() {
+ return true;
+ }
+
+}
diff --git a/bukkit-helper-121-10/src/main/java/org/dynmap/bukkit/helper/v121_10/MapChunkCache121_10.java b/bukkit-helper-121-10/src/main/java/org/dynmap/bukkit/helper/v121_10/MapChunkCache121_10.java
new file mode 100644
index 000000000..bffc97dae
--- /dev/null
+++ b/bukkit-helper-121-10/src/main/java/org/dynmap/bukkit/helper/v121_10/MapChunkCache121_10.java
@@ -0,0 +1,105 @@
+package org.dynmap.bukkit.helper.v121_10;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.level.ChunkCoordIntPair;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.biome.BiomeFog;
+import net.minecraft.world.level.chunk.Chunk;
+import net.minecraft.world.level.chunk.storage.SerializableChunkData;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_21_R6.CraftServer;
+import org.bukkit.craftbukkit.v1_21_R6.CraftWorld;
+import org.dynmap.DynmapChunk;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.common.BiomeMap;
+import org.dynmap.common.chunk.GenericChunk;
+import org.dynmap.common.chunk.GenericChunkCache;
+import org.dynmap.common.chunk.GenericMapChunkCache;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+/**
+ * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
+ */
+public class MapChunkCache121_10 extends GenericMapChunkCache {
+ private World w;
+ /**
+ * Construct empty cache
+ */
+ public MapChunkCache121_10(GenericChunkCache cc) {
+ super(cc);
+ }
+
+ @Override
+ protected Supplier getLoadedChunkAsync(DynmapChunk chunk) {
+ CompletableFuture> chunkData = CompletableFuture.supplyAsync(() -> {
+ CraftWorld cw = (CraftWorld) w;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.p) { // !LevelChunk.loaded
+ return Optional.empty();
+ }
+ return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
+ }, ((CraftServer) Bukkit.getServer()).getServer());
+ return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
+ }
+
+ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.p) return null; // LevelChunk.loaded
+ SerializableChunkData chunkData = SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
+ NBTTagCompound nbt = chunkData.a(); // SerializableChunkData.write
+ return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
+ }
+
+ @Override
+ protected Supplier loadChunkAsync(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ CompletableFuture> genericChunk = cw.getHandle().n().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
+ return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
+ }
+
+ protected GenericChunk loadChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ NBTTagCompound nbt = null;
+ ChunkCoordIntPair cc = new ChunkCoordIntPair(chunk.x, chunk.z);
+ GenericChunk gc = null;
+ try { // BUGBUG - convert this all to asyn properly, since now native async
+ nbt = cw.getHandle()
+ .n() // ServerLevel.getChunkSource
+ .a // ServerChunkCache.chunkMap
+ .d(cc) // ChunkStorage.read(ChunkPos)
+ .join().get();
+ } catch (CancellationException cx) {
+ } catch (NoSuchElementException snex) {
+ }
+ if (nbt != null) {
+ gc = parseChunkFromNBT(new NBT.NBTCompound(nbt));
+ }
+ return gc;
+ }
+
+ public void setChunks(BukkitWorld dw, List chunks) {
+ this.w = dw.getWorld();
+ super.setChunks(dw, chunks);
+ }
+
+ @Override
+ public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
+ return bm.getBiomeObject().map(BiomeBase::i).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects ; BiomeFog::getFoliageColorOverride
+ }
+
+ @Override
+ public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) {
+ BiomeFog fog = bm.getBiomeObject().map(BiomeBase::i).orElse(null); // BiomeBase::getSpecialEffects
+ if (fog == null) return colormap[bm.biomeLookup()];
+ return fog.h().a(x, z, fog.g().orElse(colormap[bm.biomeLookup()])); // BiomeFog.getGrassColorModifier.modifyColor ; BiomeFog.getGrassColorOverride
+ }
+}
diff --git a/bukkit-helper-121-10/src/main/java/org/dynmap/bukkit/helper/v121_10/NBT.java b/bukkit-helper-121-10/src/main/java/org/dynmap/bukkit/helper/v121_10/NBT.java
new file mode 100644
index 000000000..39cf4ffbe
--- /dev/null
+++ b/bukkit-helper-121-10/src/main/java/org/dynmap/bukkit/helper/v121_10/NBT.java
@@ -0,0 +1,144 @@
+package org.dynmap.bukkit.helper.v121_10;
+
+import org.dynmap.common.chunk.GenericBitStorage;
+import org.dynmap.common.chunk.GenericNBTCompound;
+import org.dynmap.common.chunk.GenericNBTList;
+
+import java.util.Optional;
+import java.util.Set;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.SimpleBitStorage;
+
+public class NBT {
+
+ public static class NBTCompound implements GenericNBTCompound {
+ private final NBTTagCompound obj;
+ public NBTCompound(NBTTagCompound t) {
+ this.obj = t;
+ }
+ @Override
+ public Set getAllKeys() {
+ return obj.e(); // CompoundTag.keySet
+ }
+ @Override
+ public boolean contains(String s) {
+ return obj.b(s); // CompoundTag.contains
+ }
+ @Override
+ public boolean contains(String s, int i) {
+ // Like contains, but with an extra constraint on type
+ NBTBase base = obj.a(s); // CompoundTag.get
+ if (base == null)
+ return false;
+ byte type = base.b(); // CompoundTag.getId
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
+ }
+ @Override
+ public byte getByte(String s) {
+ return obj.b(s, (byte)0); // CompoundTag.getByteOr
+ }
+ @Override
+ public short getShort(String s) {
+ return obj.b(s, (short)0); // CompoundTag.getShortOr
+ }
+ @Override
+ public int getInt(String s) {
+ return obj.b(s, 0); // CompoundTag.getIntOr
+ }
+ @Override
+ public long getLong(String s) {
+ return obj.b(s, 0L); // CompoundTag.getLongOr
+ }
+ @Override
+ public float getFloat(String s) {
+ return obj.b(s, 0.0f); // CompoundTag.getFloatOr
+ }
+ @Override
+ public double getDouble(String s) {
+ return obj.b(s, 0.0); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public String getString(String s) {
+ return obj.b(s, ""); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public byte[] getByteArray(String s) {
+ Optional byteArr = obj.j(s); // CompoundTag.getByteArray
+ return byteArr.orElseGet(() -> new byte[0]);
+ }
+ @Override
+ public int[] getIntArray(String s) {
+ Optional intArr = obj.k(s); // CompoundTag.getIntArray
+ return intArr.orElseGet(() -> new int[0]);
+ }
+ @Override
+ public long[] getLongArray(String s) {
+ Optional longArr = obj.l(s); // CompoundTag.getLongArray
+ return longArr.orElseGet(() -> new long[0]);
+ }
+ @Override
+ public GenericNBTCompound getCompound(String s) {
+ return new NBTCompound(obj.n(s)); // CompoundTag.getCompoundOrEmpty
+ }
+ @Override
+ public GenericNBTList getList(String s, int i) {
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.p(s)); // CompoundTag.getListOrEmpty
+ }
+ @Override
+ public boolean getBoolean(String s) {
+ return getByte(s) != 0;
+ }
+ @Override
+ public String getAsString(String s) {
+ return obj.a(s).r_().orElseGet(() -> ""); // CompoundTag.get ; Tag.asString
+ }
+ @Override
+ public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
+ return new OurBitStorage(bits, count, data);
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class NBTList implements GenericNBTList {
+ private final NBTTagList obj;
+ public NBTList(NBTTagList t) {
+ obj = t;
+ }
+ @Override
+ public int size() {
+ return obj.size();
+ }
+ @Override
+ public String getString(int idx) {
+ return obj.a(idx, ""); // ListTag.getStringOr
+ }
+ @Override
+ public GenericNBTCompound getCompound(int idx) {
+ return new NBTCompound(obj.b(idx)); // ListTag.getCompoundOrEmpty
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class OurBitStorage implements GenericBitStorage {
+ private final SimpleBitStorage bs;
+ public OurBitStorage(int bits, int count, long[] data) {
+ bs = new SimpleBitStorage(bits, count, data);
+ }
+ @Override
+ public int get(int idx) {
+ return bs.a(idx);
+ }
+ }
+}
diff --git a/forge-1.21/.gitignore b/bukkit-helper-121-11/.gitignore
similarity index 100%
rename from forge-1.21/.gitignore
rename to bukkit-helper-121-11/.gitignore
diff --git a/bukkit-helper-121-11/build.gradle b/bukkit-helper-121-11/build.gradle
new file mode 100644
index 000000000..5a8ccc1f0
--- /dev/null
+++ b/bukkit-helper-121-11/build.gradle
@@ -0,0 +1,19 @@
+eclipse {
+ project {
+ name = "Dynmap(Spigot-1.21.11)"
+ }
+}
+
+description = 'bukkit-helper-1.21.11'
+
+sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaLanguageVersion.of(17) // Need this here so eclipse task generates correctly.
+
+dependencies {
+ implementation project(':bukkit-helper')
+ implementation project(':dynmap-api')
+ implementation project(path: ':DynmapCore', configuration: 'shadow')
+ compileOnly group: 'org.spigotmc', name: 'spigot-api', version:'1.21.11-R0.1-SNAPSHOT'
+ compileOnly ('org.spigotmc:spigot:1.21.11-R0.1-SNAPSHOT') {
+ exclude group: "com.mojang", module: "jtracy"
+ }
+}
diff --git a/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/BukkitVersionHelperSpigot121_11.java b/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/BukkitVersionHelperSpigot121_11.java
new file mode 100644
index 000000000..8982c57dd
--- /dev/null
+++ b/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/BukkitVersionHelperSpigot121_11.java
@@ -0,0 +1,450 @@
+package org.dynmap.bukkit.helper.v121_11;
+
+import org.bukkit.*;
+import org.bukkit.craftbukkit.v1_21_R7.CraftChunk;
+import org.bukkit.craftbukkit.v1_21_R7.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R7.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.dynmap.DynmapChunk;
+import org.dynmap.Log;
+import org.dynmap.bukkit.helper.BukkitMaterial;
+import org.dynmap.bukkit.helper.BukkitVersionHelper;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.bukkit.helper.BukkitVersionHelperGeneric.TexturesPayload;
+import org.dynmap.renderer.DynmapBlockState;
+import org.dynmap.utils.MapChunkCache;
+import org.dynmap.utils.Polygon;
+
+import com.google.common.collect.Iterables;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import com.mojang.authlib.properties.PropertyMap;
+
+import net.minecraft.core.RegistryBlockID;
+import net.minecraft.core.registries.BuiltInRegistries;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.core.IRegistry;
+import net.minecraft.nbt.NBTTagByteArray;
+import net.minecraft.nbt.NBTTagByte;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagDouble;
+import net.minecraft.nbt.NBTTagFloat;
+import net.minecraft.nbt.NBTTagIntArray;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.nbt.NBTTagLong;
+import net.minecraft.nbt.NBTTagShort;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.resources.MinecraftKey;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.tags.TagsBlock;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.BlockFluids;
+import net.minecraft.world.level.block.entity.TileEntity;
+import net.minecraft.world.level.block.state.IBlockData;
+import net.minecraft.world.level.chunk.status.ChunkStatus;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Helper for isolation of bukkit version specific issues
+ */
+public class BukkitVersionHelperSpigot121_11 extends BukkitVersionHelper {
+
+ @Override
+ public boolean isUnsafeAsync() {
+ return false;
+ }
+
+ /**
+ * Get block short name list
+ */
+ @Override
+ public String[] getBlockNames() {
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+ while (iter.hasNext()) {
+ IBlockData bs = iter.next();
+ Block b = bs.b();
+ // If this is new block vs last, it's the base block state
+ if (b != baseb) {
+ baseb = b;
+ continue;
+ }
+ MinecraftKey id = BuiltInRegistries.e.b(b); // BuiltInRegistries.BLOCK.getKey(b)
+ String bn = id.toString();
+ if (bn != null) {
+ names.add(bn);
+ Log.info("block=" + bn);
+ }
+ }
+ return names.toArray(new String[0]);
+ }
+
+ private static IRegistry reg = null;
+
+ private static IRegistry getBiomeReg() {
+ if (reg == null) {
+ reg = MinecraftServer.getServer().bc().f(Registries.aS); // MinecraftServer.registryAccess().lookupOrThrow(Registries.BIOME)
+ }
+ return reg;
+ }
+
+ private Object[] biomelist;
+ /**
+ * Get list of defined biomebase objects
+ */
+ @Override
+ public Object[] getBiomeBaseList() {
+ if (biomelist == null) {
+ biomelist = new BiomeBase[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b); // Registry.getId
+ if (bidx >= biomelist.length) {
+ biomelist = Arrays.copyOf(biomelist, bidx + biomelist.length);
+ }
+ biomelist[bidx] = b;
+ }
+ }
+ return biomelist;
+ }
+
+ /** Get ID from biomebase */
+ @Override
+ public int getBiomeBaseID(Object bb) {
+ return getBiomeReg().a((BiomeBase)bb);
+ }
+
+ public static IdentityHashMap dataToState;
+
+ /**
+ * Initialize block states (org.dynmap.blockstate.DynmapBlockState)
+ */
+ @Override
+ public void initializeBlockStates() {
+ dataToState = new IdentityHashMap();
+ HashMap lastBlockState = new HashMap();
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+
+ // Loop through block data states
+ DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
+ while (iter.hasNext()) {
+ IBlockData bd = iter.next();
+ Block b = bd.b();
+ MinecraftKey id = BuiltInRegistries.e.b(b);
+ String bname = id.toString();
+ DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one
+ int idx = 0;
+ if (lastbs != null) { // Yes
+ idx = lastbs.getStateCount(); // Get number of states so far, since this is next
+ }
+ // Build state name
+ String sb = "";
+ String fname = bd.toString();
+ int off1 = fname.indexOf('[');
+ if (off1 >= 0) {
+ int off2 = fname.indexOf(']');
+ sb = fname.substring(off1+1, off2);
+ }
+ int lightAtten = bd.g(); // BlockBehaviour$BlockStateBase.getLightBlock
+ //Log.info("statename=" + bname + "[" + sb + "], lightAtten=" + lightAtten);
+ // Fill in base attributes
+ bld.setBaseState(lastbs).setStateIndex(idx).setBlockName(bname).setStateName(sb).setAttenuatesLight(lightAtten);
+ if (bd.e()) { bld.setSolid(); } // BlockBehaviour$BlockStateBase.isSolid
+ if (bd.l()) { bld.setAir(); } // BlockBehaviour$BlockStateBase.isAir
+ if (bd.a(TagsBlock.av)) { bld.setLog(); } // BlockBehaviour$BlockStateBase.is(BlockTags.OVERWORLD_NATURAL_LOGS)
+ if (bd.a(TagsBlock.M)) { bld.setLeaves(); } // BlockBehaviour$BlockStateBase.is(BlockTags.LEAVES)
+ // BlockBehaviour$BlockStateBase.getFluidState.isEmpty(), BlockBehaviour$BlockStateBase.getBlock
+ if (!bd.y().c() && !(bd.b() instanceof BlockFluids)) { // Test if fluid type for block is not empty
+ bld.setWaterlogged();
+ //Log.info("statename=" + bname + "[" + sb + "] = waterlogged");
+ }
+ DynmapBlockState dbs = bld.build(); // Build state
+
+ dataToState.put(bd, dbs);
+ lastBlockState.put(bname, (lastbs == null) ? dbs : lastbs);
+ Log.verboseinfo("blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + dbs.isWaterlogged());
+ }
+ }
+ /**
+ * Create chunk cache for given chunks of given world
+ * @param dw - world
+ * @param chunks - chunk list
+ * @return cache
+ */
+ @Override
+ public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) {
+ MapChunkCache121_11 c = new MapChunkCache121_11(gencache);
+ c.setChunks(dw, chunks);
+ return c;
+ }
+
+ /**
+ * Get biome base water multiplier
+ */
+ @Override
+ public int getBiomeBaseWaterMult(Object bb) {
+ BiomeBase biome = (BiomeBase) bb;
+ return biome.i(); // Biome.getWaterColor
+ }
+
+ /** Get temperature from biomebase */
+ @Override
+ public float getBiomeBaseTemperature(Object bb) {
+ return ((BiomeBase)bb).f(); // Biome.getBaseTemperature
+ }
+
+ /** Get humidity from biomebase */
+ @Override
+ public float getBiomeBaseHumidity(Object bb) {
+ String vals = ((BiomeBase)bb).i.toString(); // Biome.climateSettings
+ float humidity = 0.5F;
+ int idx = vals.indexOf("downfall=");
+ if (idx >= 0) {
+ humidity = Float.parseFloat(vals.substring(idx+9, vals.indexOf(']', idx)));
+ }
+ return humidity;
+ }
+
+ @Override
+ public Polygon getWorldBorder(World world) {
+ Polygon p = null;
+ WorldBorder wb = world.getWorldBorder();
+ if (wb != null) {
+ Location c = wb.getCenter();
+ double size = wb.getSize();
+ if ((size > 1) && (size < 1E7)) {
+ size = size / 2;
+ p = new Polygon();
+ p.addVertex(c.getX()-size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()+size);
+ p.addVertex(c.getX()-size, c.getZ()+size);
+ }
+ }
+ return p;
+ }
+ // Send title/subtitle to user
+ public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) {
+ if (p != null) {
+ p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks);
+ }
+ }
+
+ /**
+ * Get material map by block ID
+ */
+ @Override
+ public BukkitMaterial[] getMaterialList() {
+ return new BukkitMaterial[4096]; // Not used
+ }
+
+ @Override
+ public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) {
+ Log.severe("unloadChunkNoSave not implemented");
+ }
+
+ private String[] biomenames;
+ @Override
+ public String[] getBiomeNames() {
+ if (biomenames == null) {
+ biomenames = new String[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b);
+ if (bidx >= biomenames.length) {
+ biomenames = Arrays.copyOf(biomenames, bidx + biomenames.length);
+ }
+ biomenames[bidx] = b.toString();
+ }
+ }
+ return biomenames;
+ }
+
+ @Override
+ public String getStateStringByCombinedId(int blkid, int meta) {
+ Log.severe("getStateStringByCombinedId not implemented");
+ return null;
+ }
+ @Override
+ /** Get ID string from biomebase */
+ public String getBiomeBaseIDString(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).a(); // MinecraftKey.getPath()
+ }
+ @Override
+ public String getBiomeBaseResourceLocsation(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).toString();
+ }
+
+ @Override
+ public Object getUnloadQueue(World world) {
+ Log.warning("getUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isInUnloadQueue(Object unloadqueue, int x, int z) {
+ Log.warning("isInUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Object[] getBiomeBaseFromSnapshot(ChunkSnapshot css) {
+ Log.warning("getBiomeBaseFromSnapshot not implemented yet");
+ // TODO Auto-generated method stub
+ return new Object[256];
+ }
+
+ @Override
+ public long getInhabitedTicks(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).w(); // ChunkStatus.FULL ; ChunkAccess.getInhabitedTime
+ }
+
+ @Override
+ public Map, ?> getTileEntitiesForChunk(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).j; // ChunkStatus.FULL ; ChunkAccess.blockEntities
+ }
+
+ @Override
+ public int getTileEntityX(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aD_().u(); // BlockEntity.getBlockPos ; Vec3i.getX
+ }
+
+ @Override
+ public int getTileEntityY(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aD_().v(); // BlockEntity.getBlockPos ; Vec3i.getY
+ }
+
+ @Override
+ public int getTileEntityZ(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aD_().w(); // BlockEntity.getBlockPos ; Vec3i.getZ
+ }
+
+ @Override
+ public Object readTileEntityNBT(Object te, World w) {
+ TileEntity tileent = (TileEntity) te;
+ CraftWorld cw = (CraftWorld) w;
+ return tileent.d(cw.getHandle().J_()); // BlockEntity.saveCustomOnly ; LevelReader.registryAccess
+ }
+
+ @Override
+ public Object getFieldValue(Object nbt, String field) {
+ NBTTagCompound rec = (NBTTagCompound) nbt;
+ NBTBase val = rec.a(field); // CompoundTag.get
+ if(val == null) return null;
+ if(val instanceof NBTTagByte) {
+ return ((NBTTagByte)val).n(); // ByteTag.value
+ }
+ else if(val instanceof NBTTagShort) {
+ return ((NBTTagShort)val).n(); // ShortTag.value
+ }
+ else if(val instanceof NBTTagInt) {
+ return ((NBTTagInt)val).n(); // IntTag.value
+ }
+ else if(val instanceof NBTTagLong) {
+ return ((NBTTagLong)val).n(); // LongTag.value
+ }
+ else if(val instanceof NBTTagFloat) {
+ return ((NBTTagFloat)val).n(); // FloatTag.value
+ }
+ else if(val instanceof NBTTagDouble) {
+ return ((NBTTagDouble)val).n(); // DoubleTag.value
+ }
+ else if(val instanceof NBTTagByteArray) {
+ return ((NBTTagByteArray)val).e(); // ByteArrayTag.getAsByteArray
+ }
+ else if(val instanceof NBTTagString) {
+ return ((NBTTagString)val).k(); // StringTag.value
+ }
+ else if(val instanceof NBTTagIntArray) {
+ return ((NBTTagIntArray)val).g(); // IntArrayTag.getAsIntArray
+ }
+ return null;
+ }
+
+ @Override
+ public Player[] getOnlinePlayers() {
+ Collection extends Player> p = Bukkit.getServer().getOnlinePlayers();
+ return p.toArray(new Player[0]);
+ }
+
+ @Override
+ public double getHealth(Player p) {
+ return p.getHealth();
+ }
+
+ private static final Gson gson = new GsonBuilder().create();
+
+ /**
+ * Get skin URL for player
+ * @param player
+ */
+ @Override
+ public String getSkinURL(Player player) {
+ String url = null;
+ CraftPlayer cp = (CraftPlayer)player;
+ GameProfile profile = cp.getProfile();
+ if (profile != null) {
+ PropertyMap pm = profile.properties();
+ if (pm != null) {
+ Collection txt = pm.get("textures");
+ Property textureProperty = Iterables.getFirst(pm.get("textures"), null);
+ if (textureProperty != null) {
+ String val = textureProperty.value();
+ if (val != null) {
+ TexturesPayload result = null;
+ try {
+ String json = new String(Base64.getDecoder().decode(val), StandardCharsets.UTF_8);
+ result = gson.fromJson(json, TexturesPayload.class);
+ } catch (JsonParseException e) {
+ } catch (IllegalArgumentException x) {
+ Log.warning("Malformed response from skin URL check: " + val);
+ }
+ if ((result != null) && (result.textures != null) && (result.textures.containsKey("SKIN"))) {
+ url = result.textures.get("SKIN").url;
+ }
+ }
+ }
+ }
+ }
+ return url;
+ }
+ // Get minY for world
+ @Override
+ public int getWorldMinY(World w) {
+ CraftWorld cw = (CraftWorld) w;
+ return cw.getMinHeight();
+ }
+ @Override
+ public boolean useGenericCache() {
+ return true;
+ }
+
+}
diff --git a/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/MapChunkCache121_11.java b/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/MapChunkCache121_11.java
new file mode 100644
index 000000000..707998bf3
--- /dev/null
+++ b/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/MapChunkCache121_11.java
@@ -0,0 +1,105 @@
+package org.dynmap.bukkit.helper.v121_11;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.level.ChunkCoordIntPair;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.biome.BiomeFog;
+import net.minecraft.world.level.chunk.Chunk;
+import net.minecraft.world.level.chunk.storage.SerializableChunkData;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_21_R7.CraftServer;
+import org.bukkit.craftbukkit.v1_21_R7.CraftWorld;
+import org.dynmap.DynmapChunk;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.common.BiomeMap;
+import org.dynmap.common.chunk.GenericChunk;
+import org.dynmap.common.chunk.GenericChunkCache;
+import org.dynmap.common.chunk.GenericMapChunkCache;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+/**
+ * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
+ */
+public class MapChunkCache121_11 extends GenericMapChunkCache {
+ private World w;
+ /**
+ * Construct empty cache
+ */
+ public MapChunkCache121_11(GenericChunkCache cc) {
+ super(cc);
+ }
+
+ @Override
+ protected Supplier getLoadedChunkAsync(DynmapChunk chunk) {
+ CompletableFuture> chunkData = CompletableFuture.supplyAsync(() -> {
+ CraftWorld cw = (CraftWorld) w;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.p) { // !LevelChunk.loaded
+ return Optional.empty();
+ }
+ return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
+ }, ((CraftServer) Bukkit.getServer()).getServer());
+ return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
+ }
+
+ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.p) return null; // LevelChunk.loaded
+ SerializableChunkData chunkData = SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
+ NBTTagCompound nbt = chunkData.a(); // SerializableChunkData.write
+ return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
+ }
+
+ @Override
+ protected Supplier loadChunkAsync(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ CompletableFuture> genericChunk = cw.getHandle().p().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // ServerLevel.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
+ return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
+ }
+
+ protected GenericChunk loadChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ NBTTagCompound nbt = null;
+ ChunkCoordIntPair cc = new ChunkCoordIntPair(chunk.x, chunk.z);
+ GenericChunk gc = null;
+ try { // BUGBUG - convert this all to asyn properly, since now native async
+ nbt = cw.getHandle()
+ .p() // ServerLevel.getChunkSource
+ .a // ServerChunkCache.chunkMap
+ .d(cc) // SimpleRegionStorage.read(ChunkPos)
+ .join().get();
+ } catch (CancellationException cx) {
+ } catch (NoSuchElementException snex) {
+ }
+ if (nbt != null) {
+ gc = parseChunkFromNBT(new NBT.NBTCompound(nbt));
+ }
+ return gc;
+ }
+
+ public void setChunks(BukkitWorld dw, List chunks) {
+ this.w = dw.getWorld();
+ super.setChunks(dw, chunks);
+ }
+
+ @Override
+ public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
+ return bm.getBiomeObject().map(BiomeBase::h).flatMap(BiomeFog::b).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects, Biome::foliageColorOverride
+ }
+
+ @Override
+ public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) {
+ BiomeFog fog = bm.getBiomeObject().map(BiomeBase::h).orElse(null); // BiomeBase::getSpecialEffects
+ if (fog == null) return colormap[bm.biomeLookup()];
+ return fog.e().a(x, z, fog.d().orElse(colormap[bm.biomeLookup()])); // BiomeFog.grassColorModifier.modifyColor ; BiomeFog.grassColorOverride
+ }
+}
diff --git a/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/NBT.java b/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/NBT.java
new file mode 100644
index 000000000..5cbefe182
--- /dev/null
+++ b/bukkit-helper-121-11/src/main/java/org/dynmap/bukkit/helper/v121_11/NBT.java
@@ -0,0 +1,144 @@
+package org.dynmap.bukkit.helper.v121_11;
+
+import org.dynmap.common.chunk.GenericBitStorage;
+import org.dynmap.common.chunk.GenericNBTCompound;
+import org.dynmap.common.chunk.GenericNBTList;
+
+import java.util.Optional;
+import java.util.Set;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.SimpleBitStorage;
+
+public class NBT {
+
+ public static class NBTCompound implements GenericNBTCompound {
+ private final NBTTagCompound obj;
+ public NBTCompound(NBTTagCompound t) {
+ this.obj = t;
+ }
+ @Override
+ public Set getAllKeys() {
+ return obj.e(); // CompoundTag.keySet
+ }
+ @Override
+ public boolean contains(String s) {
+ return obj.b(s); // CompoundTag.contains
+ }
+ @Override
+ public boolean contains(String s, int i) {
+ // Like contains, but with an extra constraint on type
+ NBTBase base = obj.a(s); // CompoundTag.get
+ if (base == null)
+ return false;
+ byte type = base.b(); // CompoundTag.getId
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
+ }
+ @Override
+ public byte getByte(String s) {
+ return obj.b(s, (byte)0); // CompoundTag.getByteOr
+ }
+ @Override
+ public short getShort(String s) {
+ return obj.b(s, (short)0); // CompoundTag.getShortOr
+ }
+ @Override
+ public int getInt(String s) {
+ return obj.b(s, 0); // CompoundTag.getIntOr
+ }
+ @Override
+ public long getLong(String s) {
+ return obj.b(s, 0L); // CompoundTag.getLongOr
+ }
+ @Override
+ public float getFloat(String s) {
+ return obj.b(s, 0.0f); // CompoundTag.getFloatOr
+ }
+ @Override
+ public double getDouble(String s) {
+ return obj.b(s, 0.0); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public String getString(String s) {
+ return obj.b(s, ""); // CompoundTag.getStringOr
+ }
+ @Override
+ public byte[] getByteArray(String s) {
+ Optional byteArr = obj.j(s); // CompoundTag.getByteArray
+ return byteArr.orElseGet(() -> new byte[0]);
+ }
+ @Override
+ public int[] getIntArray(String s) {
+ Optional intArr = obj.k(s); // CompoundTag.getIntArray
+ return intArr.orElseGet(() -> new int[0]);
+ }
+ @Override
+ public long[] getLongArray(String s) {
+ Optional longArr = obj.l(s); // CompoundTag.getLongArray
+ return longArr.orElseGet(() -> new long[0]);
+ }
+ @Override
+ public GenericNBTCompound getCompound(String s) {
+ return new NBTCompound(obj.n(s)); // CompoundTag.getCompoundOrEmpty
+ }
+ @Override
+ public GenericNBTList getList(String s, int i) {
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.p(s)); // CompoundTag.getListOrEmpty
+ }
+ @Override
+ public boolean getBoolean(String s) {
+ return getByte(s) != 0;
+ }
+ @Override
+ public String getAsString(String s) {
+ return obj.a(s).p_().orElseGet(() -> ""); // CompoundTag.get ; Tag.asString
+ }
+ @Override
+ public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
+ return new OurBitStorage(bits, count, data);
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class NBTList implements GenericNBTList {
+ private final NBTTagList obj;
+ public NBTList(NBTTagList t) {
+ obj = t;
+ }
+ @Override
+ public int size() {
+ return obj.size();
+ }
+ @Override
+ public String getString(int idx) {
+ return obj.a(idx, ""); // ListTag.getStringOr
+ }
+ @Override
+ public GenericNBTCompound getCompound(int idx) {
+ return new NBTCompound(obj.b(idx)); // ListTag.getCompoundOrEmpty
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class OurBitStorage implements GenericBitStorage {
+ private final SimpleBitStorage bs;
+ public OurBitStorage(int bits, int count, long[] data) {
+ bs = new SimpleBitStorage(bits, count, data);
+ }
+ @Override
+ public int get(int idx) {
+ return bs.a(idx);
+ }
+ }
+}
diff --git a/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/BukkitVersionHelperSpigot121_3.java b/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/BukkitVersionHelperSpigot121_3.java
index 4527aaeb4..a5a5aaf6c 100644
--- a/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/BukkitVersionHelperSpigot121_3.java
+++ b/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/BukkitVersionHelperSpigot121_3.java
@@ -67,7 +67,7 @@ public class BukkitVersionHelperSpigot121_3 extends BukkitVersionHelper {
@Override
public boolean isUnsafeAsync() {
- return true;
+ return false;
}
/**
diff --git a/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/MapChunkCache121_3.java b/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/MapChunkCache121_3.java
index b3b1b796b..676391f1e 100644
--- a/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/MapChunkCache121_3.java
+++ b/bukkit-helper-121-3/src/main/java/org/dynmap/bukkit/helper/v121_3/MapChunkCache121_3.java
@@ -6,7 +6,9 @@
import net.minecraft.world.level.biome.BiomeFog;
import net.minecraft.world.level.chunk.Chunk;
import net.minecraft.world.level.chunk.storage.SerializableChunkData;
+import org.bukkit.Bukkit;
import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_21_R2.CraftServer;
import org.bukkit.craftbukkit.v1_21_R2.CraftWorld;
import org.dynmap.DynmapChunk;
import org.dynmap.bukkit.helper.BukkitWorld;
@@ -17,7 +19,10 @@
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Optional;
import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
/**
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +36,19 @@ public MapChunkCache121_3(GenericChunkCache cc) {
super(cc);
}
+ @Override
+ protected Supplier getLoadedChunkAsync(DynmapChunk chunk) {
+ CompletableFuture> chunkData = CompletableFuture.supplyAsync(() -> {
+ CraftWorld cw = (CraftWorld) w;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.q) { // !c.loaded
+ return Optional.empty();
+ }
+ return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
+ }, ((CraftServer) Bukkit.getServer()).getServer());
+ return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
+ }
+
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
CraftWorld cw = (CraftWorld) w;
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +59,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
}
+ @Override
+ protected Supplier loadChunkAsync(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ CompletableFuture> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
+ return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
+ }
+
protected GenericChunk loadChunk(DynmapChunk chunk) {
CraftWorld cw = (CraftWorld) w;
NBTTagCompound nbt = null;
@@ -64,7 +89,7 @@ public void setChunks(BukkitWorld dw, List chunks) {
@Override
public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
- return bm.getBiomeObject().map(BiomeBase::h).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects, BiomeFog::skyColor
+ return bm.getBiomeObject().map(BiomeBase::h).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects, BiomeFog::getFoliageColorOverride
}
@Override
diff --git a/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/BukkitVersionHelperSpigot121_4.java b/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/BukkitVersionHelperSpigot121_4.java
index 67dc588e7..9a388d74d 100644
--- a/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/BukkitVersionHelperSpigot121_4.java
+++ b/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/BukkitVersionHelperSpigot121_4.java
@@ -67,7 +67,7 @@ public class BukkitVersionHelperSpigot121_4 extends BukkitVersionHelper {
@Override
public boolean isUnsafeAsync() {
- return true;
+ return false;
}
/**
diff --git a/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/MapChunkCache121_4.java b/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/MapChunkCache121_4.java
index 9a7320a46..40efaf670 100644
--- a/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/MapChunkCache121_4.java
+++ b/bukkit-helper-121-4/src/main/java/org/dynmap/bukkit/helper/v121_4/MapChunkCache121_4.java
@@ -6,7 +6,9 @@
import net.minecraft.world.level.biome.BiomeFog;
import net.minecraft.world.level.chunk.Chunk;
import net.minecraft.world.level.chunk.storage.SerializableChunkData;
+import org.bukkit.Bukkit;
import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_21_R3.CraftServer;
import org.bukkit.craftbukkit.v1_21_R3.CraftWorld;
import org.dynmap.DynmapChunk;
import org.dynmap.bukkit.helper.BukkitWorld;
@@ -17,7 +19,10 @@
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Optional;
import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
/**
* Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
@@ -31,6 +36,19 @@ public MapChunkCache121_4(GenericChunkCache cc) {
super(cc);
}
+ @Override
+ protected Supplier getLoadedChunkAsync(DynmapChunk chunk) {
+ CompletableFuture> chunkData = CompletableFuture.supplyAsync(() -> {
+ CraftWorld cw = (CraftWorld) w;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.q) { // !c.loaded
+ return Optional.empty();
+ }
+ return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
+ }, ((CraftServer) Bukkit.getServer()).getServer());
+ return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
+ }
+
protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
CraftWorld cw = (CraftWorld) w;
if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
@@ -41,6 +59,13 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
}
+ @Override
+ protected Supplier loadChunkAsync(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ CompletableFuture> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
+ return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
+ }
+
protected GenericChunk loadChunk(DynmapChunk chunk) {
CraftWorld cw = (CraftWorld) w;
NBTTagCompound nbt = null;
@@ -64,7 +89,7 @@ public void setChunks(BukkitWorld dw, List chunks) {
@Override
public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
- return bm.getBiomeObject().map(BiomeBase::h).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects, BiomeFog::skyColor
+ return bm.getBiomeObject().map(BiomeBase::h).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects, BiomeFog::getFoliageColorOverride
}
@Override
diff --git a/bukkit-helper-121-5/.gitignore b/bukkit-helper-121-5/.gitignore
new file mode 100644
index 000000000..84c048a73
--- /dev/null
+++ b/bukkit-helper-121-5/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/bukkit-helper-121-5/build.gradle b/bukkit-helper-121-5/build.gradle
new file mode 100644
index 000000000..0b5680747
--- /dev/null
+++ b/bukkit-helper-121-5/build.gradle
@@ -0,0 +1,19 @@
+eclipse {
+ project {
+ name = "Dynmap(Spigot-1.21.5)"
+ }
+}
+
+description = 'bukkit-helper-1.21.5'
+
+sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaLanguageVersion.of(17) // Need this here so eclipse task generates correctly.
+
+dependencies {
+ implementation project(':bukkit-helper')
+ implementation project(':dynmap-api')
+ implementation project(path: ':DynmapCore', configuration: 'shadow')
+ compileOnly group: 'org.spigotmc', name: 'spigot-api', version:'1.21.5-R0.1-SNAPSHOT'
+ compileOnly ('org.spigotmc:spigot:1.21.5-R0.1-SNAPSHOT') {
+ exclude group: "com.mojang", module: "jtracy"
+ }
+}
diff --git a/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/BukkitVersionHelperSpigot121_5.java b/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/BukkitVersionHelperSpigot121_5.java
new file mode 100644
index 000000000..08614de47
--- /dev/null
+++ b/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/BukkitVersionHelperSpigot121_5.java
@@ -0,0 +1,450 @@
+package org.dynmap.bukkit.helper.v121_5;
+
+import org.bukkit.*;
+import org.bukkit.craftbukkit.v1_21_R4.CraftChunk;
+import org.bukkit.craftbukkit.v1_21_R4.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.dynmap.DynmapChunk;
+import org.dynmap.Log;
+import org.dynmap.bukkit.helper.BukkitMaterial;
+import org.dynmap.bukkit.helper.BukkitVersionHelper;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.bukkit.helper.BukkitVersionHelperGeneric.TexturesPayload;
+import org.dynmap.renderer.DynmapBlockState;
+import org.dynmap.utils.MapChunkCache;
+import org.dynmap.utils.Polygon;
+
+import com.google.common.collect.Iterables;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import com.mojang.authlib.properties.PropertyMap;
+
+import net.minecraft.core.RegistryBlockID;
+import net.minecraft.core.registries.BuiltInRegistries;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.core.IRegistry;
+import net.minecraft.nbt.NBTTagByteArray;
+import net.minecraft.nbt.NBTTagByte;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagDouble;
+import net.minecraft.nbt.NBTTagFloat;
+import net.minecraft.nbt.NBTTagIntArray;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.nbt.NBTTagLong;
+import net.minecraft.nbt.NBTTagShort;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.resources.MinecraftKey;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.tags.TagsBlock;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.BlockFluids;
+import net.minecraft.world.level.block.entity.TileEntity;
+import net.minecraft.world.level.block.state.IBlockData;
+import net.minecraft.world.level.chunk.status.ChunkStatus;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Helper for isolation of bukkit version specific issues
+ */
+public class BukkitVersionHelperSpigot121_5 extends BukkitVersionHelper {
+
+ @Override
+ public boolean isUnsafeAsync() {
+ return false;
+ }
+
+ /**
+ * Get block short name list
+ */
+ @Override
+ public String[] getBlockNames() {
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+ while (iter.hasNext()) {
+ IBlockData bs = iter.next();
+ Block b = bs.b();
+ // If this is new block vs last, it's the base block state
+ if (b != baseb) {
+ baseb = b;
+ continue;
+ }
+ MinecraftKey id = BuiltInRegistries.e.b(b);
+ String bn = id.toString();
+ if (bn != null) {
+ names.add(bn);
+ Log.info("block=" + bn);
+ }
+ }
+ return names.toArray(new String[0]);
+ }
+
+ private static IRegistry reg = null;
+
+ private static IRegistry getBiomeReg() {
+ if (reg == null) {
+ reg = MinecraftServer.getServer().ba().f(Registries.aG); // MinecraftServer.registryAccess().lookupOrThrow(Registries.BIOME)
+ }
+ return reg;
+ }
+
+ private Object[] biomelist;
+ /**
+ * Get list of defined biomebase objects
+ */
+ @Override
+ public Object[] getBiomeBaseList() {
+ if (biomelist == null) {
+ biomelist = new BiomeBase[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b); // iRegistry.getId
+ if (bidx >= biomelist.length) {
+ biomelist = Arrays.copyOf(biomelist, bidx + biomelist.length);
+ }
+ biomelist[bidx] = b;
+ }
+ }
+ return biomelist;
+ }
+
+ /** Get ID from biomebase */
+ @Override
+ public int getBiomeBaseID(Object bb) {
+ return getBiomeReg().a((BiomeBase)bb);
+ }
+
+ public static IdentityHashMap dataToState;
+
+ /**
+ * Initialize block states (org.dynmap.blockstate.DynmapBlockState)
+ */
+ @Override
+ public void initializeBlockStates() {
+ dataToState = new IdentityHashMap();
+ HashMap lastBlockState = new HashMap();
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+
+ // Loop through block data states
+ DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
+ while (iter.hasNext()) {
+ IBlockData bd = iter.next();
+ Block b = bd.b();
+ MinecraftKey id = BuiltInRegistries.e.b(b);
+ String bname = id.toString();
+ DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one
+ int idx = 0;
+ if (lastbs != null) { // Yes
+ idx = lastbs.getStateCount(); // Get number of states so far, since this is next
+ }
+ // Build state name
+ String sb = "";
+ String fname = bd.toString();
+ int off1 = fname.indexOf('[');
+ if (off1 >= 0) {
+ int off2 = fname.indexOf(']');
+ sb = fname.substring(off1+1, off2);
+ }
+ int lightAtten = bd.g(); // BlockBehaviour$BlockStateBase.getLightBlock
+ //Log.info("statename=" + bname + "[" + sb + "], lightAtten=" + lightAtten);
+ // Fill in base attributes
+ bld.setBaseState(lastbs).setStateIndex(idx).setBlockName(bname).setStateName(sb).setAttenuatesLight(lightAtten);
+ if (bd.e()) { bld.setSolid(); } // BlockBehaviour$BlockStateBase.isSolid
+ if (bd.l()) { bld.setAir(); } // BlockBehaviour$BlockStateBase.isAir
+ if (bd.a(TagsBlock.t)) { bld.setLog(); } // BlockBehaviour$BlockStateBase.is(OVERWORLD_NATURAL_LOGS)
+ if (bd.a(TagsBlock.Q)) { bld.setLeaves(); } // BlockBehaviour$BlockStateBase.is(LEAVES)
+ // BlockBehaviour$BlockStateBase.getFluidState.isEmpty(), BlockBehaviour$BlockStateBase.getBlock
+ if (!bd.y().c() && !(bd.b() instanceof BlockFluids)) { // Test if fluid type for block is not empty
+ bld.setWaterlogged();
+ //Log.info("statename=" + bname + "[" + sb + "] = waterlogged");
+ }
+ DynmapBlockState dbs = bld.build(); // Build state
+
+ dataToState.put(bd, dbs);
+ lastBlockState.put(bname, (lastbs == null) ? dbs : lastbs);
+ Log.verboseinfo("blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + dbs.isWaterlogged());
+ }
+ }
+ /**
+ * Create chunk cache for given chunks of given world
+ * @param dw - world
+ * @param chunks - chunk list
+ * @return cache
+ */
+ @Override
+ public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) {
+ MapChunkCache121_5 c = new MapChunkCache121_5(gencache);
+ c.setChunks(dw, chunks);
+ return c;
+ }
+
+ /**
+ * Get biome base water multiplier
+ */
+ @Override
+ public int getBiomeBaseWaterMult(Object bb) {
+ BiomeBase biome = (BiomeBase) bb;
+ return biome.j(); // Biome.getWaterColor
+ }
+
+ /** Get temperature from biomebase */
+ @Override
+ public float getBiomeBaseTemperature(Object bb) {
+ return ((BiomeBase)bb).h(); // Biome.getBaseTemperature
+ }
+
+ /** Get humidity from biomebase */
+ @Override
+ public float getBiomeBaseHumidity(Object bb) {
+ String vals = ((BiomeBase)bb).i.toString(); // Biome.climateSettings
+ float humidity = 0.5F;
+ int idx = vals.indexOf("downfall=");
+ if (idx >= 0) {
+ humidity = Float.parseFloat(vals.substring(idx+9, vals.indexOf(']', idx)));
+ }
+ return humidity;
+ }
+
+ @Override
+ public Polygon getWorldBorder(World world) {
+ Polygon p = null;
+ WorldBorder wb = world.getWorldBorder();
+ if (wb != null) {
+ Location c = wb.getCenter();
+ double size = wb.getSize();
+ if ((size > 1) && (size < 1E7)) {
+ size = size / 2;
+ p = new Polygon();
+ p.addVertex(c.getX()-size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()+size);
+ p.addVertex(c.getX()-size, c.getZ()+size);
+ }
+ }
+ return p;
+ }
+ // Send title/subtitle to user
+ public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) {
+ if (p != null) {
+ p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks);
+ }
+ }
+
+ /**
+ * Get material map by block ID
+ */
+ @Override
+ public BukkitMaterial[] getMaterialList() {
+ return new BukkitMaterial[4096]; // Not used
+ }
+
+ @Override
+ public void unloadChunkNoSave(World w, org.bukkit.Chunk c, int cx, int cz) {
+ Log.severe("unloadChunkNoSave not implemented");
+ }
+
+ private String[] biomenames;
+ @Override
+ public String[] getBiomeNames() {
+ if (biomenames == null) {
+ biomenames = new String[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b);
+ if (bidx >= biomenames.length) {
+ biomenames = Arrays.copyOf(biomenames, bidx + biomenames.length);
+ }
+ biomenames[bidx] = b.toString();
+ }
+ }
+ return biomenames;
+ }
+
+ @Override
+ public String getStateStringByCombinedId(int blkid, int meta) {
+ Log.severe("getStateStringByCombinedId not implemented");
+ return null;
+ }
+ @Override
+ /** Get ID string from biomebase */
+ public String getBiomeBaseIDString(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).a(); // MinecraftKey.getPath()
+ }
+ @Override
+ public String getBiomeBaseResourceLocsation(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).toString();
+ }
+
+ @Override
+ public Object getUnloadQueue(World world) {
+ Log.warning("getUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isInUnloadQueue(Object unloadqueue, int x, int z) {
+ Log.warning("isInUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Object[] getBiomeBaseFromSnapshot(ChunkSnapshot css) {
+ Log.warning("getBiomeBaseFromSnapshot not implemented yet");
+ // TODO Auto-generated method stub
+ return new Object[256];
+ }
+
+ @Override
+ public long getInhabitedTicks(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).w(); // ChunkStatus.FULL ; IChunkAccess.getInhabitedTime
+ }
+
+ @Override
+ public Map, ?> getTileEntitiesForChunk(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).k; // ChunkStatus.FULL ; IChunkAccess.blockEntities
+ }
+
+ @Override
+ public int getTileEntityX(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.ax_().u(); // TileEntity.getBlockPos ; Vec3i.getX
+ }
+
+ @Override
+ public int getTileEntityY(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.ax_().v(); // TileEntity.getBlockPos ; Vec3i.getY
+ }
+
+ @Override
+ public int getTileEntityZ(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.ax_().w(); // TileEntity.getBlockPos ; Vec3i.getZ
+ }
+
+ @Override
+ public Object readTileEntityNBT(Object te, org.bukkit.World w) {
+ TileEntity tileent = (TileEntity) te;
+ CraftWorld cw = (CraftWorld) w;
+ return tileent.e(cw.getHandle().J_()); // TileEntity.saveCustomOnly ; LevelReader.registryAccess
+ }
+
+ @Override
+ public Object getFieldValue(Object nbt, String field) {
+ NBTTagCompound rec = (NBTTagCompound) nbt;
+ NBTBase val = rec.a(field); // NBTTagCompound.get
+ if(val == null) return null;
+ if(val instanceof NBTTagByte) {
+ return ((NBTTagByte)val).n(); // NBTTagByte.value
+ }
+ else if(val instanceof NBTTagShort) {
+ return ((NBTTagShort)val).n(); // NBTTagShort.value
+ }
+ else if(val instanceof NBTTagInt) {
+ return ((NBTTagInt)val).n(); // NBTTagInt.value
+ }
+ else if(val instanceof NBTTagLong) {
+ return ((NBTTagLong)val).n(); // NBTTagLong.value
+ }
+ else if(val instanceof NBTTagFloat) {
+ return ((NBTTagFloat)val).n(); // NBTTagFloat.value
+ }
+ else if(val instanceof NBTTagDouble) {
+ return ((NBTTagDouble)val).n(); // NBTTagDouble.value
+ }
+ else if(val instanceof NBTTagByteArray) {
+ return ((NBTTagByteArray)val).e(); // NBTTagByteArray.getAsByteArray
+ }
+ else if(val instanceof NBTTagString) {
+ return ((NBTTagString)val).k(); // NBTTagString.value
+ }
+ else if(val instanceof NBTTagIntArray) {
+ return ((NBTTagIntArray)val).g(); // NBTTagIntArray.getAsIntArray
+ }
+ return null;
+ }
+
+ @Override
+ public Player[] getOnlinePlayers() {
+ Collection extends Player> p = Bukkit.getServer().getOnlinePlayers();
+ return p.toArray(new Player[0]);
+ }
+
+ @Override
+ public double getHealth(Player p) {
+ return p.getHealth();
+ }
+
+ private static final Gson gson = new GsonBuilder().create();
+
+ /**
+ * Get skin URL for player
+ * @param player
+ */
+ @Override
+ public String getSkinURL(Player player) {
+ String url = null;
+ CraftPlayer cp = (CraftPlayer)player;
+ GameProfile profile = cp.getProfile();
+ if (profile != null) {
+ PropertyMap pm = profile.getProperties();
+ if (pm != null) {
+ Collection txt = pm.get("textures");
+ Property textureProperty = Iterables.getFirst(pm.get("textures"), null);
+ if (textureProperty != null) {
+ String val = textureProperty.value();
+ if (val != null) {
+ TexturesPayload result = null;
+ try {
+ String json = new String(Base64.getDecoder().decode(val), StandardCharsets.UTF_8);
+ result = gson.fromJson(json, TexturesPayload.class);
+ } catch (JsonParseException e) {
+ } catch (IllegalArgumentException x) {
+ Log.warning("Malformed response from skin URL check: " + val);
+ }
+ if ((result != null) && (result.textures != null) && (result.textures.containsKey("SKIN"))) {
+ url = result.textures.get("SKIN").url;
+ }
+ }
+ }
+ }
+ }
+ return url;
+ }
+ // Get minY for world
+ @Override
+ public int getWorldMinY(World w) {
+ CraftWorld cw = (CraftWorld) w;
+ return cw.getMinHeight();
+ }
+ @Override
+ public boolean useGenericCache() {
+ return true;
+ }
+
+}
diff --git a/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/MapChunkCache121_5.java b/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/MapChunkCache121_5.java
new file mode 100644
index 000000000..3c5b48d39
--- /dev/null
+++ b/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/MapChunkCache121_5.java
@@ -0,0 +1,105 @@
+package org.dynmap.bukkit.helper.v121_5;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.level.ChunkCoordIntPair;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.biome.BiomeFog;
+import net.minecraft.world.level.chunk.Chunk;
+import net.minecraft.world.level.chunk.storage.SerializableChunkData;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_21_R4.CraftServer;
+import org.bukkit.craftbukkit.v1_21_R4.CraftWorld;
+import org.dynmap.DynmapChunk;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.common.BiomeMap;
+import org.dynmap.common.chunk.GenericChunk;
+import org.dynmap.common.chunk.GenericChunkCache;
+import org.dynmap.common.chunk.GenericMapChunkCache;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+/**
+ * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
+ */
+public class MapChunkCache121_5 extends GenericMapChunkCache {
+ private World w;
+ /**
+ * Construct empty cache
+ */
+ public MapChunkCache121_5(GenericChunkCache cc) {
+ super(cc);
+ }
+
+ @Override
+ protected Supplier getLoadedChunkAsync(DynmapChunk chunk) {
+ CompletableFuture> chunkData = CompletableFuture.supplyAsync(() -> {
+ CraftWorld cw = (CraftWorld) w;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.q) { // !c.loaded
+ return Optional.empty();
+ }
+ return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
+ }, ((CraftServer) Bukkit.getServer()).getServer());
+ return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
+ }
+
+ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.q) return null; // LevelChunk.loaded
+ SerializableChunkData chunkData = SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
+ NBTTagCompound nbt = chunkData.a(); // SerializableChunkData.write
+ return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
+ }
+
+ @Override
+ protected Supplier loadChunkAsync(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ CompletableFuture> genericChunk = cw.getHandle().m().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
+ return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
+ }
+
+ protected GenericChunk loadChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ NBTTagCompound nbt = null;
+ ChunkCoordIntPair cc = new ChunkCoordIntPair(chunk.x, chunk.z);
+ GenericChunk gc = null;
+ try { // BUGBUG - convert this all to asyn properly, since now native async
+ nbt = cw.getHandle()
+ .m() // ServerLevel.getChunkSource
+ .a // ServerChunkCache.chunkMap
+ .d(cc) // ChunkStorage.read(ChunkPos)
+ .join().get();
+ } catch (CancellationException cx) {
+ } catch (NoSuchElementException snex) {
+ }
+ if (nbt != null) {
+ gc = parseChunkFromNBT(new NBT.NBTCompound(nbt));
+ }
+ return gc;
+ }
+
+ public void setChunks(BukkitWorld dw, List chunks) {
+ this.w = dw.getWorld();
+ super.setChunks(dw, chunks);
+ }
+
+ @Override
+ public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
+ return bm.getBiomeObject().map(BiomeBase::i).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects ; BiomeFog::getFoliageColorOverride
+ }
+
+ @Override
+ public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) {
+ BiomeFog fog = bm.getBiomeObject().map(BiomeBase::i).orElse(null); // BiomeBase::getSpecialEffects
+ if (fog == null) return colormap[bm.biomeLookup()];
+ return fog.h().a(x, z, fog.g().orElse(colormap[bm.biomeLookup()])); // BiomeFog.getGrassColorModifier.modifyColor ; BiomeFog.getGrassColorOverride
+ }
+}
diff --git a/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/NBT.java b/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/NBT.java
new file mode 100644
index 000000000..6df501040
--- /dev/null
+++ b/bukkit-helper-121-5/src/main/java/org/dynmap/bukkit/helper/v121_5/NBT.java
@@ -0,0 +1,144 @@
+package org.dynmap.bukkit.helper.v121_5;
+
+import org.dynmap.common.chunk.GenericBitStorage;
+import org.dynmap.common.chunk.GenericNBTCompound;
+import org.dynmap.common.chunk.GenericNBTList;
+
+import java.util.Optional;
+import java.util.Set;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.SimpleBitStorage;
+
+public class NBT {
+
+ public static class NBTCompound implements GenericNBTCompound {
+ private final NBTTagCompound obj;
+ public NBTCompound(NBTTagCompound t) {
+ this.obj = t;
+ }
+ @Override
+ public Set getAllKeys() {
+ return obj.e(); // CompoundTag.keySet
+ }
+ @Override
+ public boolean contains(String s) {
+ return obj.b(s); // CompoundTag.contains
+ }
+ @Override
+ public boolean contains(String s, int i) {
+ // Like contains, but with an extra constraint on type
+ NBTBase base = obj.a(s); // CompoundTag.get
+ if (base == null)
+ return false;
+ byte type = base.b(); // CompoundTag.getId
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
+ }
+ @Override
+ public byte getByte(String s) {
+ return obj.b(s, (byte)0); // CompoundTag.getByteOr
+ }
+ @Override
+ public short getShort(String s) {
+ return obj.b(s, (short)0); // CompoundTag.getShortOr
+ }
+ @Override
+ public int getInt(String s) {
+ return obj.b(s, 0); // CompoundTag.getIntOr
+ }
+ @Override
+ public long getLong(String s) {
+ return obj.b(s, 0L); // CompoundTag.getLongOr
+ }
+ @Override
+ public float getFloat(String s) {
+ return obj.b(s, 0.0f); // CompoundTag.getFloatOr
+ }
+ @Override
+ public double getDouble(String s) {
+ return obj.b(s, 0.0); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public String getString(String s) {
+ return obj.b(s, ""); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public byte[] getByteArray(String s) {
+ Optional byteArr = obj.j(s); // CompoundTag.getByteArray
+ return byteArr.orElseGet(() -> new byte[0]);
+ }
+ @Override
+ public int[] getIntArray(String s) {
+ Optional intArr = obj.k(s); // CompoundTag.getIntArray
+ return intArr.orElseGet(() -> new int[0]);
+ }
+ @Override
+ public long[] getLongArray(String s) {
+ Optional longArr = obj.l(s); // CompoundTag.getLongArray
+ return longArr.orElseGet(() -> new long[0]);
+ }
+ @Override
+ public GenericNBTCompound getCompound(String s) {
+ return new NBTCompound(obj.n(s)); // CompoundTag.getCompoundOrEmpty
+ }
+ @Override
+ public GenericNBTList getList(String s, int i) {
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.p(s)); // CompoundTag.getListOrEmpty
+ }
+ @Override
+ public boolean getBoolean(String s) {
+ return getByte(s) != 0;
+ }
+ @Override
+ public String getAsString(String s) {
+ return obj.a(s).p_().orElseGet(() -> ""); // CompoundTag.get ; Tag.asString
+ }
+ @Override
+ public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
+ return new OurBitStorage(bits, count, data);
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class NBTList implements GenericNBTList {
+ private final NBTTagList obj;
+ public NBTList(NBTTagList t) {
+ obj = t;
+ }
+ @Override
+ public int size() {
+ return obj.size();
+ }
+ @Override
+ public String getString(int idx) {
+ return obj.a(idx, ""); // ListTag.getStringOr
+ }
+ @Override
+ public GenericNBTCompound getCompound(int idx) {
+ return new NBTCompound(obj.b(idx)); // ListTag.getCompoundOrEmpty
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class OurBitStorage implements GenericBitStorage {
+ private final SimpleBitStorage bs;
+ public OurBitStorage(int bits, int count, long[] data) {
+ bs = new SimpleBitStorage(bits, count, data);
+ }
+ @Override
+ public int get(int idx) {
+ return bs.a(idx);
+ }
+ }
+}
diff --git a/bukkit-helper-121-6/.gitignore b/bukkit-helper-121-6/.gitignore
new file mode 100644
index 000000000..84c048a73
--- /dev/null
+++ b/bukkit-helper-121-6/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/bukkit-helper-121-6/build.gradle b/bukkit-helper-121-6/build.gradle
new file mode 100644
index 000000000..e4aa9c39a
--- /dev/null
+++ b/bukkit-helper-121-6/build.gradle
@@ -0,0 +1,19 @@
+eclipse {
+ project {
+ name = "Dynmap(Spigot-1.21.7)"
+ }
+}
+
+description = 'bukkit-helper-1.21.7'
+
+sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaLanguageVersion.of(17) // Need this here so eclipse task generates correctly.
+
+dependencies {
+ implementation project(':bukkit-helper')
+ implementation project(':dynmap-api')
+ implementation project(path: ':DynmapCore', configuration: 'shadow')
+ compileOnly group: 'org.spigotmc', name: 'spigot-api', version:'1.21.7-R0.1-SNAPSHOT'
+ compileOnly ('org.spigotmc:spigot:1.21.7-R0.1-SNAPSHOT') {
+ exclude group: "com.mojang", module: "jtracy"
+ }
+}
diff --git a/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/BukkitVersionHelperSpigot121_6.java b/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/BukkitVersionHelperSpigot121_6.java
new file mode 100644
index 000000000..7698789de
--- /dev/null
+++ b/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/BukkitVersionHelperSpigot121_6.java
@@ -0,0 +1,450 @@
+package org.dynmap.bukkit.helper.v121_6;
+
+import org.bukkit.*;
+import org.bukkit.craftbukkit.v1_21_R5.CraftChunk;
+import org.bukkit.craftbukkit.v1_21_R5.CraftWorld;
+import org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer;
+import org.bukkit.entity.Player;
+import org.dynmap.DynmapChunk;
+import org.dynmap.Log;
+import org.dynmap.bukkit.helper.BukkitMaterial;
+import org.dynmap.bukkit.helper.BukkitVersionHelper;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.bukkit.helper.BukkitVersionHelperGeneric.TexturesPayload;
+import org.dynmap.renderer.DynmapBlockState;
+import org.dynmap.utils.MapChunkCache;
+import org.dynmap.utils.Polygon;
+
+import com.google.common.collect.Iterables;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import com.mojang.authlib.properties.PropertyMap;
+
+import net.minecraft.core.RegistryBlockID;
+import net.minecraft.core.registries.BuiltInRegistries;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.core.IRegistry;
+import net.minecraft.nbt.NBTTagByteArray;
+import net.minecraft.nbt.NBTTagByte;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagDouble;
+import net.minecraft.nbt.NBTTagFloat;
+import net.minecraft.nbt.NBTTagIntArray;
+import net.minecraft.nbt.NBTTagInt;
+import net.minecraft.nbt.NBTTagLong;
+import net.minecraft.nbt.NBTTagShort;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.resources.MinecraftKey;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.tags.TagsBlock;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.BlockFluids;
+import net.minecraft.world.level.block.entity.TileEntity;
+import net.minecraft.world.level.block.state.IBlockData;
+import net.minecraft.world.level.chunk.status.ChunkStatus;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * Helper for isolation of bukkit version specific issues
+ */
+public class BukkitVersionHelperSpigot121_6 extends BukkitVersionHelper {
+
+ @Override
+ public boolean isUnsafeAsync() {
+ return false;
+ }
+
+ /**
+ * Get block short name list
+ */
+ @Override
+ public String[] getBlockNames() {
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+ while (iter.hasNext()) {
+ IBlockData bs = iter.next();
+ Block b = bs.b();
+ // If this is new block vs last, it's the base block state
+ if (b != baseb) {
+ baseb = b;
+ continue;
+ }
+ MinecraftKey id = BuiltInRegistries.e.b(b);
+ String bn = id.toString();
+ if (bn != null) {
+ names.add(bn);
+ Log.info("block=" + bn);
+ }
+ }
+ return names.toArray(new String[0]);
+ }
+
+ private static IRegistry reg = null;
+
+ private static IRegistry getBiomeReg() {
+ if (reg == null) {
+ reg = MinecraftServer.getServer().ba().f(Registries.aK);
+ }
+ return reg;
+ }
+
+ private Object[] biomelist;
+ /**
+ * Get list of defined biomebase objects
+ */
+ @Override
+ public Object[] getBiomeBaseList() {
+ if (biomelist == null) {
+ biomelist = new BiomeBase[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b); // iRegistry.getId
+ if (bidx >= biomelist.length) {
+ biomelist = Arrays.copyOf(biomelist, bidx + biomelist.length);
+ }
+ biomelist[bidx] = b;
+ }
+ }
+ return biomelist;
+ }
+
+ /** Get ID from biomebase */
+ @Override
+ public int getBiomeBaseID(Object bb) {
+ return getBiomeReg().a((BiomeBase)bb);
+ }
+
+ public static IdentityHashMap dataToState;
+
+ /**
+ * Initialize block states (org.dynmap.blockstate.DynmapBlockState)
+ */
+ @Override
+ public void initializeBlockStates() {
+ dataToState = new IdentityHashMap();
+ HashMap lastBlockState = new HashMap();
+ RegistryBlockID bsids = Block.k;
+ Block baseb = null;
+ Iterator iter = bsids.iterator();
+ ArrayList names = new ArrayList();
+
+ // Loop through block data states
+ DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
+ while (iter.hasNext()) {
+ IBlockData bd = iter.next();
+ Block b = bd.b();
+ MinecraftKey id = BuiltInRegistries.e.b(b);
+ String bname = id.toString();
+ DynmapBlockState lastbs = lastBlockState.get(bname); // See if we have seen this one
+ int idx = 0;
+ if (lastbs != null) { // Yes
+ idx = lastbs.getStateCount(); // Get number of states so far, since this is next
+ }
+ // Build state name
+ String sb = "";
+ String fname = bd.toString();
+ int off1 = fname.indexOf('[');
+ if (off1 >= 0) {
+ int off2 = fname.indexOf(']');
+ sb = fname.substring(off1+1, off2);
+ }
+ int lightAtten = bd.g(); // BlockBehaviour$BlockStateBase.getLightBlock
+ //Log.info("statename=" + bname + "[" + sb + "], lightAtten=" + lightAtten);
+ // Fill in base attributes
+ bld.setBaseState(lastbs).setStateIndex(idx).setBlockName(bname).setStateName(sb).setAttenuatesLight(lightAtten);
+ if (bd.e()) { bld.setSolid(); } // BlockBehaviour$BlockStateBase.isSolid
+ if (bd.l()) { bld.setAir(); } // BlockBehaviour$BlockStateBase.isAir
+ if (bd.a(TagsBlock.an)) { bld.setLog(); } // BlockBehaviour$BlockStateBase.is(OVERWORLD_NATURAL_LOGS)
+ if (bd.a(TagsBlock.L)) { bld.setLeaves(); } // BlockBehaviour$BlockStateBase.is(LEAVES)
+ // BlockBehaviour$BlockStateBase.getFluidState.isEmpty(), BlockBehaviour$BlockStateBase.getBlock
+ if (!bd.y().c() && !(bd.b() instanceof BlockFluids)) { // Test if fluid type for block is not empty
+ bld.setWaterlogged();
+ //Log.info("statename=" + bname + "[" + sb + "] = waterlogged");
+ }
+ DynmapBlockState dbs = bld.build(); // Build state
+
+ dataToState.put(bd, dbs);
+ lastBlockState.put(bname, (lastbs == null) ? dbs : lastbs);
+ Log.verboseinfo("blk=" + bname + ", idx=" + idx + ", state=" + sb + ", waterlogged=" + dbs.isWaterlogged());
+ }
+ }
+ /**
+ * Create chunk cache for given chunks of given world
+ * @param dw - world
+ * @param chunks - chunk list
+ * @return cache
+ */
+ @Override
+ public MapChunkCache getChunkCache(BukkitWorld dw, List chunks) {
+ MapChunkCache121_6 c = new MapChunkCache121_6(gencache);
+ c.setChunks(dw, chunks);
+ return c;
+ }
+
+ /**
+ * Get biome base water multiplier
+ */
+ @Override
+ public int getBiomeBaseWaterMult(Object bb) {
+ BiomeBase biome = (BiomeBase) bb;
+ return biome.j(); // Biome.getWaterColor
+ }
+
+ /** Get temperature from biomebase */
+ @Override
+ public float getBiomeBaseTemperature(Object bb) {
+ return ((BiomeBase)bb).h(); // Biome.getBaseTemperature
+ }
+
+ /** Get humidity from biomebase */
+ @Override
+ public float getBiomeBaseHumidity(Object bb) {
+ String vals = ((BiomeBase)bb).i.toString(); // Biome.climateSettings
+ float humidity = 0.5F;
+ int idx = vals.indexOf("downfall=");
+ if (idx >= 0) {
+ humidity = Float.parseFloat(vals.substring(idx+9, vals.indexOf(']', idx)));
+ }
+ return humidity;
+ }
+
+ @Override
+ public Polygon getWorldBorder(World world) {
+ Polygon p = null;
+ WorldBorder wb = world.getWorldBorder();
+ if (wb != null) {
+ Location c = wb.getCenter();
+ double size = wb.getSize();
+ if ((size > 1) && (size < 1E7)) {
+ size = size / 2;
+ p = new Polygon();
+ p.addVertex(c.getX()-size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()-size);
+ p.addVertex(c.getX()+size, c.getZ()+size);
+ p.addVertex(c.getX()-size, c.getZ()+size);
+ }
+ }
+ return p;
+ }
+ // Send title/subtitle to user
+ public void sendTitleText(Player p, String title, String subtitle, int fadeInTicks, int stayTicks, int fadeOutTIcks) {
+ if (p != null) {
+ p.sendTitle(title, subtitle, fadeInTicks, stayTicks, fadeOutTIcks);
+ }
+ }
+
+ /**
+ * Get material map by block ID
+ */
+ @Override
+ public BukkitMaterial[] getMaterialList() {
+ return new BukkitMaterial[4096]; // Not used
+ }
+
+ @Override
+ public void unloadChunkNoSave(World w, Chunk c, int cx, int cz) {
+ Log.severe("unloadChunkNoSave not implemented");
+ }
+
+ private String[] biomenames;
+ @Override
+ public String[] getBiomeNames() {
+ if (biomenames == null) {
+ biomenames = new String[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ BiomeBase b = iter.next();
+ int bidx = getBiomeReg().a(b);
+ if (bidx >= biomenames.length) {
+ biomenames = Arrays.copyOf(biomenames, bidx + biomenames.length);
+ }
+ biomenames[bidx] = b.toString();
+ }
+ }
+ return biomenames;
+ }
+
+ @Override
+ public String getStateStringByCombinedId(int blkid, int meta) {
+ Log.severe("getStateStringByCombinedId not implemented");
+ return null;
+ }
+ @Override
+ /** Get ID string from biomebase */
+ public String getBiomeBaseIDString(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).a(); // MinecraftKey.getPath()
+ }
+ @Override
+ public String getBiomeBaseResourceLocsation(Object bb) {
+ return getBiomeReg().b((BiomeBase)bb).toString();
+ }
+
+ @Override
+ public Object getUnloadQueue(World world) {
+ Log.warning("getUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public boolean isInUnloadQueue(Object unloadqueue, int x, int z) {
+ Log.warning("isInUnloadQueue not implemented yet");
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @Override
+ public Object[] getBiomeBaseFromSnapshot(ChunkSnapshot css) {
+ Log.warning("getBiomeBaseFromSnapshot not implemented yet");
+ // TODO Auto-generated method stub
+ return new Object[256];
+ }
+
+ @Override
+ public long getInhabitedTicks(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).w(); // ChunkStatus.FULL ; IChunkAccess.getInhabitedTime
+ }
+
+ @Override
+ public Map, ?> getTileEntitiesForChunk(Chunk c) {
+ return ((CraftChunk)c).getHandle(ChunkStatus.n).k; // ChunkStatus.FULL ; IChunkAccess.blockEntities
+ }
+
+ @Override
+ public int getTileEntityX(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aA_().u(); // TileEntity.getBlockPos ; Vec3i.getX
+ }
+
+ @Override
+ public int getTileEntityY(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aA_().v(); // TileEntity.getBlockPos ; Vec3i.getY
+ }
+
+ @Override
+ public int getTileEntityZ(Object te) {
+ TileEntity tileent = (TileEntity) te;
+ return tileent.aA_().w(); // TileEntity.getBlockPos ; Vec3i.getZ
+ }
+
+ @Override
+ public Object readTileEntityNBT(Object te, World w) {
+ TileEntity tileent = (TileEntity) te;
+ CraftWorld cw = (CraftWorld) w;
+ return tileent.d(cw.getHandle().K_()); // TileEntity.saveCustomOnly ; LevelReader.registryAccess
+ }
+
+ @Override
+ public Object getFieldValue(Object nbt, String field) {
+ NBTTagCompound rec = (NBTTagCompound) nbt;
+ NBTBase val = rec.a(field); // NBTTagCompound.get
+ if(val == null) return null;
+ if(val instanceof NBTTagByte) {
+ return ((NBTTagByte)val).n(); // NBTTagByte.value
+ }
+ else if(val instanceof NBTTagShort) {
+ return ((NBTTagShort)val).n(); // NBTTagShort.value
+ }
+ else if(val instanceof NBTTagInt) {
+ return ((NBTTagInt)val).n(); // NBTTagInt.value
+ }
+ else if(val instanceof NBTTagLong) {
+ return ((NBTTagLong)val).n(); // NBTTagLong.value
+ }
+ else if(val instanceof NBTTagFloat) {
+ return ((NBTTagFloat)val).n(); // NBTTagFloat.value
+ }
+ else if(val instanceof NBTTagDouble) {
+ return ((NBTTagDouble)val).n(); // NBTTagDouble.value
+ }
+ else if(val instanceof NBTTagByteArray) {
+ return ((NBTTagByteArray)val).e(); // NBTTagByteArray.getAsByteArray
+ }
+ else if(val instanceof NBTTagString) {
+ return ((NBTTagString)val).k(); // NBTTagString.value
+ }
+ else if(val instanceof NBTTagIntArray) {
+ return ((NBTTagIntArray)val).g(); // NBTTagIntArray.getAsIntArray
+ }
+ return null;
+ }
+
+ @Override
+ public Player[] getOnlinePlayers() {
+ Collection extends Player> p = Bukkit.getServer().getOnlinePlayers();
+ return p.toArray(new Player[0]);
+ }
+
+ @Override
+ public double getHealth(Player p) {
+ return p.getHealth();
+ }
+
+ private static final Gson gson = new GsonBuilder().create();
+
+ /**
+ * Get skin URL for player
+ * @param player
+ */
+ @Override
+ public String getSkinURL(Player player) {
+ String url = null;
+ CraftPlayer cp = (CraftPlayer)player;
+ GameProfile profile = cp.getProfile();
+ if (profile != null) {
+ PropertyMap pm = profile.getProperties();
+ if (pm != null) {
+ Collection txt = pm.get("textures");
+ Property textureProperty = Iterables.getFirst(pm.get("textures"), null);
+ if (textureProperty != null) {
+ String val = textureProperty.value();
+ if (val != null) {
+ TexturesPayload result = null;
+ try {
+ String json = new String(Base64.getDecoder().decode(val), StandardCharsets.UTF_8);
+ result = gson.fromJson(json, TexturesPayload.class);
+ } catch (JsonParseException e) {
+ } catch (IllegalArgumentException x) {
+ Log.warning("Malformed response from skin URL check: " + val);
+ }
+ if ((result != null) && (result.textures != null) && (result.textures.containsKey("SKIN"))) {
+ url = result.textures.get("SKIN").url;
+ }
+ }
+ }
+ }
+ }
+ return url;
+ }
+ // Get minY for world
+ @Override
+ public int getWorldMinY(World w) {
+ CraftWorld cw = (CraftWorld) w;
+ return cw.getMinHeight();
+ }
+ @Override
+ public boolean useGenericCache() {
+ return true;
+ }
+
+}
diff --git a/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/MapChunkCache121_6.java b/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/MapChunkCache121_6.java
new file mode 100644
index 000000000..f49d7277e
--- /dev/null
+++ b/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/MapChunkCache121_6.java
@@ -0,0 +1,105 @@
+package org.dynmap.bukkit.helper.v121_6;
+
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.world.level.ChunkCoordIntPair;
+import net.minecraft.world.level.biome.BiomeBase;
+import net.minecraft.world.level.biome.BiomeFog;
+import net.minecraft.world.level.chunk.Chunk;
+import net.minecraft.world.level.chunk.storage.SerializableChunkData;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.craftbukkit.v1_21_R5.CraftServer;
+import org.bukkit.craftbukkit.v1_21_R5.CraftWorld;
+import org.dynmap.DynmapChunk;
+import org.dynmap.bukkit.helper.BukkitWorld;
+import org.dynmap.common.BiomeMap;
+import org.dynmap.common.chunk.GenericChunk;
+import org.dynmap.common.chunk.GenericChunkCache;
+import org.dynmap.common.chunk.GenericMapChunkCache;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+/**
+ * Container for managing chunks - dependent upon using chunk snapshots, since rendering is off server thread
+ */
+public class MapChunkCache121_6 extends GenericMapChunkCache {
+ private World w;
+ /**
+ * Construct empty cache
+ */
+ public MapChunkCache121_6(GenericChunkCache cc) {
+ super(cc);
+ }
+
+ @Override
+ protected Supplier getLoadedChunkAsync(DynmapChunk chunk) {
+ CompletableFuture> chunkData = CompletableFuture.supplyAsync(() -> {
+ CraftWorld cw = (CraftWorld) w;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.q) { // !c.loaded
+ return Optional.empty();
+ }
+ return Optional.of(SerializableChunkData.a(cw.getHandle(), c)); // SerializableChunkData.copyOf
+ }, ((CraftServer) Bukkit.getServer()).getServer());
+ return () -> chunkData.join().map(SerializableChunkData::a).map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null); // SerializableChunkData::write
+ }
+
+ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ if (!cw.isChunkLoaded(chunk.x, chunk.z)) return null;
+ Chunk c = cw.getHandle().getChunkIfLoaded(chunk.x, chunk.z);
+ if (c == null || !c.q) return null; // LevelChunk.loaded
+ SerializableChunkData chunkData = SerializableChunkData.a(cw.getHandle(), c); //SerializableChunkData.copyOf
+ NBTTagCompound nbt = chunkData.a(); // SerializableChunkData.write
+ return nbt != null ? parseChunkFromNBT(new NBT.NBTCompound(nbt)) : null;
+ }
+
+ @Override
+ protected Supplier loadChunkAsync(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ CompletableFuture> genericChunk = cw.getHandle().n().a.d(new ChunkCoordIntPair(chunk.x, chunk.z)); // WorldServer.getChunkSource().chunkMap.read(new ChunkCoordIntPair(chunk.x, chunk.z))
+ return () -> genericChunk.join().map(NBT.NBTCompound::new).map(this::parseChunkFromNBT).orElse(null);
+ }
+
+ protected GenericChunk loadChunk(DynmapChunk chunk) {
+ CraftWorld cw = (CraftWorld) w;
+ NBTTagCompound nbt = null;
+ ChunkCoordIntPair cc = new ChunkCoordIntPair(chunk.x, chunk.z);
+ GenericChunk gc = null;
+ try { // BUGBUG - convert this all to asyn properly, since now native async
+ nbt = cw.getHandle()
+ .n() // ServerLevel.getChunkSource
+ .a // ServerChunkCache.chunkMap
+ .d(cc) // ChunkStorage.read(ChunkPos)
+ .join().get();
+ } catch (CancellationException cx) {
+ } catch (NoSuchElementException snex) {
+ }
+ if (nbt != null) {
+ gc = parseChunkFromNBT(new NBT.NBTCompound(nbt));
+ }
+ return gc;
+ }
+
+ public void setChunks(BukkitWorld dw, List chunks) {
+ this.w = dw.getWorld();
+ super.setChunks(dw, chunks);
+ }
+
+ @Override
+ public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
+ return bm.getBiomeObject().map(BiomeBase::i).flatMap(BiomeFog::e).orElse(colormap[bm.biomeLookup()]); // BiomeBase::getSpecialEffects ; BiomeFog::getFoliageColorOverride
+ }
+
+ @Override
+ public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) {
+ BiomeFog fog = bm.getBiomeObject().map(BiomeBase::i).orElse(null); // BiomeBase::getSpecialEffects
+ if (fog == null) return colormap[bm.biomeLookup()];
+ return fog.h().a(x, z, fog.g().orElse(colormap[bm.biomeLookup()])); // BiomeFog.getGrassColorModifier.modifyColor ; BiomeFog.getGrassColorOverride
+ }
+}
diff --git a/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/NBT.java b/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/NBT.java
new file mode 100644
index 000000000..2c321c5ff
--- /dev/null
+++ b/bukkit-helper-121-6/src/main/java/org/dynmap/bukkit/helper/v121_6/NBT.java
@@ -0,0 +1,144 @@
+package org.dynmap.bukkit.helper.v121_6;
+
+import org.dynmap.common.chunk.GenericBitStorage;
+import org.dynmap.common.chunk.GenericNBTCompound;
+import org.dynmap.common.chunk.GenericNBTList;
+
+import java.util.Optional;
+import java.util.Set;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.SimpleBitStorage;
+
+public class NBT {
+
+ public static class NBTCompound implements GenericNBTCompound {
+ private final NBTTagCompound obj;
+ public NBTCompound(NBTTagCompound t) {
+ this.obj = t;
+ }
+ @Override
+ public Set getAllKeys() {
+ return obj.e(); // CompoundTag.keySet
+ }
+ @Override
+ public boolean contains(String s) {
+ return obj.b(s); // CompoundTag.contains
+ }
+ @Override
+ public boolean contains(String s, int i) {
+ // Like contains, but with an extra constraint on type
+ NBTBase base = obj.a(s); // CompoundTag.get
+ if (base == null)
+ return false;
+ byte type = base.b(); // CompoundTag.getId
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
+ }
+ @Override
+ public byte getByte(String s) {
+ return obj.b(s, (byte)0); // CompoundTag.getByteOr
+ }
+ @Override
+ public short getShort(String s) {
+ return obj.b(s, (short)0); // CompoundTag.getShortOr
+ }
+ @Override
+ public int getInt(String s) {
+ return obj.b(s, 0); // CompoundTag.getIntOr
+ }
+ @Override
+ public long getLong(String s) {
+ return obj.b(s, 0L); // CompoundTag.getLongOr
+ }
+ @Override
+ public float getFloat(String s) {
+ return obj.b(s, 0.0f); // CompoundTag.getFloatOr
+ }
+ @Override
+ public double getDouble(String s) {
+ return obj.b(s, 0.0); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public String getString(String s) {
+ return obj.b(s, ""); // CompoundTag.getDoubleOr
+ }
+ @Override
+ public byte[] getByteArray(String s) {
+ Optional byteArr = obj.j(s); // CompoundTag.getByteArray
+ return byteArr.orElseGet(() -> new byte[0]);
+ }
+ @Override
+ public int[] getIntArray(String s) {
+ Optional intArr = obj.k(s); // CompoundTag.getIntArray
+ return intArr.orElseGet(() -> new int[0]);
+ }
+ @Override
+ public long[] getLongArray(String s) {
+ Optional longArr = obj.l(s); // CompoundTag.getLongArray
+ return longArr.orElseGet(() -> new long[0]);
+ }
+ @Override
+ public GenericNBTCompound getCompound(String s) {
+ return new NBTCompound(obj.n(s)); // CompoundTag.getCompoundOrEmpty
+ }
+ @Override
+ public GenericNBTList getList(String s, int i) {
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.p(s)); // CompoundTag.getListOrEmpty
+ }
+ @Override
+ public boolean getBoolean(String s) {
+ return getByte(s) != 0;
+ }
+ @Override
+ public String getAsString(String s) {
+ return obj.a(s).p_().orElseGet(() -> ""); // CompoundTag.get ; Tag.asString
+ }
+ @Override
+ public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
+ return new OurBitStorage(bits, count, data);
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class NBTList implements GenericNBTList {
+ private final NBTTagList obj;
+ public NBTList(NBTTagList t) {
+ obj = t;
+ }
+ @Override
+ public int size() {
+ return obj.size();
+ }
+ @Override
+ public String getString(int idx) {
+ return obj.a(idx, ""); // ListTag.getStringOr
+ }
+ @Override
+ public GenericNBTCompound getCompound(int idx) {
+ return new NBTCompound(obj.b(idx)); // ListTag.getCompoundOrEmpty
+ }
+ public String toString() {
+ return obj.toString();
+ }
+ }
+
+ public static class OurBitStorage implements GenericBitStorage {
+ private final SimpleBitStorage bs;
+ public OurBitStorage(int bits, int count, long[] data) {
+ bs = new SimpleBitStorage(bits, count, data);
+ }
+ @Override
+ public int get(int idx) {
+ return bs.a(idx);
+ }
+ }
+}
diff --git a/bukkit-helper/.settings/org.eclipse.buildship.core.prefs b/bukkit-helper/.settings/org.eclipse.buildship.core.prefs
index 15b2bc1a2..24ef279fc 100644
--- a/bukkit-helper/.settings/org.eclipse.buildship.core.prefs
+++ b/bukkit-helper/.settings/org.eclipse.buildship.core.prefs
@@ -2,7 +2,7 @@ arguments=
auto.sync=false
build.scans.enabled=false
connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(6.3))
-connection.project.dir=../forge-1.21
+connection.project.dir=..
eclipse.preferences.version=1
gradle.user.home=
java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home
diff --git a/fabric-1.14.4/build.gradle b/fabric-1.14.4/build.gradle
index b5bf304ec..d2c9b13e9 100644
--- a/fabric-1.14.4/build.gradle
+++ b/fabric-1.14.4/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
apply plugin: 'eclipse'
diff --git a/fabric-1.15.2/build.gradle b/fabric-1.15.2/build.gradle
index b3eb8ff72..c3b32a161 100644
--- a/fabric-1.15.2/build.gradle
+++ b/fabric-1.15.2/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
diff --git a/fabric-1.16.4/build.gradle b/fabric-1.16.4/build.gradle
index ff98556bc..e3a80ca46 100644
--- a/fabric-1.16.4/build.gradle
+++ b/fabric-1.16.4/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
diff --git a/fabric-1.17.1/build.gradle b/fabric-1.17.1/build.gradle
index 868cff37d..db7e77641 100644
--- a/fabric-1.17.1/build.gradle
+++ b/fabric-1.17.1/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
diff --git a/fabric-1.18.2/build.gradle b/fabric-1.18.2/build.gradle
index 4576b0ce5..48fada538 100644
--- a/fabric-1.18.2/build.gradle
+++ b/fabric-1.18.2/build.gradle
@@ -1,6 +1,6 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
@@ -35,7 +35,7 @@ dependencies {
shadow project(path: ':DynmapCore', configuration: 'shadow')
- modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
+ modCompileOnly "me.lucko:fabric-permissions-api:0.4.0"
compileOnly 'net.luckperms:api:5.4'
}
diff --git a/fabric-1.19.4/build.gradle b/fabric-1.19.4/build.gradle
index c3fab0335..b3e71012a 100644
--- a/fabric-1.19.4/build.gradle
+++ b/fabric-1.19.4/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
@@ -34,7 +34,7 @@ dependencies {
shadow project(path: ':DynmapCore', configuration: 'shadow')
- modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
+ modCompileOnly "me.lucko:fabric-permissions-api:0.4.0"
compileOnly 'net.luckperms:api:5.4'
}
diff --git a/fabric-1.20.6/build.gradle b/fabric-1.20.6/build.gradle
index ef8a9b0e3..da0a1d0e2 100644
--- a/fabric-1.20.6/build.gradle
+++ b/fabric-1.20.6/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
@@ -34,7 +34,7 @@ dependencies {
shadow project(path: ':DynmapCore', configuration: 'shadow')
- modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
+ modCompileOnly "me.lucko:fabric-permissions-api:0.4.0"
compileOnly 'net.luckperms:api:5.4'
}
diff --git a/fabric-1.21.1/gradle.properties b/fabric-1.21.1/gradle.properties
deleted file mode 100644
index 5b783a33e..000000000
--- a/fabric-1.21.1/gradle.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-minecraft_version=1.21.1
-yarn_mappings=1.21.1+build.3
-loader_version=0.15.11
-fabric_version=0.102.1+1.21.1
diff --git a/fabric-1.21.1/.gitignore b/fabric-1.21.11/.gitignore
similarity index 100%
rename from fabric-1.21.1/.gitignore
rename to fabric-1.21.11/.gitignore
diff --git a/fabric-1.21/build.gradle b/fabric-1.21.11/build.gradle
similarity index 92%
rename from fabric-1.21/build.gradle
rename to fabric-1.21.11/build.gradle
index cd51a9b01..06e02c7a0 100644
--- a/fabric-1.21/build.gradle
+++ b/fabric-1.21.11/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
@@ -8,7 +8,7 @@ group = parent.group
eclipse {
project {
- name = "Dynmap(Fabric-1.21)"
+ name = "Dynmap(Fabric-1.21.11)"
}
}
@@ -34,7 +34,7 @@ dependencies {
shadow project(path: ':DynmapCore', configuration: 'shadow')
- modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
+ modCompileOnly "me.lucko:fabric-permissions-api:0.5.0"
compileOnly 'net.luckperms:api:5.4'
}
diff --git a/fabric-1.21.11/gradle.properties b/fabric-1.21.11/gradle.properties
new file mode 100644
index 000000000..6e0e43834
--- /dev/null
+++ b/fabric-1.21.11/gradle.properties
@@ -0,0 +1,6 @@
+minecraft_version=1.21.11
+
+# see https://fabricmc.net/develop/
+yarn_mappings=1.21.11+build.3
+loader_version=0.18.4
+fabric_version=0.140.2+1.21.11
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/DynmapMod.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/DynmapMod.java
similarity index 97%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/DynmapMod.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/DynmapMod.java
index 8c2e3bef6..d4fbb6f91 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/DynmapMod.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/DynmapMod.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/DynmapPlugin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/DynmapPlugin.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/DynmapPlugin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/DynmapPlugin.java
index b6f99fc5c..5e9141be5 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/DynmapPlugin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/DynmapPlugin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_11;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
@@ -29,22 +29,22 @@
import net.minecraft.world.biome.Biome;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkSection;
+import net.minecraft.client.color.world.BiomeColors;
import org.dynmap.*;
import org.dynmap.common.BiomeMap;
import org.dynmap.common.DynmapCommandSender;
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapPlayer;
import org.dynmap.common.chunk.GenericChunkCache;
-import org.dynmap.fabric_1_21_1.command.DmapCommand;
-import org.dynmap.fabric_1_21_1.command.DmarkerCommand;
-import org.dynmap.fabric_1_21_1.command.DynmapCommand;
-import org.dynmap.fabric_1_21_1.command.DynmapExpCommand;
-import org.dynmap.fabric_1_21_1.event.BlockEvents;
-import org.dynmap.fabric_1_21_1.event.CustomServerChunkEvents;
-import org.dynmap.fabric_1_21_1.event.CustomServerLifecycleEvents;
-import org.dynmap.fabric_1_21_1.event.PlayerEvents;
-import org.dynmap.fabric_1_21_1.mixin.BiomeEffectsAccessor;
-import org.dynmap.fabric_1_21_1.permissions.*;
+import org.dynmap.fabric_1_21_11.command.DmapCommand;
+import org.dynmap.fabric_1_21_11.command.DmarkerCommand;
+import org.dynmap.fabric_1_21_11.command.DynmapCommand;
+import org.dynmap.fabric_1_21_11.command.DynmapExpCommand;
+import org.dynmap.fabric_1_21_11.event.BlockEvents;
+import org.dynmap.fabric_1_21_11.event.CustomServerChunkEvents;
+import org.dynmap.fabric_1_21_11.event.CustomServerLifecycleEvents;
+import org.dynmap.fabric_1_21_11.event.PlayerEvents;
+import org.dynmap.fabric_1_21_11.permissions.*;
import org.dynmap.permissions.PermissionsHandler;
import org.dynmap.renderer.DynmapBlockState;
@@ -163,7 +163,7 @@ public void initializeBlockStates() {
}
statename += p.getName() + "=" + bs.get(p).toString();
}
- int lightAtten = bs.isOpaqueFullCube(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTransparent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
+ int lightAtten = bs.isOpaqueFullCube() ? 15 : (bs.isTransparent() ? 0 : 1);
//Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
@@ -259,7 +259,7 @@ public boolean isOp(String player) {
}
// TODO: Consider whether cheats are enabled for integrated server
- return server.isSingleplayer() && server.isHost(server.getPlayerManager().getPlayer(player).getGameProfile());
+ return server.isSingleplayer() && server.isHost(server.getPlayerManager().getPlayer(player).getPlayerConfigEntry());
}
boolean hasPerm(PlayerEntity psender, String permission) {
@@ -335,7 +335,7 @@ public void loadExtraBiomes(String mcver) {
String id = biomeRegistry.getId(bb).getPath();
String rl = biomeRegistry.getId(bb).toString();
float tmp = bb.getTemperature(), hum = bb.weather.downfall();
- int watermult = ((BiomeEffectsAccessor) bb.getEffects()).getWaterColor();
+ int watermult = bb.getWaterColor();
Log.verboseinfo("biome[" + i + "]: hum=" + hum + ", tmp=" + tmp + ", mult=" + Integer.toHexString(watermult));
BiomeMap bmap = BiomeMap.NULL;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricAdapter.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricAdapter.java
similarity index 91%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricAdapter.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricAdapter.java
index 3560e44d2..8a3ed05cd 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricAdapter.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricAdapter.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
import net.minecraft.server.world.ServerWorld;
import org.dynmap.DynmapLocation;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricCommandSender.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricCommandSender.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricCommandSender.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricCommandSender.java
index c0dfbfa6a..2e590a780 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricCommandSender.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricCommandSender.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_11;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.Text;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricLogger.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricLogger.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricLogger.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricLogger.java
index 1aed4d2c9..aaadead59 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricLogger.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricLogger.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_11;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricMapChunkCache.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricMapChunkCache.java
similarity index 75%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricMapChunkCache.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricMapChunkCache.java
index 0832c794e..c885f5840 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricMapChunkCache.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricMapChunkCache.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
import net.minecraft.nbt.*;
import net.minecraft.server.world.ServerChunkLoadingManager;
@@ -8,13 +8,14 @@
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.WordPackedArray;
-import net.minecraft.world.ChunkSerializer;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeEffects;
+import net.minecraft.client.color.world.BiomeColors;
import net.minecraft.world.chunk.ChunkManager;
import net.minecraft.world.chunk.ChunkStatus;
-
+import net.minecraft.world.chunk.SerializedChunk;
+import org.dynmap.fabric_1_21_11.access.BiomeEffectsExt;
import org.dynmap.DynmapChunk;
import org.dynmap.DynmapCore;
import org.dynmap.DynmapWorld;
@@ -66,7 +67,8 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
if (cps.isChunkLoaded(chunk.x, chunk.z)) {
NbtCompound nbt = null;
try {
- nbt = ChunkSerializer.serialize((ServerWorld) w, cps.getWorldChunk(chunk.x, chunk.z, false));
+ SerializedChunk sc = SerializedChunk.fromChunk((ServerWorld) w, cps.getWorldChunk(chunk.x, chunk.z, false));
+ nbt = sc.serialize();
} catch (NullPointerException e) {
// TODO: find out why this is happening and why it only seems to happen since 1.16.2
Log.severe("ChunkSerializer.serialize threw a NullPointerException", e);
@@ -104,13 +106,30 @@ protected GenericChunk loadChunk(DynmapChunk chunk) {
@Override
public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
- return bm.getBiomeObject().map(Biome::getEffects).flatMap(BiomeEffects::getFoliageColor).orElse(colormap[bm.biomeLookup()]);
+ return bm.getBiomeObject()
+ .map(Biome::getEffects)
+ .map(effects -> ((BiomeEffectsExt)(Object)effects)
+ .dynmap$getFoliageColor()
+ .orElse(colormap[bm.biomeLookup()]))
+ .orElse(colormap[bm.biomeLookup()]);
}
@Override
public int getGrassColor(BiomeMap bm, int[] colormap, int x, int z) {
- BiomeEffects effects = bm.getBiomeObject().map(Biome::getEffects).orElse(null);
+ BiomeEffects effects = bm.getBiomeObject()
+ .map(Biome::getEffects)
+ .orElse(null);
+
if (effects == null) return colormap[bm.biomeLookup()];
- return effects.getGrassColorModifier().getModifiedGrassColor(x, z, effects.getGrassColor().orElse(colormap[bm.biomeLookup()]));
+
+ BiomeEffectsExt ext = (BiomeEffectsExt) (Object) effects;
+
+ int baseColor = ext.dynmap$getGrassColor()
+ .orElse(colormap[bm.biomeLookup()]);
+
+ BiomeEffects.GrassColorModifier modifier = ext.dynmap$getGrassColorModifier();
+ if (modifier != null) return modifier.getModifiedGrassColor((double)x, (double)z, baseColor);
+
+ return baseColor;
}
}
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricPlayer.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricPlayer.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricPlayer.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricPlayer.java
index a6adce1f7..d1bff9322 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricPlayer.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricPlayer.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_11;
import com.google.common.collect.Iterables;
import com.google.gson.Gson;
@@ -44,7 +44,7 @@ public FabricPlayer(DynmapPlugin plugin, ServerPlayerEntity player) {
uuid = this.player.getUuid();
GameProfile prof = this.player.getGameProfile();
if (prof != null) {
- Property textureProperty = Iterables.getFirst(prof.getProperties().get("textures"), null);
+ Property textureProperty = Iterables.getFirst(prof.properties().get("textures"), null);
if (textureProperty != null) {
DynmapPlugin.TexturesPayload result = null;
@@ -99,8 +99,8 @@ public DynmapLocation getLocation() {
return null;
}
- Vec3d pos = player.getPos();
- return FabricAdapter.toDynmapLocation(plugin, player.getServerWorld(), pos.getX(), pos.getY(), pos.getZ());
+ // Vec3d pos = player.movement;
+ return FabricAdapter.toDynmapLocation(plugin, player.getEntityWorld(), player.getX(), player.getY(), player.getZ());
}
@Override
@@ -109,7 +109,7 @@ public String getWorld() {
return null;
}
- World world = player.getWorld();
+ World world = player.getEntityWorld();
if (world != null) {
return plugin.getWorld(world).getName();
}
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricServer.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricServer.java
similarity index 96%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricServer.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricServer.java
index 0c02dbf43..356da962d 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricServer.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricServer.java
@@ -1,6 +1,5 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
-import com.mojang.authlib.GameProfile;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.minecraft.block.AbstractSignBlock;
@@ -14,6 +13,7 @@
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.PlayerManager;
import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.server.PlayerConfigEntry;
import net.minecraft.text.Text;
import net.minecraft.util.UserCache;
import net.minecraft.util.Util;
@@ -28,8 +28,8 @@
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapPlayer;
import org.dynmap.common.DynmapServerInterface;
-import org.dynmap.fabric_1_21.event.BlockEvents;
-import org.dynmap.fabric_1_21.event.ServerChatEvents;
+import org.dynmap.fabric_1_21_11.event.BlockEvents;
+import org.dynmap.fabric_1_21_11.event.ServerChatEvents;
import org.dynmap.utils.MapChunkCache;
import org.dynmap.utils.VisibilityLimit;
@@ -60,12 +60,11 @@ public class FabricServer extends DynmapServerInterface {
public FabricServer(DynmapPlugin plugin, MinecraftServer server) {
this.plugin = plugin;
this.server = server;
- this.biomeRegistry = server.getRegistryManager().get(RegistryKeys.BIOME);
+ this.biomeRegistry = server.getRegistryManager().getOrThrow(RegistryKeys.BIOME);
}
- private Optional getProfileByName(String player) {
- UserCache cache = server.getUserCache();
- return cache.findByName(player);
+ private Optional getProfileByName(String playerName) {
+ return Optional.ofNullable(PlayerConfigEntry.fromNickname(playerName));
}
public final Registry getBiomeRegistry() {
@@ -202,12 +201,10 @@ public String getServerName() {
public boolean isPlayerBanned(String pid) {
PlayerManager scm = server.getPlayerManager();
BannedPlayerList bl = scm.getUserBanList();
- try {
- return bl.contains(getProfileByName(pid).get());
- } catch (NoSuchElementException e) {
- /* If this profile doesn't exist, default to "banned" for good measure. */
- return true;
- }
+
+ return getProfileByName(pid)
+ .map(profile -> bl.get(profile) != null)
+ .orElse(true);
}
@Override
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricWorld.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricWorld.java
similarity index 98%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricWorld.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricWorld.java
index 4f7cfa42c..238c7a711 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricWorld.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/FabricWorld.java
@@ -1,7 +1,8 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_11;
import net.minecraft.registry.RegistryKey;
import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.WorldProperties.SpawnPoint;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.Heightmap;
import net.minecraft.world.LightType;
@@ -96,7 +97,7 @@ public boolean isTheEnd() {
@Override
public DynmapLocation getSpawnLocation() {
if (world != null) {
- BlockPos spawnPos = world.getLevelProperties().getSpawnPos();
+ BlockPos spawnPos = world.getLevelProperties().getSpawnPoint().getPos().toImmutable();
spawnloc.x = spawnPos.getX();
spawnloc.y = spawnPos.getY();
spawnloc.z = spawnPos.getZ();
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/NBT.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/NBT.java
similarity index 65%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/NBT.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/NBT.java
index 49ad8d914..4e236b21e 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/NBT.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/NBT.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
import org.dynmap.common.chunk.GenericBitStorage;
import org.dynmap.common.chunk.GenericNBTCompound;
@@ -6,6 +6,7 @@
import java.util.Set;
import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import net.minecraft.util.collection.PackedIntegerArray;
@@ -26,63 +27,74 @@ public boolean contains(String s) {
}
@Override
public boolean contains(String s, int i) {
- return obj.contains(s, i);
+ // Like contains, but with an extra constraint on type
+ NbtElement base = obj.get(s);
+ if (base == null)
+ return false;
+ int type = base.getType();
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
}
@Override
public byte getByte(String s) {
- return obj.getByte(s);
+ return obj.getByte(s, (byte)0);
}
@Override
public short getShort(String s) {
- return obj.getShort(s);
+ return obj.getShort(s, (short)0);
}
@Override
public int getInt(String s) {
- return obj.getInt(s);
+ return obj.getInt(s, (int)0);
}
@Override
public long getLong(String s) {
- return obj.getLong(s);
+ return obj.getLong(s, (long)0);
}
@Override
public float getFloat(String s) {
- return obj.getFloat(s);
+ return obj.getFloat(s, (float)0);
}
@Override
public double getDouble(String s) {
- return obj.getDouble(s);
+ return obj.getDouble(s, (double)0);
}
@Override
public String getString(String s) {
- return obj.getString(s);
+ return obj.getString(s, "");
}
@Override
public byte[] getByteArray(String s) {
- return obj.getByteArray(s);
+ return obj.getByteArray(s).orElseGet(() -> new byte[0]);
}
@Override
public int[] getIntArray(String s) {
- return obj.getIntArray(s);
+ return obj.getIntArray(s).orElseGet(() -> new int[0]);
}
@Override
public long[] getLongArray(String s) {
- return obj.getLongArray(s);
+ return obj.getLongArray(s).orElseGet(() -> new long[0]);
}
@Override
public GenericNBTCompound getCompound(String s) {
- return new NBTCompound(obj.getCompound(s));
+ return new NBTCompound(obj.getCompoundOrEmpty(s));
}
@Override
public GenericNBTList getList(String s, int i) {
- return new NBTList(obj.getList(s, i));
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.getListOrEmpty(s));
}
@Override
public boolean getBoolean(String s) {
- return obj.getBoolean(s);
+ return obj.getBoolean(s, false);
}
@Override
public String getAsString(String s) {
- return obj.get(s).asString();
+ return obj.get(s).asString().orElse("");
}
@Override
public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
@@ -103,11 +115,11 @@ public int size() {
}
@Override
public String getString(int idx) {
- return obj.getString(idx);
+ return obj.getString(idx, "");
}
@Override
public GenericNBTCompound getCompound(int idx) {
- return new NBTCompound(obj.getCompound(idx));
+ return new NBTCompound(obj.getCompoundOrEmpty(idx));
}
public String toString() {
return obj.toString();
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/TaskRecord.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/TaskRecord.java
similarity index 96%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/TaskRecord.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/TaskRecord.java
index dc5c32957..4b179536d 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/TaskRecord.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/TaskRecord.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
import java.util.concurrent.FutureTask;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/VersionCheck.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/VersionCheck.java
similarity index 99%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/VersionCheck.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/VersionCheck.java
index 94a12f7ba..b4d3295ba 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/VersionCheck.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/VersionCheck.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_11;
import org.dynmap.DynmapCore;
import org.dynmap.Log;
diff --git a/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/access/BiomeEffectsExt.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/access/BiomeEffectsExt.java
new file mode 100644
index 000000000..b87052993
--- /dev/null
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/access/BiomeEffectsExt.java
@@ -0,0 +1,12 @@
+package org.dynmap.fabric_1_21_11.access;
+import java.util.Optional;
+import net.minecraft.world.biome.BiomeEffects;
+import java.util.OptionalInt;
+
+public interface BiomeEffectsExt {
+ int dynmap$getWaterColor();
+ Optional dynmap$getFoliageColor();
+ Optional dynmap$getDryFoliageColor();
+ Optional dynmap$getGrassColor();
+ BiomeEffects.GrassColorModifier dynmap$getGrassColorModifier();
+}
\ No newline at end of file
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/access/ProtoChunkAccessor.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/access/ProtoChunkAccessor.java
similarity index 64%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/access/ProtoChunkAccessor.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/access/ProtoChunkAccessor.java
index fd2ad5fa9..21d94fced 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/access/ProtoChunkAccessor.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/access/ProtoChunkAccessor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.access;
+package org.dynmap.fabric_1_21_11.access;
public interface ProtoChunkAccessor {
boolean getTouchedByWorldGen();
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DmapCommand.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DmapCommand.java
similarity index 59%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DmapCommand.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DmapCommand.java
index 8510555ef..b1d9b28ef 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DmapCommand.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DmapCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21.command;
+package org.dynmap.fabric_1_21_11.command;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
public class DmapCommand extends DynmapCommandExecutor {
public DmapCommand(DynmapPlugin p) {
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DmarkerCommand.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DmarkerCommand.java
similarity index 61%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DmarkerCommand.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DmarkerCommand.java
index a6216335e..f6fe4eb88 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DmarkerCommand.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DmarkerCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21.command;
+package org.dynmap.fabric_1_21_11.command;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
public class DmarkerCommand extends DynmapCommandExecutor {
public DmarkerCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapCommand.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapCommand.java
similarity index 60%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapCommand.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapCommand.java
index f92db84f2..2f764c2f2 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapCommand.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_1.command;
+package org.dynmap.fabric_1_21_11.command;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
public class DynmapCommand extends DynmapCommandExecutor {
public DynmapCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapCommandExecutor.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapCommandExecutor.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapCommandExecutor.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapCommandExecutor.java
index 56287a9aa..ec0614ed8 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapCommandExecutor.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapCommandExecutor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.command;
+package org.dynmap.fabric_1_21_11.command;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
@@ -11,7 +11,7 @@
import java.util.Arrays;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
import static net.minecraft.server.command.CommandManager.argument;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapExpCommand.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapExpCommand.java
similarity index 62%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapExpCommand.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapExpCommand.java
index dee66a2c8..4c0276286 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapExpCommand.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/command/DynmapExpCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_3.command;
+package org.dynmap.fabric_1_21_11.command;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
public class DynmapExpCommand extends DynmapCommandExecutor {
public DynmapExpCommand(DynmapPlugin p) {
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/BlockEvents.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/BlockEvents.java
similarity index 97%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/BlockEvents.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/BlockEvents.java
index 6cc117860..3d0193239 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/BlockEvents.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/BlockEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.event;
+package org.dynmap.fabric_1_21_11.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/CustomServerChunkEvents.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/CustomServerChunkEvents.java
similarity index 94%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/CustomServerChunkEvents.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/CustomServerChunkEvents.java
index d9122c25a..7139764a1 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/CustomServerChunkEvents.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/CustomServerChunkEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.event;
+package org.dynmap.fabric_1_21_11.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/CustomServerLifecycleEvents.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/CustomServerLifecycleEvents.java
similarity index 93%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/CustomServerLifecycleEvents.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/CustomServerLifecycleEvents.java
index f84666b29..f91d02aaa 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/CustomServerLifecycleEvents.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/CustomServerLifecycleEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.event;
+package org.dynmap.fabric_1_21_11.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/PlayerEvents.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/PlayerEvents.java
similarity index 98%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/PlayerEvents.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/PlayerEvents.java
index dad913e05..b767be7fb 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/PlayerEvents.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/PlayerEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.event;
+package org.dynmap.fabric_1_21_11.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/ServerChatEvents.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/ServerChatEvents.java
similarity index 94%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/ServerChatEvents.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/ServerChatEvents.java
index 8ab6989e8..9227ba07f 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/ServerChatEvents.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/event/ServerChatEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.event;
+package org.dynmap.fabric_1_21_11.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/BiomeEffectsMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/BiomeEffectsMixin.java
new file mode 100644
index 000000000..0f6030dbc
--- /dev/null
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/BiomeEffectsMixin.java
@@ -0,0 +1,52 @@
+package org.dynmap.fabric_1_21_11.mixin;
+
+import net.minecraft.world.biome.BiomeEffects;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+import org.dynmap.fabric_1_21_11.access.BiomeEffectsExt;
+import java.util.Optional;
+
+@Mixin(BiomeEffects.class)
+public class BiomeEffectsMixin implements BiomeEffectsExt {
+
+ @Shadow private int waterColor;
+ @Shadow private Optional foliageColor;
+ @Shadow private Optional dryFoliageColor;
+ @Shadow private Optional grassColor;
+ @Shadow private BiomeEffects.GrassColorModifier grassColorModifier;
+
+ private int dynmap$waterColor;
+
+ @Inject(method = "", at = @At("RETURN"))
+ private void onInit(int waterColor,
+ Optional foliageColor,
+ Optional dryFoliageColor,
+ Optional grassColor,
+ BiomeEffects.GrassColorModifier grassColorModifier,
+ CallbackInfo ci)
+ {
+ this.dynmap$waterColor = waterColor;
+ }
+
+ @Override
+ public int dynmap$getWaterColor() {
+ return dynmap$waterColor;
+ }
+
+ @Override
+ public Optional dynmap$getFoliageColor() { return foliageColor; }
+
+ @Override
+ public Optional dynmap$getDryFoliageColor() { return dryFoliageColor; }
+
+ @Override
+ public Optional dynmap$getGrassColor() { return grassColor; }
+
+ @Override
+ public BiomeEffects.GrassColorModifier dynmap$getGrassColorModifier() {
+ return grassColorModifier;
+ }
+}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ChunkGeneratingMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ChunkGeneratingMixin.java
similarity index 87%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ChunkGeneratingMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ChunkGeneratingMixin.java
index a48fbcdb2..f3110bfdc 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ChunkGeneratingMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ChunkGeneratingMixin.java
@@ -1,12 +1,12 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.world.chunk.ChunkGenerating;
import net.minecraft.world.chunk.ChunkGenerationContext;
import net.minecraft.world.chunk.AbstractChunkHolder;
import net.minecraft.world.chunk.Chunk;
-import org.dynmap.fabric_1_21_1.access.ProtoChunkAccessor;
-import org.dynmap.fabric_1_21_1.event.CustomServerChunkEvents;
+import org.dynmap.fabric_1_21_11.access.ProtoChunkAccessor;
+import org.dynmap.fabric_1_21_11.event.CustomServerChunkEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/MinecraftServerMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/MinecraftServerMixin.java
similarity index 83%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/MinecraftServerMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/MinecraftServerMixin.java
index 2b296eef5..3e39a21fd 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/MinecraftServerMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/MinecraftServerMixin.java
@@ -1,8 +1,8 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.server.MinecraftServer;
-import org.dynmap.fabric_1_21.event.CustomServerLifecycleEvents;
+import org.dynmap.fabric_1_21_11.event.CustomServerLifecycleEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/PlayerManagerMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/PlayerManagerMixin.java
similarity index 93%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/PlayerManagerMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/PlayerManagerMixin.java
index c00d683f4..2c6bde8db 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/PlayerManagerMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/PlayerManagerMixin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.entity.Entity;
import net.minecraft.network.ClientConnection;
@@ -6,7 +6,7 @@
import net.minecraft.server.network.ConnectedClientData;
import net.minecraft.server.network.ServerPlayerEntity;
-import org.dynmap.fabric_1_21_3.event.PlayerEvents;
+import org.dynmap.fabric_1_21_11.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ProtoChunkMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ProtoChunkMixin.java
similarity index 80%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ProtoChunkMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ProtoChunkMixin.java
index 74822a58e..06e5ba01c 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ProtoChunkMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ProtoChunkMixin.java
@@ -1,10 +1,10 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.ProtoChunk;
-import org.dynmap.fabric_1_21_1.access.ProtoChunkAccessor;
+import org.dynmap.fabric_1_21_11.access.ProtoChunkAccessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -21,7 +21,7 @@ public class ProtoChunkMixin implements ProtoChunkAccessor {
target = "Lnet/minecraft/world/chunk/ChunkSection;setBlockState(IIILnet/minecraft/block/BlockState;)Lnet/minecraft/block/BlockState;"
)
)
- public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) {
+ public void setBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) {
touchedByWorldGen = true;
}
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ServerPlayNetworkHandlerMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ServerPlayNetworkHandlerMixin.java
similarity index 95%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ServerPlayNetworkHandlerMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ServerPlayNetworkHandlerMixin.java
index 4d9c853e2..08d74df1b 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ServerPlayNetworkHandlerMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ServerPlayNetworkHandlerMixin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
@@ -17,8 +17,8 @@
import java.util.Arrays;
import java.util.List;
-import org.dynmap.fabric_1_21_3.event.BlockEvents;
-import org.dynmap.fabric_1_21_3.event.ServerChatEvents;
+import org.dynmap.fabric_1_21_11.event.BlockEvents;
+import org.dynmap.fabric_1_21_11.event.ServerChatEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ServerPlayerEntityMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ServerPlayerEntityMixin.java
similarity index 94%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ServerPlayerEntityMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ServerPlayerEntityMixin.java
index 62aa1d273..0324f1ede 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ServerPlayerEntityMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/ServerPlayerEntityMixin.java
@@ -1,11 +1,11 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.entity.Entity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.TeleportTarget;
-import org.dynmap.fabric_1_21_3.event.PlayerEvents;
+import org.dynmap.fabric_1_21_11.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/WorldChunkMixin.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/WorldChunkMixin.java
similarity index 77%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/WorldChunkMixin.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/WorldChunkMixin.java
index eb36a7987..77770fa28 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/WorldChunkMixin.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/mixin/WorldChunkMixin.java
@@ -1,11 +1,11 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_11.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.WorldChunk;
-import org.dynmap.fabric_1_21_3.event.BlockEvents;
+import org.dynmap.fabric_1_21_11.event.BlockEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -18,7 +18,7 @@ public abstract class WorldChunkMixin {
public abstract World getWorld();
@Inject(method = "setBlockState", at = @At("RETURN"))
- public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) {
+ public void setBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) {
if (info.getReturnValue() != null) {
BlockEvents.BLOCK_EVENT.invoker().onBlockEvent(this.getWorld(), pos);
}
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/FabricPermissions.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/FabricPermissions.java
similarity index 93%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/FabricPermissions.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/FabricPermissions.java
index 6e32ca7e5..77293e4a2 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/FabricPermissions.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/FabricPermissions.java
@@ -1,9 +1,9 @@
-package org.dynmap.fabric_1_21_3.permissions;
+package org.dynmap.fabric_1_21_11.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
import org.dynmap.json.simple.parser.JSONParser;
import java.util.Set;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/FilePermissions.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/FilePermissions.java
similarity index 96%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/FilePermissions.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/FilePermissions.java
index 7c2f0fd79..b0eacc083 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/FilePermissions.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/FilePermissions.java
@@ -1,9 +1,9 @@
-package org.dynmap.fabric_1_21.permissions;
+package org.dynmap.fabric_1_21_11.permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.ConfigurationNode;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
import java.io.File;
import java.util.HashMap;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/LuckPermissions.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/LuckPermissions.java
similarity index 97%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/LuckPermissions.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/LuckPermissions.java
index 1a90bab2d..7fde17543 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/LuckPermissions.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/LuckPermissions.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.permissions;
+package org.dynmap.fabric_1_21_11.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.luckperms.api.LuckPerms;
@@ -9,7 +9,7 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
import org.dynmap.json.simple.JSONArray;
import org.dynmap.json.simple.JSONObject;
import org.dynmap.json.simple.parser.JSONParser;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/OpPermissions.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/OpPermissions.java
similarity index 93%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/OpPermissions.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/OpPermissions.java
index 444535613..a4bf39e7e 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/OpPermissions.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/OpPermissions.java
@@ -1,8 +1,8 @@
-package org.dynmap.fabric_1_21.permissions;
+package org.dynmap.fabric_1_21_11.permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_11.DynmapPlugin;
import java.util.HashSet;
import java.util.Set;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/PermissionProvider.java b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/PermissionProvider.java
similarity index 89%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/PermissionProvider.java
rename to fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/PermissionProvider.java
index fca16005b..4fb7522c5 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/PermissionProvider.java
+++ b/fabric-1.21.11/src/main/java/org/dynmap/fabric_1_21_11/permissions/PermissionProvider.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.permissions;
+package org.dynmap.fabric_1_21_11.permissions;
import net.minecraft.entity.player.PlayerEntity;
diff --git a/fabric-1.21.1/src/main/resources/assets/dynmap/icon.png b/fabric-1.21.11/src/main/resources/assets/dynmap/icon.png
similarity index 100%
rename from fabric-1.21.1/src/main/resources/assets/dynmap/icon.png
rename to fabric-1.21.11/src/main/resources/assets/dynmap/icon.png
diff --git a/fabric-1.21.1/src/main/resources/configuration.txt b/fabric-1.21.11/src/main/resources/configuration.txt
similarity index 100%
rename from fabric-1.21.1/src/main/resources/configuration.txt
rename to fabric-1.21.11/src/main/resources/configuration.txt
diff --git a/fabric-1.21.1/src/main/resources/dynmap.accesswidener b/fabric-1.21.11/src/main/resources/dynmap.accesswidener
similarity index 100%
rename from fabric-1.21.1/src/main/resources/dynmap.accesswidener
rename to fabric-1.21.11/src/main/resources/dynmap.accesswidener
diff --git a/fabric-1.21/src/main/resources/dynmap.mixins.json b/fabric-1.21.11/src/main/resources/dynmap.mixins.json
similarity index 73%
rename from fabric-1.21/src/main/resources/dynmap.mixins.json
rename to fabric-1.21.11/src/main/resources/dynmap.mixins.json
index 36f345b06..6790f8e1b 100644
--- a/fabric-1.21/src/main/resources/dynmap.mixins.json
+++ b/fabric-1.21.11/src/main/resources/dynmap.mixins.json
@@ -1,10 +1,10 @@
{
"required": true,
"minVersion": "0.8",
- "package": "org.dynmap.fabric_1_21.mixin",
- "compatibilityLevel": "JAVA_17",
+ "package": "org.dynmap.fabric_1_21_11.mixin",
+ "compatibilityLevel": "JAVA_21",
"mixins": [
- "BiomeEffectsAccessor",
+ "BiomeEffectsMixin",
"ChunkGeneratingMixin",
"MinecraftServerMixin",
"PlayerManagerMixin",
diff --git a/fabric-1.21.1/src/main/resources/fabric.mod.json b/fabric-1.21.11/src/main/resources/fabric.mod.json
similarity index 78%
rename from fabric-1.21.1/src/main/resources/fabric.mod.json
rename to fabric-1.21.11/src/main/resources/fabric.mod.json
index 8c1cca87d..26cfc2f40 100644
--- a/fabric-1.21.1/src/main/resources/fabric.mod.json
+++ b/fabric-1.21.11/src/main/resources/fabric.mod.json
@@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"id": "dynmap",
- "version": "${version}",
+ "version": "3.4.0-beta-1",
"name": "Dynmap",
"description": "Dynamic, Google-maps style rendered maps for your Minecraft server",
"authors": [
@@ -18,7 +18,7 @@
"environment": "*",
"entrypoints": {
"main": [
- "org.dynmap.fabric_1_21_1.DynmapMod"
+ "org.dynmap.fabric_1_21_11.DynmapMod"
]
},
"mixins": [
@@ -27,8 +27,8 @@
"accessWidener" : "dynmap.accesswidener",
"depends": {
- "fabricloader": ">=0.15.11",
- "fabric": ">=0.102.0",
- "minecraft": ["1.21.1"]
+ "fabricloader": ">=0.18.2",
+ "fabric": ">=0.139.4",
+ "minecraft": ["1.21.11"]
}
}
diff --git a/fabric-1.21.1/src/main/resources/permissions.yml.example b/fabric-1.21.11/src/main/resources/permissions.yml.example
similarity index 100%
rename from fabric-1.21.1/src/main/resources/permissions.yml.example
rename to fabric-1.21.11/src/main/resources/permissions.yml.example
diff --git a/fabric-1.21.3/gradle.properties b/fabric-1.21.3/gradle.properties
deleted file mode 100644
index 17faf67f4..000000000
--- a/fabric-1.21.3/gradle.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-minecraft_version=1.21.3
-yarn_mappings=1.21.3+build.1
-loader_version=0.16.9
-fabric_version=0.108.0+1.21.3
diff --git a/fabric-1.21.3/.gitignore b/fabric-1.21.6/.gitignore
similarity index 100%
rename from fabric-1.21.3/.gitignore
rename to fabric-1.21.6/.gitignore
diff --git a/fabric-1.21.1/build.gradle b/fabric-1.21.6/build.gradle
similarity index 92%
rename from fabric-1.21.1/build.gradle
rename to fabric-1.21.6/build.gradle
index e54424d89..bce1c28d2 100644
--- a/fabric-1.21.1/build.gradle
+++ b/fabric-1.21.6/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
@@ -8,7 +8,7 @@ group = parent.group
eclipse {
project {
- name = "Dynmap(Fabric-1.21.1)"
+ name = "Dynmap(Fabric-1.21.6)"
}
}
@@ -34,7 +34,7 @@ dependencies {
shadow project(path: ':DynmapCore', configuration: 'shadow')
- modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
+ modCompileOnly "me.lucko:fabric-permissions-api:0.4.0"
compileOnly 'net.luckperms:api:5.4'
}
diff --git a/fabric-1.21.6/gradle.properties b/fabric-1.21.6/gradle.properties
new file mode 100644
index 000000000..fea2c1bf6
--- /dev/null
+++ b/fabric-1.21.6/gradle.properties
@@ -0,0 +1,6 @@
+minecraft_version=1.21.6
+
+# see https://fabricmc.net/develop/
+yarn_mappings=1.21.6+build.1
+loader_version=0.16.14
+fabric_version=0.128.2+1.21.6
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/DynmapMod.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/DynmapMod.java
similarity index 98%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/DynmapMod.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/DynmapMod.java
index 4ce880463..670cb2d60 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/DynmapMod.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/DynmapMod.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_7;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/DynmapPlugin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/DynmapPlugin.java
similarity index 98%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/DynmapPlugin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/DynmapPlugin.java
index 2f1700e67..d95fb9e59 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/DynmapPlugin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/DynmapPlugin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_7;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
@@ -35,16 +35,16 @@
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapPlayer;
import org.dynmap.common.chunk.GenericChunkCache;
-import org.dynmap.fabric_1_21_3.command.DmapCommand;
-import org.dynmap.fabric_1_21_3.command.DmarkerCommand;
-import org.dynmap.fabric_1_21_3.command.DynmapCommand;
-import org.dynmap.fabric_1_21_3.command.DynmapExpCommand;
-import org.dynmap.fabric_1_21_3.event.BlockEvents;
-import org.dynmap.fabric_1_21_3.event.CustomServerChunkEvents;
-import org.dynmap.fabric_1_21_3.event.CustomServerLifecycleEvents;
-import org.dynmap.fabric_1_21_3.event.PlayerEvents;
-import org.dynmap.fabric_1_21_3.mixin.BiomeEffectsAccessor;
-import org.dynmap.fabric_1_21_3.permissions.*;
+import org.dynmap.fabric_1_21_7.command.DmapCommand;
+import org.dynmap.fabric_1_21_7.command.DmarkerCommand;
+import org.dynmap.fabric_1_21_7.command.DynmapCommand;
+import org.dynmap.fabric_1_21_7.command.DynmapExpCommand;
+import org.dynmap.fabric_1_21_7.event.BlockEvents;
+import org.dynmap.fabric_1_21_7.event.CustomServerChunkEvents;
+import org.dynmap.fabric_1_21_7.event.CustomServerLifecycleEvents;
+import org.dynmap.fabric_1_21_7.event.PlayerEvents;
+import org.dynmap.fabric_1_21_7.mixin.BiomeEffectsAccessor;
+import org.dynmap.fabric_1_21_7.permissions.*;
import org.dynmap.permissions.PermissionsHandler;
import org.dynmap.renderer.DynmapBlockState;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricAdapter.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricAdapter.java
similarity index 91%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricAdapter.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricAdapter.java
index ad444547e..1c32eb5ae 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricAdapter.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricAdapter.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_7;
import net.minecraft.server.world.ServerWorld;
import org.dynmap.DynmapLocation;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricCommandSender.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricCommandSender.java
similarity index 96%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricCommandSender.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricCommandSender.java
index 5616d9f69..8ae55cd32 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricCommandSender.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricCommandSender.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_7;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.Text;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricLogger.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricLogger.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricLogger.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricLogger.java
index 6fab5556a..2d0900cb9 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricLogger.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricLogger.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_7;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricMapChunkCache.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricMapChunkCache.java
similarity index 99%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricMapChunkCache.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricMapChunkCache.java
index 8847b5be6..62b8d5ccb 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricMapChunkCache.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricMapChunkCache.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_7;
import net.minecraft.nbt.*;
import net.minecraft.server.world.ServerChunkLoadingManager;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricPlayer.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricPlayer.java
similarity index 98%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricPlayer.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricPlayer.java
index f026ec674..2551de862 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricPlayer.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricPlayer.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_7;
import com.google.common.collect.Iterables;
import com.google.gson.Gson;
@@ -100,7 +100,7 @@ public DynmapLocation getLocation() {
}
Vec3d pos = player.getPos();
- return FabricAdapter.toDynmapLocation(plugin, player.getServerWorld(), pos.getX(), pos.getY(), pos.getZ());
+ return FabricAdapter.toDynmapLocation(plugin, player.getWorld(), pos.getX(), pos.getY(), pos.getZ());
}
@Override
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricServer.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricServer.java
similarity index 99%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricServer.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricServer.java
index 91316b9ac..ebf4e455a 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricServer.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricServer.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_7;
import com.mojang.authlib.GameProfile;
import net.fabricmc.loader.api.FabricLoader;
@@ -28,8 +28,8 @@
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapPlayer;
import org.dynmap.common.DynmapServerInterface;
-import org.dynmap.fabric_1_21_3.event.BlockEvents;
-import org.dynmap.fabric_1_21_3.event.ServerChatEvents;
+import org.dynmap.fabric_1_21_7.event.BlockEvents;
+import org.dynmap.fabric_1_21_7.event.ServerChatEvents;
import org.dynmap.utils.MapChunkCache;
import org.dynmap.utils.VisibilityLimit;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricWorld.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricWorld.java
similarity index 99%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricWorld.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricWorld.java
index e0ded7543..b5378d25f 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricWorld.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/FabricWorld.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_7;
import net.minecraft.registry.RegistryKey;
import net.minecraft.util.math.BlockPos;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/NBT.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/NBT.java
similarity index 65%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/NBT.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/NBT.java
index 47b27c8f2..e98109acd 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/NBT.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/NBT.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_7;
import org.dynmap.common.chunk.GenericBitStorage;
import org.dynmap.common.chunk.GenericNBTCompound;
@@ -6,6 +6,7 @@
import java.util.Set;
import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import net.minecraft.util.collection.PackedIntegerArray;
@@ -26,63 +27,74 @@ public boolean contains(String s) {
}
@Override
public boolean contains(String s, int i) {
- return obj.contains(s, i);
+ // Like contains, but with an extra constraint on type
+ NbtElement base = obj.get(s);
+ if (base == null)
+ return false;
+ int type = base.getType();
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
}
@Override
public byte getByte(String s) {
- return obj.getByte(s);
+ return obj.getByte(s, (byte)0);
}
@Override
public short getShort(String s) {
- return obj.getShort(s);
+ return obj.getShort(s, (short)0);
}
@Override
public int getInt(String s) {
- return obj.getInt(s);
+ return obj.getInt(s, (int)0);
}
@Override
public long getLong(String s) {
- return obj.getLong(s);
+ return obj.getLong(s, (long)0);
}
@Override
public float getFloat(String s) {
- return obj.getFloat(s);
+ return obj.getFloat(s, (float)0);
}
@Override
public double getDouble(String s) {
- return obj.getDouble(s);
+ return obj.getDouble(s, (double)0);
}
@Override
public String getString(String s) {
- return obj.getString(s);
+ return obj.getString(s, "");
}
@Override
public byte[] getByteArray(String s) {
- return obj.getByteArray(s);
+ return obj.getByteArray(s).orElseGet(() -> new byte[0]);
}
@Override
public int[] getIntArray(String s) {
- return obj.getIntArray(s);
+ return obj.getIntArray(s).orElseGet(() -> new int[0]);
}
@Override
public long[] getLongArray(String s) {
- return obj.getLongArray(s);
+ return obj.getLongArray(s).orElseGet(() -> new long[0]);
}
@Override
public GenericNBTCompound getCompound(String s) {
- return new NBTCompound(obj.getCompound(s));
+ return new NBTCompound(obj.getCompoundOrEmpty(s));
}
@Override
public GenericNBTList getList(String s, int i) {
- return new NBTList(obj.getList(s, i));
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.getListOrEmpty(s));
}
@Override
public boolean getBoolean(String s) {
- return obj.getBoolean(s);
+ return obj.getBoolean(s, false);
}
@Override
public String getAsString(String s) {
- return obj.get(s).asString();
+ return obj.get(s).asString().orElse("");
}
@Override
public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
@@ -103,11 +115,11 @@ public int size() {
}
@Override
public String getString(int idx) {
- return obj.getString(idx);
+ return obj.getString(idx, "");
}
@Override
public GenericNBTCompound getCompound(int idx) {
- return new NBTCompound(obj.getCompound(idx));
+ return new NBTCompound(obj.getCompoundOrEmpty(idx));
}
public String toString() {
return obj.toString();
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/TaskRecord.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/TaskRecord.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/TaskRecord.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/TaskRecord.java
index 7ad620128..30bf611f5 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/TaskRecord.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/TaskRecord.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_7;
import java.util.concurrent.FutureTask;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/VersionCheck.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/VersionCheck.java
similarity index 99%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/VersionCheck.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/VersionCheck.java
index a029690a3..92c87281d 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/VersionCheck.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/VersionCheck.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_7;
import org.dynmap.DynmapCore;
import org.dynmap.Log;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/access/ProtoChunkAccessor.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/access/ProtoChunkAccessor.java
similarity index 65%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/access/ProtoChunkAccessor.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/access/ProtoChunkAccessor.java
index 6ecb5becf..acad7fb10 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/access/ProtoChunkAccessor.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/access/ProtoChunkAccessor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.access;
+package org.dynmap.fabric_1_21_7.access;
public interface ProtoChunkAccessor {
boolean getTouchedByWorldGen();
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DmapCommand.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DmapCommand.java
similarity index 60%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DmapCommand.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DmapCommand.java
index 819bad0cf..ecc331983 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DmapCommand.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DmapCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_3.command;
+package org.dynmap.fabric_1_21_7.command;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
public class DmapCommand extends DynmapCommandExecutor {
public DmapCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DmarkerCommand.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DmarkerCommand.java
similarity index 61%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DmarkerCommand.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DmarkerCommand.java
index 438908458..c571a921b 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DmarkerCommand.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DmarkerCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_3.command;
+package org.dynmap.fabric_1_21_7.command;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
public class DmarkerCommand extends DynmapCommandExecutor {
public DmarkerCommand(DynmapPlugin p) {
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapCommand.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapCommand.java
similarity index 61%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapCommand.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapCommand.java
index c9180f374..e5ad39ae1 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapCommand.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21.command;
+package org.dynmap.fabric_1_21_7.command;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
public class DynmapCommand extends DynmapCommandExecutor {
public DynmapCommand(DynmapPlugin p) {
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapCommandExecutor.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapCommandExecutor.java
similarity index 96%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapCommandExecutor.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapCommandExecutor.java
index 702edd8ca..fd1d8c51d 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapCommandExecutor.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapCommandExecutor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.command;
+package org.dynmap.fabric_1_21_7.command;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
@@ -11,7 +11,7 @@
import java.util.Arrays;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
import static net.minecraft.server.command.CommandManager.argument;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapExpCommand.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapExpCommand.java
similarity index 62%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapExpCommand.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapExpCommand.java
index 7daaab757..b2210b230 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapExpCommand.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/command/DynmapExpCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_1.command;
+package org.dynmap.fabric_1_21_7.command;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
public class DynmapExpCommand extends DynmapCommandExecutor {
public DynmapExpCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/BlockEvents.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/BlockEvents.java
similarity index 97%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/BlockEvents.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/BlockEvents.java
index 538e8335f..14cb0cbfc 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/BlockEvents.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/BlockEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.event;
+package org.dynmap.fabric_1_21_7.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/CustomServerChunkEvents.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/CustomServerChunkEvents.java
similarity index 94%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/CustomServerChunkEvents.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/CustomServerChunkEvents.java
index bb661c916..02c8efabb 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/CustomServerChunkEvents.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/CustomServerChunkEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.event;
+package org.dynmap.fabric_1_21_7.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/CustomServerLifecycleEvents.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/CustomServerLifecycleEvents.java
similarity index 93%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/CustomServerLifecycleEvents.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/CustomServerLifecycleEvents.java
index 46f028048..f1e49232b 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/CustomServerLifecycleEvents.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/CustomServerLifecycleEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.event;
+package org.dynmap.fabric_1_21_7.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/PlayerEvents.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/PlayerEvents.java
similarity index 98%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/PlayerEvents.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/PlayerEvents.java
index fb4d6976a..91dc059ef 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/PlayerEvents.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/PlayerEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.event;
+package org.dynmap.fabric_1_21_7.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/ServerChatEvents.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/ServerChatEvents.java
similarity index 94%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/ServerChatEvents.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/ServerChatEvents.java
index aff1d72e4..63783ffa5 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/event/ServerChatEvents.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/event/ServerChatEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.event;
+package org.dynmap.fabric_1_21_7.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/BiomeEffectsAccessor.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/BiomeEffectsAccessor.java
similarity index 86%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/BiomeEffectsAccessor.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/BiomeEffectsAccessor.java
index a083db0b7..9fe749792 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/BiomeEffectsAccessor.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/BiomeEffectsAccessor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.world.biome.BiomeEffects;
import org.spongepowered.asm.mixin.Mixin;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ChunkGeneratingMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ChunkGeneratingMixin.java
similarity index 87%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ChunkGeneratingMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ChunkGeneratingMixin.java
index 9355f2b91..2449b3d3e 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ChunkGeneratingMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ChunkGeneratingMixin.java
@@ -1,12 +1,12 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.world.chunk.ChunkGenerating;
import net.minecraft.world.chunk.ChunkGenerationContext;
import net.minecraft.world.chunk.AbstractChunkHolder;
import net.minecraft.world.chunk.Chunk;
-import org.dynmap.fabric_1_21_3.access.ProtoChunkAccessor;
-import org.dynmap.fabric_1_21_3.event.CustomServerChunkEvents;
+import org.dynmap.fabric_1_21_7.access.ProtoChunkAccessor;
+import org.dynmap.fabric_1_21_7.event.CustomServerChunkEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/MinecraftServerMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/MinecraftServerMixin.java
similarity index 84%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/MinecraftServerMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/MinecraftServerMixin.java
index 5059403a2..72a28617c 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/MinecraftServerMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/MinecraftServerMixin.java
@@ -1,8 +1,8 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.server.MinecraftServer;
-import org.dynmap.fabric_1_21_3.event.CustomServerLifecycleEvents;
+import org.dynmap.fabric_1_21_7.event.CustomServerLifecycleEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/PlayerManagerMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/PlayerManagerMixin.java
similarity index 93%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/PlayerManagerMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/PlayerManagerMixin.java
index aabd196ba..ad59d77af 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/PlayerManagerMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/PlayerManagerMixin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.entity.Entity;
import net.minecraft.network.ClientConnection;
@@ -6,7 +6,7 @@
import net.minecraft.server.network.ConnectedClientData;
import net.minecraft.server.network.ServerPlayerEntity;
-import org.dynmap.fabric_1_21.event.PlayerEvents;
+import org.dynmap.fabric_1_21_7.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ProtoChunkMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ProtoChunkMixin.java
similarity index 80%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ProtoChunkMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ProtoChunkMixin.java
index d6a22196c..3079a4ece 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ProtoChunkMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ProtoChunkMixin.java
@@ -1,10 +1,10 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.ProtoChunk;
-import org.dynmap.fabric_1_21.access.ProtoChunkAccessor;
+import org.dynmap.fabric_1_21_7.access.ProtoChunkAccessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -21,11 +21,11 @@ public class ProtoChunkMixin implements ProtoChunkAccessor {
target = "Lnet/minecraft/world/chunk/ChunkSection;setBlockState(IIILnet/minecraft/block/BlockState;)Lnet/minecraft/block/BlockState;"
)
)
- public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) {
+ public void setBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) {
touchedByWorldGen = true;
}
public boolean getTouchedByWorldGen() {
return touchedByWorldGen;
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ServerPlayNetworkHandlerMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ServerPlayNetworkHandlerMixin.java
similarity index 95%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ServerPlayNetworkHandlerMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ServerPlayNetworkHandlerMixin.java
index 7f625df25..2833ef2af 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ServerPlayNetworkHandlerMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ServerPlayNetworkHandlerMixin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
@@ -17,8 +17,8 @@
import java.util.Arrays;
import java.util.List;
-import org.dynmap.fabric_1_21_1.event.BlockEvents;
-import org.dynmap.fabric_1_21_1.event.ServerChatEvents;
+import org.dynmap.fabric_1_21_7.event.BlockEvents;
+import org.dynmap.fabric_1_21_7.event.ServerChatEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ServerPlayerEntityMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ServerPlayerEntityMixin.java
similarity index 94%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ServerPlayerEntityMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ServerPlayerEntityMixin.java
index 82fc9b5fa..bd701a0c8 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ServerPlayerEntityMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/ServerPlayerEntityMixin.java
@@ -1,11 +1,11 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.entity.Entity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.TeleportTarget;
-import org.dynmap.fabric_1_21.event.PlayerEvents;
+import org.dynmap.fabric_1_21_7.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/WorldChunkMixin.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/WorldChunkMixin.java
similarity index 78%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/WorldChunkMixin.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/WorldChunkMixin.java
index af289d7f9..12fd5f9df 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/WorldChunkMixin.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/mixin/WorldChunkMixin.java
@@ -1,11 +1,11 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_7.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.WorldChunk;
-import org.dynmap.fabric_1_21.event.BlockEvents;
+import org.dynmap.fabric_1_21_7.event.BlockEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -18,7 +18,7 @@ public abstract class WorldChunkMixin {
public abstract World getWorld();
@Inject(method = "setBlockState", at = @At("RETURN"))
- public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) {
+ public void setBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) {
if (info.getReturnValue() != null) {
BlockEvents.BLOCK_EVENT.invoker().onBlockEvent(this.getWorld(), pos);
}
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/FabricPermissions.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/FabricPermissions.java
similarity index 93%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/FabricPermissions.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/FabricPermissions.java
index 6abd57195..133931fd7 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/FabricPermissions.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/FabricPermissions.java
@@ -1,9 +1,9 @@
-package org.dynmap.fabric_1_21.permissions;
+package org.dynmap.fabric_1_21_7.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
import org.dynmap.json.simple.parser.JSONParser;
import java.util.Set;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/FilePermissions.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/FilePermissions.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/FilePermissions.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/FilePermissions.java
index a9d560437..d36b4c474 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/FilePermissions.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/FilePermissions.java
@@ -1,9 +1,9 @@
-package org.dynmap.fabric_1_21_3.permissions;
+package org.dynmap.fabric_1_21_7.permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.ConfigurationNode;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
import java.io.File;
import java.util.HashMap;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/LuckPermissions.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/LuckPermissions.java
similarity index 97%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/LuckPermissions.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/LuckPermissions.java
index 8723aa5f1..81b698a33 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/LuckPermissions.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/LuckPermissions.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.permissions;
+package org.dynmap.fabric_1_21_7.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.luckperms.api.LuckPerms;
@@ -9,7 +9,7 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
import org.dynmap.json.simple.JSONArray;
import org.dynmap.json.simple.JSONObject;
import org.dynmap.json.simple.parser.JSONParser;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/OpPermissions.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/OpPermissions.java
similarity index 93%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/OpPermissions.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/OpPermissions.java
index 870b30668..2bc5a9163 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/OpPermissions.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/OpPermissions.java
@@ -1,8 +1,8 @@
-package org.dynmap.fabric_1_21_3.permissions;
+package org.dynmap.fabric_1_21_7.permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_7.DynmapPlugin;
import java.util.HashSet;
import java.util.Set;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/PermissionProvider.java b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/PermissionProvider.java
similarity index 89%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/PermissionProvider.java
rename to fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/PermissionProvider.java
index 1e08a7fd6..91c7b52fd 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/permissions/PermissionProvider.java
+++ b/fabric-1.21.6/src/main/java/org/dynmap/fabric_1_21_7/permissions/PermissionProvider.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.permissions;
+package org.dynmap.fabric_1_21_7.permissions;
import net.minecraft.entity.player.PlayerEntity;
diff --git a/fabric-1.21.3/src/main/resources/assets/dynmap/icon.png b/fabric-1.21.6/src/main/resources/assets/dynmap/icon.png
similarity index 100%
rename from fabric-1.21.3/src/main/resources/assets/dynmap/icon.png
rename to fabric-1.21.6/src/main/resources/assets/dynmap/icon.png
diff --git a/fabric-1.21.3/src/main/resources/configuration.txt b/fabric-1.21.6/src/main/resources/configuration.txt
similarity index 100%
rename from fabric-1.21.3/src/main/resources/configuration.txt
rename to fabric-1.21.6/src/main/resources/configuration.txt
diff --git a/fabric-1.21.3/src/main/resources/dynmap.accesswidener b/fabric-1.21.6/src/main/resources/dynmap.accesswidener
similarity index 100%
rename from fabric-1.21.3/src/main/resources/dynmap.accesswidener
rename to fabric-1.21.6/src/main/resources/dynmap.accesswidener
diff --git a/fabric-1.21.1/src/main/resources/dynmap.mixins.json b/fabric-1.21.6/src/main/resources/dynmap.mixins.json
similarity index 88%
rename from fabric-1.21.1/src/main/resources/dynmap.mixins.json
rename to fabric-1.21.6/src/main/resources/dynmap.mixins.json
index 28fce76cf..9b1618339 100644
--- a/fabric-1.21.1/src/main/resources/dynmap.mixins.json
+++ b/fabric-1.21.6/src/main/resources/dynmap.mixins.json
@@ -1,7 +1,7 @@
{
"required": true,
"minVersion": "0.8",
- "package": "org.dynmap.fabric_1_21_1.mixin",
+ "package": "org.dynmap.fabric_1_21_7.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"BiomeEffectsAccessor",
diff --git a/fabric-1.21.3/src/main/resources/fabric.mod.json b/fabric-1.21.6/src/main/resources/fabric.mod.json
similarity index 84%
rename from fabric-1.21.3/src/main/resources/fabric.mod.json
rename to fabric-1.21.6/src/main/resources/fabric.mod.json
index 2e9c78c11..6718f719d 100644
--- a/fabric-1.21.3/src/main/resources/fabric.mod.json
+++ b/fabric-1.21.6/src/main/resources/fabric.mod.json
@@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"id": "dynmap",
- "version": "${version}",
+ "version": "3.4.0-beta-1",
"name": "Dynmap",
"description": "Dynamic, Google-maps style rendered maps for your Minecraft server",
"authors": [
@@ -18,7 +18,7 @@
"environment": "*",
"entrypoints": {
"main": [
- "org.dynmap.fabric_1_21_3.DynmapMod"
+ "org.dynmap.fabric_1_21_7.DynmapMod"
]
},
"mixins": [
@@ -29,6 +29,6 @@
"depends": {
"fabricloader": ">=0.16.9",
"fabric": ">=0.108.0",
- "minecraft": ["1.21.3","1.21.4"]
+ "minecraft": ["1.21.6","1.21.7", "1.21.8"]
}
}
diff --git a/fabric-1.21.3/src/main/resources/permissions.yml.example b/fabric-1.21.6/src/main/resources/permissions.yml.example
similarity index 100%
rename from fabric-1.21.3/src/main/resources/permissions.yml.example
rename to fabric-1.21.6/src/main/resources/permissions.yml.example
diff --git a/fabric-1.21/.gitignore b/fabric-1.21.9-10/.gitignore
similarity index 100%
rename from fabric-1.21/.gitignore
rename to fabric-1.21.9-10/.gitignore
diff --git a/fabric-1.21.3/build.gradle b/fabric-1.21.9-10/build.gradle
similarity index 88%
rename from fabric-1.21.3/build.gradle
rename to fabric-1.21.9-10/build.gradle
index 73492c32e..8a8de3289 100644
--- a/fabric-1.21.3/build.gradle
+++ b/fabric-1.21.9-10/build.gradle
@@ -1,5 +1,5 @@
plugins {
- id 'fabric-loom' version '1.9-SNAPSHOT'
+ id 'fabric-loom' version '1.13.6'
}
archivesBaseName = "Dynmap"
@@ -8,7 +8,7 @@ group = parent.group
eclipse {
project {
- name = "Dynmap(Fabric-1.21.3)"
+ name = "Dynmap(Fabric-1.21.9-10)"
}
}
@@ -34,7 +34,7 @@ dependencies {
shadow project(path: ':DynmapCore', configuration: 'shadow')
- modCompileOnly "me.lucko:fabric-permissions-api:0.1-SNAPSHOT"
+ modCompileOnly "me.lucko:fabric-permissions-api:0.5.0"
compileOnly 'net.luckperms:api:5.4'
}
@@ -63,7 +63,7 @@ jar {
}
remapJar {
- archiveFileName = "${archivesBaseName}-${project.version}-fabric-${project.minecraft_version}.jar"
+ archiveFileName = "${archivesBaseName}-${project.version}-fabric-${project.minecraft_version}-10.jar" // TODO: Remove -10 when updating after 1.21.10 release
destinationDirectory = file '../target'
}
diff --git a/fabric-1.21.9-10/gradle.properties b/fabric-1.21.9-10/gradle.properties
new file mode 100644
index 000000000..9e1958d38
--- /dev/null
+++ b/fabric-1.21.9-10/gradle.properties
@@ -0,0 +1,6 @@
+minecraft_version=1.21.9
+
+# see https://fabricmc.net/develop/
+yarn_mappings=1.21.9+build.1
+loader_version=0.17.2
+fabric_version=0.133.14+1.21.9
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/DynmapMod.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/DynmapMod.java
similarity index 97%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/DynmapMod.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/DynmapMod.java
index 683c13d05..a7c5f8532 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/DynmapMod.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/DynmapMod.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_9_10;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.loader.api.FabricLoader;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/DynmapPlugin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/DynmapPlugin.java
similarity index 97%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/DynmapPlugin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/DynmapPlugin.java
index 4962df149..8e7968186 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/DynmapPlugin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/DynmapPlugin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_9_10;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
@@ -35,16 +35,16 @@
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapPlayer;
import org.dynmap.common.chunk.GenericChunkCache;
-import org.dynmap.fabric_1_21.command.DmapCommand;
-import org.dynmap.fabric_1_21.command.DmarkerCommand;
-import org.dynmap.fabric_1_21.command.DynmapCommand;
-import org.dynmap.fabric_1_21.command.DynmapExpCommand;
-import org.dynmap.fabric_1_21.event.BlockEvents;
-import org.dynmap.fabric_1_21.event.CustomServerChunkEvents;
-import org.dynmap.fabric_1_21.event.CustomServerLifecycleEvents;
-import org.dynmap.fabric_1_21.event.PlayerEvents;
-import org.dynmap.fabric_1_21.mixin.BiomeEffectsAccessor;
-import org.dynmap.fabric_1_21.permissions.*;
+import org.dynmap.fabric_1_21_9_10.command.DmapCommand;
+import org.dynmap.fabric_1_21_9_10.command.DmarkerCommand;
+import org.dynmap.fabric_1_21_9_10.command.DynmapCommand;
+import org.dynmap.fabric_1_21_9_10.command.DynmapExpCommand;
+import org.dynmap.fabric_1_21_9_10.event.BlockEvents;
+import org.dynmap.fabric_1_21_9_10.event.CustomServerChunkEvents;
+import org.dynmap.fabric_1_21_9_10.event.CustomServerLifecycleEvents;
+import org.dynmap.fabric_1_21_9_10.event.PlayerEvents;
+import org.dynmap.fabric_1_21_9_10.mixin.BiomeEffectsAccessor;
+import org.dynmap.fabric_1_21_9_10.permissions.*;
import org.dynmap.permissions.PermissionsHandler;
import org.dynmap.renderer.DynmapBlockState;
@@ -163,7 +163,7 @@ public void initializeBlockStates() {
}
statename += p.getName() + "=" + bs.get(p).toString();
}
- int lightAtten = bs.isOpaqueFullCube(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 15 : (bs.isTransparent(EmptyBlockView.INSTANCE, BlockPos.ORIGIN) ? 0 : 1);
+ int lightAtten = bs.isOpaqueFullCube() ? 15 : (bs.isTransparent() ? 0 : 1);
//Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
// Fill in base attributes
bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
@@ -259,7 +259,7 @@ public boolean isOp(String player) {
}
// TODO: Consider whether cheats are enabled for integrated server
- return server.isSingleplayer() && server.isHost(server.getPlayerManager().getPlayer(player).getGameProfile());
+ return server.isSingleplayer() && server.isHost(server.getPlayerManager().getPlayer(player).getPlayerConfigEntry());
}
boolean hasPerm(PlayerEntity psender, String permission) {
@@ -793,4 +793,4 @@ private void loadWorlds() {
}
}
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricAdapter.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricAdapter.java
similarity index 90%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricAdapter.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricAdapter.java
index bb12c7c33..076cda678 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricAdapter.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricAdapter.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_9_10;
import net.minecraft.server.world.ServerWorld;
import org.dynmap.DynmapLocation;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricCommandSender.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricCommandSender.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricCommandSender.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricCommandSender.java
index b13956a92..b2c538589 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricCommandSender.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricCommandSender.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_9_10;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.Text;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricLogger.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricLogger.java
similarity index 95%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricLogger.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricLogger.java
index f2046938c..cf70bb801 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/FabricLogger.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricLogger.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21;
+package org.dynmap.fabric_1_21_9_10;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -46,4 +46,4 @@ public void warning(String s) {
public void warning(String s, Throwable t) {
log.warn(DM + s, t);
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricMapChunkCache.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricMapChunkCache.java
similarity index 94%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricMapChunkCache.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricMapChunkCache.java
index bbadf1568..b164a99d2 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricMapChunkCache.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricMapChunkCache.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_9_10;
import net.minecraft.nbt.*;
import net.minecraft.server.world.ServerChunkLoadingManager;
@@ -8,12 +8,12 @@
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.WordPackedArray;
-import net.minecraft.world.ChunkSerializer;
import net.minecraft.world.World;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeEffects;
import net.minecraft.world.chunk.ChunkManager;
import net.minecraft.world.chunk.ChunkStatus;
+import net.minecraft.world.chunk.SerializedChunk;
import org.dynmap.DynmapChunk;
import org.dynmap.DynmapCore;
@@ -66,7 +66,8 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
if (cps.isChunkLoaded(chunk.x, chunk.z)) {
NbtCompound nbt = null;
try {
- nbt = ChunkSerializer.serialize((ServerWorld) w, cps.getWorldChunk(chunk.x, chunk.z, false));
+ SerializedChunk sc = SerializedChunk.fromChunk((ServerWorld) w, cps.getWorldChunk(chunk.x, chunk.z, false));
+ nbt = sc.serialize();
} catch (NullPointerException e) {
// TODO: find out why this is happening and why it only seems to happen since 1.16.2
Log.severe("ChunkSerializer.serialize threw a NullPointerException", e);
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricPlayer.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricPlayer.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricPlayer.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricPlayer.java
index 508bfa0ee..9eb7e9d78 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricPlayer.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricPlayer.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_9_10;
import com.google.common.collect.Iterables;
import com.google.gson.Gson;
@@ -44,7 +44,7 @@ public FabricPlayer(DynmapPlugin plugin, ServerPlayerEntity player) {
uuid = this.player.getUuid();
GameProfile prof = this.player.getGameProfile();
if (prof != null) {
- Property textureProperty = Iterables.getFirst(prof.getProperties().get("textures"), null);
+ Property textureProperty = Iterables.getFirst(prof.properties().get("textures"), null);
if (textureProperty != null) {
DynmapPlugin.TexturesPayload result = null;
@@ -99,8 +99,8 @@ public DynmapLocation getLocation() {
return null;
}
- Vec3d pos = player.getPos();
- return FabricAdapter.toDynmapLocation(plugin, player.getServerWorld(), pos.getX(), pos.getY(), pos.getZ());
+ // Vec3d pos = player.movement;
+ return FabricAdapter.toDynmapLocation(plugin, player.getEntityWorld(), player.getX(), player.getY(), player.getZ());
}
@Override
@@ -109,7 +109,7 @@ public String getWorld() {
return null;
}
- World world = player.getWorld();
+ World world = player.getEntityWorld();
if (world != null) {
return plugin.getWorld(world).getName();
}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricServer.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricServer.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricServer.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricServer.java
index 488640e54..4b2400771 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/FabricServer.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricServer.java
@@ -1,6 +1,5 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_9_10;
-import com.mojang.authlib.GameProfile;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
import net.minecraft.block.AbstractSignBlock;
@@ -14,6 +13,7 @@
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.PlayerManager;
import net.minecraft.server.network.ServerPlayerEntity;
+import net.minecraft.server.PlayerConfigEntry;
import net.minecraft.text.Text;
import net.minecraft.util.UserCache;
import net.minecraft.util.Util;
@@ -28,8 +28,8 @@
import org.dynmap.common.DynmapListenerManager;
import org.dynmap.common.DynmapPlayer;
import org.dynmap.common.DynmapServerInterface;
-import org.dynmap.fabric_1_21_1.event.BlockEvents;
-import org.dynmap.fabric_1_21_1.event.ServerChatEvents;
+import org.dynmap.fabric_1_21_9_10.event.BlockEvents;
+import org.dynmap.fabric_1_21_9_10.event.ServerChatEvents;
import org.dynmap.utils.MapChunkCache;
import org.dynmap.utils.VisibilityLimit;
@@ -60,12 +60,11 @@ public class FabricServer extends DynmapServerInterface {
public FabricServer(DynmapPlugin plugin, MinecraftServer server) {
this.plugin = plugin;
this.server = server;
- this.biomeRegistry = server.getRegistryManager().get(RegistryKeys.BIOME);
+ this.biomeRegistry = server.getRegistryManager().getOrThrow(RegistryKeys.BIOME);
}
- private Optional getProfileByName(String player) {
- UserCache cache = server.getUserCache();
- return cache.findByName(player);
+ private Optional getProfileByName(String playerName) {
+ return Optional.ofNullable(PlayerConfigEntry.fromNickname(playerName));
}
public final Registry getBiomeRegistry() {
@@ -202,12 +201,10 @@ public String getServerName() {
public boolean isPlayerBanned(String pid) {
PlayerManager scm = server.getPlayerManager();
BannedPlayerList bl = scm.getUserBanList();
- try {
- return bl.contains(getProfileByName(pid).get());
- } catch (NoSuchElementException e) {
- /* If this profile doesn't exist, default to "banned" for good measure. */
- return true;
- }
+
+ return getProfileByName(pid)
+ .map(profile -> bl.get(profile) != null)
+ .orElse(true);
}
@Override
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricWorld.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricWorld.java
similarity index 98%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricWorld.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricWorld.java
index 51f681282..0c35b5bd4 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/FabricWorld.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/FabricWorld.java
@@ -1,7 +1,8 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_9_10;
import net.minecraft.registry.RegistryKey;
import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.WorldProperties.SpawnPoint;
import net.minecraft.util.math.MathHelper;
import net.minecraft.world.Heightmap;
import net.minecraft.world.LightType;
@@ -96,7 +97,7 @@ public boolean isTheEnd() {
@Override
public DynmapLocation getSpawnLocation() {
if (world != null) {
- BlockPos spawnPos = world.getLevelProperties().getSpawnPos();
+ BlockPos spawnPos = world.getLevelProperties().getSpawnPoint().getPos().toImmutable();
spawnloc.x = spawnPos.getX();
spawnloc.y = spawnPos.getY();
spawnloc.z = spawnPos.getZ();
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/NBT.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/NBT.java
similarity index 65%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/NBT.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/NBT.java
index 485eeae6c..a9e65d5ba 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/NBT.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/NBT.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_9_10;
import org.dynmap.common.chunk.GenericBitStorage;
import org.dynmap.common.chunk.GenericNBTCompound;
@@ -6,6 +6,7 @@
import java.util.Set;
import net.minecraft.nbt.NbtCompound;
+import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import net.minecraft.util.collection.PackedIntegerArray;
@@ -26,63 +27,74 @@ public boolean contains(String s) {
}
@Override
public boolean contains(String s, int i) {
- return obj.contains(s, i);
+ // Like contains, but with an extra constraint on type
+ NbtElement base = obj.get(s);
+ if (base == null)
+ return false;
+ int type = base.getType();
+ if (type == i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
}
@Override
public byte getByte(String s) {
- return obj.getByte(s);
+ return obj.getByte(s, (byte)0);
}
@Override
public short getShort(String s) {
- return obj.getShort(s);
+ return obj.getShort(s, (short)0);
}
@Override
public int getInt(String s) {
- return obj.getInt(s);
+ return obj.getInt(s, (int)0);
}
@Override
public long getLong(String s) {
- return obj.getLong(s);
+ return obj.getLong(s, (long)0);
}
@Override
public float getFloat(String s) {
- return obj.getFloat(s);
+ return obj.getFloat(s, (float)0);
}
@Override
public double getDouble(String s) {
- return obj.getDouble(s);
+ return obj.getDouble(s, (double)0);
}
@Override
public String getString(String s) {
- return obj.getString(s);
+ return obj.getString(s, "");
}
@Override
public byte[] getByteArray(String s) {
- return obj.getByteArray(s);
+ return obj.getByteArray(s).orElseGet(() -> new byte[0]);
}
@Override
public int[] getIntArray(String s) {
- return obj.getIntArray(s);
+ return obj.getIntArray(s).orElseGet(() -> new int[0]);
}
@Override
public long[] getLongArray(String s) {
- return obj.getLongArray(s);
+ return obj.getLongArray(s).orElseGet(() -> new long[0]);
}
@Override
public GenericNBTCompound getCompound(String s) {
- return new NBTCompound(obj.getCompound(s));
+ return new NBTCompound(obj.getCompoundOrEmpty(s));
}
@Override
public GenericNBTList getList(String s, int i) {
- return new NBTList(obj.getList(s, i));
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.getListOrEmpty(s));
}
@Override
public boolean getBoolean(String s) {
- return obj.getBoolean(s);
+ return obj.getBoolean(s, false);
}
@Override
public String getAsString(String s) {
- return obj.get(s).asString();
+ return obj.get(s).asString().orElse("");
}
@Override
public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
@@ -103,11 +115,11 @@ public int size() {
}
@Override
public String getString(int idx) {
- return obj.getString(idx);
+ return obj.getString(idx, "");
}
@Override
public GenericNBTCompound getCompound(int idx) {
- return new NBTCompound(obj.getCompound(idx));
+ return new NBTCompound(obj.getCompoundOrEmpty(idx));
}
public String toString() {
return obj.toString();
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/TaskRecord.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/TaskRecord.java
similarity index 95%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/TaskRecord.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/TaskRecord.java
index 3f35e06f3..e439385c1 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/TaskRecord.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/TaskRecord.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1;
+package org.dynmap.fabric_1_21_9_10;
import java.util.concurrent.FutureTask;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/VersionCheck.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/VersionCheck.java
similarity index 99%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/VersionCheck.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/VersionCheck.java
index a05bb81b3..dabc37151 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/VersionCheck.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/VersionCheck.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3;
+package org.dynmap.fabric_1_21_9_10;
import org.dynmap.DynmapCore;
import org.dynmap.Log;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/access/ProtoChunkAccessor.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/access/ProtoChunkAccessor.java
similarity index 63%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/access/ProtoChunkAccessor.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/access/ProtoChunkAccessor.java
index e1208130b..95be663ea 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/access/ProtoChunkAccessor.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/access/ProtoChunkAccessor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.access;
+package org.dynmap.fabric_1_21_9_10.access;
public interface ProtoChunkAccessor {
boolean getTouchedByWorldGen();
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DmapCommand.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DmapCommand.java
similarity index 58%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DmapCommand.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DmapCommand.java
index e0b460cbc..3e6fe4384 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DmapCommand.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DmapCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_1.command;
+package org.dynmap.fabric_1_21_9_10.command;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
public class DmapCommand extends DynmapCommandExecutor {
public DmapCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DmarkerCommand.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DmarkerCommand.java
similarity index 60%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DmarkerCommand.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DmarkerCommand.java
index de845d34c..18d202856 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DmarkerCommand.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DmarkerCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_1.command;
+package org.dynmap.fabric_1_21_9_10.command;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
public class DmarkerCommand extends DynmapCommandExecutor {
public DmarkerCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapCommand.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapCommand.java
similarity index 59%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapCommand.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapCommand.java
index ea7daec7c..2cf8ec0a2 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/command/DynmapCommand.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21_3.command;
+package org.dynmap.fabric_1_21_9_10.command;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
public class DynmapCommand extends DynmapCommandExecutor {
public DynmapCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapCommandExecutor.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapCommandExecutor.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapCommandExecutor.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapCommandExecutor.java
index ab48599af..01cc34fde 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/command/DynmapCommandExecutor.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapCommandExecutor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.command;
+package org.dynmap.fabric_1_21_9_10.command;
import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
@@ -11,7 +11,7 @@
import java.util.Arrays;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
import static com.mojang.brigadier.arguments.StringArgumentType.greedyString;
import static net.minecraft.server.command.CommandManager.argument;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapExpCommand.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapExpCommand.java
similarity index 61%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapExpCommand.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapExpCommand.java
index 2fcf9f695..2955e8b85 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/command/DynmapExpCommand.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/command/DynmapExpCommand.java
@@ -1,6 +1,6 @@
-package org.dynmap.fabric_1_21.command;
+package org.dynmap.fabric_1_21_9_10.command;
-import org.dynmap.fabric_1_21.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
public class DynmapExpCommand extends DynmapCommandExecutor {
public DynmapExpCommand(DynmapPlugin p) {
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/BlockEvents.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/BlockEvents.java
similarity index 96%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/BlockEvents.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/BlockEvents.java
index 9fb7b8156..19b4d5f75 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/BlockEvents.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/BlockEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.event;
+package org.dynmap.fabric_1_21_9_10.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/CustomServerChunkEvents.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/CustomServerChunkEvents.java
similarity index 93%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/CustomServerChunkEvents.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/CustomServerChunkEvents.java
index 1b390c34c..6a370dabf 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/CustomServerChunkEvents.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/CustomServerChunkEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.event;
+package org.dynmap.fabric_1_21_9_10.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
@@ -18,4 +18,4 @@ public class CustomServerChunkEvents {
public interface ChunkGenerate {
void onChunkGenerate(ServerWorld world, Chunk chunk);
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/CustomServerLifecycleEvents.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/CustomServerLifecycleEvents.java
similarity index 93%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/CustomServerLifecycleEvents.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/CustomServerLifecycleEvents.java
index 0c95f394c..4387519ed 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/CustomServerLifecycleEvents.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/CustomServerLifecycleEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.event;
+package org.dynmap.fabric_1_21_9_10.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/PlayerEvents.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/PlayerEvents.java
similarity index 97%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/PlayerEvents.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/PlayerEvents.java
index 40114d923..03ed4d194 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/event/PlayerEvents.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/PlayerEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.event;
+package org.dynmap.fabric_1_21_9_10.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/ServerChatEvents.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/ServerChatEvents.java
similarity index 93%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/ServerChatEvents.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/ServerChatEvents.java
index c0c3ceadf..127bc35bd 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/event/ServerChatEvents.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/event/ServerChatEvents.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.event;
+package org.dynmap.fabric_1_21_9_10.event;
import net.fabricmc.fabric.api.event.Event;
import net.fabricmc.fabric.api.event.EventFactory;
@@ -20,4 +20,4 @@ private ServerChatEvents() {
public interface ServerChatCallback {
void onChatMessage(ServerPlayerEntity player, String message);
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/BiomeEffectsAccessor.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/BiomeEffectsAccessor.java
similarity index 85%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/BiomeEffectsAccessor.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/BiomeEffectsAccessor.java
index fef2f5071..d6a3fe67c 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/BiomeEffectsAccessor.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/BiomeEffectsAccessor.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.world.biome.BiomeEffects;
import org.spongepowered.asm.mixin.Mixin;
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ChunkGeneratingMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ChunkGeneratingMixin.java
similarity index 87%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ChunkGeneratingMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ChunkGeneratingMixin.java
index e206a0adf..2e5d75e6d 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ChunkGeneratingMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ChunkGeneratingMixin.java
@@ -1,12 +1,12 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.world.chunk.ChunkGenerating;
import net.minecraft.world.chunk.ChunkGenerationContext;
import net.minecraft.world.chunk.AbstractChunkHolder;
import net.minecraft.world.chunk.Chunk;
-import org.dynmap.fabric_1_21.access.ProtoChunkAccessor;
-import org.dynmap.fabric_1_21.event.CustomServerChunkEvents;
+import org.dynmap.fabric_1_21_9_10.access.ProtoChunkAccessor;
+import org.dynmap.fabric_1_21_9_10.event.CustomServerChunkEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -24,4 +24,4 @@ private static void onChunkGenerate(Chunk chunk, ChunkGenerationContext chunkGen
CustomServerChunkEvents.CHUNK_GENERATE.invoker().onChunkGenerate(chunkGenerationContext.world(), callbackInfoReturnable.getReturnValue());
}
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/MinecraftServerMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/MinecraftServerMixin.java
similarity index 83%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/MinecraftServerMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/MinecraftServerMixin.java
index d6ec18cff..689ed0770 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/MinecraftServerMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/MinecraftServerMixin.java
@@ -1,8 +1,8 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.server.MinecraftServer;
-import org.dynmap.fabric_1_21_1.event.CustomServerLifecycleEvents;
+import org.dynmap.fabric_1_21_9_10.event.CustomServerLifecycleEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/PlayerManagerMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/PlayerManagerMixin.java
similarity index 93%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/PlayerManagerMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/PlayerManagerMixin.java
index 9ce9db01b..cd50f37b7 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/PlayerManagerMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/PlayerManagerMixin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.entity.Entity;
import net.minecraft.network.ClientConnection;
@@ -6,7 +6,7 @@
import net.minecraft.server.network.ConnectedClientData;
import net.minecraft.server.network.ServerPlayerEntity;
-import org.dynmap.fabric_1_21_1.event.PlayerEvents;
+import org.dynmap.fabric_1_21_9_10.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ProtoChunkMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ProtoChunkMixin.java
similarity index 80%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ProtoChunkMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ProtoChunkMixin.java
index 182ac7f36..670abb723 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/mixin/ProtoChunkMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ProtoChunkMixin.java
@@ -1,10 +1,10 @@
-package org.dynmap.fabric_1_21_3.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.chunk.ProtoChunk;
-import org.dynmap.fabric_1_21_3.access.ProtoChunkAccessor;
+import org.dynmap.fabric_1_21_9_10.access.ProtoChunkAccessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
@@ -21,7 +21,7 @@ public class ProtoChunkMixin implements ProtoChunkAccessor {
target = "Lnet/minecraft/world/chunk/ChunkSection;setBlockState(IIILnet/minecraft/block/BlockState;)Lnet/minecraft/block/BlockState;"
)
)
- public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) {
+ public void setBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) {
touchedByWorldGen = true;
}
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ServerPlayNetworkHandlerMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ServerPlayNetworkHandlerMixin.java
similarity index 94%
rename from fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ServerPlayNetworkHandlerMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ServerPlayNetworkHandlerMixin.java
index a273cfd3b..4e142670d 100644
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/ServerPlayNetworkHandlerMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ServerPlayNetworkHandlerMixin.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
@@ -17,8 +17,8 @@
import java.util.Arrays;
import java.util.List;
-import org.dynmap.fabric_1_21.event.BlockEvents;
-import org.dynmap.fabric_1_21.event.ServerChatEvents;
+import org.dynmap.fabric_1_21_9_10.event.BlockEvents;
+import org.dynmap.fabric_1_21_9_10.event.ServerChatEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -71,4 +71,4 @@ public void onSignUpdate(UpdateSignC2SPacket packet, List signT
// Cancel the original tryChangeText() since we're calling it ourselves above.
ci.cancel();
}
-}
\ No newline at end of file
+}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ServerPlayerEntityMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ServerPlayerEntityMixin.java
similarity index 93%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ServerPlayerEntityMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ServerPlayerEntityMixin.java
index 9749e8675..87ecd5b5e 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/ServerPlayerEntityMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/ServerPlayerEntityMixin.java
@@ -1,11 +1,11 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.entity.Entity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.world.TeleportTarget;
-import org.dynmap.fabric_1_21_1.event.PlayerEvents;
+import org.dynmap.fabric_1_21_9_10.event.PlayerEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/WorldChunkMixin.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/WorldChunkMixin.java
similarity index 77%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/WorldChunkMixin.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/WorldChunkMixin.java
index 7ecae9606..a998cccb6 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/mixin/WorldChunkMixin.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/mixin/WorldChunkMixin.java
@@ -1,11 +1,11 @@
-package org.dynmap.fabric_1_21_1.mixin;
+package org.dynmap.fabric_1_21_9_10.mixin;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.WorldChunk;
-import org.dynmap.fabric_1_21_1.event.BlockEvents;
+import org.dynmap.fabric_1_21_9_10.event.BlockEvents;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@@ -18,7 +18,7 @@ public abstract class WorldChunkMixin {
public abstract World getWorld();
@Inject(method = "setBlockState", at = @At("RETURN"))
- public void setBlockState(BlockPos pos, BlockState state, boolean moved, CallbackInfoReturnable info) {
+ public void setBlockState(BlockPos pos, BlockState state, int flags, CallbackInfoReturnable info) {
if (info.getReturnValue() != null) {
BlockEvents.BLOCK_EVENT.invoker().onBlockEvent(this.getWorld(), pos);
}
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/FabricPermissions.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/FabricPermissions.java
similarity index 93%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/FabricPermissions.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/FabricPermissions.java
index 5987fa75a..bab41fc20 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/FabricPermissions.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/FabricPermissions.java
@@ -1,9 +1,9 @@
-package org.dynmap.fabric_1_21_1.permissions;
+package org.dynmap.fabric_1_21_9_10.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
import org.dynmap.json.simple.parser.JSONParser;
import java.util.Set;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/FilePermissions.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/FilePermissions.java
similarity index 96%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/FilePermissions.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/FilePermissions.java
index aa2a3167e..333bd5865 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/FilePermissions.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/FilePermissions.java
@@ -1,9 +1,9 @@
-package org.dynmap.fabric_1_21_1.permissions;
+package org.dynmap.fabric_1_21_9_10.permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.ConfigurationNode;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
import java.io.File;
import java.util.HashMap;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/LuckPermissions.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/LuckPermissions.java
similarity index 97%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/LuckPermissions.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/LuckPermissions.java
index e4b2b50b7..ddd51d763 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/LuckPermissions.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/LuckPermissions.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.permissions;
+package org.dynmap.fabric_1_21_9_10.permissions;
import me.lucko.fabric.api.permissions.v0.Permissions;
import net.luckperms.api.LuckPerms;
@@ -9,7 +9,7 @@
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_3.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
import org.dynmap.json.simple.JSONArray;
import org.dynmap.json.simple.JSONObject;
import org.dynmap.json.simple.parser.JSONParser;
diff --git a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/OpPermissions.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/OpPermissions.java
similarity index 93%
rename from fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/OpPermissions.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/OpPermissions.java
index 7cb9f61e1..451a6e823 100644
--- a/fabric-1.21.1/src/main/java/org/dynmap/fabric_1_21_1/permissions/OpPermissions.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/OpPermissions.java
@@ -1,8 +1,8 @@
-package org.dynmap.fabric_1_21_1.permissions;
+package org.dynmap.fabric_1_21_9_10.permissions;
import net.minecraft.entity.player.PlayerEntity;
import org.dynmap.Log;
-import org.dynmap.fabric_1_21_1.DynmapPlugin;
+import org.dynmap.fabric_1_21_9_10.DynmapPlugin;
import java.util.HashSet;
import java.util.Set;
diff --git a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/PermissionProvider.java b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/PermissionProvider.java
similarity index 88%
rename from fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/PermissionProvider.java
rename to fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/PermissionProvider.java
index 6c6e9fe46..1c6dd3879 100644
--- a/fabric-1.21.3/src/main/java/org/dynmap/fabric_1_21_3/permissions/PermissionProvider.java
+++ b/fabric-1.21.9-10/src/main/java/org/dynmap/fabric_1_21_9_10/permissions/PermissionProvider.java
@@ -1,4 +1,4 @@
-package org.dynmap.fabric_1_21_3.permissions;
+package org.dynmap.fabric_1_21_9_10.permissions;
import net.minecraft.entity.player.PlayerEntity;
diff --git a/fabric-1.21/src/main/resources/assets/dynmap/icon.png b/fabric-1.21.9-10/src/main/resources/assets/dynmap/icon.png
similarity index 100%
rename from fabric-1.21/src/main/resources/assets/dynmap/icon.png
rename to fabric-1.21.9-10/src/main/resources/assets/dynmap/icon.png
diff --git a/fabric-1.21/src/main/resources/configuration.txt b/fabric-1.21.9-10/src/main/resources/configuration.txt
similarity index 100%
rename from fabric-1.21/src/main/resources/configuration.txt
rename to fabric-1.21.9-10/src/main/resources/configuration.txt
diff --git a/fabric-1.21/src/main/resources/dynmap.accesswidener b/fabric-1.21.9-10/src/main/resources/dynmap.accesswidener
similarity index 100%
rename from fabric-1.21/src/main/resources/dynmap.accesswidener
rename to fabric-1.21.9-10/src/main/resources/dynmap.accesswidener
diff --git a/fabric-1.21.3/src/main/resources/dynmap.mixins.json b/fabric-1.21.9-10/src/main/resources/dynmap.mixins.json
similarity index 79%
rename from fabric-1.21.3/src/main/resources/dynmap.mixins.json
rename to fabric-1.21.9-10/src/main/resources/dynmap.mixins.json
index d089d0172..ace8e2d34 100644
--- a/fabric-1.21.3/src/main/resources/dynmap.mixins.json
+++ b/fabric-1.21.9-10/src/main/resources/dynmap.mixins.json
@@ -1,8 +1,8 @@
{
"required": true,
"minVersion": "0.8",
- "package": "org.dynmap.fabric_1_21_3.mixin",
- "compatibilityLevel": "JAVA_17",
+ "package": "org.dynmap.fabric_1_21_9_10.mixin",
+ "compatibilityLevel": "JAVA_21",
"mixins": [
"BiomeEffectsAccessor",
"ChunkGeneratingMixin",
diff --git a/fabric-1.21/src/main/resources/fabric.mod.json b/fabric-1.21.9-10/src/main/resources/fabric.mod.json
similarity index 77%
rename from fabric-1.21/src/main/resources/fabric.mod.json
rename to fabric-1.21.9-10/src/main/resources/fabric.mod.json
index 9051acdee..94996de55 100644
--- a/fabric-1.21/src/main/resources/fabric.mod.json
+++ b/fabric-1.21.9-10/src/main/resources/fabric.mod.json
@@ -1,7 +1,7 @@
{
"schemaVersion": 1,
"id": "dynmap",
- "version": "${version}",
+ "version": "3.4.0-beta-1",
"name": "Dynmap",
"description": "Dynamic, Google-maps style rendered maps for your Minecraft server",
"authors": [
@@ -18,7 +18,7 @@
"environment": "*",
"entrypoints": {
"main": [
- "org.dynmap.fabric_1_21.DynmapMod"
+ "org.dynmap.fabric_1_21_9_10.DynmapMod"
]
},
"mixins": [
@@ -27,8 +27,8 @@
"accessWidener" : "dynmap.accesswidener",
"depends": {
- "fabricloader": ">=0.15.11",
- "fabric": ">=0.98.0",
- "minecraft": ["1.21-rc.1", "1.21"]
+ "fabricloader": ">=0.17.2",
+ "fabric": ">=0.108.0",
+ "minecraft": ["1.21.9", "1.21.10"]
}
}
diff --git a/fabric-1.21/src/main/resources/permissions.yml.example b/fabric-1.21.9-10/src/main/resources/permissions.yml.example
similarity index 100%
rename from fabric-1.21/src/main/resources/permissions.yml.example
rename to fabric-1.21.9-10/src/main/resources/permissions.yml.example
diff --git a/fabric-1.21/gradle.properties b/fabric-1.21/gradle.properties
deleted file mode 100644
index 5dfbbcf83..000000000
--- a/fabric-1.21/gradle.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-minecraft_version=1.21
-yarn_mappings=1.21+build.1
-loader_version=0.15.11
-fabric_version=0.100.1+1.21
diff --git a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/BiomeEffectsAccessor.java b/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/BiomeEffectsAccessor.java
deleted file mode 100644
index 7bcf881c5..000000000
--- a/fabric-1.21/src/main/java/org/dynmap/fabric_1_21/mixin/BiomeEffectsAccessor.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.dynmap.fabric_1_21.mixin;
-
-import net.minecraft.world.biome.BiomeEffects;
-import org.spongepowered.asm.mixin.Mixin;
-import org.spongepowered.asm.mixin.gen.Accessor;
-
-@Mixin(BiomeEffects.class)
-public interface BiomeEffectsAccessor {
- @Accessor
- int getWaterColor();
-}
diff --git a/forge-1.20.6/src/main/java/org/dynmap/forge_1_20_6/DynmapPlugin.java b/forge-1.20.6/src/main/java/org/dynmap/forge_1_20_6/DynmapPlugin.java
index ca7c49bb0..4c9b20869 100644
--- a/forge-1.20.6/src/main/java/org/dynmap/forge_1_20_6/DynmapPlugin.java
+++ b/forge-1.20.6/src/main/java/org/dynmap/forge_1_20_6/DynmapPlugin.java
@@ -54,9 +54,7 @@
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.LiquidBlock;
-import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.LevelChunk;
@@ -125,7 +123,6 @@
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
-
import net.minecraft.world.level.EmptyBlockGetter;
public class DynmapPlugin
@@ -1730,7 +1727,35 @@ public void run() {
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ private void touchChunk(ForgeWorld fw, ChunkAccess c, String cause) {
+ int ymax = Integer.MIN_VALUE;
+ int ymin = Integer.MAX_VALUE;
+ LevelChunkSection[] sections = c.getSections();
+ // If no sections, assume all
+ if (sections.length == 0) {
+ ymax = (c.getMaxSection()+1) << 4;
+ ymin = c.getMinSection() << 4;
+ }
+ else {
+ for(int i = 0; i < sections.length; i++) {
+ if((sections[i] != null) && (sections[i].hasOnlyAir() == false)) {
+ int sy = c.getSectionYFromSectionIndex(i) << 4;
+ if (sy < ymin) ymin = sy;
+ if ((sy+16) > ymax) ymax = sy + 16;
+ }
+ }
+ }
+ ChunkPos cp = c.getPos();
+ int x = cp.x << 4;
+ int z = cp.z << 4;
+ Log.info(String.format("ymin=%d, ymax=%d", ymin, ymax));
+ // If not empty AND not initial scan
+ if (ymax != Integer.MIN_VALUE) {
+ mapManager.touchVolume(fw.getName(), x, ymin, z, x+15, ymax, z+15, "chunkgenerate");
+ }
+ }
+
+ @SubscribeEvent(priority=EventPriority.MONITOR)
public void handleChunkLoad(ChunkEvent.Load event) {
if(!onchunkgenerate) return;
@@ -1744,7 +1769,7 @@ public void handleChunkLoad(ChunkEvent.Load event) {
}
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ @SubscribeEvent(priority=EventPriority.MONITOR)
public void handleChunkUnload(ChunkEvent.Unload event) {
if(!onchunkgenerate) return;
@@ -1756,29 +1781,13 @@ public void handleChunkUnload(ChunkEvent.Unload event) {
ChunkPos cp = c.getPos();
if (fw != null) {
if (!checkIfKnownChunk(fw, cp)) {
- int ymax = Integer.MIN_VALUE;
- int ymin = Integer.MAX_VALUE;
- LevelChunkSection[] sections = c.getSections();
- for(int i = 0; i < sections.length; i++) {
- if((sections[i] != null) && (sections[i].hasOnlyAir() == false)) {
- int sy = c.getSectionYFromSectionIndex(i);
- if (sy < ymin) ymin = sy;
- if ((sy+16) > ymax) ymax = sy + 16;
- }
- }
- int x = cp.x << 4;
- int z = cp.z << 4;
- // If not empty AND not initial scan
- if (ymax != Integer.MIN_VALUE) {
- //Log.info(String.format("chunkkeyerate(unload)(%s,%d,%d,%d,%d,%d,%s)", fw.getName(), x, ymin, z, x+15, ymax, z+15));
- mapManager.touchVolume(fw.getName(), x, ymin, z, x+15, ymax, z+15, "chunkgenerate");
- }
+ touchChunk(fw, c, "unload");
}
removeKnownChunk(fw, cp);
}
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ @SubscribeEvent(priority=EventPriority.MONITOR)
public void handleChunkDataSave(ChunkDataEvent.Save event) {
if(!onchunkgenerate) return;
@@ -1789,33 +1798,16 @@ public void handleChunkDataSave(ChunkDataEvent.Save event) {
ForgeWorld fw = getWorld((ServerLevel)w, false);
ChunkPos cp = c.getPos();
if (fw != null) {
- if (!checkIfKnownChunk(fw, cp)) {
- int ymax = Integer.MIN_VALUE;
- int ymin = Integer.MAX_VALUE;
- LevelChunkSection[] sections = c.getSections();
- for(int i = 0; i < sections.length; i++) {
- if((sections[i] != null) && (sections[i].hasOnlyAir() == false)) {
- int sy = c.getSectionYFromSectionIndex(i);
- if (sy < ymin) ymin = sy;
- if ((sy+16) > ymax) ymax = sy + 16;
- }
- }
- int x = cp.x << 4;
- int z = cp.z << 4;
- // If not empty AND not initial scan
- if (ymax != Integer.MIN_VALUE) {
- //Log.info(String.format("chunkkeyerate(save)(%s,%d,%d,%d,%d,%d,%s)", fw.getName(), x, ymin, z, x+15, ymax, z+15));
- mapManager.touchVolume(fw.getName(), x, ymin, z, x+15, ymax, z+15, "chunkgenerate");
- }
- // If cooked, add to known
- if ((c.getStatus() == ChunkStatus.FULL) && (c instanceof LevelChunk)) {
- addKnownChunk(fw, cp);
- }
+ touchChunk(fw, c, "datasave");
+ // If cooked, add to known
+ if (c.getStatus() == ChunkStatus.FULL) {
+ addKnownChunk(fw, cp);
}
}
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+
+ @SubscribeEvent(priority=EventPriority.MONITOR, receiveCanceled=false)
public void handleBlockEvent(BlockEvent event) {
if(!core_enabled) return;
if(!onblockchange) return;
diff --git a/forge-1.21.10/.gitignore b/forge-1.21.10/.gitignore
new file mode 100644
index 000000000..84c048a73
--- /dev/null
+++ b/forge-1.21.10/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/forge-1.21/build.gradle b/forge-1.21.10/build.gradle
similarity index 81%
rename from forge-1.21/build.gradle
rename to forge-1.21.10/build.gradle
index 3dff50159..262083a7e 100644
--- a/forge-1.21/build.gradle
+++ b/forge-1.21.10/build.gradle
@@ -14,7 +14,7 @@ apply plugin: 'eclipse'
eclipse {
project {
- name = "Dynmap(Forge-1.21)"
+ name = "Dynmap(Forge-1.21.10)"
}
}
@@ -25,24 +25,26 @@ println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getPro
ext.buildNumber = System.getenv().BUILD_NUMBER ?: "Dev"
minecraft {
- mappings channel: 'official', version: '1.21'
+ mappings channel: 'official', version: '1.21.10'
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
reobf = false
copyIdeResources = true
runs {
server {
+ property 'eventbus.api.strictRuntimeChecks', 'true'
workingDirectory project.file('run').canonicalPath
}
}
}
-project.archivesBaseName = "${project.archivesBaseName}-forge-1.21"
+project.archivesBaseName = "${project.archivesBaseName}-forge-1.21.10"
dependencies {
implementation project(path: ":DynmapCore", configuration: "shadow")
implementation project(path: ':DynmapCoreAPI')
+ annotationProcessor 'net.minecraftforge:eventbus-validator:7.0-beta.7'
- minecraft 'net.minecraftforge:forge:1.21-51.0.8'
+ minecraft 'net.minecraftforge:forge:1.21.10-60.1.5'
}
processResources
@@ -51,7 +53,7 @@ processResources
// replace version and mcversion
expand(
version: project.version + '-' + project.ext.buildNumber,
- mcversion: "1.21"
+ mcversion: "1.21.10"
)
}
}
@@ -63,10 +65,10 @@ shadowJar {
exclude("META-INF/maven/**")
exclude("META-INF/services/**")
}
- relocate('org.apache.commons.codec', 'org.dynmap.forge_1_21.commons.codec')
+ relocate('org.apache.commons.codec', 'org.dynmap.forge_1_21_10.commons.codec')
archiveBaseName = "Dynmap"
- archiveClassifier = "forge-1.21"
+ archiveClassifier = "forge-1.21.10"
destinationDirectory = file '../target'
}
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/ClientProxy.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ClientProxy.java
similarity index 67%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/ClientProxy.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ClientProxy.java
index feedf2405..0d4756fb1 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/ClientProxy.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ClientProxy.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3;
+package org.dynmap.forge_1_21_10;
public class ClientProxy extends Proxy {
public ClientProxy() {
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/DynmapMod.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/DynmapMod.java
similarity index 64%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/DynmapMod.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/DynmapMod.java
index 10d5cf96c..5c5d24ef5 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/DynmapMod.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/DynmapMod.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3;
+package org.dynmap.forge_1_21_10;
import java.io.File;
@@ -6,7 +6,7 @@
import org.dynmap.DynmapCommonAPI;
import org.dynmap.DynmapCommonAPIListener;
import org.dynmap.Log;
-import org.dynmap.forge_1_21_3.DynmapPlugin.OurLog;
+import org.dynmap.forge_1_21_10.DynmapPlugin.OurLog;
import net.minecraft.server.MinecraftServer;
import net.minecraftforge.fml.common.Mod;
@@ -15,14 +15,13 @@
import net.minecraftforge.event.server.ServerStartedEvent;
import net.minecraftforge.event.server.ServerStartingEvent;
import net.minecraftforge.event.server.ServerStoppingEvent;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
+import net.minecraftforge.eventbus.api.bus.BusGroup;
+import net.minecraftforge.eventbus.api.bus.EventBus;
+import net.minecraftforge.eventbus.api.listener.SubscribeEvent;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModList;
-import net.minecraftforge.fml.ModLoadingContext;
-import net.minecraftforge.fml.StartupMessageManager;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
-import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
@Mod("dynmap")
@@ -30,6 +29,7 @@ public class DynmapMod
{
// The instance of your mod that Forge uses.
public static DynmapMod instance;
+ public static BusGroup modBusGroup;
// Says where the client and server 'proxy' code is loaded.
public static Proxy proxy = DistExecutor.runForDist(() -> ClientProxy::new, () -> Proxy::new);
@@ -51,27 +51,19 @@ public void apiEnabled(DynmapCommonAPI api) {
}
}
- //TODO
- //public class LoadingCallback implements net.minecraftforge.common.ForgeChunkManager.LoadingCallback {
- // @Override
- // public void ticketsLoaded(List tickets, World world) {
- // if(tickets.size() > 0) {
- // DynmapPlugin.setBusy(world, tickets.get(0));
- // for(int i = 1; i < tickets.size(); i++) {
- // ForgeChunkManager.releaseTicket(tickets.get(i));
- // }
- // }
- // }
- //}
-
- public DynmapMod() {
+ public DynmapMod(FMLJavaModLoadingContext context) {
instance = this;
- FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
- FMLJavaModLoadingContext.get().getModEventBus().addListener(this::init);
+
+ modBusGroup = context.getModBusGroup();
+
+ // Register the commonSetup method for modloading
+ FMLCommonSetupEvent.getBus(modBusGroup).addListener(this::setup);
- MinecraftForge.EVENT_BUS.register(this);
+ ServerStartedEvent.BUS.addListener(this::onServerStarted);
+ ServerAboutToStartEvent.BUS.addListener(this::onServerStarting);
+ ServerStoppingEvent.BUS.addListener(this::onServerStopping);
- ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class,
+ context.registerExtensionPoint(IExtensionPoint.DisplayTest.class,
()->new IExtensionPoint.DisplayTest(()->IExtensionPoint.DisplayTest.IGNORESERVERONLY, (remote, isServer)-> true));
Log.setLogger(new OurLog());
@@ -98,21 +90,8 @@ public void setup(final FMLCommonSetupEvent event)
//}
}
- public void init(FMLLoadCompleteEvent event)
- {
- /* Set up for chunk loading notice from chunk manager */
- //TODO
- //if(useforcedchunks) {
- // ForgeChunkManager.setForcedChunkLoadingCallback(DynmapMod.instance, new LoadingCallback());
- //}
- //else {
- // Log.info("[Dynmap] World loading using forced chunks is disabled");
- //}
- }
-
private MinecraftServer server;
- @SubscribeEvent
public void onServerStarting(ServerAboutToStartEvent event) {
server = event.getServer();
if(plugin == null)
@@ -120,14 +99,12 @@ public void onServerStarting(ServerAboutToStartEvent event) {
plugin.onStarting(server.getCommands().getDispatcher());
}
- @SubscribeEvent
public void onServerStarted(ServerStartedEvent event) {
DynmapCommonAPIListener.register(new APICallback());
plugin.serverStarted();
}
- @SubscribeEvent
- public void serverStopping(ServerStoppingEvent event)
+ public void onServerStopping(ServerStoppingEvent event)
{
proxy.stopServer(plugin);
plugin = null;
diff --git a/forge-1.21/src/main/java/org/dynmap/forge_1_21/DynmapPlugin.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/DynmapPlugin.java
similarity index 91%
rename from forge-1.21/src/main/java/org/dynmap/forge_1_21/DynmapPlugin.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/DynmapPlugin.java
index 838a4ef7e..0030ff67b 100644
--- a/forge-1.21/src/main/java/org/dynmap/forge_1_21/DynmapPlugin.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/DynmapPlugin.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21;
+package org.dynmap.forge_1_21_10;
import java.io.File;
import java.io.InputStream;
@@ -46,7 +46,7 @@
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
-import net.minecraft.server.players.GameProfileCache;
+import net.minecraft.server.players.NameAndId;
import net.minecraft.server.players.UserBanList;
import net.minecraft.tags.BlockTags;
import net.minecraft.world.entity.Pose;
@@ -54,9 +54,7 @@
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Block;
-import net.minecraft.world.level.block.LeavesBlock;
import net.minecraft.world.level.block.LiquidBlock;
-import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.LevelChunk;
@@ -65,6 +63,7 @@
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ServerChatEvent;
import net.minecraftforge.event.TickEvent;
+import net.minecraftforge.event.TickEvent.ServerTickEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerChangedDimensionEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent;
@@ -73,6 +72,8 @@
import net.minecraftforge.event.level.ChunkDataEvent;
import net.minecraftforge.event.level.ChunkEvent;
import net.minecraftforge.event.level.LevelEvent;
+import net.minecraftforge.eventbus.api.listener.Priority;
+import net.minecraftforge.eventbus.api.listener.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.ModContainer;
import net.minecraftforge.fml.loading.LoadingModList;
@@ -98,12 +99,12 @@
import org.dynmap.common.DynmapServerInterface;
import org.dynmap.common.DynmapListenerManager.EventType;
import org.dynmap.common.chunk.GenericChunkCache;
-import org.dynmap.forge_1_21.DmapCommand;
-import org.dynmap.forge_1_21.DmarkerCommand;
-import org.dynmap.forge_1_21.DynmapCommand;
-import org.dynmap.forge_1_21.permissions.FilePermissions;
-import org.dynmap.forge_1_21.permissions.OpPermissions;
-import org.dynmap.forge_1_21.permissions.PermissionProvider;
+import org.dynmap.forge_1_21_10.DmapCommand;
+import org.dynmap.forge_1_21_10.DmarkerCommand;
+import org.dynmap.forge_1_21_10.DynmapCommand;
+import org.dynmap.forge_1_21_10.permissions.FilePermissions;
+import org.dynmap.forge_1_21_10.permissions.OpPermissions;
+import org.dynmap.forge_1_21_10.permissions.PermissionProvider;
import org.dynmap.permissions.PermissionsHandler;
import org.dynmap.renderer.DynmapBlockState;
import org.dynmap.utils.DynmapLogger;
@@ -123,10 +124,6 @@
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
-import net.minecraftforge.eventbus.api.EventPriority;
-import net.minecraftforge.eventbus.api.SubscribeEvent;
-
-import net.minecraft.world.level.EmptyBlockGetter;
public class DynmapPlugin
{
@@ -138,7 +135,6 @@ public class DynmapPlugin
private MapManager mapManager;
private static net.minecraft.server.MinecraftServer server;
public static DynmapPlugin plugin;
- private ChatHandler chathandler;
private HashMap sortWeights = new HashMap();
// Drop world load ticket after 30 seconds
private long worldIdleTimeoutNS = 30 * 1000000000L;
@@ -199,7 +195,7 @@ private boolean checkIfKnownChunk(ForgeWorld fw, ChunkPos pos) {
private static Registry getBiomeReg() {
if (reg == null) {
- reg = server.registryAccess().registryOrThrow(Registries.BIOME);
+ reg = server.registryAccess().lookup(Registries.BIOME).get();
}
return reg;
}
@@ -251,7 +247,7 @@ public void initializeBlockStates() {
}
int lightAtten = 15;
try { // Workaround for mods with broken block state logic...
- lightAtten =bs.isSolidRender(EmptyBlockGetter.INSTANCE, BlockPos.ZERO) ? 15 : (bs.propagatesSkylightDown(EmptyBlockGetter.INSTANCE, BlockPos.ZERO) ? 0 : 1);
+ lightAtten = bs.isSolidRender() ? 15 : (bs.propagatesSkylightDown() ? 0 : 1);
} catch (Exception x) {
Log.warning(String.format("Exception while checking lighting data for block state: %s[%s]", bn, statename));
Log.verboseinfo("Exception: " + x.toString());
@@ -355,18 +351,16 @@ private class ChatMessage {
}
private ConcurrentLinkedQueue msgqueue = new ConcurrentLinkedQueue();
- public class ChatHandler {
- @SubscribeEvent
- public void handleChat(ServerChatEvent event) {
- String msg = event.getMessage().getString();
- if(!msg.startsWith("/")) {
- ChatMessage cm = new ChatMessage();
- cm.message = msg;
- cm.sender = event.getPlayer();
- msgqueue.add(cm);
- }
- }
- }
+ private boolean handleChatRegistered = false;
+ public void handleChat(final ServerChatEvent event) {
+ String msg = event.getMessage().getString();
+ if(!msg.startsWith("/")) {
+ ChatMessage cm = new ChatMessage();
+ cm.message = msg;
+ cm.sender = event.getPlayer();
+ msgqueue.add(cm);
+ }
+ }
/** TODO: depends on forge chunk manager
private static class WorldBusyRecord {
@@ -470,7 +464,7 @@ public boolean isOp(String player) {
return true;
}
}
- return (server.isSingleplayer() && player.equalsIgnoreCase(server.getSingleplayerProfile().getName()));
+ return (server.isSingleplayer() && player.equalsIgnoreCase(server.getSingleplayerProfile().name()));
}
private boolean hasPerm(ServerPlayer psender, String permission) {
@@ -531,10 +525,9 @@ public class ForgeServer extends DynmapServerInterface
public ForgeServer() {
}
- private GameProfile getProfileByName(String player) {
- GameProfileCache cache = server.getProfileCache();
- Optional val = cache.get(player);
- return val.isPresent() ? val.get() : null;
+ private NameAndId getNameAndIdByName(String player) {
+ ServerPlayer p = server.getPlayerList().getPlayer(player);
+ return (p != null) ? new NameAndId(p.getGameProfile()) : null;
}
@Override
@@ -647,7 +640,8 @@ public String getServerName()
public boolean isPlayerBanned(String pid)
{
UserBanList bl = server.getPlayerList().getBans();
- return bl.isBanned(getProfileByName(pid));
+ NameAndId nid = getNameAndIdByName(pid);
+ return (nid != null) ? bl.isBanned(nid) : false;
}
@Override
@@ -701,9 +695,9 @@ public void onPlayerBedLeave(PlayerBedLeaveEvent evt) {
break;
case PLAYER_CHAT:
- if (chathandler == null) {
- chathandler = new ChatHandler();
- MinecraftForge.EVENT_BUS.register(chathandler);
+ if (!handleChatRegistered) {
+ handleChatRegistered = true;
+ ServerChatEvent.BUS.addListener(DynmapPlugin.this::handleChat);
}
break;
@@ -811,7 +805,7 @@ public Set checkPlayerPermissions(String player, Set perms)
if (scm == null) return Collections.emptySet();
UserBanList bl = scm.getBans();
if (bl == null) return Collections.emptySet();
- if(bl.isBanned(getProfileByName(player))) {
+ if (isPlayerBanned(player)) {
return Collections.emptySet();
}
Set rslt = hasOfflinePermissions(player, perms);
@@ -830,7 +824,7 @@ public boolean checkPlayerPermission(String player, String perm)
if (scm == null) return false;
UserBanList bl = scm.getBans();
if (bl == null) return false;
- if(bl.isBanned(getProfileByName(player))) {
+ if (isPlayerBanned(player)) {
return false;
}
return hasOfflinePermission(player, perm);
@@ -921,10 +915,7 @@ public int getCurrentPlayers()
}
@SubscribeEvent
- public void tickEvent(TickEvent.ServerTickEvent event) {
- if (event.phase == TickEvent.Phase.START) {
- return;
- }
+ public void tickEvent(TickEvent.ServerTickEvent.Post event) {
cur_tick_starttime = System.nanoTime();
long elapsed = cur_tick_starttime - lasttick;
lasttick = cur_tick_starttime;
@@ -1139,7 +1130,7 @@ public ForgePlayer(ServerPlayer p)
uuid = player.getUUID();
GameProfile prof = player.getGameProfile();
if (prof != null) {
- Property textureProperty = Iterables.getFirst(prof.getProperties().get("textures"), null);
+ Property textureProperty = Iterables.getFirst(prof.properties().get("textures"), null);
if (textureProperty != null) {
TexturesPayload result = null;
@@ -1196,7 +1187,7 @@ public DynmapLocation getLocation()
return null;
}
Vec3 v = player.position();
- return toLoc(player.serverLevel(), v.x, v.y, v.z);
+ return toLoc(player.level(), v.x, v.y, v.z);
}
@Override
public String getWorld()
@@ -1206,9 +1197,9 @@ public String getWorld()
return null;
}
- if (player.serverLevel() != null)
+ if (player.level() != null)
{
- return DynmapPlugin.this.getWorld((ServerLevel)player.serverLevel()).getName();
+ return DynmapPlugin.this.getWorld((ServerLevel)player.level()).getName();
}
return null;
@@ -1555,7 +1546,7 @@ public void onStart() {
/* Register tick handler */
if(!tickregistered) {
- MinecraftForge.EVENT_BUS.register(fserver);
+ ServerTickEvent.Post.BUS.addListener(fserver::tickEvent);
tickregistered = true;
}
@@ -1694,7 +1685,7 @@ private void registerPlayerLoginListener()
}
public class WorldTracker {
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ @SubscribeEvent(priority=Priority.MONITOR)
public void handleWorldLoad(LevelEvent.Load event) {
if(!core_enabled) return;
LevelAccessor w = event.getLevel();
@@ -1708,7 +1699,7 @@ public void run() {
}
}, 0);
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ @SubscribeEvent(priority=Priority.MONITOR)
public void handleWorldUnload(LevelEvent.Unload event) {
if(!core_enabled) return;
LevelAccessor w = event.getLevel();
@@ -1730,95 +1721,124 @@ public void run() {
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ private void touchChunk(ForgeWorld fw, ChunkAccess c, String cause) {
+ int ymax = Integer.MIN_VALUE;
+ int ymin = Integer.MAX_VALUE;
+ LevelChunkSection[] sections = c.getSections();
+ // If no sections, assume all
+ if (sections.length == 0) {
+ ymax = (c.getMaxSectionY()+1) << 4;
+ ymin = c.getMinSectionY() << 4;
+ }
+ else {
+ for(int i = 0; i < sections.length; i++) {
+ if((sections[i] != null) && (sections[i].hasOnlyAir() == false)) {
+ int sy = c.getSectionYFromSectionIndex(i) << 4;
+ if (sy < ymin) ymin = sy;
+ if ((sy+16) > ymax) ymax = sy + 16;
+ }
+ }
+ }
+ ChunkPos cp = c.getPos();
+ int x = cp.x << 4;
+ int z = cp.z << 4;
+ // If not empty AND not initial scan
+ if (ymax != Integer.MIN_VALUE) {
+ mapManager.touchVolume(fw.getName(), x, ymin, z, x+15, ymax, z+15, "chunkgenerate");
+ }
+ }
+
+ @SubscribeEvent(priority=Priority.MONITOR)
public void handleChunkLoad(ChunkEvent.Load event) {
- if(!onchunkgenerate) return;
-
LevelAccessor w = event.getLevel();
- if(!(w instanceof ServerLevel)) return;
+ if (!(w instanceof ServerLevel)) return;
ChunkAccess c = event.getChunk();
- if ((c != null) && (c.getPersistedStatus() == ChunkStatus.FULL) && (c instanceof LevelChunk)) {
+ if ((c != null) && (c.getPersistedStatus() == ChunkStatus.FULL)) {
ForgeWorld fw = getWorld((ServerLevel)w, false);
if (fw != null) {
addKnownChunk(fw, c.getPos());
}
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
- public void handleChunkUnload(ChunkEvent.Unload event) {
- if(!onchunkgenerate) return;
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleChunkLightingCalculated(ChunkEvent.LightingCalculated event) {
+ LevelAccessor w = event.getLevel();
+ if (!(w instanceof ServerLevel)) return;
+ ChunkAccess c = event.getChunk();
+ if (c != null) {
+ ForgeWorld fw = getWorld((ServerLevel)w, false);
+ if (fw != null) {
+ touchChunk(fw, c, "lighting");
+ if (c.getPersistedStatus() == ChunkStatus.FULL) {
+ addKnownChunk(fw, c.getPos());
+ }
+ }
+ }
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleChunkUnload(ChunkEvent.Unload event) {
LevelAccessor w = event.getLevel();
- if(!(w instanceof ServerLevel)) return;
+ if (!(w instanceof ServerLevel)) return;
ChunkAccess c = event.getChunk();
if (c != null) {
ForgeWorld fw = getWorld((ServerLevel)w, false);
ChunkPos cp = c.getPos();
if (fw != null) {
if (!checkIfKnownChunk(fw, cp)) {
- int ymax = Integer.MIN_VALUE;
- int ymin = Integer.MAX_VALUE;
- LevelChunkSection[] sections = c.getSections();
- for(int i = 0; i < sections.length; i++) {
- if((sections[i] != null) && (sections[i].hasOnlyAir() == false)) {
- int sy = c.getSectionYFromSectionIndex(i);
- if (sy < ymin) ymin = sy;
- if ((sy+16) > ymax) ymax = sy + 16;
- }
- }
- int x = cp.x << 4;
- int z = cp.z << 4;
- // If not empty AND not initial scan
- if (ymax != Integer.MIN_VALUE) {
- //Log.info(String.format("chunkkeyerate(unload)(%s,%d,%d,%d,%d,%d,%s)", fw.getName(), x, ymin, z, x+15, ymax, z+15));
- mapManager.touchVolume(fw.getName(), x, ymin, z, x+15, ymax, z+15, "chunkgenerate");
- }
+ touchChunk(fw, c, "unload");
}
removeKnownChunk(fw, cp);
}
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
+ @SubscribeEvent(priority=Priority.MONITOR)
public void handleChunkDataSave(ChunkDataEvent.Save event) {
- if(!onchunkgenerate) return;
-
LevelAccessor w = event.getLevel();
- if(!(w instanceof ServerLevel)) return;
+ if (!(w instanceof ServerLevel)) return;
ChunkAccess c = event.getChunk();
if (c != null) {
ForgeWorld fw = getWorld((ServerLevel)w, false);
ChunkPos cp = c.getPos();
if (fw != null) {
- if (!checkIfKnownChunk(fw, cp)) {
- int ymax = Integer.MIN_VALUE;
- int ymin = Integer.MAX_VALUE;
- LevelChunkSection[] sections = c.getSections();
- for(int i = 0; i < sections.length; i++) {
- if((sections[i] != null) && (sections[i].hasOnlyAir() == false)) {
- int sy = c.getSectionYFromSectionIndex(i);
- if (sy < ymin) ymin = sy;
- if ((sy+16) > ymax) ymax = sy + 16;
- }
- }
- int x = cp.x << 4;
- int z = cp.z << 4;
- // If not empty AND not initial scan
- if (ymax != Integer.MIN_VALUE) {
- //Log.info(String.format("chunkkeyerate(save)(%s,%d,%d,%d,%d,%d,%s)", fw.getName(), x, ymin, z, x+15, ymax, z+15));
- mapManager.touchVolume(fw.getName(), x, ymin, z, x+15, ymax, z+15, "chunkgenerate");
- }
- // If cooked, add to known
- if ((c.getPersistedStatus() == ChunkStatus.FULL) && (c instanceof LevelChunk)) {
- addKnownChunk(fw, cp);
- }
- }
+ touchChunk(fw, c, "datasave");
+ // If cooked, add to known
+ if (c.getPersistedStatus() == ChunkStatus.FULL) {
+ addKnownChunk(fw, cp);
+ }
}
}
}
- @SubscribeEvent(priority=EventPriority.LOWEST)
- public void handleBlockEvent(BlockEvent event) {
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleBlockToolModificationEvent(BlockEvent.BlockToolModificationEvent event) {
+ handleBlockEvent(event);
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleBreakEvent(BlockEvent.BreakEvent event) {
+ handleBlockEvent(event);
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleCropGrowEvent(BlockEvent.CropGrowEvent event) {
+ handleBlockEvent(event);
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleEntityPlaceEvent(BlockEvent.EntityPlaceEvent event) {
+ handleBlockEvent(event);
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleFluidPlaceBlockEvent(BlockEvent.FluidPlaceBlockEvent event) {
+ handleBlockEvent(event);
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handleNeighborNotifyEvent(BlockEvent.NeighborNotifyEvent event) {
+ handleBlockEvent(event);
+ }
+ @SubscribeEvent(priority=Priority.MONITOR)
+ public void handlePortalSpawnEvent(BlockEvent.PortalSpawnEvent event) {
+ handleBlockEvent(event);
+ }
+ private void handleBlockEvent(BlockEvent event) {
if(!core_enabled) return;
- if(!onblockchange) return;
BlockUpdateRec r = new BlockUpdateRec();
r.w = event.getLevel();
if(!(r.w instanceof ServerLevel)) return; // band-aid to prevent errors in unsupported 'running in client' scenario
@@ -1849,7 +1869,22 @@ private void registerEvents()
onblockchange = true;
if ((worldTracker == null) && (onblockchange || onchunkpopulate || onchunkgenerate)) {
worldTracker = new WorldTracker();
- MinecraftForge.EVENT_BUS.register(worldTracker);
+ LevelEvent.Load.BUS.addListener(worldTracker::handleWorldLoad);
+ LevelEvent.Unload.BUS.addListener(worldTracker::handleWorldUnload);
+ if (onchunkgenerate) {
+ ChunkEvent.Load.BUS.addListener(worldTracker::handleChunkLoad);
+ ChunkDataEvent.Save.BUS.addListener(worldTracker::handleChunkDataSave);
+ ChunkEvent.LightingCalculated.BUS.addListener(worldTracker::handleChunkLightingCalculated);
+ }
+ if (onblockchange) {
+ BlockEvent.BlockToolModificationEvent.BUS.addListener(worldTracker::handleBlockToolModificationEvent);
+ BlockEvent.BreakEvent.BUS.addListener(worldTracker::handleBreakEvent);
+ BlockEvent.CropGrowEvent.BUS.addListener(worldTracker::handleCropGrowEvent);
+ BlockEvent.EntityPlaceEvent.BUS.addListener(worldTracker::handleEntityPlaceEvent);
+ BlockEvent.FluidPlaceBlockEvent.BUS.addListener(worldTracker::handleFluidPlaceBlockEvent);
+ BlockEvent.NeighborNotifyEvent.BUS.addListener(worldTracker::handleNeighborNotifyEvent);
+ BlockEvent.PortalSpawnEvent.BUS.addListener(worldTracker::handlePortalSpawnEvent);
+ }
}
// Prime the known full chunks
if (onchunkgenerate && (server.getAllLevels() != null)) {
diff --git a/forge-1.21/src/main/java/org/dynmap/forge_1_21/ForgeMapChunkCache.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ForgeMapChunkCache.java
similarity index 88%
rename from forge-1.21/src/main/java/org/dynmap/forge_1_21/ForgeMapChunkCache.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ForgeMapChunkCache.java
index 1018ebfbd..d317fd3d8 100644
--- a/forge-1.21/src/main/java/org/dynmap/forge_1_21/ForgeMapChunkCache.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ForgeMapChunkCache.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21;
+package org.dynmap.forge_1_21_10;
import java.util.List;
import java.util.NoSuchElementException;
@@ -17,8 +17,8 @@
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.chunk.ChunkAccess;
-import net.minecraft.world.level.chunk.storage.ChunkSerializer;
import net.minecraft.world.level.chunk.status.ChunkStatus;
+import net.minecraft.world.level.chunk.storage.SerializableChunkData;
/**
* Container for managing chunks - dependent upon using chunk snapshots, since
@@ -39,7 +39,8 @@ protected GenericChunk getLoadedChunk(DynmapChunk chunk) {
GenericChunk gc = null;
ChunkAccess ch = cps.getChunk(chunk.x, chunk.z, ChunkStatus.FULL, false);
if (ch != null) {
- CompoundTag nbt = ChunkSerializer.write(w, ch);
+ SerializableChunkData sc = SerializableChunkData.copyOf(w, cps.getChunk(chunk.x, chunk.z, false));
+ CompoundTag nbt = sc.write();
if (nbt != null) {
gc = parseChunkFromNBT(new NBT.NBTCompound(nbt));
}
@@ -72,10 +73,10 @@ private CompoundTag readChunk(int x, int z) {
if (rslt != null) {
CompoundTag lev = rslt;
if (lev.contains("Level")) {
- lev = lev.getCompound("Level");
+ lev = lev.getCompoundOrEmpty("Level");
}
// Don't load uncooked chunks
- String stat = lev.getString("Status");
+ String stat = lev.getStringOr("Status", null);
ChunkStatus cs = ChunkStatus.byName(stat);
if ((stat == null) ||
// Needs to be at least lighted
@@ -95,8 +96,8 @@ private CompoundTag readChunk(int x, int z) {
}
@Override
public int getFoliageColor(BiomeMap bm, int[] colormap, int x, int z) {
- return bm.getBiomeObject().map(Biome::getSpecialEffects)
- .flatMap(BiomeSpecialEffects::getFoliageColorOverride)
+ return bm.getBiomeObject().map(Biome::getSpecialEffects).
+ flatMap(BiomeSpecialEffects::getFoliageColorOverride)
.orElse(colormap[bm.biomeLookup()]);
}
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/ForgeWorld.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ForgeWorld.java
similarity index 98%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/ForgeWorld.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ForgeWorld.java
index 81bf1e7bd..fe0d374a3 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/ForgeWorld.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/ForgeWorld.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3;
+package org.dynmap.forge_1_21_10;
/**
* Forge specific implementation of DynmapWorld
*/
@@ -106,7 +106,7 @@ public boolean isTheEnd()
public DynmapLocation getSpawnLocation()
{
if(world != null) {
- BlockPos p = world.getLevel().getSharedSpawnPos();
+ BlockPos p = world.getLevel().getRespawnData().pos();
spawnloc.x = p.getX();
spawnloc.y = p.getY();
spawnloc.z = p.getZ();
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/NBT.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/NBT.java
similarity index 64%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/NBT.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/NBT.java
index 685ac88c2..26c64edb3 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/NBT.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/NBT.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3;
+package org.dynmap.forge_1_21_10;
import org.dynmap.common.chunk.GenericBitStorage;
import org.dynmap.common.chunk.GenericNBTCompound;
@@ -7,6 +7,7 @@
import java.util.Set;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
+import net.minecraft.nbt.Tag;
import net.minecraft.util.SimpleBitStorage;
public class NBT {
@@ -18,7 +19,7 @@ public NBTCompound(CompoundTag t) {
}
@Override
public Set getAllKeys() {
- return obj.getAllKeys();
+ return obj.keySet();
}
@Override
public boolean contains(String s) {
@@ -26,63 +27,74 @@ public boolean contains(String s) {
}
@Override
public boolean contains(String s, int i) {
- return obj.contains(s, i);
+ // Like contains, but with an extra constraint on type
+ Tag base = obj.get(s);
+ if (base == null)
+ return false;
+ byte type = base.getId();
+ if (type == (byte) i)
+ return true;
+ else if (i != TAG_ANY_NUMERIC)
+ return false;
+ return type == TAG_BYTE || type == TAG_SHORT || type == TAG_INT || type == TAG_LONG || type == TAG_FLOAT
+ || type == TAG_DOUBLE;
}
@Override
public byte getByte(String s) {
- return obj.getByte(s);
+ return obj.getByteOr(s, (byte)0);
}
@Override
public short getShort(String s) {
- return obj.getShort(s);
+ return obj.getShortOr(s, (short)0);
}
@Override
public int getInt(String s) {
- return obj.getInt(s);
+ return obj.getIntOr(s, (int)0);
}
@Override
public long getLong(String s) {
- return obj.getLong(s);
+ return obj.getLongOr(s, (long)0);
}
@Override
public float getFloat(String s) {
- return obj.getFloat(s);
+ return obj.getFloatOr(s, (float)0);
}
@Override
public double getDouble(String s) {
- return obj.getDouble(s);
+ return obj.getDoubleOr(s, (double)0);
}
@Override
public String getString(String s) {
- return obj.getString(s);
+ return obj.getStringOr(s, "");
}
@Override
public byte[] getByteArray(String s) {
- return obj.getByteArray(s);
+ return obj.getByteArray(s).orElseGet(() -> new byte[0]);
}
@Override
public int[] getIntArray(String s) {
- return obj.getIntArray(s);
+ return obj.getIntArray(s).orElseGet(() -> new int[0]);
}
@Override
public long[] getLongArray(String s) {
- return obj.getLongArray(s);
+ return obj.getLongArray(s).orElseGet(() -> new long[0]);
}
@Override
public GenericNBTCompound getCompound(String s) {
- return new NBTCompound(obj.getCompound(s));
+ return new NBTCompound(obj.getCompoundOrEmpty(s));
}
@Override
public GenericNBTList getList(String s, int i) {
- return new NBTList(obj.getList(s, i));
+ // i argument used to be used to constrain list type, but nbt lists no longer have types as of 1.21.5
+ return new NBTList(obj.getListOrEmpty(s));
}
@Override
public boolean getBoolean(String s) {
- return obj.getBoolean(s);
+ return obj.getBooleanOr(s, false);
}
@Override
public String getAsString(String s) {
- return obj.get(s).getAsString();
+ return obj.get(s).asString().orElse("");
}
@Override
public GenericBitStorage makeBitStorage(int bits, int count, long[] data) {
@@ -103,11 +115,11 @@ public int size() {
}
@Override
public String getString(int idx) {
- return obj.getString(idx);
+ return obj.getStringOr(idx, "");
}
@Override
public GenericNBTCompound getCompound(int idx) {
- return new NBTCompound(obj.getCompound(idx));
+ return new NBTCompound(obj.getCompoundOrEmpty(idx));
}
public String toString() {
return obj.toString();
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/Proxy.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/Proxy.java
similarity index 93%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/Proxy.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/Proxy.java
index 6e945f7d0..1614b58ae 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/Proxy.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/Proxy.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3;
+package org.dynmap.forge_1_21_10;
import net.minecraft.server.MinecraftServer;
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/VersionCheck.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/VersionCheck.java
similarity index 99%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/VersionCheck.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/VersionCheck.java
index b695d9cf6..3843ec4d1 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/VersionCheck.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/VersionCheck.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3;
+package org.dynmap.forge_1_21_10;
import java.io.BufferedReader;
import java.io.InputStreamReader;
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/permissions/FilePermissions.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/FilePermissions.java
similarity index 96%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/permissions/FilePermissions.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/FilePermissions.java
index 5526e3d1a..c3019edf2 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/permissions/FilePermissions.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/FilePermissions.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3.permissions;
+package org.dynmap.forge_1_21_10.permissions;
import java.io.File;
import java.util.HashMap;
@@ -8,7 +8,7 @@
import org.dynmap.ConfigurationNode;
import org.dynmap.Log;
-import org.dynmap.forge_1_21_3.DynmapPlugin;
+import org.dynmap.forge_1_21_10.DynmapPlugin;
import net.minecraft.server.level.ServerPlayer;
diff --git a/forge-1.21/src/main/java/org/dynmap/forge_1_21/permissions/OpPermissions.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/OpPermissions.java
similarity index 93%
rename from forge-1.21/src/main/java/org/dynmap/forge_1_21/permissions/OpPermissions.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/OpPermissions.java
index f4e642e44..66777ddae 100644
--- a/forge-1.21/src/main/java/org/dynmap/forge_1_21/permissions/OpPermissions.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/OpPermissions.java
@@ -1,10 +1,10 @@
-package org.dynmap.forge_1_21.permissions;
+package org.dynmap.forge_1_21_10.permissions;
import java.util.HashSet;
import java.util.Set;
import org.dynmap.Log;
-import org.dynmap.forge_1_21.DynmapPlugin;
+import org.dynmap.forge_1_21_10.DynmapPlugin;
import net.minecraft.server.level.ServerPlayer;
diff --git a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/permissions/PermissionProvider.java b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/PermissionProvider.java
similarity index 89%
rename from forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/permissions/PermissionProvider.java
rename to forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/PermissionProvider.java
index f3c7f3543..e75281485 100644
--- a/forge-1.21.3/src/main/java/org/dynmap/forge_1_21_3/permissions/PermissionProvider.java
+++ b/forge-1.21.10/src/main/java/org/dynmap/forge_1_21_10/permissions/PermissionProvider.java
@@ -1,4 +1,4 @@
-package org.dynmap.forge_1_21_3.permissions;
+package org.dynmap.forge_1_21_10.permissions;
import java.util.Set;
diff --git a/forge-1.21.3/src/main/resources/META-INF/accesstransformer.cfg b/forge-1.21.10/src/main/resources/META-INF/accesstransformer.cfg
similarity index 100%
rename from forge-1.21.3/src/main/resources/META-INF/accesstransformer.cfg
rename to forge-1.21.10/src/main/resources/META-INF/accesstransformer.cfg
diff --git a/forge-1.21.10/src/main/resources/META-INF/mods.toml b/forge-1.21.10/src/main/resources/META-INF/mods.toml
new file mode 100644
index 000000000..163811904
--- /dev/null
+++ b/forge-1.21.10/src/main/resources/META-INF/mods.toml
@@ -0,0 +1,26 @@
+modLoader="javafml"
+loaderVersion="[60,)"
+issueTrackerURL="https://github.com/webbukkit/dynmap/issues"
+license="Apache Public License v2"
+[[mods]]
+modId="dynmap"
+version="${version}"
+displayName="Dynmap"
+authors="mikeprimm"
+description='''
+Dynamic, Google-maps style rendered maps for your Minecraft server
+'''
+
+[[dependencies.dynmap]]
+ modId="forge"
+ mandatory=true
+ versionRange="[60,)"
+ ordering="NONE"
+ # Side this dependency is applied on - BOTH, CLIENT or SERVER
+ side="SERVER"
+[[dependencies.dynmap]]
+ modId="minecraft"
+ mandatory=true
+ versionRange="[1.21.10,1.21.11)"
+ ordering="NONE"
+ side="SERVER"
diff --git a/forge-1.21.3/src/main/resources/configuration.txt b/forge-1.21.10/src/main/resources/configuration.txt
similarity index 100%
rename from forge-1.21.3/src/main/resources/configuration.txt
rename to forge-1.21.10/src/main/resources/configuration.txt
diff --git a/forge-1.21.3/src/main/resources/pack.mcmeta b/forge-1.21.10/src/main/resources/pack.mcmeta
similarity index 100%
rename from forge-1.21.3/src/main/resources/pack.mcmeta
rename to forge-1.21.10/src/main/resources/pack.mcmeta
diff --git a/forge-1.21.3/src/main/resources/permissions.yml.example b/forge-1.21.10/src/main/resources/permissions.yml.example
similarity index 100%
rename from forge-1.21.3/src/main/resources/permissions.yml.example
rename to forge-1.21.10/src/main/resources/permissions.yml.example
diff --git a/forge-1.21.11/.gitignore b/forge-1.21.11/.gitignore
new file mode 100644
index 000000000..84c048a73
--- /dev/null
+++ b/forge-1.21.11/.gitignore
@@ -0,0 +1 @@
+/build/
diff --git a/forge-1.21.11/build.gradle b/forge-1.21.11/build.gradle
new file mode 100644
index 000000000..854ab09c8
--- /dev/null
+++ b/forge-1.21.11/build.gradle
@@ -0,0 +1,80 @@
+buildscript {
+ repositories {
+ maven { url = 'https://files.minecraftforge.net/maven' }
+ jcenter()
+ mavenCentral()
+ }
+ dependencies {
+ classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '[6.0.24,6.2)', changing: true
+ }
+}
+apply plugin: 'net.minecraftforge.gradle'
+//apply plugin: 'com.github.johnrengelman.shadow'
+apply plugin: 'eclipse'
+
+eclipse {
+ project {
+ name = "Dynmap(Forge-1.21.11)"
+ }
+}
+
+sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaLanguageVersion.of(21) // Need this here so eclipse task generates correctly.
+
+println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
+
+ext.buildNumber = System.getenv().BUILD_NUMBER ?: "Dev"
+
+minecraft {
+ mappings channel: 'official', version: '1.21.11'
+ accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
+ reobf = false
+ copyIdeResources = true
+ runs {
+ server {
+ property 'eventbus.api.strictRuntimeChecks', 'true'
+ workingDirectory project.file('run').canonicalPath
+ }
+ }
+}
+
+project.archivesBaseName = "${project.archivesBaseName}-forge-1.21.11"
+
+dependencies {
+ implementation project(path: ":DynmapCore", configuration: "shadow")
+ implementation project(path: ':DynmapCoreAPI')
+ annotationProcessor 'net.minecraftforge:eventbus-validator:7.0-beta.7'
+
+ minecraft 'net.minecraftforge:forge:1.21.11-61.0.5'
+}
+
+processResources
+{
+ filesMatching('META-INF/mods.toml') {
+ // replace version and mcversion
+ expand(
+ version: project.version + '-' + project.ext.buildNumber,
+ mcversion: "1.21.11"
+ )
+ }
+}
+
+shadowJar {
+ dependencies {
+ include(dependency(':DynmapCore'))
+ include(dependency("commons-codec:commons-codec:"))
+ exclude("META-INF/maven/**")
+ exclude("META-INF/services/**")
+ }
+ relocate('org.apache.commons.codec', 'org.dynmap.forge_1_21_11.commons.codec')
+
+ archiveBaseName = "Dynmap"
+ archiveClassifier = "forge-1.21.11"
+ destinationDirectory = file '../target'
+}
+
+shadowJar.doLast {
+ task ->
+ ant.checksum file: task.archivePath
+}
+
+build.dependsOn(shadowJar)
diff --git a/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/ClientProxy.java b/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/ClientProxy.java
new file mode 100644
index 000000000..d76cdbc67
--- /dev/null
+++ b/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/ClientProxy.java
@@ -0,0 +1,6 @@
+package org.dynmap.forge_1_21_11;
+
+public class ClientProxy extends Proxy {
+ public ClientProxy() {
+ }
+}
diff --git a/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/DynmapMod.java b/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/DynmapMod.java
new file mode 100644
index 000000000..3f5bc5521
--- /dev/null
+++ b/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/DynmapMod.java
@@ -0,0 +1,112 @@
+package org.dynmap.forge_1_21_11;
+
+import java.io.File;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.dynmap.DynmapCommonAPI;
+import org.dynmap.DynmapCommonAPIListener;
+import org.dynmap.Log;
+import org.dynmap.forge_1_21_11.DynmapPlugin.OurLog;
+
+import net.minecraft.server.MinecraftServer;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.server.ServerAboutToStartEvent;
+import net.minecraftforge.event.server.ServerStartedEvent;
+import net.minecraftforge.event.server.ServerStartingEvent;
+import net.minecraftforge.event.server.ServerStoppingEvent;
+import net.minecraftforge.eventbus.api.bus.BusGroup;
+import net.minecraftforge.eventbus.api.bus.EventBus;
+import net.minecraftforge.eventbus.api.listener.SubscribeEvent;
+import net.minecraftforge.fml.DistExecutor;
+import net.minecraftforge.fml.IExtensionPoint;
+import net.minecraftforge.fml.ModList;
+import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
+import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
+
+@Mod("dynmap")
+public class DynmapMod
+{
+ // The instance of your mod that Forge uses.
+ public static DynmapMod instance;
+ public static BusGroup modBusGroup;
+
+ // Says where the client and server 'proxy' code is loaded.
+ public static Proxy proxy = DistExecutor.runForDist(() -> ClientProxy::new, () -> Proxy::new);
+
+ public static DynmapPlugin plugin;
+ public static File jarfile;
+ public static String ver;
+ public static boolean useforcedchunks;
+
+ public class APICallback extends DynmapCommonAPIListener {
+ @Override
+ public void apiListenerAdded() {
+ if(plugin == null) {
+ plugin = proxy.startServer(server);
+ }
+ }
+ @Override
+ public void apiEnabled(DynmapCommonAPI api) {
+ }
+ }
+
+ public DynmapMod(FMLJavaModLoadingContext context) {
+ instance = this;
+
+ modBusGroup = context.getModBusGroup();
+
+ // Register the commonSetup method for modloading
+ FMLCommonSetupEvent.getBus(modBusGroup).addListener(this::setup);
+
+ ServerStartedEvent.BUS.addListener(this::onServerStarted);
+ ServerAboutToStartEvent.BUS.addListener(this::onServerStarting);
+ ServerStoppingEvent.BUS.addListener(this::onServerStopping);
+
+ context.registerExtensionPoint(IExtensionPoint.DisplayTest.class,
+ ()->new IExtensionPoint.DisplayTest(()->IExtensionPoint.DisplayTest.IGNORESERVERONLY, (remote, isServer)-> true));
+
+ Log.setLogger(new OurLog());
+ org.dynmap.modsupport.ModSupportImpl.init();
+ }
+
+ public void setup(final FMLCommonSetupEvent event)
+ {
+ //TOOO
+ jarfile = ModList.get().getModFileById("dynmap").getFile().getFilePath().toFile();
+
+ ver = ModList.get().getModContainerById("dynmap").get().getModInfo().getVersion().toString();
+
+ //// Load configuration file - use suggested (config/WesterosBlocks.cfg)
+ //Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
+ //try {
+ // cfg.load();
+ //
+ // useforcedchunks = cfg.get("Settings", "UseForcedChunks", true).getBoolean(true);
+ //}
+ //finally
+ //{
+ // cfg.save();
+ //}
+ }
+
+ private MinecraftServer server;
+
+ public void onServerStarting(ServerAboutToStartEvent event) {
+ server = event.getServer();
+ if(plugin == null)
+ plugin = proxy.startServer(server);
+ plugin.onStarting(server.getCommands().getDispatcher());
+ }
+
+ public void onServerStarted(ServerStartedEvent event) {
+ DynmapCommonAPIListener.register(new APICallback());
+ plugin.serverStarted();
+ }
+
+ public void onServerStopping(ServerStoppingEvent event)
+ {
+ proxy.stopServer(plugin);
+ plugin = null;
+ }
+}
diff --git a/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/DynmapPlugin.java b/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/DynmapPlugin.java
new file mode 100644
index 000000000..d02010d88
--- /dev/null
+++ b/forge-1.21.11/src/main/java/org/dynmap/forge_1_21_11/DynmapPlugin.java
@@ -0,0 +1,2076 @@
+package org.dynmap.forge_1_21_11;
+
+import java.io.File;
+import java.io.InputStream;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.PriorityQueue;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
+import java.util.regex.Pattern;
+
+import net.minecraft.commands.CommandSource;
+import net.minecraft.commands.CommandSourceStack;
+import net.minecraft.commands.Commands;
+import net.minecraft.core.BlockPos;
+import net.minecraft.core.IdMapper;
+import net.minecraft.core.Registry;
+import net.minecraft.core.registries.BuiltInRegistries;
+import net.minecraft.core.registries.Registries;
+import net.minecraft.network.Connection;
+import net.minecraft.network.chat.Component;
+import net.minecraft.network.protocol.game.ClientboundSetSubtitleTextPacket;
+import net.minecraft.network.protocol.game.ClientboundSetTitleTextPacket;
+import net.minecraft.network.protocol.game.ClientboundSetTitlesAnimationPacket;
+import net.minecraft.resources.Identifier;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.level.ChunkHolder;
+import net.minecraft.server.level.ServerLevel;
+import net.minecraft.server.level.ServerPlayer;
+import net.minecraft.server.network.ServerGamePacketListenerImpl;
+import net.minecraft.server.players.NameAndId;
+import net.minecraft.server.players.UserBanList;
+import net.minecraft.tags.BlockTags;
+import net.minecraft.world.entity.Pose;
+import net.minecraft.world.level.ChunkPos;
+import net.minecraft.world.level.LevelAccessor;
+import net.minecraft.world.level.biome.Biome;
+import net.minecraft.world.level.block.Block;
+import net.minecraft.world.level.block.LiquidBlock;
+import net.minecraft.world.level.block.state.BlockState;
+import net.minecraft.world.level.chunk.ChunkAccess;
+import net.minecraft.world.level.chunk.LevelChunk;
+import net.minecraft.world.level.chunk.LevelChunkSection;
+import net.minecraft.world.phys.Vec3;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.ServerChatEvent;
+import net.minecraftforge.event.TickEvent;
+import net.minecraftforge.event.TickEvent.ServerTickEvent;
+import net.minecraftforge.event.entity.player.PlayerEvent.PlayerChangedDimensionEvent;
+import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent;
+import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent;
+import net.minecraftforge.event.entity.player.PlayerEvent.PlayerRespawnEvent;
+import net.minecraftforge.event.level.BlockEvent;
+import net.minecraftforge.event.level.ChunkDataEvent;
+import net.minecraftforge.event.level.ChunkEvent;
+import net.minecraftforge.event.level.LevelEvent;
+import net.minecraftforge.eventbus.api.listener.Priority;
+import net.minecraftforge.eventbus.api.listener.SubscribeEvent;
+import net.minecraftforge.fml.ModList;
+import net.minecraftforge.fml.ModContainer;
+import net.minecraftforge.fml.loading.LoadingModList;
+import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo;
+import net.minecraftforge.fml.loading.moddiscovery.ModInfo;
+import net.minecraft.world.level.chunk.status.ChunkStatus;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.maven.artifact.versioning.ArtifactVersion;
+import org.dynmap.ConfigurationNode;
+import org.dynmap.DynmapChunk;
+import org.dynmap.DynmapCommonAPIListener;
+import org.dynmap.DynmapCore;
+import org.dynmap.DynmapLocation;
+import org.dynmap.DynmapWorld;
+import org.dynmap.Log;
+import org.dynmap.MapManager;
+import org.dynmap.PlayerList;
+import org.dynmap.common.BiomeMap;
+import org.dynmap.common.DynmapCommandSender;
+import org.dynmap.common.DynmapPlayer;
+import org.dynmap.common.DynmapServerInterface;
+import org.dynmap.common.DynmapListenerManager.EventType;
+import org.dynmap.common.chunk.GenericChunkCache;
+import org.dynmap.forge_1_21_11.DmapCommand;
+import org.dynmap.forge_1_21_11.DmarkerCommand;
+import org.dynmap.forge_1_21_11.DynmapCommand;
+import org.dynmap.forge_1_21_11.permissions.FilePermissions;
+import org.dynmap.forge_1_21_11.permissions.OpPermissions;
+import org.dynmap.forge_1_21_11.permissions.PermissionProvider;
+import org.dynmap.permissions.PermissionsHandler;
+import org.dynmap.renderer.DynmapBlockState;
+import org.dynmap.utils.DynmapLogger;
+import org.dynmap.utils.MapChunkCache;
+import org.dynmap.utils.VisibilityLimit;
+
+import com.google.common.collect.Iterables;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
+import com.mojang.authlib.GameProfile;
+import com.mojang.authlib.properties.Property;
+import com.mojang.brigadier.CommandDispatcher;
+import com.mojang.brigadier.arguments.StringArgumentType;
+import com.mojang.brigadier.builder.RequiredArgumentBuilder;
+import com.mojang.brigadier.exceptions.CommandSyntaxException;
+
+import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
+import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
+
+public class DynmapPlugin
+{
+ private DynmapCore core;
+ private PermissionProvider permissions;
+ private boolean core_enabled;
+ public GenericChunkCache sscache;
+ public PlayerList playerList;
+ private MapManager mapManager;
+ private static net.minecraft.server.MinecraftServer server;
+ public static DynmapPlugin plugin;
+ private HashMap sortWeights = new HashMap();
+ // Drop world load ticket after 30 seconds
+ private long worldIdleTimeoutNS = 30 * 1000000000L;
+ private HashMap worlds = new HashMap();
+ private LevelAccessor last_world;
+ private ForgeWorld last_fworld;
+ private Map players = new HashMap();
+ //TODO private ForgeMetrics metrics;
+ private HashSet modsused = new HashSet();
+ private ForgeServer fserver = new ForgeServer();
+ private boolean tickregistered = false;
+ // TPS calculator
+ private double tps;
+ private long lasttick;
+ private long avgticklen;
+ // Per tick limit, in nsec
+ private long perTickLimit = (50000000); // 50 ms
+ private boolean useSaveFolder = true;
+
+ private static final String[] TRIGGER_DEFAULTS = { "blockupdate", "chunkpopulate", "chunkgenerate" };
+
+ private static final Pattern patternControlCode = Pattern.compile("(?i)\\u00A7[0-9A-FK-OR]");
+
+ public static class BlockUpdateRec {
+ LevelAccessor w;
+ String wid;
+ int x, y, z;
+ }
+ ConcurrentLinkedQueue blockupdatequeue = new ConcurrentLinkedQueue();
+
+ public static DynmapBlockState[] stateByID;
+
+ private Map knownloadedchunks = new HashMap();
+ private boolean didInitialKnownChunks = false;
+ private void addKnownChunk(ForgeWorld fw, ChunkPos pos) {
+ LongOpenHashSet cset = knownloadedchunks.get(fw.getName());
+ if (cset == null) {
+ cset = new LongOpenHashSet();
+ knownloadedchunks.put(fw.getName(), cset);
+ }
+ cset.add(pos.toLong());
+ }
+ private void removeKnownChunk(ForgeWorld fw, ChunkPos pos) {
+ LongOpenHashSet cset = knownloadedchunks.get(fw.getName());
+ if (cset != null) {
+ cset.remove(pos.toLong());
+ }
+ }
+ private boolean checkIfKnownChunk(ForgeWorld fw, ChunkPos pos) {
+ LongOpenHashSet cset = knownloadedchunks.get(fw.getName());
+ if (cset != null) {
+ return cset.contains(pos.toLong());
+ }
+ return false;
+ }
+
+ private static Registry reg = null;
+
+ private static Registry getBiomeReg() {
+ if (reg == null) {
+ reg = server.registryAccess().lookup(Registries.BIOME).get();
+ }
+ return reg;
+ }
+
+ /**
+ * Initialize block states (org.dynmap.blockstate.DynmapBlockState)
+ */
+ public void initializeBlockStates() {
+ stateByID = new DynmapBlockState[512*32]; // Simple map - scale as needed
+ Arrays.fill(stateByID, DynmapBlockState.AIR); // Default to air
+
+ IdMapper bsids = Block.BLOCK_STATE_REGISTRY;
+
+ DynmapBlockState basebs = null;
+ Block baseb = null;
+ int baseidx = 0;
+
+ Iterator iter = bsids.iterator();
+ DynmapBlockState.Builder bld = new DynmapBlockState.Builder();
+ while (iter.hasNext()) {
+ BlockState bs = iter.next();
+ int idx = bsids.getId(bs);
+ if (idx >= stateByID.length) {
+ int plen = stateByID.length;
+ stateByID = Arrays.copyOf(stateByID, idx*11/10); // grow array by 10%
+ Arrays.fill(stateByID, plen, stateByID.length, DynmapBlockState.AIR);
+ }
+ Block b = bs.getBlock();
+ // If this is new block vs last, it's the base block state
+ if (b != baseb) {
+ basebs = null;
+ baseidx = idx;
+ baseb = b;
+ }
+ Identifier ui = BuiltInRegistries.BLOCK.getKey(b);
+
+ if (ui == null) {
+ continue;
+ }
+ String bn = ui.getNamespace() + ":" + ui.getPath();
+ // Only do defined names, and not "air"
+ if (!bn.equals(DynmapBlockState.AIR_BLOCK)) {
+ String statename = "";
+ for (net.minecraft.world.level.block.state.properties.Property> p : bs.getProperties()) {
+ if (statename.length() > 0) {
+ statename += ",";
+ }
+ statename += p.getName() + "=" + bs.getValue(p).toString();
+ }
+ int lightAtten = 15;
+ try { // Workaround for mods with broken block state logic...
+ lightAtten = bs.isSolidRender() ? 15 : (bs.propagatesSkylightDown() ? 0 : 1);
+ } catch (Exception x) {
+ Log.warning(String.format("Exception while checking lighting data for block state: %s[%s]", bn, statename));
+ Log.verboseinfo("Exception: " + x.toString());
+ }
+ //Log.info("statename=" + bn + "[" + statename + "], lightAtten=" + lightAtten);
+ // Fill in base attributes
+ bld.setBaseState(basebs).setStateIndex(idx - baseidx).setBlockName(bn).setStateName(statename).setLegacyBlockID(idx).setAttenuatesLight(lightAtten);
+ if (bs.getSoundType() != null) { bld.setMaterial(bs.getSoundType().toString()); }
+ if (bs.isSolid()) { bld.setSolid(); }
+ if (bs.isAir()) { bld.setAir(); }
+ if (bs.is(BlockTags.LOGS)) { bld.setLog(); }
+ if (bs.is(BlockTags.LEAVES)) { bld.setLeaves(); }
+ if ((!bs.getFluidState().isEmpty()) && !(bs.getBlock() instanceof LiquidBlock)) {
+ bld.setWaterlogged();
+ }
+ DynmapBlockState dbs = bld.build(); // Build state
+ stateByID[idx] = dbs;
+ if (basebs == null) { basebs = dbs; }
+ }
+ }
+ for (int gidx = 0; gidx < DynmapBlockState.getGlobalIndexMax(); gidx++) {
+ DynmapBlockState bs = DynmapBlockState.getStateByGlobalIndex(gidx);
+ //Log.info(gidx + ":" + bs.toString() + ", gidx=" + bs.globalStateIndex + ", sidx=" + bs.stateIndex);
+ }
+ }
+
+ //public static final Item getItemByID(int id) {
+ // return Item.getItemById(id);
+ //}
+
+ private static Biome[] biomelist = null;
+
+ public static final Biome[] getBiomeList() {
+ if (biomelist == null) {
+ biomelist = new Biome[256];
+ Iterator iter = getBiomeReg().iterator();
+ while (iter.hasNext()) {
+ Biome b = iter.next();
+ int bidx = getBiomeReg().getId(b);
+ if (bidx >= biomelist.length) {
+ biomelist = Arrays.copyOf(biomelist, bidx + biomelist.length);
+ }
+ biomelist[bidx] = b;
+ }
+ }
+ return biomelist;
+ }
+ //public static final NetworkManager getNetworkManager(ServerPlayNetHandler nh) {
+ // return nh.netManager;
+ //}
+
+ private ForgePlayer getOrAddPlayer(ServerPlayer p) {
+ String name = p.getName().getString();
+ ForgePlayer fp = players.get(name);
+ if(fp != null) {
+ fp.player = p;
+ }
+ else {
+ fp = new ForgePlayer(p);
+ players.put(name, fp);
+ }
+ return fp;
+ }
+
+ private static class TaskRecord implements Comparable