Init
This commit is contained in:
280
content/world/portals/portal-systems.fr.md
Normal file
280
content/world/portals/portal-systems.fr.md
Normal 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);
|
||||
```
|
||||
Reference in New Issue
Block a user