forked from upstream/ViaVersion
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
736ba3c53c | ||
|
|
6d47c5af61 | ||
|
|
2b42e38300 | ||
|
|
4260095390 | ||
|
|
769498661d | ||
|
|
1c25e5011a | ||
|
|
bb3de8ef8d | ||
|
|
770dd485ec | ||
|
|
964a1b2581 | ||
|
|
bb1a5e745a | ||
|
|
a0a31641e3 | ||
|
|
4e493f61cd | ||
|
|
ae7f1f07d5 | ||
|
|
be89cb52b3 | ||
|
|
b63765a970 | ||
|
|
2047b42d78 | ||
|
|
a1179887cd | ||
|
|
b2a3512bbd | ||
|
|
2fe81b5b70 | ||
|
|
1da2fb89c4 | ||
|
|
53e18c1f8d | ||
|
|
9460a65f02 | ||
|
|
150a516006 |
No files matched your search
@@ -1 +0,0 @@
|
||||
.gitea/CODEOWNERS linguist-detectable=false
|
||||
@@ -1,3 +0,0 @@
|
||||
# Pull requests request review from the eligible staff team(s).
|
||||
# One approval from either an Admin or Developer satisfies branch protection.
|
||||
* @trueog/Admins @trueog/Developers
|
||||
@@ -6,9 +6,11 @@ updates:
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
open-pull-requests-limit: 10
|
||||
- package-ecosystem: "gradle"
|
||||
cooldown:
|
||||
default-days: 7
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "monthly"
|
||||
open-pull-requests-limit: 10
|
||||
@@ -11,11 +11,11 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Gradle
|
||||
uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
|
||||
uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0
|
||||
with:
|
||||
cache-disabled: false
|
||||
cache-provider: basic
|
||||
|
||||
@@ -16,11 +16,11 @@ jobs:
|
||||
timeout-minutes: 30
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Set up Gradle
|
||||
uses: gradle/actions/setup-gradle@50e97c2cd7a37755bbfafc9c5b7cafaece252f6e # v6.1.0
|
||||
uses: gradle/actions/setup-gradle@3f131e8634966bd73d06cc69884922b02e6faf92 # v6.2.0
|
||||
with:
|
||||
cache-disabled: false
|
||||
cache-provider: basic
|
||||
|
||||
@@ -104,7 +104,7 @@ public class MappingDataLoader {
|
||||
throw new IllegalArgumentException("Unknown global identifier key: " + registry);
|
||||
}
|
||||
if (globalId < 0 || globalId >= array.length) {
|
||||
throw new IllegalArgumentException("Unknown global identifier index: " + globalId);
|
||||
throw new IllegalArgumentException("Unknown global identifier index: " + registry + "/" + globalId);
|
||||
}
|
||||
return array[globalId];
|
||||
}
|
||||
@@ -262,6 +262,13 @@ public class MappingDataLoader {
|
||||
// Assign the changed value
|
||||
addConsumer.addTo(mappings, changedId, values[i]);
|
||||
}
|
||||
|
||||
// Fill the remainder
|
||||
if (fillBetween && nextUnhandledId != size) {
|
||||
for (int id = nextUnhandledId; id < size; id++) {
|
||||
addConsumer.addTo(mappings, id, id);
|
||||
}
|
||||
}
|
||||
} else if (strategy == IDENTITY_ID) {
|
||||
final IntTag sizeTag = tag.getIntTag("size");
|
||||
return new IdentityMappings(sizeTag.asInt(), mappedSize);
|
||||
@@ -315,6 +322,10 @@ public class MappingDataLoader {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mappedGlobalId == -1) {
|
||||
throw new IllegalArgumentException("Mapped global id -1 for unmapped global id: " + key + "/" + unmappedIdentifier + " (" + unmappedGlobalId + ")");
|
||||
}
|
||||
|
||||
identity = false;
|
||||
unmappedIdentifiers.add(unmappedIdentifier);
|
||||
mappedIdentifiers.add(identifierFromGlobalId(key, mappedGlobalId));
|
||||
|
||||
@@ -35,6 +35,7 @@ import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_11;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_2;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.AdventureModePredicate;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrim;
|
||||
import com.viaversion.viaversion.api.minecraft.item.data.ArmorTrimMaterial;
|
||||
|
||||
+2
-2
@@ -34,7 +34,7 @@ public class StructuredDataKeys1_20_5 extends VersionedStructuredDataKeys {
|
||||
|
||||
public StructuredDataKeys1_20_5(final VersionedTypesHolder types) {
|
||||
this.container = add("container", types.itemArray());
|
||||
this.chargedProjectiles = add("charged_projectiles", types.itemArray());
|
||||
this.bundleContents = add("bundle_contents", types.itemArray());
|
||||
this.chargedProjectiles = add("charged_projectiles", types.itemArray().withMaxLength(1024));
|
||||
this.bundleContents = add("bundle_contents", types.itemArray().withMaxLength(1024));
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -36,8 +36,8 @@ public class StructuredDataKeys1_21_2 extends VersionedStructuredDataKeys {
|
||||
|
||||
public StructuredDataKeys1_21_2(final VersionedTypesHolder types) {
|
||||
this.container = add("container", new ContainerContentsType(types.optionalItemTemplate()));
|
||||
this.chargedProjectiles = add("charged_projectiles", types.itemTemplateArray());
|
||||
this.bundleContents = add("bundle_contents", types.itemTemplateArray());
|
||||
this.chargedProjectiles = add("charged_projectiles", types.itemTemplateArray().withMaxLength(1024));
|
||||
this.bundleContents = add("bundle_contents", types.itemTemplateArray().withMaxLength(1024));
|
||||
this.useRemainder = add("use_remainder", types.itemTemplate());
|
||||
}
|
||||
}
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2026 ViaVersion and contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.viaversion.viaversion.api.minecraft.data.version;
|
||||
|
||||
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
|
||||
|
||||
public class StructuredDataKeys26_2 extends StructuredDataKeys1_21_11 {
|
||||
|
||||
public final StructuredDataKey<Item> sulfurCubeContent;
|
||||
|
||||
public StructuredDataKeys26_2(final VersionedTypesHolder types) {
|
||||
super(types);
|
||||
this.sulfurCubeContent = add("sulfur_cube_content", types.item());
|
||||
}
|
||||
}
|
||||
+332
@@ -0,0 +1,332 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2026 ViaVersion and contributors
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
package com.viaversion.viaversion.api.minecraft.entities;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.viaversion.viaversion.api.protocol.Protocol;
|
||||
import com.viaversion.viaversion.util.EntityTypeUtil;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
import java.util.Locale;
|
||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||
|
||||
public enum EntityTypes26_2 implements EntityType {
|
||||
|
||||
ENTITY(null, null),
|
||||
|
||||
AREA_EFFECT_CLOUD(ENTITY),
|
||||
END_CRYSTAL(ENTITY),
|
||||
EVOKER_FANGS(ENTITY),
|
||||
EXPERIENCE_ORB(ENTITY),
|
||||
EYE_OF_ENDER(ENTITY),
|
||||
FALLING_BLOCK(ENTITY),
|
||||
ITEM(ENTITY),
|
||||
TNT(ENTITY),
|
||||
OMINOUS_ITEM_SPAWNER(ENTITY),
|
||||
MARKER(ENTITY),
|
||||
LIGHTNING_BOLT(ENTITY),
|
||||
INTERACTION(ENTITY),
|
||||
|
||||
DISPLAY(ENTITY, null),
|
||||
BLOCK_DISPLAY(DISPLAY),
|
||||
ITEM_DISPLAY(DISPLAY),
|
||||
TEXT_DISPLAY(DISPLAY),
|
||||
|
||||
// Hanging entities
|
||||
HANGING_ENTITY(ENTITY, null),
|
||||
LEASH_KNOT(HANGING_ENTITY),
|
||||
PAINTING(HANGING_ENTITY),
|
||||
ITEM_FRAME(HANGING_ENTITY),
|
||||
GLOW_ITEM_FRAME(ITEM_FRAME),
|
||||
|
||||
// Projectiles
|
||||
PROJECTILE(ENTITY, null),
|
||||
ITEM_PROJECTILE(PROJECTILE, null),
|
||||
SNOWBALL(ITEM_PROJECTILE),
|
||||
ENDER_PEARL(ITEM_PROJECTILE),
|
||||
EGG(ITEM_PROJECTILE),
|
||||
EXPERIENCE_BOTTLE(ITEM_PROJECTILE),
|
||||
FIREWORK_ROCKET(PROJECTILE),
|
||||
LLAMA_SPIT(PROJECTILE),
|
||||
SHULKER_BULLET(PROJECTILE),
|
||||
FISHING_BOBBER(PROJECTILE),
|
||||
WITHER_SKULL(PROJECTILE),
|
||||
DRAGON_FIREBALL(PROJECTILE), // Doesn't actually inherit fireball
|
||||
|
||||
ABSTRACT_THROWN_POTION(ITEM_PROJECTILE, null),
|
||||
SPLASH_POTION(ABSTRACT_THROWN_POTION),
|
||||
LINGERING_POTION(ABSTRACT_THROWN_POTION),
|
||||
|
||||
ABSTRACT_ARROW(PROJECTILE, null),
|
||||
ARROW(ABSTRACT_ARROW),
|
||||
SPECTRAL_ARROW(ABSTRACT_ARROW),
|
||||
TRIDENT(ABSTRACT_ARROW),
|
||||
|
||||
ABSTRACT_FIREBALL(ENTITY, null),
|
||||
FIREBALL(ABSTRACT_FIREBALL),
|
||||
SMALL_FIREBALL(ABSTRACT_FIREBALL),
|
||||
|
||||
ABSTRACT_WIND_CHARGE(PROJECTILE, null),
|
||||
WIND_CHARGE(ABSTRACT_WIND_CHARGE),
|
||||
BREEZE_WIND_CHARGE(ABSTRACT_WIND_CHARGE),
|
||||
|
||||
// Vehicles
|
||||
VEHICLE(ENTITY, null),
|
||||
|
||||
ABSTRACT_MINECART(VEHICLE, null),
|
||||
MINECART(ABSTRACT_MINECART),
|
||||
FURNACE_MINECART(ABSTRACT_MINECART),
|
||||
COMMAND_BLOCK_MINECART(ABSTRACT_MINECART),
|
||||
TNT_MINECART(ABSTRACT_MINECART),
|
||||
SPAWNER_MINECART(ABSTRACT_MINECART),
|
||||
|
||||
ABSTRACT_MINECART_CONTAINER(ABSTRACT_MINECART, null),
|
||||
CHEST_MINECART(ABSTRACT_MINECART_CONTAINER),
|
||||
HOPPER_MINECART(ABSTRACT_MINECART_CONTAINER),
|
||||
|
||||
ABSTRACT_BOAT(VEHICLE, null),
|
||||
ABSTRACT_CHEST_BOAT(ABSTRACT_BOAT, null),
|
||||
ACACIA_BOAT(ABSTRACT_BOAT),
|
||||
ACACIA_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
BAMBOO_CHEST_RAFT(ABSTRACT_CHEST_BOAT),
|
||||
BAMBOO_RAFT(ABSTRACT_BOAT),
|
||||
BIRCH_BOAT(ABSTRACT_BOAT),
|
||||
BIRCH_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
CHERRY_BOAT(ABSTRACT_BOAT),
|
||||
CHERRY_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
DARK_OAK_BOAT(ABSTRACT_BOAT),
|
||||
DARK_OAK_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
JUNGLE_BOAT(ABSTRACT_BOAT),
|
||||
JUNGLE_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
MANGROVE_BOAT(ABSTRACT_BOAT),
|
||||
MANGROVE_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
OAK_BOAT(ABSTRACT_BOAT),
|
||||
OAK_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
PALE_OAK_BOAT(ABSTRACT_BOAT),
|
||||
PALE_OAK_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
SPRUCE_BOAT(ABSTRACT_BOAT),
|
||||
SPRUCE_CHEST_BOAT(ABSTRACT_CHEST_BOAT),
|
||||
|
||||
// Living entities as a larger subclass
|
||||
LIVING_ENTITY(ENTITY, null),
|
||||
ARMOR_STAND(LIVING_ENTITY),
|
||||
|
||||
// Players
|
||||
AVATAR(LIVING_ENTITY, null),
|
||||
MANNEQUIN(AVATAR),
|
||||
PLAYER(AVATAR),
|
||||
|
||||
// Mobs as a larger subclass
|
||||
MOB(LIVING_ENTITY, null),
|
||||
ENDER_DRAGON(MOB),
|
||||
|
||||
// Ambient mobs
|
||||
AMBIENT_CREATURE(MOB, null),
|
||||
BAT(AMBIENT_CREATURE),
|
||||
|
||||
// Flying mobs
|
||||
FLYING_MOB(MOB, null),
|
||||
GHAST(FLYING_MOB),
|
||||
PHANTOM(FLYING_MOB),
|
||||
|
||||
// Pathfinder mobs and its subclasses
|
||||
PATHFINDER_MOB(MOB, null),
|
||||
ALLAY(PATHFINDER_MOB),
|
||||
|
||||
ABSTRACT_GOLEM(PATHFINDER_MOB, null),
|
||||
SNOW_GOLEM(ABSTRACT_GOLEM),
|
||||
IRON_GOLEM(ABSTRACT_GOLEM),
|
||||
SHULKER(ABSTRACT_GOLEM),
|
||||
COPPER_GOLEM(ABSTRACT_GOLEM),
|
||||
|
||||
// Ageable mobs and (tamable) animals
|
||||
ABSTRACT_AGEABLE(PATHFINDER_MOB, null),
|
||||
|
||||
ABSTRACT_VILLAGER(ABSTRACT_AGEABLE, null),
|
||||
VILLAGER(ABSTRACT_VILLAGER),
|
||||
WANDERING_TRADER(ABSTRACT_VILLAGER),
|
||||
|
||||
ABSTRACT_CUBE_MOB(ABSTRACT_AGEABLE, null),
|
||||
SLIME(ABSTRACT_CUBE_MOB),
|
||||
MAGMA_CUBE(ABSTRACT_CUBE_MOB),
|
||||
SULFUR_CUBE(ABSTRACT_CUBE_MOB),
|
||||
|
||||
ABSTRACT_ANIMAL(ABSTRACT_AGEABLE, null),
|
||||
AXOLOTL(ABSTRACT_ANIMAL),
|
||||
CHICKEN(ABSTRACT_ANIMAL),
|
||||
PANDA(ABSTRACT_ANIMAL),
|
||||
PIG(ABSTRACT_ANIMAL),
|
||||
POLAR_BEAR(ABSTRACT_ANIMAL),
|
||||
RABBIT(ABSTRACT_ANIMAL),
|
||||
SHEEP(ABSTRACT_ANIMAL),
|
||||
BEE(ABSTRACT_ANIMAL),
|
||||
TURTLE(ABSTRACT_ANIMAL),
|
||||
FOX(ABSTRACT_ANIMAL),
|
||||
FROG(ABSTRACT_ANIMAL),
|
||||
GOAT(ABSTRACT_ANIMAL),
|
||||
HOGLIN(ABSTRACT_ANIMAL),
|
||||
STRIDER(ABSTRACT_ANIMAL),
|
||||
SNIFFER(ABSTRACT_ANIMAL),
|
||||
ARMADILLO(ABSTRACT_ANIMAL),
|
||||
HAPPY_GHAST(ABSTRACT_ANIMAL),
|
||||
OCELOT(ABSTRACT_ANIMAL),
|
||||
|
||||
ABSTRACT_COW(ABSTRACT_ANIMAL, null),
|
||||
COW(ABSTRACT_COW),
|
||||
MOOSHROOM(ABSTRACT_COW),
|
||||
|
||||
TAMABLE_ANIMAL(ABSTRACT_ANIMAL, null),
|
||||
CAT(TAMABLE_ANIMAL),
|
||||
WOLF(TAMABLE_ANIMAL),
|
||||
PARROT(TAMABLE_ANIMAL),
|
||||
|
||||
ABSTRACT_NAUTILUS(TAMABLE_ANIMAL, null),
|
||||
NAUTILUS(ABSTRACT_NAUTILUS),
|
||||
ZOMBIE_NAUTILUS(ABSTRACT_NAUTILUS),
|
||||
|
||||
ABSTRACT_HORSE(ABSTRACT_ANIMAL, null),
|
||||
HORSE(ABSTRACT_HORSE),
|
||||
SKELETON_HORSE(ABSTRACT_HORSE),
|
||||
ZOMBIE_HORSE(ABSTRACT_HORSE),
|
||||
CAMEL(ABSTRACT_HORSE),
|
||||
CAMEL_HUSK(CAMEL),
|
||||
|
||||
ABSTRACT_CHESTED_HORSE(ABSTRACT_HORSE, null),
|
||||
DONKEY(ABSTRACT_CHESTED_HORSE),
|
||||
MULE(ABSTRACT_CHESTED_HORSE),
|
||||
LLAMA(ABSTRACT_CHESTED_HORSE),
|
||||
TRADER_LLAMA(LLAMA),
|
||||
|
||||
// Monsters
|
||||
ABSTRACT_MONSTER(PATHFINDER_MOB, null),
|
||||
BLAZE(ABSTRACT_MONSTER),
|
||||
CREEPER(ABSTRACT_MONSTER),
|
||||
ENDERMITE(ABSTRACT_MONSTER),
|
||||
ENDERMAN(ABSTRACT_MONSTER),
|
||||
GIANT(ABSTRACT_MONSTER),
|
||||
SILVERFISH(ABSTRACT_MONSTER),
|
||||
VEX(ABSTRACT_MONSTER),
|
||||
WITHER(ABSTRACT_MONSTER),
|
||||
BREEZE(ABSTRACT_MONSTER),
|
||||
ZOGLIN(ABSTRACT_MONSTER),
|
||||
WARDEN(ABSTRACT_MONSTER),
|
||||
CREAKING(ABSTRACT_MONSTER),
|
||||
|
||||
ABSTRACT_SKELETON(ABSTRACT_MONSTER, null),
|
||||
SKELETON(ABSTRACT_SKELETON),
|
||||
STRAY(ABSTRACT_SKELETON),
|
||||
WITHER_SKELETON(ABSTRACT_SKELETON),
|
||||
BOGGED(ABSTRACT_SKELETON),
|
||||
PARCHED(ABSTRACT_SKELETON),
|
||||
|
||||
ZOMBIE(ABSTRACT_MONSTER),
|
||||
DROWNED(ZOMBIE),
|
||||
HUSK(ZOMBIE),
|
||||
ZOMBIFIED_PIGLIN(ZOMBIE),
|
||||
ZOMBIE_VILLAGER(ZOMBIE),
|
||||
|
||||
GUARDIAN(ABSTRACT_MONSTER),
|
||||
ELDER_GUARDIAN(GUARDIAN),
|
||||
|
||||
SPIDER(ABSTRACT_MONSTER),
|
||||
CAVE_SPIDER(SPIDER),
|
||||
|
||||
ABSTRACT_PIGLIN(ABSTRACT_MONSTER, null),
|
||||
PIGLIN(ABSTRACT_PIGLIN),
|
||||
PIGLIN_BRUTE(ABSTRACT_PIGLIN),
|
||||
|
||||
// Water mobs
|
||||
AGEABLE_WATER_CREATURE(ABSTRACT_AGEABLE, null),
|
||||
DOLPHIN(AGEABLE_WATER_CREATURE),
|
||||
|
||||
SQUID(AGEABLE_WATER_CREATURE),
|
||||
GLOW_SQUID(SQUID),
|
||||
|
||||
WATER_ANIMAL(PATHFINDER_MOB, null),
|
||||
ABSTRACT_FISH(WATER_ANIMAL, null),
|
||||
PUFFERFISH(ABSTRACT_FISH),
|
||||
TADPOLE(ABSTRACT_FISH),
|
||||
|
||||
ABSTRACT_SCHOOLING_FISH(ABSTRACT_FISH, null),
|
||||
COD(ABSTRACT_SCHOOLING_FISH),
|
||||
SALMON(ABSTRACT_SCHOOLING_FISH),
|
||||
TROPICAL_FISH(ABSTRACT_SCHOOLING_FISH),
|
||||
|
||||
// Raiders
|
||||
ABSTRACT_RAIDER(ABSTRACT_MONSTER, null),
|
||||
WITCH(ABSTRACT_RAIDER),
|
||||
RAVAGER(ABSTRACT_RAIDER),
|
||||
|
||||
ABSTRACT_ILLAGER(ABSTRACT_RAIDER, null),
|
||||
SPELLCASTER_ILLAGER(ABSTRACT_ILLAGER, null),
|
||||
VINDICATOR(ABSTRACT_ILLAGER),
|
||||
PILLAGER(ABSTRACT_ILLAGER),
|
||||
EVOKER(SPELLCASTER_ILLAGER),
|
||||
ILLUSIONER(SPELLCASTER_ILLAGER);
|
||||
|
||||
private static final EntityType[] TYPES = EntityTypeUtil.createSizedArray(values());
|
||||
private final EntityType parent;
|
||||
private final String identifier;
|
||||
private int id = -1;
|
||||
|
||||
EntityTypes26_2(final EntityType parent) {
|
||||
this.parent = parent;
|
||||
this.identifier = Key.namespaced(name().toLowerCase(Locale.ROOT));
|
||||
}
|
||||
|
||||
EntityTypes26_2(final EntityType parent, @Nullable final String identifier) {
|
||||
this.parent = parent;
|
||||
this.identifier = identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getId() {
|
||||
if (id == -1) {
|
||||
throw new IllegalStateException("Ids have not been initialized yet (type " + name() + ")");
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String identifier() {
|
||||
Preconditions.checkArgument(identifier != null, "Called identifier method on abstract type");
|
||||
return identifier;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable EntityType getParent() {
|
||||
return parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAbstractType() {
|
||||
return identifier == null;
|
||||
}
|
||||
|
||||
public static EntityType getTypeFromId(final int typeId) {
|
||||
return EntityTypeUtil.getTypeFromId(TYPES, typeId, PIG);
|
||||
}
|
||||
|
||||
public static void initialize(final Protocol<?, ?, ?, ?> protocol) {
|
||||
EntityTypeUtil.initialize(values(), TYPES, protocol, (type, id) -> type.id = id);
|
||||
}
|
||||
}
|
||||
@@ -94,6 +94,7 @@ public class ProtocolVersion implements Comparable<ProtocolVersion> {
|
||||
public static final ProtocolVersion v1_21_9 = register(773, "1.21.9-1.21.10", new SubVersionRange("1.21", 9, 10));
|
||||
public static final ProtocolVersion v1_21_11 = register(774, "1.21.11");
|
||||
public static final ProtocolVersion v26_1 = register(775, "26.1-26.1.2", new SubVersionRange("26.1", 0, 2));
|
||||
public static final ProtocolVersion v26_2 = register(776, "26.2");
|
||||
public static final ProtocolVersion unknown = new ProtocolVersion(VersionType.SPECIAL, -1, -1, "UNKNOWN", null);
|
||||
|
||||
static {
|
||||
|
||||
@@ -179,7 +179,8 @@ public final class Types {
|
||||
public static final Type<UUID[]> UUID_ARRAY = new ArrayType<>(Types.UUID);
|
||||
|
||||
public static final VarIntType VAR_INT = new VarIntType();
|
||||
public static final OptionalVarIntType OPTIONAL_VAR_INT = new OptionalVarIntType();
|
||||
public static final OptionalVarIntType OPTIONAL_VAR_INT = new OptionalVarIntType(); // compact
|
||||
public static final OptionalType<Integer> BOOL_OPTIONAL_VAR_INT = new VarIntType.OptionalVarIntType(); // regular boolean prefixed
|
||||
public static final Type<int[]> VAR_INT_ARRAY_PRIMITIVE = new VarIntArrayType();
|
||||
public static final VarLongType VAR_LONG = new VarLongType();
|
||||
|
||||
|
||||
@@ -45,6 +45,12 @@ public class ArrayType<T> extends Type<T[]> {
|
||||
this.maxLength = maxLength;
|
||||
}
|
||||
|
||||
private ArrayType(Class<? super T[]> outputClass, Type<T> type, int maxLength) {
|
||||
super(type.getTypeName() + " Array", outputClass);
|
||||
this.elementType = type;
|
||||
this.maxLength = maxLength;
|
||||
}
|
||||
|
||||
public static Class<?> getArrayClass(Class<?> componentType) {
|
||||
// Should only happen once per class init.
|
||||
return Array.newInstance(componentType, 0).getClass();
|
||||
@@ -101,4 +107,8 @@ public class ArrayType<T> extends Type<T[]> {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public ArrayType<T> withMaxLength(final int maxLength) {
|
||||
return new ArrayType<>(this.getOutputClass(), this.elementType, maxLength);
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@
|
||||
package com.viaversion.viaversion.api.type.types;
|
||||
|
||||
import com.viaversion.viaversion.api.minecraft.codec.Ops;
|
||||
import com.viaversion.viaversion.api.type.OptionalType;
|
||||
import com.viaversion.viaversion.api.type.Type;
|
||||
import com.viaversion.viaversion.api.type.TypeConverter;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
@@ -108,4 +109,11 @@ public class VarIntType extends Type<Integer> implements TypeConverter<Integer>
|
||||
public static int varIntLength(final int value) {
|
||||
return VAR_INT_LENGTHS[Integer.numberOfLeadingZeros(value)];
|
||||
}
|
||||
|
||||
public static final class OptionalVarIntType extends OptionalType<Integer> {
|
||||
|
||||
public OptionalVarIntType() {
|
||||
super(Types.VAR_INT);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -163,6 +163,13 @@ public class ParticleType extends DynamicType<Particle> {
|
||||
particle.add(Types.INT, Types.INT.readPrimitive(buf)); // Color
|
||||
particle.add(Types.FLOAT, Types.FLOAT.readPrimitive(buf)); // Power
|
||||
};
|
||||
public static final DataReader<Particle> GEYSER_BASE = (buf, particle) -> {
|
||||
particle.add(Types.INT, Types.INT.readPrimitive(buf)); // Water blocks
|
||||
particle.add(Types.FLOAT, Types.FLOAT.readPrimitive(buf)); // Burst impulse base
|
||||
};
|
||||
public static final DataReader<Particle> GEYSER = (buf, particle) -> {
|
||||
particle.add(Types.INT, Types.INT.readPrimitive(buf)); // Water blocks
|
||||
};
|
||||
|
||||
public static DataReader<Particle> item(Type<Item> item) {
|
||||
return (buf, particle) -> particle.add(item, item.read(buf));
|
||||
@@ -259,12 +266,20 @@ public class ParticleType extends DynamicType<Particle> {
|
||||
return fill1_21_4(protocol).reader("tinted_leaves", Readers.COLOR);
|
||||
}
|
||||
|
||||
public static void fill1_21_9(final Protocol<?, ?, ?, ?> protocol) {
|
||||
fill1_21_5(protocol)
|
||||
public static DataFiller fill1_21_9(final Protocol<?, ?, ?, ?> protocol) {
|
||||
return fill1_21_5(protocol)
|
||||
.reader("dragon_breath", Readers.POWER)
|
||||
.reader("effect", Readers.SPELL)
|
||||
.reader("instant_effect", Readers.SPELL)
|
||||
.reader("flash", Readers.COLOR);
|
||||
}
|
||||
|
||||
public static void fill26_2(final Protocol<?, ?, ?, ?> protocol) {
|
||||
fill1_21_9(protocol)
|
||||
.reader("geyser", Readers.GEYSER)
|
||||
.reader("geyser_base", Readers.GEYSER_BASE)
|
||||
.reader("geyser_poof", Readers.GEYSER_BASE)
|
||||
.reader("geyser_plume", Readers.GEYSER);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -47,7 +47,7 @@ public class Types1_20_5<K extends VersionedStructuredDataKeys, E extends Abstra
|
||||
public final Type<StructuredData<?>[]> structuredDataArray = new ArrayType<>(structuredData);
|
||||
public final Type<Item> item = new ItemType1_20_5(structuredData);
|
||||
public final Type<Item> lengthPrefixedItem = new ItemType1_20_5(lengthPrefixedStructuredData);
|
||||
public final Type<Item[]> itemArray = new ArrayType<>(item);
|
||||
public final ArrayType<Item> itemArray = new ArrayType<>(item);
|
||||
public final Type<Item> itemCost = new ItemCostType1_20_5(structuredDataArray);
|
||||
public final Type<Item> optionalItemCost = new ItemCostType1_20_5.OptionalItemCostType(itemCost);
|
||||
private K structuredDataKeys;
|
||||
@@ -77,7 +77,7 @@ public class Types1_20_5<K extends VersionedStructuredDataKeys, E extends Abstra
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type<Item[]> itemArray() {
|
||||
public ArrayType<Item> itemArray() {
|
||||
return itemArray;
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ public class Types1_20_5<K extends VersionedStructuredDataKeys, E extends Abstra
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type<Item[]> itemTemplateArray() {
|
||||
public ArrayType<Item> itemTemplateArray() {
|
||||
return itemArray;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ public class Types26_1<K extends VersionedStructuredDataKeys, E extends Abstract
|
||||
|
||||
public final Type<Item> itemTemplate = new ItemTemplateType26_1(structuredData);
|
||||
public final Type<Item> optionalItemTemplate = new ItemTemplateType26_1.OptionalItemTemplateType(itemTemplate);
|
||||
public final Type<Item[]> itemTemplateArray = new ArrayType<>(itemTemplate);
|
||||
public final ArrayType<Item> itemTemplateArray = new ArrayType<>(itemTemplate);
|
||||
|
||||
public Types26_1(final Function<VersionedTypesHolder, K> keysSupplier, final Function<VersionedTypesHolder, E> entityDataTypesSupplier) {
|
||||
super(null, entityDataTypesSupplier);
|
||||
@@ -52,7 +52,7 @@ public class Types26_1<K extends VersionedStructuredDataKeys, E extends Abstract
|
||||
}
|
||||
|
||||
@Override
|
||||
public Type<Item[]> itemTemplateArray() {
|
||||
public ArrayType<Item> itemTemplateArray() {
|
||||
return itemTemplateArray;
|
||||
}
|
||||
}
|
||||
@@ -26,6 +26,7 @@ import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_11;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_2;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys26_2;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_20_5;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes1_21_11;
|
||||
@@ -51,4 +52,5 @@ public final class VersionedTypes {
|
||||
public static final Types1_20_5<StructuredDataKeys1_21_5, EntityDataTypes1_21_9> V1_21_9 = new Types1_20_5<>(StructuredDataKeys1_21_5::new, EntityDataTypes1_21_9::new);
|
||||
public static final Types1_20_5<StructuredDataKeys1_21_11, EntityDataTypes1_21_11> V1_21_11 = new Types1_20_5<>(StructuredDataKeys1_21_11::new, EntityDataTypes1_21_11::new);
|
||||
public static final Types26_1<StructuredDataKeys1_21_11, EntityDataTypes26_1> V26_1 = new Types26_1<>(StructuredDataKeys1_21_11::new, EntityDataTypes26_1::new);
|
||||
public static final Types26_1<StructuredDataKeys26_2, EntityDataTypes26_1> V26_2 = new Types26_1<>(StructuredDataKeys26_2::new, EntityDataTypes26_1::new);
|
||||
}
|
||||
+2
-2
@@ -46,7 +46,7 @@ public interface VersionedTypesHolder {
|
||||
*/
|
||||
Type<Item> item();
|
||||
|
||||
Type<Item[]> itemArray();
|
||||
ArrayType<Item> itemArray();
|
||||
|
||||
/**
|
||||
* Returns the unmapped item stack template type, used for certain recipes/templates in 26.1+.
|
||||
@@ -57,7 +57,7 @@ public interface VersionedTypesHolder {
|
||||
|
||||
Type<Item> optionalItemTemplate();
|
||||
|
||||
Type<Item[]> itemTemplateArray();
|
||||
ArrayType<Item> itemTemplateArray();
|
||||
|
||||
/**
|
||||
* Returns the unmapped item cost type, used in merchant offers.
|
||||
|
||||
@@ -8,7 +8,7 @@ repositories {
|
||||
|
||||
dependencies {
|
||||
// version must be manually kept in sync with the one in root project settings.gradle.kts
|
||||
implementation("com.gradleup.shadow:shadow-gradle-plugin:9.4.1")
|
||||
implementation("com.gradleup.shadow:shadow-gradle-plugin:9.4.2")
|
||||
|
||||
// A nice no-conflict comment for patching in downgrading
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
plugins {
|
||||
base
|
||||
eclipse
|
||||
id("via.build-logic")
|
||||
}
|
||||
|
||||
|
||||
@@ -267,8 +267,8 @@ public class ViaManagerImpl implements ViaManager {
|
||||
platform.getLogger().warning("ViaVersion no longer officially supports this version of Java, only offering unsupported compatibility builds.");
|
||||
platform.getLogger().warning("See https://github.com/ViaVersion/ViaVersion/releases/tag/5.0.0 for more information.");
|
||||
} else if (version < 21) {
|
||||
// platform.getLogger().warning("Please update your Java runtime to at least Java 21 (your version is " + javaVersion + ").");
|
||||
// platform.getLogger().warning("At some point in the future, ViaVersion will no longer be compatible with this version of Java.");
|
||||
platform.getLogger().warning("Please update your Java runtime to at least Java 21 (your version is " + javaVersion + ").");
|
||||
platform.getLogger().warning("At some point in the future, ViaVersion will no longer be compatible with this version of Java.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -90,6 +90,7 @@ import com.viaversion.viaversion.protocols.v1_8to1_9.Protocol1_8To1_9;
|
||||
import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.Protocol1_9_1To1_9_3;
|
||||
import com.viaversion.viaversion.protocols.v1_9_3to1_10.Protocol1_9_3To1_10;
|
||||
import com.viaversion.viaversion.protocols.v1_9to1_9_1.Protocol1_9To1_9_1;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.Protocol26_1To26_2;
|
||||
import com.viaversion.viaversion.util.MathUtil;
|
||||
import com.viaversion.viaversion.util.Pair;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
@@ -219,6 +220,7 @@ public class ProtocolManagerImpl implements ProtocolManager {
|
||||
registerProtocol(new Protocol1_21_9To1_21_11(), ProtocolVersion.v1_21_11, ProtocolVersion.v1_21_9);
|
||||
|
||||
registerProtocol(new Protocol1_21_11To26_1(), ProtocolVersion.v26_1, ProtocolVersion.v1_21_11);
|
||||
registerProtocol(new Protocol26_1To26_2(), ProtocolVersion.v26_2, ProtocolVersion.v26_1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
@@ -122,6 +122,11 @@ public final class RegistrationBuilder {
|
||||
this.adapter = adapter;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param max max version, exclusive
|
||||
* @param action registration
|
||||
* @return self
|
||||
*/
|
||||
public TypedRangesBuilder<CU, SU, R> to(final ProtocolVersion max, final TypedRegistrationAction<CU, SU, R> action) {
|
||||
to(max, wrapAction(action));
|
||||
return this;
|
||||
|
||||
+2
-1
@@ -86,7 +86,8 @@ public final class DefaultRegistrations {
|
||||
.to(ProtocolVersion.v1_21_5, TextComponentRegistrations::registerComponents1_21_4)
|
||||
)
|
||||
.ranges(TextComponentRegistrations::nbtText, ProtocolVersion.v1_21_5, b -> b
|
||||
.since(TextComponentRegistrations::registerComponents1_21_5)
|
||||
.to(ProtocolVersion.v26_2, TextComponentRegistrations::registerComponents1_21_5)
|
||||
.since(TextComponentRegistrations::registerComponents26_2)
|
||||
)
|
||||
|
||||
.ranges(ProtocolVersion.v1_17_1, sbeps -> sbeps
|
||||
|
||||
+8
@@ -183,6 +183,14 @@ final class TextComponentRegistrations {
|
||||
ctx.clientbound(ClientboundPackets1_21_5.PLAYER_CHAT, cr::registerPlayerChat1_21_5);
|
||||
}
|
||||
|
||||
static <CU extends ClientboundPacketType> void registerComponents26_2(final RegistrationContext<CU, ?> ctx, final NBTComponentRewriter<CU> cr) {
|
||||
common1_20_5(ctx, cr);
|
||||
ctx.clientbound(ClientboundPackets1_21_5.SET_PLAYER_TEAM, cr::registerSetPlayerTeam26_2);
|
||||
ctx.clientbound(ClientboundPackets1_21_5.DISGUISED_CHAT, cr::registerDisguisedChat);
|
||||
ctx.clientbound(ClientboundPackets1_21_5.PLAYER_INFO_UPDATE, cr::registerPlayerInfoUpdate1_21_4);
|
||||
ctx.clientbound(ClientboundPackets1_21_5.PLAYER_CHAT, cr::registerPlayerChat1_21_5);
|
||||
}
|
||||
|
||||
static @Nullable <CU extends ClientboundPacketType, SU extends ServerboundPacketType> ComponentRewriterBase<CU> text(final RegistrationContext<CU, SU> ctx) {
|
||||
return (ComponentRewriterBase<CU>) ctx.protocol().getComponentRewriter();
|
||||
}
|
||||
|
||||
+8
@@ -30,12 +30,14 @@ import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
|
||||
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
|
||||
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ServerboundPackets1_21_6;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundPacket1_21_9;
|
||||
import com.viaversion.viaversion.rewriter.BlockRewriter;
|
||||
import com.viaversion.viaversion.rewriter.ParticleRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
|
||||
import com.viaversion.viaversion.rewriter.TagRewriter;
|
||||
import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5;
|
||||
@@ -58,6 +60,7 @@ final class Protocol98_1To99_1 extends AbstractProtocol<ClientboundPacket26_1, C
|
||||
private final ParticleRewriter<ClientboundPacket26_1> particleRewriter = new ParticleRewriter<>(this);
|
||||
private final TagRewriter<ClientboundPacket26_1> tagRewriter = new TagRewriter<>(this);
|
||||
private final NBTComponentRewriter<ClientboundPacket26_1> componentRewriter = new ComponentRewriter99_1(this);
|
||||
private final RecipeDisplayRewriter<ClientboundPacket26_1> recipeewriter = new RecipeDisplayRewriter1_21_5<>(this);
|
||||
private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this);
|
||||
|
||||
public Protocol98_1To99_1() {
|
||||
@@ -132,6 +135,11 @@ final class Protocol98_1To99_1 extends AbstractProtocol<ClientboundPacket26_1, C
|
||||
return registryDataRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecipeDisplayRewriter<ClientboundPacket26_1> getRecipeRewriter() {
|
||||
return recipeewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParticleRewriter<ClientboundPacket26_1> getParticleRewriter() {
|
||||
return particleRewriter;
|
||||
|
||||
-8
@@ -142,14 +142,6 @@ public final class EntityPacketRewriter1_20 extends EntityRewriter<ClientboundPa
|
||||
registerEntityDataTypeHandler(Types1_20.ENTITY_DATA_TYPES.itemType, Types1_20.ENTITY_DATA_TYPES.blockStateType, Types1_20.ENTITY_DATA_TYPES.optionalBlockStateType, Types1_20.ENTITY_DATA_TYPES.particleType, null);
|
||||
registerBlockStateHandler(EntityTypes1_19_4.ABSTRACT_MINECART, 11);
|
||||
|
||||
// Purpur's Rainglow patch adds a non-vanilla SQUID_COLOR (String) accessor on GlowSquid,
|
||||
// declared right after DATA_DARK_TICKS_REMAINING, so the server emits it at source index 17.
|
||||
// AGEABLE_WATER_CREATURE.addIndex(16) in v1_21To1_21_2 later shifts it to index 18, where
|
||||
// 1.21.11+ clients only allocate 18 slots (max valid index 17) and crash with
|
||||
// ArrayIndexOutOfBoundsException: Index 18 out of bounds for length 18. Drop at source.
|
||||
// Vanilla 1.19.4 GlowSquid has no slot 17, so this is safe for non-Purpur servers.
|
||||
filter().type(EntityTypes1_19_4.GLOW_SQUID).cancel(17);
|
||||
|
||||
// Rotate item display by 180 degrees around the Y axis
|
||||
filter().type(EntityTypes1_19_4.ITEM_DISPLAY).handler((event, data) -> {
|
||||
if (event.trackedEntity().hasSentEntityData() || event.hasExtraData()) {
|
||||
|
||||
+3
-2
@@ -1550,8 +1550,9 @@ public class ComponentRewriter1_20_5<C extends ClientboundPacketType> extends Js
|
||||
}
|
||||
|
||||
protected Item[] itemArrayFromTag(final UserConnection connection, final ListTag<CompoundTag> tag) {
|
||||
final Item[] items = new Item[tag.size()];
|
||||
for (int i = 0; i < tag.size(); i++) {
|
||||
final int size = Math.min(tag.size(), 1024);
|
||||
final Item[] items = new Item[size];
|
||||
for (int i = 0; i < size; i++) {
|
||||
items[i] = itemFromTag(connection, tag.get(i));
|
||||
}
|
||||
return items;
|
||||
|
||||
+12
-8
@@ -239,17 +239,21 @@ public final class Protocol1_21_11To26_1 extends AbstractProtocol<ClientboundPac
|
||||
|
||||
private void addJukeboxPlayables(final String... songs) {
|
||||
for (final String song : songs) {
|
||||
final CompoundTag songTag = new CompoundTag();
|
||||
final CompoundTag songDescription = new CompoundTag();
|
||||
songDescription.putString("translate", "jukebox_song.minecraft." + song);
|
||||
songTag.put("description", songDescription);
|
||||
songTag.putString("sound_event", "music_disc." + song);
|
||||
songTag.putFloat("length_in_seconds", 175F);
|
||||
songTag.putInt("comparator_output", 10);
|
||||
registryDataRewriter.addEntries("jukebox_song", new RegistryEntry(song, songTag));
|
||||
registryDataRewriter.addEntries("jukebox_song", createJukeboxPlayableEntry(song));
|
||||
}
|
||||
}
|
||||
|
||||
public static RegistryEntry createJukeboxPlayableEntry(final String song) {
|
||||
final CompoundTag songTag = new CompoundTag();
|
||||
final CompoundTag songDescription = new CompoundTag();
|
||||
songDescription.putString("translate", "jukebox_song.minecraft." + song);
|
||||
songTag.put("description", songDescription);
|
||||
songTag.putString("sound_event", "music_disc." + song);
|
||||
songTag.putFloat("length_in_seconds", 175F);
|
||||
songTag.putInt("comparator_output", 10);
|
||||
return new RegistryEntry(song, songTag);
|
||||
}
|
||||
|
||||
private void swapAffixAndAddAssetId(final String registryKey, final String affix) {
|
||||
registryDataRewriter.addHandler(registryKey, (key, tag) -> {
|
||||
swapEntityNameAffix(affix, tag);
|
||||
|
||||
+1
-1
@@ -81,7 +81,7 @@ public enum ServerboundPackets26_1 implements ServerboundPacket26_1 {
|
||||
SET_STRUCTURE_BLOCK, // 0x3B
|
||||
SET_TEST_BLOCK, // 0x3C
|
||||
SIGN_UPDATE, // 0x3D
|
||||
SPECTATE_ENTITY, // 0x3E
|
||||
SPECTATE_ENTITY, // 0x3E // TODO rename to SPECTATOR_ACTION once a new enum is needed
|
||||
SWING, // 0x3F
|
||||
TELEPORT_TO_ENTITY, // 0x40
|
||||
TEST_INSTANCE_BLOCK_ACTION, // 0x41
|
||||
|
||||
+2
-1
@@ -61,6 +61,7 @@ import com.viaversion.viaversion.rewriter.SoundRewriter;
|
||||
import com.viaversion.viaversion.rewriter.TagRewriter;
|
||||
import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5;
|
||||
import com.viaversion.viaversion.rewriter.text.NBTComponentRewriter;
|
||||
import com.viaversion.viaversion.util.Limit;
|
||||
|
||||
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
|
||||
|
||||
@@ -112,7 +113,7 @@ public final class Protocol1_21_7To1_21_9 extends AbstractProtocol<ClientboundPa
|
||||
wrapper.write(Types.VAR_INT, 0); // Number of block particles
|
||||
});
|
||||
registerServerbound(ServerboundPackets1_21_6.DEBUG_SAMPLE_SUBSCRIPTION, wrapper -> {
|
||||
final int count = wrapper.read(Types.VAR_INT); // subscription count
|
||||
final int count = Limit.max(wrapper.read(Types.VAR_INT), 32); // subscription count
|
||||
for (int i = 0; i < count; i++) {
|
||||
final int id = wrapper.read(Types.VAR_INT); // subscription registry id
|
||||
if (id == 0) { // DEDICATED_SERVER_TICK_TIME
|
||||
|
||||
+257
@@ -0,0 +1,257 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2026 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viaversion.protocols.v26_1to26_2;
|
||||
|
||||
import com.viaversion.nbt.tag.CompoundTag;
|
||||
import com.viaversion.nbt.tag.Tag;
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.data.MappingData;
|
||||
import com.viaversion.viaversion.api.data.MappingDataBase;
|
||||
import com.viaversion.viaversion.api.minecraft.RegistryType;
|
||||
import com.viaversion.viaversion.api.minecraft.data.StructuredDataKey;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_11;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys26_2;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes26_2;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes26_1;
|
||||
import com.viaversion.viaversion.api.protocol.AbstractProtocol;
|
||||
import com.viaversion.viaversion.api.protocol.packet.State;
|
||||
import com.viaversion.viaversion.api.protocol.packet.provider.PacketTypesProvider;
|
||||
import com.viaversion.viaversion.api.protocol.packet.provider.SimplePacketTypesProvider;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.api.type.types.chunk.ChunkType26_1;
|
||||
import com.viaversion.viaversion.api.type.types.misc.ParticleType;
|
||||
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
|
||||
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
|
||||
import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets;
|
||||
import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.Protocol1_21_11To26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ServerboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ServerboundPackets26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_4to1_21_5.rewriter.RecipeDisplayRewriter1_21_5;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ServerboundConfigurationPackets1_21_9;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.rewriter.BlockItemPacketRewriter26_2;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.rewriter.EntityPacketRewriter26_2;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.storage.Encrypted;
|
||||
import com.viaversion.viaversion.rewriter.BlockRewriter;
|
||||
import com.viaversion.viaversion.rewriter.ParticleRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RecipeDisplayRewriter;
|
||||
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
|
||||
import com.viaversion.viaversion.rewriter.TagRewriter;
|
||||
import com.viaversion.viaversion.rewriter.block.BlockRewriter1_21_5;
|
||||
import com.viaversion.viaversion.rewriter.text.NBTComponentRewriter;
|
||||
import com.viaversion.viaversion.util.Key;
|
||||
import java.util.UUID;
|
||||
|
||||
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
|
||||
|
||||
public final class Protocol26_1To26_2 extends AbstractProtocol<ClientboundPacket26_1, ClientboundPacket26_1, ServerboundPacket26_1, ServerboundPacket26_1> {
|
||||
|
||||
public static final MappingData MAPPINGS = new MappingDataBase("26.1", "26.2");
|
||||
private final EntityPacketRewriter26_2 entityRewriter = new EntityPacketRewriter26_2(this);
|
||||
private final BlockItemPacketRewriter26_2 itemRewriter = new BlockItemPacketRewriter26_2(this);
|
||||
private final BlockRewriter<ClientboundPacket26_1> blockRewriter = new BlockRewriter1_21_5<>(this, ChunkType26_1::new);
|
||||
private final ParticleRewriter<ClientboundPacket26_1> particleRewriter = new ParticleRewriter<>(this);
|
||||
private final TagRewriter<ClientboundPacket26_1> tagRewriter = new TagRewriter<>(this);
|
||||
private final NBTComponentRewriter<ClientboundPacket26_1> componentRewriter = new NBTComponentRewriter<>(this);
|
||||
private final RegistryDataRewriter registryDataRewriter = new RegistryDataRewriter(this) {
|
||||
@Override
|
||||
public void updateEnchantmentTerm(final CompoundTag term) {
|
||||
super.updateEnchantmentTerm(term);
|
||||
|
||||
final String condition = term.getString("condition");
|
||||
if (Key.equals(condition, "entity_properties")) {
|
||||
final CompoundTag predicate = term.getCompoundTag("predicate");
|
||||
final CompoundTag typeSpecific = predicate.removeUnchecked("type_specific");
|
||||
if (typeSpecific != null) {
|
||||
updateTypeSpecificTerm(predicate, typeSpecific);
|
||||
return;
|
||||
}
|
||||
|
||||
final Tag typeTag = predicate.remove("type");
|
||||
if (typeTag != null) {
|
||||
predicate.put("entity_type", typeTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
private final RecipeDisplayRewriter1_21_5<ClientboundPacket26_1> recipeRewriter = new RecipeDisplayRewriter1_21_5<>(this);
|
||||
|
||||
private void updateTypeSpecificTerm(final CompoundTag predicate, final CompoundTag typeSpecific) {
|
||||
final String type = typeSpecific.getString("type");
|
||||
final String strippedType = Key.stripMinecraftNamespace(type);
|
||||
if (strippedType.equals("player") || strippedType.equals("lightning")
|
||||
|| strippedType.equals("fishing_hook") || strippedType.equals("raider")) {
|
||||
predicate.put("type_specific/" + strippedType, typeSpecific);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Protocol26_1To26_2() {
|
||||
super(ClientboundPacket26_1.class, ClientboundPacket26_1.class, ServerboundPacket26_1.class, ServerboundPacket26_1.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
super.registerPackets();
|
||||
replaceClientbound(ClientboundPackets26_1.SET_PLAYER_TEAM, wrapper -> {
|
||||
wrapper.passthrough(Types.STRING); // Team Name
|
||||
final byte action = wrapper.passthrough(Types.BYTE); // Mode
|
||||
if (action == 0 || action == 2) {
|
||||
componentRewriter.passthroughAndProcess(wrapper); // Display name
|
||||
|
||||
final byte flags = wrapper.read(Types.BYTE);
|
||||
final int nametagVisibility = wrapper.read(Types.VAR_INT);
|
||||
final int collisionRule = wrapper.read(Types.VAR_INT);
|
||||
final int color = wrapper.read(Types.VAR_INT);
|
||||
|
||||
componentRewriter.passthroughAndProcess(wrapper); // Prefix
|
||||
componentRewriter.passthroughAndProcess(wrapper); // Suffix
|
||||
|
||||
wrapper.write(Types.VAR_INT, nametagVisibility);
|
||||
wrapper.write(Types.VAR_INT, collisionRule);
|
||||
wrapper.write(Types.BOOL_OPTIONAL_VAR_INT, color < 16 ? color : null); // only actual colors now
|
||||
wrapper.write(Types.BYTE, flags);
|
||||
}
|
||||
});
|
||||
|
||||
registerClientbound(State.LOGIN, ClientboundLoginPackets.LOGIN_FINISHED, wrapper -> {
|
||||
wrapper.passthrough(Types.UUID); // UUID
|
||||
wrapper.passthrough(Types.STRING); // Name
|
||||
wrapper.passthrough(Types.PROFILE_PROPERTY_ARRAY);
|
||||
|
||||
wrapper.write(Types.UUID, UUID.randomUUID()); // Session ID
|
||||
});
|
||||
|
||||
registerServerbound(State.LOGIN, ServerboundLoginPackets.ENCRYPTION_KEY, wrapper -> {
|
||||
// Previously also used for hiding skins on offline mode servers, now moved to the login packet.
|
||||
wrapper.user().put(new Encrypted());
|
||||
});
|
||||
|
||||
tagRewriter.addEmptyTags(RegistryType.BLOCK, "infiniburn_nether", "infiniburn_end", "infiniburn_overworld"); // from an older version, but servers may have skipped these
|
||||
registryDataRewriter.addEntries("jukebox_song", Protocol1_21_11To26_1.createJukeboxPlayableEntry("bounce"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onMappingDataLoaded() {
|
||||
EntityTypes26_2.initialize(this);
|
||||
ParticleType.Fillers.fill26_2(this);
|
||||
mappedTypes().structuredData.filler(this).add(StructuredDataKey.CUSTOM_DATA, StructuredDataKey.MAX_STACK_SIZE, StructuredDataKey.MAX_DAMAGE,
|
||||
StructuredDataKey.UNBREAKABLE1_21_5, StructuredDataKey.RARITY, StructuredDataKey.TOOLTIP_DISPLAY, StructuredDataKey.DAMAGE_RESISTANT26_1,
|
||||
StructuredDataKey.CUSTOM_NAME, StructuredDataKey.LORE, StructuredDataKey.ENCHANTMENTS1_21_5,
|
||||
StructuredDataKey.CUSTOM_MODEL_DATA1_21_4, StructuredDataKey.BLOCKS_ATTACKS26_1, StructuredDataKey.PROVIDES_BANNER_PATTERNS26_1,
|
||||
StructuredDataKey.REPAIR_COST, StructuredDataKey.CREATIVE_SLOT_LOCK, StructuredDataKey.ENCHANTMENT_GLINT_OVERRIDE,
|
||||
StructuredDataKey.INTANGIBLE_PROJECTILE, StructuredDataKey.STORED_ENCHANTMENTS1_21_5, StructuredDataKey.DYED_COLOR1_21_5,
|
||||
StructuredDataKey.MAP_COLOR, StructuredDataKey.MAP_ID, StructuredDataKey.MAP_DECORATIONS, StructuredDataKey.MAP_POST_PROCESSING,
|
||||
StructuredDataKey.POTION_CONTENTS1_21_2, StructuredDataKey.SUSPICIOUS_STEW_EFFECTS, StructuredDataKey.WRITABLE_BOOK_CONTENT,
|
||||
StructuredDataKey.WRITTEN_BOOK_CONTENT, StructuredDataKey.TRIM1_21_5, StructuredDataKey.DEBUG_STICK_STATE, StructuredDataKey.ENTITY_DATA1_21_9,
|
||||
StructuredDataKey.BUCKET_ENTITY_DATA, StructuredDataKey.BLOCK_ENTITY_DATA1_21_9, StructuredDataKey.INSTRUMENT26_1,
|
||||
StructuredDataKey.RECIPES, StructuredDataKey.LODESTONE_TRACKER, StructuredDataKey.FIREWORK_EXPLOSION, StructuredDataKey.FIREWORKS,
|
||||
StructuredDataKey.PROFILE1_21_9, StructuredDataKey.NOTE_BLOCK_SOUND, StructuredDataKey.BANNER_PATTERNS, StructuredDataKey.BASE_COLOR,
|
||||
StructuredDataKey.POT_DECORATIONS, StructuredDataKey.BLOCK_STATE, StructuredDataKey.BEES1_21_9, StructuredDataKey.LOCK1_21_2,
|
||||
StructuredDataKey.CONTAINER_LOOT, StructuredDataKey.TOOL1_21_5, StructuredDataKey.ITEM_NAME, StructuredDataKey.OMINOUS_BOTTLE_AMPLIFIER,
|
||||
StructuredDataKey.FOOD1_21_2, StructuredDataKey.JUKEBOX_PLAYABLE26_1, StructuredDataKey.ATTRIBUTE_MODIFIERS1_21_6,
|
||||
StructuredDataKey.REPAIRABLE, StructuredDataKey.ENCHANTABLE, StructuredDataKey.CONSUMABLE1_21_2, StructuredDataKey.ATTACK_RANGE,
|
||||
StructuredDataKey.USE_COOLDOWN, StructuredDataKey.DAMAGE, StructuredDataKey.EQUIPPABLE1_21_6, StructuredDataKey.ITEM_MODEL,
|
||||
StructuredDataKey.GLIDER, StructuredDataKey.TOOLTIP_STYLE, StructuredDataKey.DEATH_PROTECTION, StructuredDataKey.WEAPON,
|
||||
StructuredDataKey.POTION_DURATION_SCALE, StructuredDataKey.VILLAGER_VARIANT, StructuredDataKey.WOLF_VARIANT, StructuredDataKey.WOLF_COLLAR,
|
||||
StructuredDataKey.FOX_VARIANT, StructuredDataKey.SALMON_SIZE, StructuredDataKey.PARROT_VARIANT, StructuredDataKey.TROPICAL_FISH_PATTERN,
|
||||
StructuredDataKey.TROPICAL_FISH_BASE_COLOR, StructuredDataKey.TROPICAL_FISH_PATTERN_COLOR, StructuredDataKey.MOOSHROOM_VARIANT,
|
||||
StructuredDataKey.RABBIT_VARIANT, StructuredDataKey.PIG_VARIANT, StructuredDataKey.FROG_VARIANT, StructuredDataKey.HORSE_VARIANT,
|
||||
StructuredDataKey.PAINTING_VARIANT, StructuredDataKey.LLAMA_VARIANT, StructuredDataKey.AXOLOTL_VARIANT, StructuredDataKey.CAT_VARIANT,
|
||||
StructuredDataKey.CAT_COLLAR, StructuredDataKey.SHEEP_COLOR, StructuredDataKey.SHULKER_COLOR, StructuredDataKey.PROVIDES_TRIM_MATERIAL26_1,
|
||||
StructuredDataKey.BREAK_SOUND, StructuredDataKey.COW_VARIANT, StructuredDataKey.CHICKEN_VARIANT26_1, StructuredDataKey.WOLF_SOUND_VARIANT,
|
||||
StructuredDataKey.USE_EFFECTS, StructuredDataKey.MINIMUM_ATTACK_CHARGE, StructuredDataKey.DAMAGE_TYPE26_1, StructuredDataKey.PIERCING_WEAPON,
|
||||
StructuredDataKey.KINETIC_WEAPON, StructuredDataKey.SWING_ANIMATION, StructuredDataKey.ZOMBIE_NAUTILUS_VARIANT26_1, StructuredDataKey.ADDITIONAL_TRADE_COST,
|
||||
StructuredDataKey.DYE, StructuredDataKey.PIG_SOUND_VARIANT, StructuredDataKey.COW_SOUND_VARIANT, StructuredDataKey.CHICKEN_SOUND_VARIANT, StructuredDataKey.CAT_SOUND_VARIANT);
|
||||
super.onMappingDataLoaded();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final UserConnection connection) {
|
||||
addEntityTracker(connection);
|
||||
addItemHasher(connection);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MappingData getMappingData() {
|
||||
return MAPPINGS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityPacketRewriter26_2 getEntityRewriter() {
|
||||
return entityRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockItemPacketRewriter26_2 getItemRewriter() {
|
||||
return itemRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public BlockRewriter<ClientboundPacket26_1> getBlockRewriter() {
|
||||
return blockRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RecipeDisplayRewriter<ClientboundPacket26_1> getRecipeRewriter() {
|
||||
return recipeRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegistryDataRewriter getRegistryDataRewriter() {
|
||||
return registryDataRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ParticleRewriter<ClientboundPacket26_1> getParticleRewriter() {
|
||||
return particleRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TagRewriter<ClientboundPacket26_1> getTagRewriter() {
|
||||
return tagRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTComponentRewriter<ClientboundPacket26_1> getComponentRewriter() {
|
||||
return componentRewriter;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Types1_20_5<StructuredDataKeys1_21_11, EntityDataTypes26_1> types() {
|
||||
return VersionedTypes.V26_1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Types1_20_5<StructuredDataKeys26_2, EntityDataTypes26_1> mappedTypes() {
|
||||
return VersionedTypes.V26_2;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected PacketTypesProvider<ClientboundPacket26_1, ClientboundPacket26_1, ServerboundPacket26_1, ServerboundPacket26_1> createPacketTypesProvider() {
|
||||
return new SimplePacketTypesProvider<>(
|
||||
packetTypeMap(unmappedClientboundPacketType, ClientboundPackets26_1.class, ClientboundConfigurationPackets1_21_9.class),
|
||||
packetTypeMap(mappedClientboundPacketType, ClientboundPackets26_1.class, ClientboundConfigurationPackets1_21_9.class),
|
||||
packetTypeMap(mappedServerboundPacketType, ServerboundPackets26_1.class, ServerboundConfigurationPackets1_21_9.class),
|
||||
packetTypeMap(unmappedServerboundPacketType, ServerboundPackets26_1.class, ServerboundConfigurationPackets1_21_9.class)
|
||||
);
|
||||
}
|
||||
}
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2026 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viaversion.protocols.v26_1to26_2.rewriter;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.UserConnection;
|
||||
import com.viaversion.viaversion.api.minecraft.data.StructuredDataContainer;
|
||||
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys26_2;
|
||||
import com.viaversion.viaversion.api.minecraft.item.Item;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ServerboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.Protocol26_1To26_2;
|
||||
import com.viaversion.viaversion.rewriter.StructuredItemRewriter;
|
||||
|
||||
public final class BlockItemPacketRewriter26_2 extends StructuredItemRewriter<ClientboundPacket26_1, ServerboundPacket26_1, Protocol26_1To26_2> {
|
||||
|
||||
public BlockItemPacketRewriter26_2(final Protocol26_1To26_2 protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleItemDataComponentsToClient(final UserConnection connection, final Item item, final StructuredDataContainer container) {
|
||||
upgradeData(container);
|
||||
super.handleItemDataComponentsToClient(connection, item, container);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleItemDataComponentsToServer(final UserConnection connection, final Item item, final StructuredDataContainer container) {
|
||||
downgradeData(protocol.mappedTypes().structuredDataKeys(), container);
|
||||
super.handleItemDataComponentsToServer(connection, item, container);
|
||||
}
|
||||
|
||||
public static void upgradeData(final StructuredDataContainer container) {
|
||||
}
|
||||
|
||||
public static void downgradeData(final StructuredDataKeys26_2 dataKeys, final StructuredDataContainer container) {
|
||||
container.remove(dataKeys.sulfurCubeContent);
|
||||
}
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2026 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viaversion.protocols.v26_1to26_2.rewriter;
|
||||
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityType;
|
||||
import com.viaversion.viaversion.api.minecraft.entities.EntityTypes26_2;
|
||||
import com.viaversion.viaversion.api.minecraft.entitydata.types.EntityDataTypes26_1;
|
||||
import com.viaversion.viaversion.api.type.Types;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPacket26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ClientboundPackets26_1;
|
||||
import com.viaversion.viaversion.protocols.v1_21_11to26_1.packet.ServerboundPackets26_1;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.Protocol26_1To26_2;
|
||||
import com.viaversion.viaversion.protocols.v26_1to26_2.storage.Encrypted;
|
||||
import com.viaversion.viaversion.rewriter.EntityRewriter;
|
||||
|
||||
public final class EntityPacketRewriter26_2 extends EntityRewriter<ClientboundPacket26_1, Protocol26_1To26_2> {
|
||||
|
||||
public EntityPacketRewriter26_2(final Protocol26_1To26_2 protocol) {
|
||||
super(protocol);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerPackets() {
|
||||
super.registerPackets();
|
||||
|
||||
protocol.registerServerbound(ServerboundPackets26_1.SPECTATE_ENTITY, wrapper -> {
|
||||
final Integer entityId = wrapper.read(Types.OPTIONAL_VAR_INT);
|
||||
if (entityId != null) {
|
||||
wrapper.write(Types.VAR_INT, entityId);
|
||||
} else {
|
||||
wrapper.cancel();
|
||||
}
|
||||
});
|
||||
|
||||
protocol.appendClientbound(ClientboundPackets26_1.LOGIN, wrapper -> {
|
||||
// Continuing from the registered handler
|
||||
wrapper.passthrough(Types.BYTE); // Previous gamemode
|
||||
wrapper.passthrough(Types.BOOLEAN); // Debug
|
||||
wrapper.passthrough(Types.BOOLEAN); // Flat
|
||||
wrapper.passthrough(Types.OPTIONAL_GLOBAL_POSITION); // Last death location
|
||||
wrapper.passthrough(Types.VAR_INT); // Portal cooldown
|
||||
wrapper.passthrough(Types.VAR_INT); // Sea level
|
||||
final boolean onlineMode = wrapper.user().has(Encrypted.class);
|
||||
wrapper.write(Types.BOOLEAN, onlineMode);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void registerRewrites() {
|
||||
final EntityDataTypes26_1 entityDataTypes = protocol.mappedTypes().entityDataTypes();
|
||||
dataTypeMapper().register();
|
||||
registerEntityDataTypeHandler(
|
||||
entityDataTypes.itemType,
|
||||
entityDataTypes.blockStateType,
|
||||
entityDataTypes.optionalBlockStateType,
|
||||
entityDataTypes.particleType,
|
||||
entityDataTypes.particlesType,
|
||||
entityDataTypes.componentType,
|
||||
entityDataTypes.optionalComponentType
|
||||
);
|
||||
|
||||
filter().type(EntityTypes26_2.ABSTRACT_CUBE_MOB).addIndex(16); // baby
|
||||
filter().type(EntityTypes26_2.ABSTRACT_CUBE_MOB).addIndex(17); // age locked
|
||||
}
|
||||
|
||||
@Override
|
||||
public EntityType typeFromId(final int type) {
|
||||
return EntityTypes26_2.getTypeFromId(type);
|
||||
}
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
|
||||
* Copyright (C) 2016-2026 ViaVersion and contributors
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.viaversion.viaversion.protocols.v26_1to26_2.storage;
|
||||
|
||||
import com.viaversion.viaversion.api.connection.StorableObject;
|
||||
|
||||
public final class Encrypted implements StorableObject {
|
||||
}
|
||||
@@ -399,24 +399,14 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
}
|
||||
|
||||
final CompoundTag requirements = effectsTag.getCompoundTag("requirements");
|
||||
final ListTag<CompoundTag> terms;
|
||||
if (requirements != null && (terms = requirements.getListTag("terms", CompoundTag.class)) != null) {
|
||||
for (final CompoundTag term : terms) {
|
||||
updateEnchantmentTerm(term);
|
||||
}
|
||||
if (requirements != null) {
|
||||
updateEnchantmentTerm(requirements);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateEnchantmentTerm(final CompoundTag term) {
|
||||
final String condition = term.getString("condition");
|
||||
if (Key.equals(condition, "all_of") || Key.equals(condition, "any_of")) {
|
||||
final ListTag<CompoundTag> terms = term.getListTag("terms", CompoundTag.class);
|
||||
if (terms != null) {
|
||||
for (final CompoundTag childTerm : terms) {
|
||||
updateEnchantmentTerm(childTerm);
|
||||
}
|
||||
}
|
||||
} else if (Key.equals(condition, "inverted")) {
|
||||
if (Key.equals(condition, "inverted")) {
|
||||
final CompoundTag childTerm = term.getCompoundTag("term");
|
||||
if (childTerm != null) {
|
||||
updateEnchantmentTerm(childTerm);
|
||||
@@ -425,9 +415,17 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
final CompoundTag predicate = term.getCompoundTag("predicate");
|
||||
if (predicate != null) {
|
||||
updateType(predicate, "type", protocol.getMappingData().getEntityMappings());
|
||||
updateType(predicate, "entity_type", protocol.getMappingData().getEntityMappings());
|
||||
}
|
||||
} else if (Key.equals(condition, "block_state_property")) {
|
||||
updateType(term, "block", protocol.getMappingData().getFullBlockMappings());
|
||||
} else {
|
||||
final ListTag<CompoundTag> terms = term.getListTag("terms", CompoundTag.class);
|
||||
if (terms != null) {
|
||||
for (final CompoundTag childTerm : terms) {
|
||||
updateEnchantmentTerm(childTerm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -488,6 +486,10 @@ public class RegistryDataRewriter implements com.viaversion.viaversion.api.rewri
|
||||
}
|
||||
|
||||
private void setMappedOrDummyId(final FullMappings mappings, final StringTag tag) {
|
||||
if (Key.stripMinecraftNamespace(tag.getValue()).startsWith("#")) {
|
||||
return;
|
||||
}
|
||||
|
||||
String mappedType = mappings.mappedIdentifier(tag.getValue());
|
||||
if (mappedType == null) {
|
||||
mappedType = mappings.mappedIdentifier(0); // Dummy
|
||||
|
||||
+16
@@ -161,6 +161,22 @@ public abstract class ComponentRewriterBase<C extends ClientboundPacketType> imp
|
||||
});
|
||||
}
|
||||
|
||||
public void registerSetPlayerTeam26_2(final C packetType) {
|
||||
protocol.registerClientbound(packetType, wrapper -> {
|
||||
wrapper.passthrough(Types.STRING); // Team Name
|
||||
final byte action = wrapper.passthrough(Types.BYTE); // Mode
|
||||
if (action == 0 || action == 2) {
|
||||
passthroughAndProcess(wrapper); // Display name
|
||||
passthroughAndProcess(wrapper); // Prefix
|
||||
passthroughAndProcess(wrapper); // Suffix
|
||||
wrapper.passthrough(Types.VAR_INT); // Nametag visibility
|
||||
wrapper.passthrough(Types.VAR_INT); // Collision rule
|
||||
wrapper.passthrough(Types.OPTIONAL_VAR_INT); // Color
|
||||
wrapper.passthrough(Types.BYTE); // Flags
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void registerPlayerInfoUpdate1_21_4(final C packetType) {
|
||||
protocol.registerClientbound(packetType, wrapper -> {
|
||||
final BitSet actions = wrapper.passthrough(Types.PROFILE_ACTIONS_ENUM1_21_4);
|
||||
|
||||
@@ -9,100 +9,240 @@
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# Should ViaVersion check for updates?
|
||||
check-for-updates: false
|
||||
check-for-updates: true
|
||||
# Send the supported versions with the Status (Ping) response packet
|
||||
send-supported-versions: true
|
||||
send-supported-versions: false
|
||||
# Easier to configure alternative to 'block-protocols'. Uses readable version strings with possible '<' and '>' prefixes.
|
||||
# An example to block 1.16.4, everything below 1.16, as well as everything above 1.17.1 would be: ["<1.16", "1.16.4", ">1.17.1"]
|
||||
# You can use both this and the block-protocols option at the same time as well.
|
||||
block-versions: [">1.21.11"]
|
||||
block-versions: []
|
||||
# Block specific Minecraft protocol version numbers.
|
||||
# List of all Minecraft protocol versions: https://minecraft.wiki/w/Protocol_version, or use a generator: https://via.krusic22.com
|
||||
block-protocols: []
|
||||
# Change the blocked disconnect message
|
||||
block-disconnect-msg: |
|
||||
§7[§a§lTrue§c§lOG §e§lNetwork§7] §l§cUnsupported client! §e:(
|
||||
§4♥ §6Please re-log using MCJE 1.8-1.21.11 §4♥
|
||||
reload-disconnect-msg: |
|
||||
§7[§a§lTrue§c§lOG §e§lNetwork§7] §l§6Server is restarting... §4♥
|
||||
block-disconnect-msg: "You are using an unsupported Minecraft version!"
|
||||
# If you use ProtocolLib, we can't reload without kicking the players.
|
||||
# (We don't suggest using reload either, use a plugin manager)
|
||||
# You can customize the message we kick people with if you use ProtocolLib here.
|
||||
reload-disconnect-msg: "Server reload, please rejoin!"
|
||||
# Settings for logging behavior. When debugging issues, we may ask you to change some of these.
|
||||
# Most of these are disabled by default to prevent log spam from bad user input.
|
||||
logging:
|
||||
# Whether to log more info about kicks due to blocked protocol versions to the console.
|
||||
log-blocked-joins: false
|
||||
# Whether to log errors during entity data conversion.
|
||||
log-entity-data-errors: true
|
||||
log-text-component-conversion-errors: true
|
||||
# Whether to log errors during text component conversion.
|
||||
log-text-component-conversion-errors: false
|
||||
# Whether to warn for other issues when converting items, blocks, or other data between server and client.
|
||||
log-other-conversion-warnings: false
|
||||
# Maximum length of error messages in the console.
|
||||
max-error-length: 1500
|
||||
#
|
||||
# Used for auto updating config files. Do not touch.
|
||||
config-version: 1
|
||||
init-config-version: 1
|
||||
migrate-default-config-changes: false
|
||||
# Whether to update config values that were left on their default to newly changed defaults. Recommended to keep enabled.
|
||||
migrate-default-config-changes: true
|
||||
# If enabled, ViaVersion will send the native player version to the server on connect via a plugin message.
|
||||
# See the wiki for more info: https://github.com/ViaVersion/ViaVersion/wiki/Server-and-Player-Details-Protocol
|
||||
send-player-details: true
|
||||
# If enabled, ViaVersion will send the native server version to a player on connect via a plugin message.
|
||||
# See the wiki above for more info.
|
||||
send-server-details: true
|
||||
#----------------------------------------------------------#
|
||||
# VELOCITY OPTIONS #
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# Velocity allows you to have different server versions inside.
|
||||
# Instead of you entering all the versions of these servers, we can ping them.
|
||||
#
|
||||
# What interval would you like us to ping at? (in seconds)
|
||||
# Use -1 to disable.
|
||||
velocity-ping-interval: 60
|
||||
# If the above is enabled, should we save the info to the config (in the section below)
|
||||
velocity-ping-save: true
|
||||
# To get a server's protocol, ViaVersion will do the following:
|
||||
# Look for the server in the following section, then look for the last ping if velocity-ping is enabled
|
||||
# otherwise use default.
|
||||
#
|
||||
# The format for the following is:
|
||||
# servername: protocolversion
|
||||
# You can find protocol ids on https://minecraft.wiki/w/Protocol_version
|
||||
# It will fall back to the default option if none found.
|
||||
velocity-servers: {}
|
||||
#
|
||||
#----------------------------------------------------------#
|
||||
# GLOBAL PACKET LIMITER #
|
||||
#----------------------------------------------------------#
|
||||
# Packets Per Second (PPS) and kilobyte packet size limiters.
|
||||
# Setting 'max-per-second' or 'sustained-max-per-second' to -1 will disable the individual limit.
|
||||
# Kick messages may include the %pps or %bps placeholders respectively, though they are more intended for debugging purposes.
|
||||
#
|
||||
# Limits the amount of packets sent per second.
|
||||
# Clients by default send around 20-90 packets per second.
|
||||
packet-limiter:
|
||||
enabled: true
|
||||
# The maximum packets a client can send per second.
|
||||
max-per-second: 800
|
||||
max-per-second-kick-message: Your client is sending too many packets.
|
||||
max-per-second-kick-message: "You are sending too many packets!"
|
||||
#
|
||||
# We can also kick them if they repeatedly send too many packets over a longer period of time.
|
||||
# E.g. if a player sends over 200 packets per second for 4 out of 7 seconds, we kick them.
|
||||
# The maximum packets per second a client can send over a longer period of time.
|
||||
sustained-max-per-second: 200
|
||||
# Period to track in seconds.
|
||||
sustained-period-seconds: 7
|
||||
# The number of seconds within the interval that the client can exceed the limit before being kicked.
|
||||
sustained-threshold: 4
|
||||
sustained-kick-message: Your client is sending way too many packets!
|
||||
sustained-kick-message: "You are sending too many packets, :("
|
||||
# Limits the size of packets in kilobytes sent per second.
|
||||
packet-size-limiter:
|
||||
enabled: true
|
||||
enabled: false
|
||||
max-per-second: -1
|
||||
max-per-second-kick-message: Your client is sending too many packets per second.
|
||||
max-per-second-kick-message: "You are sending too large packets!"
|
||||
sustained-max-per-second: -1
|
||||
sustained-period-seconds: 5
|
||||
sustained-threshold: 3
|
||||
sustained-kick-message: Your client is sending packets which are larger than the limit!
|
||||
hologram-patch: true
|
||||
sustained-kick-message: "You are sending too large packets, :("
|
||||
#
|
||||
#----------------------------------------------------------#
|
||||
# MULTIPLE VERSIONS OPTIONS #
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# Should we enable our hologram patch?
|
||||
# If they're in the wrong place, enable this
|
||||
hologram-patch: false
|
||||
# This is the offset, should work as default when enabled.
|
||||
hologram-y: -0.96
|
||||
# Whether to make sure ViaVersion's UserConnection object is already available in the PlayerJoinEvent.
|
||||
# You may disable this for faster startup/join time if you are 100% sure no plugin requires this.
|
||||
register-userconnections-on-join: true
|
||||
piston-animation-patch: true
|
||||
quick-move-action-fix: true
|
||||
# Should we disable piston animation for 1.11/1.11.1 clients?
|
||||
# In some cases, when firing lots of pistons, it crashes them.
|
||||
piston-animation-patch: false
|
||||
# Experimental - Should we fix shift quick move action for 1.12 clients (causes shift + double click not to work when moving items) (only works on 1.8-1.11.2 bukkit based servers)
|
||||
quick-move-action-fix: false
|
||||
# Should we use prefix for team color on 1.13 and above clients?
|
||||
team-colour-fix: true
|
||||
# 1.13 introduced new auto complete which can trigger "Kicked for spamming" for servers older than 1.13, the following option will disable it completely.
|
||||
disable-1_13-auto-complete: false
|
||||
1_13-tab-complete-delay: 2
|
||||
fix-low-snow-collision: true
|
||||
fix-infested-block-breaking: false
|
||||
# The following option will delay the tab complete request in x ticks if greater than 0, if other tab-complete is received, the previous is cancelled
|
||||
1_13-tab-complete-delay: 0
|
||||
# For 1.13 clients the smallest (1 layer) snow doesn't have collisions, this will send these as 2 snowlayers for 1.13+ clients to prevent them bugging through them
|
||||
fix-low-snow-collision: false
|
||||
# Infested blocks are instantly breakable for 1.13+ clients, resulting in them being unable to break them on sub 1.13 servers. This remaps them to their normal stone variants
|
||||
fix-infested-block-breaking: true
|
||||
# In 1.14 the client page limit has been upped to 100 (from 50). Some anti-exploit plugins ban when clients go higher than 50. This option cuts edited books to 50 pages.
|
||||
truncate-1_14-books: false
|
||||
change-1_9-hitbox: true
|
||||
# This prevents clients using 1.9-1.13 on 1.8 servers from receiving no knockback/having velocity bugs whilst sneaking under a block.
|
||||
change-1_9-hitbox: false
|
||||
# Similar to the above, but for 1.14+ players on 1.8-1.13 servers.
|
||||
# WARNING: This gives 1.14+ players the ability to sneak under blocks, that players under that version cannot (sneaking in places that are only 1.5 blocks high)!
|
||||
# Another thing to remember is that those players might be missed by projectiles and other hits directed at the very top of their head whilst sneaking.
|
||||
change-1_14-hitbox: false
|
||||
# Fixes 1.14+ clients on sub 1.14 servers having a light value of 0 for non-full blocks.
|
||||
fix-non-full-blocklight: true
|
||||
# Fixes walk animation not shown when health is set to Float.NaN
|
||||
fix-1_14-health-nan: true
|
||||
# Should 1.15+ clients respawn instantly / without showing a death screen?
|
||||
use-1_15-instant-respawn: false
|
||||
#
|
||||
# Enable serverside block-connections for 1.13+ clients - all the options in this section are built around this option
|
||||
serverside-blockconnections: true
|
||||
# Sets the method for the block connections (world for highly experimental (USE AT OWN RISK) world-level or packet for packet-level)
|
||||
blockconnection-method: packet
|
||||
# When activated, only the most important blocks are stored in the blockstorage. (fences, glass panes etc. won't connect to solid blocks)
|
||||
reduce-blockstorage-memory: false
|
||||
flowerstem-when-block-above: true
|
||||
vine-climb-fix: true
|
||||
# When activated with serverside-blockconnections, flower parts with blocks above will be sent as stems
|
||||
# Useful for lobbyservers where users can't build and those stems are used decoratively
|
||||
flowerstem-when-block-above: false
|
||||
# Vines that are not connected to blocks will be mapped to air, else 1.13+ would still be able to climb up on them.
|
||||
vine-climb-fix: false
|
||||
#
|
||||
# Ignores incoming plugin channel messages of 1.16+ clients with channel names longer than 32 characters.
|
||||
# CraftBukkit had this limit hardcoded until 1.16, so we have to assume any server/proxy might have this arbitrary check present.
|
||||
ignore-long-1_16-channel-names: true
|
||||
#
|
||||
# Force 1.17+ client to accept the server resource pack; they will automatically disconnect if they decline.
|
||||
forced-use-1_17-resource-pack: false
|
||||
# The message to be displayed at the prompt when the 1.17+ client receives the server resource pack.
|
||||
resource-pack-1_17-prompt: ''
|
||||
#
|
||||
# Caches light until chunks are unloaded to allow later chunk update packets as opposed to instantly uncaching when the first chunk data is sent.
|
||||
# Only disable this if you know what you are doing.
|
||||
cache-1_17-light: true
|
||||
#
|
||||
# Force-update 1.19.4+ player's inventory when they try to swap armor in a pre-occupied slot.
|
||||
armor-toggle-fix: true
|
||||
#
|
||||
# Get the world names which should be returned for each vanilla dimension
|
||||
map-1_16-world-names:
|
||||
overworld: minecraft:overworld
|
||||
nether: minecraft:the_nether
|
||||
end: minecraft:the_end
|
||||
overworld: "minecraft:overworld"
|
||||
nether: "minecraft:the_nether"
|
||||
end: "minecraft:the_end"
|
||||
#
|
||||
# If disabled, tamed cats will be displayed as ocelots to 1.14+ clients on 1.13 servers. Otherwise, ocelots (tamed and untamed) will be displayed as cats.
|
||||
translate-ocelot-to-cat: false
|
||||
#
|
||||
# Determines the value sent to 1.19+ clients on join if currently not accessible by ViaVersion.
|
||||
# It is not recommended to fake this value if your server is running 1.19 or later, as 1.20.5 have stricter chat handling and may get kicked otherwise.
|
||||
enforce-secure-chat: false
|
||||
#
|
||||
# Handles items with invalid count values (higher than max stack size) on 1.20.3 servers.
|
||||
handle-invalid-item-count: false
|
||||
#
|
||||
# Hides scoreboard numbers for 1.20.3+ clients on older server versions.
|
||||
hide-scoreboard-numbers: false
|
||||
fix-1_21-placement-rotation: false
|
||||
#
|
||||
# Fixes 1.21+ clients on 1.20.5 servers placing water/lava buckets at the wrong location when moving fast, NOTE: This may cause issues with anti-cheat plugins.
|
||||
fix-1_21-placement-rotation: true
|
||||
#
|
||||
# If enabled, cancel swing packets sent while having an inventory opened on 1.15.2 and below servers. This can cause false positives with anti-cheat plugins.
|
||||
cancel-swing-in-inventory: true
|
||||
#
|
||||
#----------------------------------------------------------#
|
||||
# 1.9+ CLIENTS ON 1.8 SERVERS OPTIONS #
|
||||
#----------------------------------------------------------#
|
||||
#
|
||||
# No collide options, these allow you to configure how collision works.
|
||||
# Do you want us to prevent collision?
|
||||
prevent-collision: true
|
||||
# If the above is true, should we automatically team players until you do?
|
||||
auto-team: true
|
||||
# When enabled, 1.9+ will be able to block by using shields
|
||||
shield-blocking: true
|
||||
no-delay-shield-blocking: true
|
||||
# If this setting is active, the main hand is used instead of the off-hand to trigger the blocking of the player.
|
||||
# With the main hand, the blocking starts way faster.
|
||||
# (Requires "show-shield-when-sword-in-hand" to be disabled)
|
||||
no-delay-shield-blocking: false
|
||||
# If this setting is active, the shield will appear immediately for 1.9+ when you hold a sword in your main hand.
|
||||
# The shield disappears when you switch to another item.
|
||||
# (Requires "shield-blocking" to be enabled)
|
||||
show-shield-when-sword-in-hand: false
|
||||
# Enable player tick simulation, this fixes eating, drinking, nether portals.
|
||||
simulate-pt: true
|
||||
# Should we use nms player to simulate packets, (may fix anti-cheat issues)
|
||||
nms-player-ticking: true
|
||||
# Should we patch boss bars so they work? (Default: true, disable if you're having issues)
|
||||
bossbar-patch: true
|
||||
# If your boss bar flickers on 1.9+, set this to 'true'. It will keep all boss bars on 100% (not recommended)
|
||||
bossbar-anti-flicker: false
|
||||
use-new-effect-indicator: false
|
||||
# This will show the new effect indicator in the top-right corner for 1.9+ players.
|
||||
use-new-effect-indicator: true
|
||||
# Show the new death messages for 1.9+ on the death screen
|
||||
use-new-deathmessages: true
|
||||
# Should we cache our items, this will prevent the server from being lagged out, however, the cost is a constant task caching items
|
||||
item-cache: true
|
||||
# Should we replace extended pistons to fix 1.10.1 (Only on chunk loading)?
|
||||
replace-pistons: false
|
||||
# What id should we replace with, default is air. (careful of players getting stuck standing on them)
|
||||
replacement-piston-id: 0
|
||||
# Fix 1.9+ clients not rendering the far away chunks and improve chunk rendering when moving fast (Increases network usage and decreases client fps slightly)
|
||||
chunk-border-fix: false
|
||||
# Allows 1.9+ left-handedness (main hand) on 1.8 servers
|
||||
left-handed-handling: true
|
||||
# Tries to cancel block break/place sounds sent by 1.8 servers to 1.9+ clients to prevent them from playing twice
|
||||
cancel-block-sounds: true
|
||||
# If enabled, 1.21.11+ clients on 1.8 servers will get wider entity hitboxes when attacking with items
|
||||
use-1_8-hitbox-margin: true
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3
-3
@@ -1,9 +1,9 @@
|
||||
# Project properties - we put these here so they can be modified without causing a recompile of the build scripts
|
||||
projectVersion=5.9.2-SNAPSHOT
|
||||
projectVersion=5.10.0
|
||||
|
||||
# Smile emoji (note that modrinth may not have added the version on release yet)
|
||||
mcVersions=26.1.2, 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9
|
||||
mcVersionRange=1.8-26.1.2
|
||||
mcVersions=26.2, 26.1.2, 26.1.1, 26.1, 1.21.11, 1.21.10, 1.21.9, 1.21.8, 1.21.7, 1.21.6, 1.21.5, 1.21.4, 1.21.3, 1.21.2, 1.21.1, 1.21, 1.20.6, 1.20.5, 1.20.4, 1.20.3, 1.20.2, 1.20.1, 1.20, 1.19.4, 1.19.3, 1.19.2, 1.19.1, 1.19, 1.18.2, 1.18.1, 1.18, 1.17.1, 1.17, 1.16.5, 1.16.4, 1.16.3, 1.16.2, 1.16.1, 1.16, 1.15.2, 1.15.1, 1.15, 1.14.4, 1.14.3, 1.14.2, 1.14.1, 1.14, 1.13.2, 1.13.1, 1.13, 1.12.2, 1.12.1, 1.12, 1.11.2, 1.11.1, 1.11, 1.10.2, 1.10.1, 1.10, 1.9.4, 1.9.3, 1.9.2, 1.9.1, 1.9, 1.8.9
|
||||
mcVersionRange=1.8-26.2
|
||||
velocityVersion=3.4-3.5
|
||||
|
||||
# Gradle properties
|
||||
|
||||
@@ -2,7 +2,7 @@ metadata.format.version = "1.1"
|
||||
|
||||
[versions]
|
||||
|
||||
gson = "2.13.2"
|
||||
gson = "2.14.0"
|
||||
snakeYaml = "2.6"
|
||||
fastutil = "8.5.15"
|
||||
vianbt = "5.2.1"
|
||||
@@ -13,8 +13,8 @@ netty = "4.0.20.Final"
|
||||
guava = "17.0"
|
||||
|
||||
junit = "6.0.3"
|
||||
platformLauncher = "6.0.3"
|
||||
checkerQual = "3.54.0"
|
||||
platformLauncher = "6.1.0"
|
||||
checkerQual = "4.2.0"
|
||||
|
||||
# Platforms
|
||||
paper = "1.20.4-R0.1-SNAPSHOT"
|
||||
|
||||
Vendored
BIN
Binary file not shown.
+4
-2
@@ -1,8 +1,10 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=2ab2958f2a1e51120c326cad6f385153bb11ee93b3c216c5fccebfdfbb7ec6cb
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
|
||||
distributionSha256Sum=bafc141b619ad6350fd975fc903156dd5c151998cc8b058e8c1044ab5f7b031f
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
|
||||
networkTimeout=10000
|
||||
retries=0
|
||||
retryBackOffMs=500
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -57,7 +57,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
|
||||
Vendored
+10
-21
@@ -23,8 +23,8 @@
|
||||
@rem
|
||||
@rem ##########################################################################
|
||||
|
||||
@rem Set local scope for the variables with windows NT shell
|
||||
if "%OS%"=="Windows_NT" setlocal
|
||||
@rem Set local scope for the variables, and ensure extensions are enabled
|
||||
setlocal EnableExtensions
|
||||
|
||||
set DIRNAME=%~dp0
|
||||
if "%DIRNAME%"=="" set DIRNAME=.
|
||||
@@ -51,7 +51,7 @@ echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
"%COMSPEC%" /c exit 1
|
||||
|
||||
:findJavaFromJavaHome
|
||||
set JAVA_HOME=%JAVA_HOME:"=%
|
||||
@@ -65,7 +65,7 @@ echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
"%COMSPEC%" /c exit 1
|
||||
|
||||
:execute
|
||||
@rem Setup the command line
|
||||
@@ -73,21 +73,10 @@ goto fail
|
||||
|
||||
|
||||
@rem Execute Gradle
|
||||
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
|
||||
@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
|
||||
@rem which allows us to clear the local environment before executing the java command
|
||||
endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
|
||||
|
||||
:end
|
||||
@rem End local scope for the variables with windows NT shell
|
||||
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||
|
||||
:fail
|
||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||
rem the _cmd.exe /c_ return code!
|
||||
set EXIT_CODE=%ERRORLEVEL%
|
||||
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||
exit /b %EXIT_CODE%
|
||||
|
||||
:mainEnd
|
||||
if "%OS%"=="Windows_NT" endlocal
|
||||
|
||||
:omega
|
||||
:exitWithErrorLevel
|
||||
@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
|
||||
"%COMSPEC%" /c exit %ERRORLEVEL%
|
||||
+1
-1
@@ -14,7 +14,7 @@ dependencyResolutionManagement {
|
||||
pluginManagement {
|
||||
// default plugin versions
|
||||
plugins {
|
||||
id("com.gradleup.shadow") version "9.4.1"
|
||||
id("com.gradleup.shadow") version "9.4.2"
|
||||
id("net.kyori.blossom") version "2.2.0"
|
||||
id("org.jetbrains.gradle.plugin.idea-ext") version "1.4.1"
|
||||
|
||||
|
||||
Reference in new issue
Block a user