281 lines
8.0 KiB
Markdown
281 lines
8.0 KiB
Markdown
---
|
|
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);
|
|
```
|