ViaFabricPlus/src/main/java/de/florianmichael/viafabricplus/fixes/entity/EntityDimensionReplacements...

210 lines
10 KiB
Java

/*
* This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
* Copyright (C) 2021-2024 FlorianMichael/EnZaXD <florian.michael07@gmail.com> and RK_01/RaphiMC
* Copyright (C) 2023-2024 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 de.florianmichael.viafabricplus.fixes.entity;
import de.florianmichael.viafabricplus.event.ChangeProtocolVersionCallback;
import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityType;
import net.raphimc.vialoader.util.VersionEnum;
import java.util.Collections;
import java.util.Map;
import static de.florianmichael.viafabricplus.util.MapUtil.linkedHashMap;
/**
* Data dump for entity dimension changes between versions.
*/
public class EntityDimensionReplacements {
/**
* A map of entity types to a map of versions to dimensions.
*/
private static final Map<EntityType<?>, Map<VersionEnum, EntityDimensions>> ENTITY_DIMENSIONS = linkedHashMap(
EntityType.WITHER, linkedHashMap(
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.9F, 4.0F),
VersionEnum.r1_8, EntityType.WITHER.getDimensions()
),
EntityType.SILVERFISH, linkedHashMap(
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.3F, 0.7F),
VersionEnum.r1_8, EntityType.SILVERFISH.getDimensions()
),
EntityType.SNOW_GOLEM, linkedHashMap(
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.4F, 1.8F),
VersionEnum.r1_8, EntityType.SNOW_GOLEM.getDimensions()
),
EntityType.ZOMBIE, linkedHashMap(
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.6F, 1.8F),
VersionEnum.r1_8, EntityDimensions.fixed(EntityType.ZOMBIE.getDimensions().width, EntityType.ZOMBIE.getDimensions().height),
VersionEnum.r1_9, EntityType.ZOMBIE.getDimensions()
),
EntityType.CHICKEN, linkedHashMap(
VersionEnum.b1_7tob1_7_3, EntityDimensions.changing(0.3F, 0.4F),
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.3F, 0.7F),
VersionEnum.r1_8, EntityType.CHICKEN.getDimensions()
),
EntityType.SHEEP, linkedHashMap(
VersionEnum.c0_28toc0_30, EntityDimensions.changing(1.4F, 1.72F),
VersionEnum.a1_0_15, EntityType.SHEEP.getDimensions()
),
EntityType.OCELOT, linkedHashMap(
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.6F, 0.8F),
VersionEnum.r1_8, EntityType.OCELOT.getDimensions()
),
EntityType.BOAT, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(1.5F, 0.6F),
VersionEnum.r1_9, EntityType.BOAT.getDimensions()
),
EntityType.CREEPER, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(0.6F, 1.8F),
VersionEnum.r1_9, EntityType.CREEPER.getDimensions()
),
EntityType.IRON_GOLEM, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(1.4F, 2.9F),
VersionEnum.r1_9, EntityType.IRON_GOLEM.getDimensions()
),
EntityType.SKELETON, linkedHashMap(
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.6F, 1.8F),
VersionEnum.r1_8, EntityDimensions.changing(0.6F, 1.95F),
VersionEnum.r1_9, EntityType.SKELETON.getDimensions()
),
EntityType.WITHER_SKELETON, linkedHashMap(
VersionEnum.r1_4_6tor1_4_7, EntityDimensions.changing(0.72F, 2.16F),
VersionEnum.r1_7_6tor1_7_10, EntityDimensions.changing(0.72F, 2.34F),
VersionEnum.r1_8, EntityDimensions.changing(0.72F, 2.535F),
VersionEnum.r1_9, EntityType.WITHER_SKELETON.getDimensions()
),
EntityType.COW, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(0.9F, 1.3F),
VersionEnum.r1_9, EntityType.COW.getDimensions()
),
EntityType.HORSE, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(1.4F, 1.6F),
VersionEnum.r1_9, EntityType.HORSE.getDimensions()
),
EntityType.MOOSHROOM, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(0.9F, 1.3F),
VersionEnum.r1_9, EntityType.MOOSHROOM.getDimensions()
),
EntityType.RABBIT, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(0.6F, 0.7F),
VersionEnum.r1_9, EntityType.RABBIT.getDimensions()
),
EntityType.SQUID, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(0.95F, 0.95F),
VersionEnum.r1_9, EntityType.SQUID.getDimensions()
),
EntityType.VILLAGER, linkedHashMap(
VersionEnum.r1_8, EntityDimensions.changing(0.6F, 1.8F),
VersionEnum.r1_9, EntityType.VILLAGER.getDimensions()
),
EntityType.WOLF, linkedHashMap(
VersionEnum.r1_1, EntityDimensions.changing(0.8F, 0.8F),
VersionEnum.r1_8, EntityDimensions.changing(0.6F, 0.8F),
VersionEnum.r1_9, EntityType.WOLF.getDimensions()
),
EntityType.DRAGON_FIREBALL, linkedHashMap(
VersionEnum.r1_10, EntityDimensions.changing(0.3125F, 0.3125F),
VersionEnum.r1_11, EntityType.DRAGON_FIREBALL.getDimensions()
),
EntityType.LEASH_KNOT, linkedHashMap(
VersionEnum.r1_16_4tor1_16_5, EntityDimensions.changing(0.5F, 0.5F),
VersionEnum.r1_17, EntityType.LEASH_KNOT.getDimensions()
),
EntityType.SLIME, linkedHashMap(
VersionEnum.r1_13_2, EntityDimensions.changing(2F, 2F),
VersionEnum.r1_14, EntityType.SLIME.getDimensions()
),
EntityType.MAGMA_CUBE, linkedHashMap(
VersionEnum.r1_13_2, EntityDimensions.changing(2F, 2F),
VersionEnum.r1_14, EntityType.MAGMA_CUBE.getDimensions()
),
EntityType.ARROW, linkedHashMap(
VersionEnum.c0_28toc0_30, EntityDimensions.changing(0.3F, 0.5F),
VersionEnum.a1_0_15, EntityType.ARROW.getDimensions()
)
);
static {
ChangeProtocolVersionCallback.EVENT.register((oldVersion, newVersion) -> MinecraftClient.getInstance().execute(() -> ENTITY_DIMENSIONS.forEach((entityType, dimensionMap) -> {
for (Map.Entry<VersionEnum, EntityDimensions> entry : dimensionMap.entrySet()) {
final VersionEnum version = entry.getKey();
final EntityDimensions dimensions = entry.getValue();
if (oldVersion.isNewerThan(version) && newVersion.isOlderThanOrEqualTo(version)) {
entityType.dimensions = dimensions;
break;
}
if (newVersion.isNewerThanOrEqualTo(version) && oldVersion.isOlderThanOrEqualTo(version)) {
entityType.dimensions = dimensions;
}
}
})));
}
public static void init() {
// Loads the class and triggers the static initializer.
}
/**
* @param entityType The {@link EntityType} to get the dimensions for.
* @return The dimensions for the given {@link EntityType} or null if there are none. The map is unmodifiable.
*/
public static Map<VersionEnum, EntityDimensions> getEntityDimensions(final EntityType<?> entityType) {
if (!ENTITY_DIMENSIONS.containsKey(entityType)) {
return null;
}
return Collections.unmodifiableMap(ENTITY_DIMENSIONS.get(entityType));
}
/**
* @param entityType The {@link EntityType} to get the dimensions for.
* @param version The {@link VersionEnum} to get the dimensions for.
* @return The closest dimensions for the given {@link EntityType} and {@link VersionEnum} or null if there are none.
*/
public static EntityDimensions getEntityDimensions(final EntityType<?> entityType, final VersionEnum version) {
final Map<VersionEnum, EntityDimensions> dimensionMap = getEntityDimensions(entityType);
if (dimensionMap == null) {
return null;
}
EntityDimensions closestDimensions = null;
VersionEnum closestVersion = null;
for (Map.Entry<VersionEnum, EntityDimensions> entry : dimensionMap.entrySet()) {
final var currentVersion = entry.getKey();
final var currentDimensions = entry.getValue();
if (currentVersion == version) { // If the version is exactly the same, return the dimensions
return currentDimensions;
}
// If the current version is closer to the version you are looking for
if (closestVersion == null || Math.abs(version.ordinal() - currentVersion.ordinal()) < Math.abs(version.ordinal() - closestVersion.ordinal())) {
closestVersion = currentVersion;
closestDimensions = currentDimensions;
}
}
return closestDimensions;
}
}