# Patch Notes: Hytale Server (Pre-release) ## Version 2026.01.15-c04fdfe10 → 2026.01.16-c508b9acd **Date de release** : 16 janvier 2026 (Pre-release) **Build précédent** : `c04fdfe10` (15 janvier 2026) **Build actuel** : `c508b9acd` (16 janvier 2026) --- ## Statistiques | Métrique | Valeur | |----------|--------| | Fichiers modifiés | 169 | | Insertions | +1604 | | Suppressions | -994 | | Delta net | +610 lignes | --- ## Table des matières 1. [Authentification - ProfileServiceClient (NOUVEAU)](#1-authentification---profileserviceclient-nouveau) 2. [Authentification - ServerAuthManager Refactoring](#2-authentification---serverauthmanager-refactoring) 3. [Système de Commandes - GAME_PROFILE_LOOKUP (NOUVEAU)](#3-système-de-commandes---game_profile_lookup-nouveau) 4. [Commandes Access Control Refactorisées](#4-commandes-access-control-refactorisées) 5. [Système de Téléportation Refactorisé](#5-système-de-téléportation-refactorisé) 6. [WorldGen - BlockMaskCondition](#6-worldgen---blockmaskcondition) 7. [PrefabSaver - Async Chunk Loading](#7-prefabsaver---async-chunk-loading) 8. [ChunkStore - Thread Safety Generator](#8-chunkstore---thread-safety-generator) 9. [InteractionManager - Timing Refactoring](#9-interactionmanager---timing-refactoring) 10. [InteractionContext - Amélioration Sélection Inventaire](#10-interactioncontext---amélioration-sélection-inventaire) 11. [Système Memories - Nouvelles Fonctionnalités](#11-système-memories---nouvelles-fonctionnalités) 12. [Configuration Serveur - Suppression LocalCompression](#12-configuration-serveur---suppression-localcompression) 13. [Holder - Nouvelle méthode cloneSerializable](#13-holder---nouvelle-méthode-cloneserializable) 14. [BlockSelection - Tri et Filler Fix](#14-blockselection---tri-et-filler-fix) 15. [Corrections de Bugs](#15-corrections-de-bugs) 16. [Migration Annotations checkerframework → javax](#16-migration-annotations-checkerframework--javax) 17. [Liste complète des fichiers modifiés](#17-liste-complète-des-fichiers-modifiés) --- ## 1. Authentification - ProfileServiceClient (NOUVEAU) **Nouveau fichier** : `com/hypixel/hytale/server/core/auth/ProfileServiceClient.java` ### 1.1 Description Nouveau client HTTP pour le service de profils Hytale. Permet de récupérer les profils publics de joueurs par UUID ou par username. **URL du service** : `https://account-data.hytale.com` ### 1.2 API Complète ```java public class ProfileServiceClient { private static final Duration REQUEST_TIMEOUT = Duration.ofSeconds(5L); public ProfileServiceClient(@Nonnull String profileServiceUrl); // Synchrone @Nullable public PublicGameProfile getProfileByUuid(@Nonnull UUID uuid, @Nonnull String bearerToken); @Nullable public PublicGameProfile getProfileByUsername(@Nonnull String username, @Nonnull String bearerToken); // Asynchrone public CompletableFuture getProfileByUuidAsync(@Nonnull UUID uuid, @Nonnull String bearerToken); public CompletableFuture getProfileByUsernameAsync(@Nonnull String username, @Nonnull String bearerToken); // Classe interne public static class PublicGameProfile { public static final BuilderCodec CODEC; private UUID uuid; private String username; public UUID getUuid(); public String getUsername(); } } ``` ### 1.3 Endpoints | Endpoint | Méthode | Description | |----------|---------|-------------| | `/profile/uuid/{uuid}` | GET | Récupère un profil par UUID | | `/profile/username/{username}` | GET | Récupère un profil par username (URL encoded) | ### 1.4 Headers HTTP ``` Accept: application/json Authorization: Bearer {token} User-Agent: {AuthConfig.USER_AGENT} ``` ### 1.5 Gestion des erreurs - Timeout de 5 secondes - Retourne `null` si HTTP status != 200 - Logging des erreurs IO, interruptions et exceptions --- ## 2. Authentification - ServerAuthManager Refactoring **Fichier** : `com/hypixel/hytale/server/core/auth/ServerAuthManager.java` ### 2.1 Nouvelle intégration ProfileServiceClient ```java private volatile ProfileServiceClient profileServiceClient; @Nonnull public ProfileServiceClient getProfileServiceClient() { // Lazy initialization avec double-checked locking if (this.profileServiceClient == null) { synchronized (this) { if (this.profileServiceClient == null) { this.profileServiceClient = new ProfileServiceClient("https://account-data.hytale.com"); } } } return this.profileServiceClient; } ``` ### 2.2 Refactoring gestion d'expiration des tokens **Nouvelles méthodes privées** : ```java // Calcule l'expiry effective (minimum entre session et identity token) @Nullable private Instant getEffectiveExpiry(@Nullable SessionServiceClient.GameSessionResponse session) { Instant sessionExpiry = session != null ? session.getExpiresAtInstant() : null; Instant identityExpiry = this.parseIdentityTokenExpiry(session != null ? session.identityToken : this.getIdentityToken()); if (sessionExpiry != null && identityExpiry != null) { return sessionExpiry.isBefore(identityExpiry) ? sessionExpiry : identityExpiry; } return sessionExpiry != null ? sessionExpiry : identityExpiry; } // Parse l'expiry depuis le JWT identity token @Nullable private Instant parseIdentityTokenExpiry(@Nullable String idToken); // Méthode unifiée pour définir l'expiry et planifier le refresh private void setExpiryAndScheduleRefresh(@Nonnull Instant expiry); ``` ### 2.3 Changements de signature **Avant** : ```java private void scheduleRefresh(int expiresInSeconds); ``` **Après** : ```java private void setExpiryAndScheduleRefresh(@Nonnull Instant expiry); ``` ### 2.4 Réorganisation des champs ```java // Champs déplacés pour meilleure organisation private volatile SessionServiceClient.GameProfile[] pendingProfiles; private volatile AuthMode pendingAuthMode; // ... maintenant au début de la classe ``` ### 2.5 Fix typo ```java // Avant LOGGER.at(Level.INFO).log("Auto-selected profile from stroage: %s (%s)", ...); // Après LOGGER.at(Level.INFO).log("Auto-selected profile from storage: %s (%s)", ...); ``` ### 2.6 Suppression de dépendance ```java // Supprimé import org.checkerframework.checker.nullness.compatqual.NullableDecl; ``` --- ## 3. Système de Commandes - GAME_PROFILE_LOOKUP (NOUVEAU) **Fichier** : `com/hypixel/hytale/server/core/command/system/arguments/types/ArgTypes.java` ### 3.1 Nouveaux types d'arguments ```java // Version asynchrone public static final SingleArgumentType> GAME_PROFILE_LOOKUP_ASYNC; // Version synchrone (bloquante) public static final SingleArgumentType GAME_PROFILE_LOOKUP; ``` ### 3.2 Logique de résolution 1. **Recherche locale** : Vérifie d'abord les joueurs connectés sur tous les mondes 2. **Parsing UUID** : Tente de parser l'input comme UUID 3. **Lookup distant** : Utilise `ProfileServiceClient` pour résoudre par UUID ou username ```java // Pseudo-code de la logique for (World world : Universe.get().getWorlds().values()) { PlayerRef playerRef = NameMatching.DEFAULT.find(world.getPlayerRefs(), input, PlayerRef::getUsername); if (playerRef != null) { return new PublicGameProfile(playerRef.getUuid(), playerRef.getUsername()); } } // Fallback: lookup distant via ProfileServiceClient ``` ### 3.3 Messages d'erreur | Clé de traduction | Cas | |-------------------|-----| | `server.commands.parsing.argtype.playerUuidLookup.noAuth` | Pas de session token disponible | | `server.commands.parsing.argtype.playerUuidLookup.notFound` | Joueur introuvable | | `server.commands.parsing.argtype.playerUuidLookup.lookupError` | Erreur lors du lookup | --- ## 4. Commandes Access Control Refactorisées ### 4.1 BanCommand **Fichier** : `com/hypixel/hytale/server/core/modules/accesscontrol/commands/BanCommand.java` **Avant** : ```java private final RequiredArg usernameArg = this.withRequiredArg("username", "...", ArgTypes.STRING); private final OptionalArg reasonArg = this.withOptionalArg("reason", "...", ArgTypes.STRING); // Utilisation String username = this.usernameArg.get(context); AuthUtil.lookupUuid(username).thenCompose(uuid -> { ... }); ``` **Après** : ```java private final RequiredArg playerArg = this.withRequiredArg("player", "server.commands.ban.player.desc", ArgTypes.GAME_PROFILE_LOOKUP); // Utilisation ProfileServiceClient.PublicGameProfile profile = this.playerArg.get(context); UUID uuid = profile.getUuid(); Message displayMessage = Message.raw(profile.getUsername()).bold(true); ``` **Changements clés** : - Suppression de `AuthUtil.lookupUuid()` (lookup intégré dans `GAME_PROFILE_LOOKUP`) - Affichage du nom en **gras** dans les messages - Simplification du code (pas de chaîne `thenCompose`) ### 4.2 UnbanCommand **Fichier** : `com/hypixel/hytale/server/core/modules/accesscontrol/commands/UnbanCommand.java` Même refactoring que BanCommand. ### 4.3 WhitelistAddCommand **Fichier** : `com/hypixel/hytale/server/core/modules/accesscontrol/commands/WhitelistAddCommand.java` Même refactoring que BanCommand. ### 4.4 WhitelistRemoveCommand **Fichier** : `com/hypixel/hytale/server/core/modules/accesscontrol/commands/WhitelistRemoveCommand.java` Même refactoring que BanCommand. --- ## 5. Système de Téléportation Refactorisé ### 5.1 Teleport.java **Fichier** : `com/hypixel/hytale/server/core/modules/entity/teleport/Teleport.java` #### Nouveaux factory methods ```java // Pour les joueurs - sépare rotation du corps et de la tête @Nonnull public static Teleport createForPlayer(@Nullable World world, @Nonnull Transform transform) { Vector3f headRotation = transform.getRotation(); Vector3f bodyRotation = new Vector3f(0.0f, headRotation.getYaw(), 0.0f); return new Teleport(world, transform.getPosition(), bodyRotation).setHeadRotation(headRotation); } @Nonnull public static Teleport createForPlayer(@Nullable World world, @Nonnull Vector3d position, @Nonnull Vector3f rotation); @Nonnull public static Teleport createForPlayer(@Nonnull Vector3d position, @Nonnull Vector3f rotation); @Nonnull public static Teleport createForPlayer(@Nonnull Transform transform); // Pour téléportation exacte (contrôle précis des rotations) @Nonnull public static Teleport createExact(@Nonnull Vector3d position, @Nonnull Vector3f bodyRotation, @Nonnull Vector3f headRotation); @Nonnull public static Teleport createExact(@Nonnull Vector3d position, @Nonnull Vector3f bodyRotation); ``` #### Constructeurs supprimés ```java // Supprimés - remplacés par factory methods public Teleport(@Nullable World world, @Nonnull Transform transform); public Teleport(@Nonnull Transform transform); ``` #### Nouvelles méthodes de mutation ```java public void setPosition(@Nonnull Vector3d position); public void setRotation(@Nonnull Vector3f rotation); // Renommé (anciennement withHeadRotation) @Nonnull public Teleport setHeadRotation(@Nonnull Vector3f headRotation) { this.headRotation = headRotation.clone(); // Note: clone() ajouté return this; } ``` #### Méthodes supprimées ```java // Supprimé public Teleport withResetRoll(); ``` ### 5.2 Warp.java **Fichier** : `com/hypixel/hytale/builtin/teleport/Warp.java` #### Constructeur simplifié **Avant** : ```java public Warp(double locX, double locY, double locZ, float yaw, float pitch, float roll, String id, @Nonnull World world, String creator, Instant creationDate) { this.transform = new Transform(locX, locY, locZ, pitch, yaw, roll); // ... } ``` **Après** : ```java public Warp(@Nonnull Transform transform, @Nonnull String id, @Nonnull World world, @Nonnull String creator, @Nonnull Instant creationDate) { this.transform = transform; // ... } ``` #### Utilisation de Teleport.createForPlayer ```java // Avant return new Teleport(worldInstance, this.transform); // Après return Teleport.createForPlayer(worldInstance, this.transform); ``` ### 5.3 Commandes de téléportation mises à jour | Fichier | Changement | |---------|------------| | `SpawnCommand.java` | `Teleport.createForPlayer()` | | `SpawnSetCommand.java` | `Teleport.createForPlayer()` | | `TeleportAllCommand.java` | `Teleport.createForPlayer()` | | `TeleportHomeCommand.java` | `Teleport.createForPlayer()` | | `TeleportTopCommand.java` | `Teleport.createForPlayer()` | | `TeleportWorldCommand.java` | `Teleport.createForPlayer()` | | `TeleportOtherToPlayerCommand.java` | `Teleport.createForPlayer()` | | `TeleportPlayerToCoordinatesCommand.java` | `Teleport.createForPlayer()` | | `TeleportToCoordinatesCommand.java` | `Teleport.createForPlayer()` | | `TeleportToPlayerCommand.java` | `Teleport.createForPlayer()` | | `WarpCommand.java` | `Teleport.createForPlayer()` | | `WarpSetCommand.java` | `Teleport.createForPlayer()` | --- ## 6. WorldGen - BlockMaskCondition **Fichier** : `com/hypixel/hytale/server/worldgen/util/condition/BlockMaskCondition.java` ### 6.1 Changement d'architecture **Avant** : Interface fonctionnelle simple ```java @FunctionalInterface public interface BlockMaskCondition { public boolean eval(int var1, int var2, BlockFluidEntry var3); } ``` **Après** : Classe complète avec système de masques (+156 lignes) ```java public class BlockMaskCondition { public static final Mask DEFAULT_MASK; public static final BlockMaskCondition DEFAULT_TRUE; public static final BlockMaskCondition DEFAULT_FALSE; @Nonnull private Mask defaultMask = DEFAULT_MASK; @Nonnull private Long2ObjectMap specificMasks = Long2ObjectMaps.emptyMap(); public void set(@Nonnull Mask defaultMask, @Nonnull Long2ObjectMap specificMasks); public boolean eval(int currentBlock, int currentFluid, int nextBlockId, int nextFluidId); } ``` ### 6.2 Classes internes #### Mask ```java public static class Mask { private final boolean matchEmpty; private final MaskEntry[] entries; public Mask(@Nonnull MaskEntry[] entries); private Mask(boolean matchEmpty, @Nonnull MaskEntry[] entries); public boolean shouldReplace(int current, int fluid); } ``` #### MaskEntry Classe pour définir les conditions de remplacement basées sur : - ID de bloc - ID de fluide - Tags de bloc - Action (WHITELIST ou BLACKLIST) ### 6.3 Fichiers impactés - `BlockPlacementMaskJsonLoader.java` (+36/-12) - `BlockPlacementMaskRegistry.java` (+28/-8) - `PrefabPasteUtil.java` (+8/-4) --- ## 7. PrefabSaver - Async Chunk Loading **Fichier** : `com/hypixel/hytale/builtin/buildertools/prefabeditor/saving/PrefabSaver.java` ### 7.1 Nouveau flow asynchrone **Avant** : ```java @Nonnull public static CompletableFuture savePrefab(...) { return CompletableFuture.supplyAsync(() -> { BlockSelection blockSelection = PrefabSaver.copyBlocks(...); if (blockSelection == null) return false; return PrefabSaver.save(...); }, world); } ``` **Après** : ```java @Nonnull public static CompletableFuture savePrefab(...) { return PrefabSaver.copyBlocksAsync(...) .thenApplyAsync(blockSelection -> { if (blockSelection == null) return false; return PrefabSaver.save(...); }, (Executor)world); } ``` ### 7.2 Nouvelle méthode de préchargement ```java @Nonnull private static CompletableFuture>> preloadChunksInSelectionAsync( @Nonnull ChunkStore chunkStore, @Nonnull Vector3i minPoint, @Nonnull Vector3i maxPoint ); ``` ### 7.3 Méthode refactorisée ```java // Avant (synchrone) @Nullable private static BlockSelection copyBlocks(...); // Après (2 méthodes) @Nonnull private static CompletableFuture copyBlocksAsync(...); @Nullable private static BlockSelection copyBlocksWithLoadedChunks(..., @Nonnull Long2ObjectMap> loadedChunks, ...); ``` --- ## 8. ChunkStore - Thread Safety Generator **Fichier** : `com/hypixel/hytale/server/core/universe/world/storage/ChunkStore.java` ### 8.1 Nouveau lock pour le générateur ```java private final StampedLock generatorLock = new StampedLock(); ``` ### 8.2 Accès thread-safe au générateur **Avant** : ```java @Nullable public IWorldGen getGenerator() { return this.generator; } public void setGenerator(@Nullable IWorldGen generator) { if (this.generator != null) { this.generator.shutdown(); } this.generator = generator; // ... } ``` **Après** : ```java @Nullable public IWorldGen getGenerator() { long readStamp = this.generatorLock.readLock(); try { return this.generator; } finally { this.generatorLock.unlockRead(readStamp); } } public void setGenerator(@Nullable IWorldGen generator) { long writeStamp = this.generatorLock.writeLock(); try { if (this.generator != null) { this.generator.shutdown(); } this.generator = generator; // ... } finally { this.generatorLock.unlockWrite(writeStamp); } } ``` ### 8.3 Nouvelle méthode ```java public void shutdownGenerator() { this.setGenerator(null); } ``` ### 8.4 Accès protégé dans getChunkReferenceAsync Tous les accès à `this.generator` dans la méthode `getChunkReferenceAsync` sont maintenant protégés par `generatorLock.readLock()`. --- ## 9. InteractionManager - Timing Refactoring **Fichier** : `com/hypixel/hytale/server/core/entity/InteractionManager.java` ### 9.1 Nouveau champ de temps ```java private long currentTime = 1L; ``` ### 9.2 Mise à jour du temps ```java public void tick(@Nonnull Ref ref, @Nonnull CommandBuffer commandBuffer, float dt) { this.currentTime += (long)commandBuffer.getExternalData().getWorld().getTickStepNanos(); // ... } ``` ### 9.3 Remplacement de System.nanoTime() Toutes les occurrences de `System.nanoTime()` ont été remplacées par `this.currentTime` : | Contexte | Avant | Après | |----------|-------|-------| | packetQueueTime | `System.nanoTime()` | `this.currentTime` | | waitingForClientFinished | `System.nanoTime()` | `this.currentTime` | | waitingForServerFinished | `System.nanoTime()` | `this.currentTime` | | waitingForSyncData | `System.nanoTime()` | `this.currentTime` | | tickTime | `System.nanoTime()` | `this.currentTime` | | getTimeInSeconds | `System.nanoTime()` | `this.currentTime` | **Avantage** : Le temps est maintenant basé sur les ticks du monde plutôt que sur l'horloge système, ce qui améliore la cohérence et la reproductibilité. --- ## 10. InteractionContext - Amélioration Sélection Inventaire **Fichier** : `com/hypixel/hytale/server/core/entity/InteractionContext.java` ### 10.1 Nouveau cas de fallback Quand les priorités d'interaction primaire et secondaire sont égales : ```java } else { if (type == InteractionType.Primary && !primary.getItem().getInteractions().containsKey((Object)InteractionType.Primary)) { selectedInventory = -5; } if (type == InteractionType.Secondary && !primary.getItem().getInteractions().containsKey((Object)InteractionType.Secondary)) { selectedInventory = -5; } } ``` **Effet** : Si l'item primaire n'a pas d'interaction du type demandé, le système utilise l'inventaire secondaire (-5). --- ## 11. Système Memories - Nouvelles Fonctionnalités ### 11.1 MemoriesPlugin.java **Fichier** : `com/hypixel/hytale/builtin/adventure/memories/MemoriesPlugin.java` #### Nouvelles pages UI ```java // Nouvelle registration OpenCustomUIInteraction.registerCustomPageSupplier(this, MemoriesUnlockedPage.class, "MemoriesUnlocked", new MemoriesUnlockedPageSuplier()); ``` #### Protection shutdown ```java @Override protected void shutdown() { if (!this.hasInitializedMemories) { return; // Nouveau: évite NPE si pas initialisé } // ... } ``` #### Nouvelle méthode setRecordedMemoriesCount ```java public int setRecordedMemoriesCount(int count) { if (count < 0) count = 0; this.recordedMemories.lock.writeLock().lock(); try { this.recordedMemories.memories.clear(); ObjectArrayList allAvailableMemories = new ObjectArrayList(); for (Map.Entry> entry : this.allMemories.entrySet()) { allAvailableMemories.addAll(entry.getValue()); } int actualCount = Math.min(count, allAvailableMemories.size()); for (int i = 0; i < actualCount; ++i) { this.recordedMemories.memories.add(allAvailableMemories.get(i)); } BsonUtil.writeSync(Constants.UNIVERSE_PATH.resolve("memories.json"), RecordedMemories.CODEC, this.recordedMemories, this.getLogger()); return actualCount; } finally { this.recordedMemories.lock.writeLock().unlock(); } } ``` #### Fix calcul getMemoriesLevel **Avant** (bug: incrémentation incorrecte): ```java for (int i = 0; i < memoriesAmountPerLevel.length && recordedMemoriesCount >= memoriesAmountPerLevel[i]; ++i) { memoriesLevel += i + 1; } ``` **Après** : ```java for (int i = memoriesAmountPerLevel.length - 1; i >= 0; --i) { if (recordedMemoriesCount < memoriesAmountPerLevel[i]) continue; return i + 2; } return memoriesLevel; ``` #### Suppression méthode ```java // Supprimé public int getMemoriesForNextLevel(@Nonnull GameplayConfig gameplayConfig); ``` ### 11.2 NPCMemory.java **Fichier** : `com/hypixel/hytale/builtin/adventure/memories/memories/npc/NPCMemory.java` #### Nouvelle méthode displayCatchEntityParticles ```java private static void displayCatchEntityParticles(MemoriesGameplayConfig memoriesGameplayConfig, Vector3d targetPosition, Ref targetRef, @Nonnull CommandBuffer commandBuffer) { ModelParticle particle = memoriesGameplayConfig.getMemoriesCatchEntityParticle(); if (particle == null) return; NetworkId networkIdComponent = commandBuffer.getComponent(targetRef, NetworkId.getComponentType()); if (networkIdComponent == null) return; // Crée et envoie le packet de particules à tous les joueurs proches SpawnModelParticles packet = new SpawnModelParticles(networkIdComponent.getId(), modelParticlesProtocol); SpatialResource, EntityStore> spatialResource = commandBuffer.getResource(EntityModule.get().getPlayerSpatialResourceType()); SpatialStructure> spatialStructure = spatialResource.getSpatialStructure(); spatialStructure.ordered(targetPosition, memoriesGameplayConfig.getMemoriesCatchParticleViewDistance(), results); for (Ref ref : results) { PlayerRef playerRefComponent = commandBuffer.getComponent(ref, PlayerRef.getComponentType()); playerRefComponent.getPacketHandler().write((Packet)packet); } } ``` #### Appel dans GatherMemoriesSystem ```java // Après création de l'item mémoire commandBuffer.addEntity(memoryItemHolder, AddReason.SPAWN); GatherMemoriesSystem.displayCatchEntityParticles(memoriesGameplayConfig, memoryItemHolderPosition, ref, commandBuffer); ``` ### 11.3 Nouveaux fichiers | Fichier | Description | |---------|-------------| | `page/MemoriesUnlockedPage.java` | Page UI pour afficher les mémoires débloquées | | `page/MemoriesUnlockedPageSuplier.java` | Supplier pour la page | --- ## 12. Configuration Serveur - Suppression LocalCompression **Fichier** : `com/hypixel/hytale/server/core/HytaleServerConfig.java` ### 12.1 Champ supprimé ```java // Supprimé private boolean localCompressionEnabled; ``` ### 12.2 Méthodes supprimées ```java // Supprimés public boolean isLocalCompressionEnabled(); public void setLocalCompressionEnabled(boolean localCompression); ``` ### 12.3 Codec mis à jour Le champ `LocalCompressionEnabled` a été retiré du CODEC de configuration. ### 12.4 Impact sur SetupPacketHandler **Fichier** : `com/hypixel/hytale/server/core/io/handlers/SetupPacketHandler.java` ```java // Supprimé HytaleServerConfig serverConfig = HytaleServer.get().getConfig(); boolean enableCompression = !serverConfig.isLocalCompressionEnabled() ? !oldHandler.isLocalConnection() : true; oldHandler.setCompressionEnabled(enableCompression); ``` La configuration du serveur est maintenant récupérée plus tard, juste avant l'envoi de `ServerInfo`. --- ## 13. Holder - Nouvelle méthode cloneSerializable **Fichier** : `com/hypixel/hytale/component/Holder.java` ### 13.1 Nouvelle méthode ```java public Holder cloneSerializable(@Nonnull ComponentRegistry.Data data) { assert (this.archetype != null); assert (this.components != null); assert (this.registry != null); long stamp = this.lock.readLock(); try { Archetype serializableArchetype = this.archetype.getSerializableArchetype(data); Component[] componentsClone = new Component[serializableArchetype.length()]; for (int i = serializableArchetype.getMinIndex(); i < serializableArchetype.length(); ++i) { ComponentType componentType = serializableArchetype.get(i); if (componentType == null) continue; componentsClone[i] = this.components[i].cloneSerializable(); } return this.registry.newHolder(serializableArchetype, componentsClone); } finally { this.lock.unlockRead(stamp); } } ``` **Usage** : Clone un holder en ne gardant que les composants sérialisables. --- ## 14. BlockSelection - Tri et Filler Fix **Fichier** : `com/hypixel/hytale/server/core/prefab/selection/standard/BlockSelection.java` ### 14.1 Nouvelle méthode sortEntitiesByPosition ```java public void sortEntitiesByPosition() { this.entitiesLock.writeLock().lock(); try { ComponentType transformType = TransformComponent.getComponentType(); this.entities.sort((a, b) -> { TransformComponent ta = a.getComponent(transformType); TransformComponent tb = b.getComponent(transformType); // Comparaison par X, puis Y, puis Z // Gestion des cas null }); } finally { this.entitiesLock.writeLock().unlock(); } } ``` ### 14.2 Fix filler blocks ```java // Nouveau cas dans withBlockComponents if (holder != null && b.filler != 0) { return new BlockHolder(b.blockId(), b.rotation(), b.filler(), b.supportValue(), null); } ``` **Effet** : Les blocs filler ne perdent plus leurs données lors de la copie. --- ## 15. Corrections de Bugs ### 15.1 PickupItemSystem - Fix NPE **Fichier** : `com/hypixel/hytale/server/core/modules/entity/item/PickupItemSystem.java` ```java // Avant if (!targetRef.isValid()) { // Après if (targetRef == null || !targetRef.isValid()) { ``` ### 15.2 World - Fix coordonnée Y dans blockValidator **Fichier** : `com/hypixel/hytale/server/core/universe/world/World.java` ```java // Avant (bug: utilisait y au lieu de worldY) blockValidator.accept(worldX, y, worldZ, blockId, 0, 1.0f, holder, ...); // Après blockValidator.accept(worldX, worldY, worldZ, blockId, 0, 1.0f, holder, ...); ``` ### 15.3 CoopBlock - ArrayList → ObjectArrayList **Fichier** : `com/hypixel/hytale/builtin/adventure/farming/states/CoopBlock.java` ```java // Avant ArrayList remainder = new ArrayList(); // Après ObjectArrayList remainder = new ObjectArrayList(); ``` ### 15.4 EnterBedSystem - Ajout assertion **Fichier** : `com/hypixel/hytale/builtin/beds/sleep/systems/player/EnterBedSystem.java` ```java PlayerRef playerRef = store.getComponent(ref, PlayerRef.getComponentType()); assert (playerRef != null); // Nouveau ``` ### 15.5 UpdateSleepPacketSystem - Ajout assertions **Fichier** : `com/hypixel/hytale/builtin/beds/sleep/systems/player/UpdateSleepPacketSystem.java` ```java SleepTracker sleepTrackerComponent = archetypeChunk.getComponent(index, SleepTracker.getComponentType()); assert (sleepTrackerComponent != null); // Nouveau PlayerRef playerRefComponent = archetypeChunk.getComponent(index, PlayerRef.getComponentType()); assert (playerRefComponent != null); // Nouveau PlayerSomnolence playerSomnolenceComponent = archetypeChunk.getComponent(index, PlayerSomnolence.getComponentType()); assert (playerSomnolenceComponent != null); // Nouveau ``` ### 15.6 WeatherSystem - Ajout assertion **Fichier** : `com/hypixel/hytale/builtin/weather/systems/WeatherSystem.java` ```java WeatherTracker weatherTrackerComponent = commandBuffer.getComponent(ref, WeatherTracker.getComponentType()); assert (weatherTrackerComponent != null); // Nouveau weatherTrackerComponent.clear(); ``` --- ## 16. Migration Annotations checkerframework → javax ### 16.1 Annotations migrées | Avant | Après | |-------|-------| | `@NonNullDecl` | `@Nonnull` | | `@NullableDecl` | `@Nullable` | ### 16.2 Import supprimé ```java // Supprimé de tous les fichiers concernés import org.checkerframework.checker.nullness.compatqual.NonNullDecl; import org.checkerframework.checker.nullness.compatqual.NullableDecl; ``` ### 16.3 Fichiers impactés (liste partielle) - `BedInteraction.java` - `ServerAuthManager.java` - `FarmingSystems.java` - `FarmingUtil.java` - `CoopResidentComponent.java` - `UseCaptureCrateInteraction.java` - `UseCoopInteraction.java` - `CoopBlock.java` - `PlayerSomnolence.java` - `SleepTracker.java` - `WorldSomnolence.java` - `EnterBedSystem.java` - `RegisterTrackerSystem.java` - `UpdateSleepPacketSystem.java` - `WakeUpOnDismountSystem.java` - `StartSlumberSystem.java` - `UpdateWorldSlumberSystem.java` - `WeatherSystem.java` - Et de nombreuses classes d'interaction... --- ## 17. Liste complète des fichiers modifiés
Cliquer pour afficher les 169 fichiers ``` com/hypixel/hytale/assetstore/AssetValidationResults.java com/hypixel/hytale/builtin/camera/command/CameraEffectCommand.java com/hypixel/hytale/builtin/adventure/farming/FarmingSystems.java com/hypixel/hytale/builtin/adventure/farming/FarmingUtil.java com/hypixel/hytale/builtin/adventure/farming/component/CoopResidentComponent.java com/hypixel/hytale/builtin/adventure/farming/interactions/UseCaptureCrateInteraction.java com/hypixel/hytale/builtin/adventure/farming/interactions/UseCoopInteraction.java com/hypixel/hytale/builtin/adventure/farming/states/CoopBlock.java com/hypixel/hytale/builtin/adventure/memories/MemoriesGameplayConfig.java com/hypixel/hytale/builtin/adventure/memories/MemoriesPlugin.java com/hypixel/hytale/builtin/adventure/memories/commands/MemoriesCommand.java com/hypixel/hytale/builtin/adventure/memories/interactions/MemoriesConditionInteraction.java com/hypixel/hytale/builtin/adventure/memories/memories/npc/NPCMemory.java com/hypixel/hytale/builtin/adventure/memories/memories/npc/NPCMemoryProvider.java com/hypixel/hytale/builtin/adventure/memories/page/MemoriesPage.java com/hypixel/hytale/builtin/adventure/memories/page/MemoriesPageSupplier.java com/hypixel/hytale/builtin/adventure/memories/temple/TempleRespawnPlayersSystem.java com/hypixel/hytale/builtin/adventure/teleporter/component/Teleporter.java com/hypixel/hytale/builtin/adventure/teleporter/systems/CreateWarpWhenTeleporterPlacedSystem.java com/hypixel/hytale/builtin/asseteditor/AssetEditorPlugin.java com/hypixel/hytale/builtin/beds/interactions/BedInteraction.java com/hypixel/hytale/builtin/beds/sleep/components/PlayerSomnolence.java com/hypixel/hytale/builtin/beds/sleep/components/SleepTracker.java com/hypixel/hytale/builtin/beds/sleep/resources/WorldSomnolence.java com/hypixel/hytale/builtin/beds/sleep/systems/player/EnterBedSystem.java com/hypixel/hytale/builtin/beds/sleep/systems/player/RegisterTrackerSystem.java com/hypixel/hytale/builtin/beds/sleep/systems/player/UpdateSleepPacketSystem.java com/hypixel/hytale/builtin/beds/sleep/systems/player/WakeUpOnDismountSystem.java com/hypixel/hytale/builtin/beds/sleep/systems/world/StartSlumberSystem.java com/hypixel/hytale/builtin/beds/sleep/systems/world/UpdateWorldSlumberSystem.java com/hypixel/hytale/builtin/blockphysics/WorldValidationUtil.java com/hypixel/hytale/builtin/buildertools/commands/ReplaceCommand.java com/hypixel/hytale/builtin/buildertools/prefabeditor/PrefabEditSessionManager.java com/hypixel/hytale/builtin/buildertools/prefabeditor/saving/PrefabSaver.java com/hypixel/hytale/builtin/buildertools/prefabeditor/ui/PrefabEditorSaveSettingsPage.java com/hypixel/hytale/builtin/buildertools/prefabeditor/ui/PrefabTeleportPage.java com/hypixel/hytale/builtin/crafting/window/StructuralCraftingWindow.java com/hypixel/hytale/builtin/hub/interactions/HubPortalInteraction.java com/hypixel/hytale/builtin/interaction/SpawnDeployableAtHitLocationInteraction.java com/hypixel/hytale/builtin/interaction/SpawnDeployableFromRaycastInteraction.java com/hypixel/hytale/builtin/instances/InstancesPlugin.java com/hypixel/hytale/builtin/instances/command/InstanceEditLoadCommand.java com/hypixel/hytale/builtin/instances/page/InstanceListPage.java com/hypixel/hytale/builtin/mounts/interactions/SeatingInteraction.java com/hypixel/hytale/builtin/path/PrefabPathSystems.java com/hypixel/hytale/builtin/path/commands/WorldPathBuilderCommand.java com/hypixel/hytale/builtin/singleplayer/systems/CloseWorldWhenBreakingDeviceSystems.java com/hypixel/hytale/builtin/teleport/Warp.java com/hypixel/hytale/builtin/teleport/commands/teleport/SpawnCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/SpawnSetCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/TeleportAllCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/TeleportHomeCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/TeleportTopCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/TeleportWorldCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/variant/TeleportOtherToPlayerCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/variant/TeleportPlayerToCoordinatesCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/variant/TeleportToCoordinatesCommand.java com/hypixel/hytale/builtin/teleport/commands/teleport/variant/TeleportToPlayerCommand.java com/hypixel/hytale/builtin/teleport/commands/warp/WarpCommand.java com/hypixel/hytale/builtin/teleport/commands/warp/WarpSetCommand.java com/hypixel/hytale/builtin/teleport/components/TeleportHistory.java com/hypixel/hytale/builtin/weather/systems/WeatherSystem.java com/hypixel/hytale/component/ComponentRegistry.java com/hypixel/hytale/component/Holder.java com/hypixel/hytale/server/cell/evaluator/SkipCellPointEvaluator.java com/hypixel/hytale/server/core/HytaleServerConfig.java com/hypixel/hytale/server/core/Message.java com/hypixel/hytale/server/core/asset/type/fluid/DefaultFluidTicker.java com/hypixel/hytale/server/core/asset/type/fluid/FluidTicker.java com/hypixel/hytale/server/core/asset/type/gameplay/CraftingConfig.java com/hypixel/hytale/server/core/asset/type/gameplay/respawn/HomeOrSpawnPoint.java com/hypixel/hytale/server/core/asset/type/gameplay/respawn/WorldSpawnPoint.java com/hypixel/hytale/server/core/asset/type/item/DroplistCommand.java com/hypixel/hytale/server/core/asset/type/item/config/Item.java com/hypixel/hytale/server/core/auth/AuthConfig.java com/hypixel/hytale/server/core/auth/ServerAuthManager.java com/hypixel/hytale/server/core/auth/oauth/OAuthClient.java com/hypixel/hytale/server/core/commands/debug/DebugPlayerPositionCommand.java com/hypixel/hytale/server/core/commands/player/inventory/GiveCommand.java com/hypixel/hytale/server/core/commands/world/worldgen/WorldGenBenchmarkCommand.java com/hypixel/hytale/server/core/command/system/arguments/types/ArgTypes.java com/hypixel/hytale/server/core/entity/InteractionContext.java com/hypixel/hytale/server/core/entity/InteractionManager.java com/hypixel/hytale/server/core/entity/player/data/UniqueItemUsagesComponent.java com/hypixel/hytale/server/core/io/handlers/SetupPacketHandler.java com/hypixel/hytale/server/core/io/handlers/game/GamePacketHandler.java com/hypixel/hytale/server/core/modules/accesscontrol/commands/BanCommand.java com/hypixel/hytale/server/core/modules/accesscontrol/commands/UnbanCommand.java com/hypixel/hytale/server/core/modules/accesscontrol/commands/WhitelistAddCommand.java com/hypixel/hytale/server/core/modules/accesscontrol/commands/WhitelistRemoveCommand.java com/hypixel/hytale/server/core/modules/accesscontrol/provider/HytaleWhitelistProvider.java com/hypixel/hytale/server/core/modules/entity/EntityModule.java com/hypixel/hytale/server/core/modules/entity/LegacyProjectileSystems.java com/hypixel/hytale/server/core/modules/entity/component/DisplayNameComponent.java com/hypixel/hytale/server/core/modules/entity/damage/DamageSystems.java com/hypixel/hytale/server/core/modules/entity/item/PickupItemComponent.java com/hypixel/hytale/server/core/modules/entity/item/PickupItemSystem.java com/hypixel/hytale/server/core/modules/entity/player/PlayerSystems.java com/hypixel/hytale/server/core/modules/entity/system/RespondToHitSystems.java com/hypixel/hytale/server/core/modules/entity/system/UpdateLocationSystems.java com/hypixel/hytale/server/core/modules/entity/teleport/Teleport.java com/hypixel/hytale/server/core/modules/entitystats/EntityStatValue.java com/hypixel/hytale/server/core/modules/interaction/config/SimpleInstantInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/SimpleInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/ApplyForceInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/ChainingInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/ChargingInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/FirstClickInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/MovementConditionInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/PickBlockInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/PlaceBlockInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/SimpleBlockInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/client/WieldingInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/BuilderToolInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/CameraInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/ChangeActiveSlotInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/ConditionInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/ParallelInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/RepeatInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/ReplaceInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/SelectInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/none/SerialInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/selector/HorizontalSelector.java com/hypixel/hytale/server/core/modules/interaction/config/selector/StabSelector.java com/hypixel/hytale/server/core/modules/interaction/config/server/CheckUniqueItemUsageInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/server/DamageEntityInteraction.java com/hypixel/hytale/server/core/modules/interaction/config/server/IncreaseBackpackCapacityInteraction.java com/hypixel/hytale/server/core/permissions/commands/op/OpAddCommand.java com/hypixel/hytale/server/core/permissions/commands/op/OpRemoveCommand.java com/hypixel/hytale/server/core/permissions/commands/op/OpSelfCommand.java com/hypixel/hytale/server/core/prefab/PrefabCopyableComponent.java com/hypixel/hytale/server/core/prefab/config/SelectionPrefabSerializer.java com/hypixel/hytale/server/core/prefab/selection/standard/BlockSelection.java com/hypixel/hytale/server/core/universe/world/World.java com/hypixel/hytale/server/core/universe/world/accessor/IChunkAccessorSync.java com/hypixel/hytale/server/core/universe/world/chunk/BlockComponentChunk.java com/hypixel/hytale/server/core/universe/world/chunk/EntityChunk.java com/hypixel/hytale/server/core/universe/world/chunk/WorldChunk.java com/hypixel/hytale/server/core/universe/world/commands/world/perf/WorldPerfResetCommand.java com/hypixel/hytale/server/core/universe/world/connectedblocks/builtin/RoofConnectedBlockRuleSet.java com/hypixel/hytale/server/core/universe/world/meta/BlockState.java com/hypixel/hytale/server/core/universe/world/path/SimplePathWaypoint.java com/hypixel/hytale/server/core/universe/world/spawn/FitToHeightMapSpawnProvider.java com/hypixel/hytale/server/core/universe/world/spawn/GlobalSpawnProvider.java com/hypixel/hytale/server/core/universe/world/spawn/IndividualSpawnProvider.java com/hypixel/hytale/server/core/universe/world/storage/ChunkStore.java com/hypixel/hytale/server/core/universe/world/storage/component/ChunkSavingSystems.java com/hypixel/hytale/server/core/universe/world/storage/provider/DefaultChunkStorageProvider.java com/hypixel/hytale/server/core/universe/world/storage/provider/EmptyChunkStorageProvider.java com/hypixel/hytale/server/core/universe/world/storage/provider/MigrationChunkStorageProvider.java com/hypixel/hytale/server/core/util/PrefabUtil.java com/hypixel/hytale/server/movement/BodyMotionTeleport.java com/hypixel/hytale/server/npc/role/builders/BuilderRole.java com/hypixel/hytale/server/npc/role/support/StateSupport.java com/hypixel/hytale/server/npc/systems/NPCSystems.java com/hypixel/hytale/server/worldgen/cave/shape/AbstractCaveNodeShape.java com/hypixel/hytale/server/worldgen/cave/shape/DistortedCaveNodeShape.java com/hypixel/hytale/server/worldgen/loader/cave/CavePrefabConfigJsonLoader.java com/hypixel/hytale/server/worldgen/loader/cave/CaveTypeJsonLoader.java com/hypixel/hytale/server/worldgen/loader/cave/PrefabCaveNodeShapeGeneratorJsonLoader.java com/hypixel/hytale/server/worldgen/loader/prefab/BlockPlacementMaskJsonLoader.java com/hypixel/hytale/server/worldgen/loader/prefab/BlockPlacementMaskRegistry.java com/hypixel/hytale/server/worldgen/loader/prefab/PrefabPatternGeneratorJsonLoader.java com/hypixel/hytale/server/worldgen/loader/prefab/UniquePrefabConfigurationJsonLoader.java com/hypixel/hytale/server/worldgen/prefab/PrefabPasteUtil.java com/hypixel/hytale/server/worldgen/util/cache/ConcurrentSizedTimeoutCache.java com/hypixel/hytale/server/worldgen/util/condition/BlockMaskCondition.java org/jline/reader/impl/LineReaderImpl.java summary.txt ```
--- ## Résumé des impacts ### Performance | Changement | Impact | |------------|--------| | PrefabSaver async chunk loading | Sauvegarde de prefabs non-bloquante | | ProfileServiceClient async | Récupération de profils sans bloquer | | ChunkStore generator lock | Thread safety améliorée | | InteractionManager currentTime | Timing plus cohérent basé sur les ticks | ### Stabilité | Changement | Impact | |------------|--------| | PickupItemSystem NPE fix | Évite crash sur ref null | | World blockValidator fix | Coordonnées Y correctes | | Assertions ajoutées | Détection précoce des erreurs | | ChunkStore thread safety | Évite race conditions sur generator | ### API | Changement | Impact | |------------|--------| | Teleport factory methods | API plus claire pour la téléportation | | BlockMaskCondition | Nouveau système de masques pour worldgen | | ProfileServiceClient | Nouvelle API pour récupérer les profils | | GAME_PROFILE_LOOKUP | Nouveau type d'argument pour les commandes | | Holder.cloneSerializable() | Nouvelle méthode de clonage | | BlockSelection.sortEntitiesByPosition() | Nouvelle méthode de tri | ### Qualité du code | Changement | Impact | |------------|--------| | Migration annotations | Standardisation sur javax.annotation | | ServerAuthManager refactoring | Code plus maintenable | | Suppression LocalCompression | Simplification de la configuration | | Typo fix "stroage" → "storage" | Meilleurs logs | --- *Généré à partir du diff git entre les versions `c04fdfe10` et `c508b9acd`* *169 fichiers analysés exhaustivement*