This commit is contained in:
2026-01-20 20:33:59 +01:00
commit b16a40e431
583 changed files with 87339 additions and 0 deletions

View File

@@ -0,0 +1,280 @@
---
title: Systemes Portail
type: docs
weight: 2
---
Les systemes portail gerent la logique d'execution pour le suivi des portails, les evenements du vide et la gestion des instances.
**Package:** `com.hypixel.hytale.builtin.portals.systems`
## Systemes de Suivi Portail
### TrackerSystem
Suit les joueurs entrant et sortant des mondes portail:
```java
public class TrackerSystem extends RefSystem<EntityStore> {
// Appele quand joueur entre dans monde portail
@Override
public void onEntityAdded(Ref<EntityStore> ref, AddReason reason,
Store<EntityStore> store,
CommandBuffer<EntityStore> commandBuffer) {
PortalWorld portalWorld = store.getResource(PortalWorld.getResourceType());
if (!portalWorld.exists()) return;
// Envoyer UI portail au joueur
PlayerRef playerRef = commandBuffer.getComponent(ref, PlayerRef.getComponentType());
UpdatePortal packet = portalWorld.createFullPacket(world);
playerRef.getPacketHandler().write(packet);
}
// Appele quand joueur quitte monde portail
@Override
public void onEntityRemove(Ref<EntityStore> ref, RemoveReason reason,
Store<EntityStore> store,
CommandBuffer<EntityStore> commandBuffer) {
// Effacer etat UI
playerRef.getPacketHandler().write(new UpdatePortal(null, null));
portalWorld.getSeesUi().remove(playerRef.getUuid());
}
@Override
public Query<EntityStore> getQuery() {
return Query.and(Player.getComponentType(), PlayerRef.getComponentType());
}
}
```
### UiTickingSystem
Met a jour l'UI portail chaque seconde:
```java
public class UiTickingSystem extends DelayedEntitySystem<EntityStore> {
public UiTickingSystem() {
super(1.0f); // Tick chaque 1 seconde
}
@Override
public void tick(float dt, int index, ArchetypeChunk<EntityStore> archetypeChunk,
Store<EntityStore> store, CommandBuffer<EntityStore> commandBuffer) {
PortalWorld portalWorld = store.getResource(PortalWorld.getResourceType());
if (!portalWorld.exists()) return;
// Envoyer temps mis a jour au joueur
UpdatePortal packet = portalWorld.createUpdatePacket(world);
playerRef.getPacketHandler().write(packet);
}
}
```
## Systemes Destination Portail
### PortalInvalidDestinationSystem
Gere les portails avec destinations invalides:
```java
public class PortalInvalidDestinationSystem {
// Eteint portails quand monde destination ferme
public static void turnOffPortalsInWorld(World world, World closedWorld) {
// Trouver tous portails pointant vers closedWorld
// Mettre leur destination a null
// Mettre a jour etat bloc a "off"
}
}
```
### CloseWorldWhenBreakingDeviceSystems
Gere la destruction du dispositif portail:
```java
// Quand composant dispositif portail supprime
public class ComponentRemoved extends System<ChunkStore> {
// Fermer le monde de destination
}
// Quand entite bloc portail supprimee
public class EntityRemoved extends System<ChunkStore> {
// Fermer le monde de destination
}
```
## Systemes Evenement Vide
### VoidEventRefSystem
Gere les references entites evenement vide:
```java
public class VoidEventRefSystem extends System<EntityStore> {
// Suit cycle de vie entite evenement vide
// Met a jour PortalWorld.voidEventRef
}
```
### VoidEventStagesSystem
Progresse a travers les etapes evenement vide:
```java
public class VoidEventStagesSystem extends System<EntityStore> {
// Verifie temps ecoule
// Active etape suivante quand seuil temps atteint
// Met a jour VoidEvent.activeStage
}
```
### VoidInvasionPortalsSpawnSystem
Fait apparaitre portails invasion pendant evenements vide:
```java
public class VoidInvasionPortalsSpawnSystem extends System<EntityStore> {
// Cree entites spawner vide
// Utilise grille hash spatiale pour maintenir distance minimum
}
```
### VoidSpawnerSystems.Instantiate
Instancie entites spawner vide:
```java
public class Instantiate extends System<EntityStore> {
// Cree entite spawner depuis config
// Ajoute a grille spatiale VoidEvent
}
```
### StartVoidEventInFragmentSystem
Initie evenements vide dans fragments portail:
```java
public class StartVoidEventInFragmentSystem extends System<EntityStore> {
// Verifie si invasion vide devrait demarrer
// Cree entite VoidEvent
// Configure premiere etape
}
```
## Systemes Malediction
### DiedInPortalSystem
Suit les morts joueurs dans mondes portail:
```java
public class DiedInPortalSystem extends System<EntityStore> {
// A la mort joueur dans monde portail:
// - Ajouter UUID joueur a set diedInWorld
// - Empeche re-entree
}
```
### CurseItemDropsSystem
Marque items laches comme maudits:
```java
public class CurseItemDropsSystem extends System<EntityStore> {
// Items laches dans monde portail deviennent maudits
// Items maudits sont perdus a la mort
}
```
### DeleteCursedItemsOnSpawnSystem
Supprime items maudits quand joueur spawn:
```java
public class DeleteCursedItemsOnSpawnSystem extends System<EntityStore> {
// Quand joueur reapparait apres mort dans portail
// Supprimer tous items maudits de l'inventaire
}
```
## Interactions Portail
### EnterPortalInteraction
Gere l'entree dans un portail:
```java
public class EnterPortalInteraction extends SimpleBlockInteraction {
// Temps minimum avant autoriser utilisation portail
public static final Duration MINIMUM_TIME_IN_WORLD = Duration.ofMillis(3000L);
@Override
protected void interactWithBlock(...) {
// Verifier dispositif portail existe
// Verifier monde destination vivant
// Verifier joueur pas mort dans monde cible
// Teleporter joueur vers instance
}
}
```
Etats monde cible:
- `OKAY` - Peut entrer
- `WORLD_DEAD` - Destination fermee
- `DIED_IN_WORLD` - Joueur mort la-bas
- `NO_SPAWN_AVAILABLE` - Pas de point de spawn
### ReturnPortalInteraction
Gere le retour d'un monde portail:
```java
public class ReturnPortalInteraction extends SimpleBlockInteraction {
// Temps minimum avant autoriser retour
public static final Duration MINIMUM_TIME_IN_WORLD = Duration.ofSeconds(15L);
// Avertissement affiche avant expiration timer
public static final Duration WARNING_TIME = Duration.ofSeconds(4L);
@Override
protected void interactWithBlock(...) {
// Verifier temps minimum ecoule
// Retirer malediction tous items
// Sortir instance
}
}
```
## Enregistrement Systemes
Tous les systemes sont enregistres dans setup PortalsPlugin:
```java
// Systemes ChunkStore
this.getChunkStoreRegistry().registerSystem(new PortalInvalidDestinationSystem());
this.getChunkStoreRegistry().registerSystem(new CloseWorldWhenBreakingDeviceSystems.ComponentRemoved());
this.getChunkStoreRegistry().registerSystem(new CloseWorldWhenBreakingDeviceSystems.EntityRemoved());
// Systemes EntityStore
this.getEntityStoreRegistry().registerSystem(new PortalTrackerSystems.TrackerSystem());
this.getEntityStoreRegistry().registerSystem(new PortalTrackerSystems.UiTickingSystem());
this.getEntityStoreRegistry().registerSystem(new DiedInPortalSystem());
this.getEntityStoreRegistry().registerSystem(new CurseItemDropsSystem());
this.getEntityStoreRegistry().registerSystem(new DeleteCursedItemsOnSpawnSystem());
this.getEntityStoreRegistry().registerSystem(new VoidEventRefSystem());
this.getEntityStoreRegistry().registerSystem(new VoidInvasionPortalsSpawnSystem());
this.getEntityStoreRegistry().registerSystem(new VoidSpawnerSystems.Instantiate());
this.getEntityStoreRegistry().registerSystem(new StartVoidEventInFragmentSystem());
this.getEntityStoreRegistry().registerSystem(new VoidEventStagesSystem());
```
## Enregistrement Interactions
Les interactions portail sont enregistrees comme types codec:
```java
this.getCodecRegistry(Interaction.CODEC)
.register("Portal", EnterPortalInteraction.class, EnterPortalInteraction.CODEC)
.register("PortalReturn", ReturnPortalInteraction.class, ReturnPortalInteraction.CODEC);
```