Init
This commit is contained in:
302
content/world/entities/flocking-behavior.fr.md
Normal file
302
content/world/entities/flocking-behavior.fr.md
Normal file
@@ -0,0 +1,302 @@
|
||||
---
|
||||
title: Comportement de Groupe
|
||||
type: docs
|
||||
weight: 10
|
||||
---
|
||||
|
||||
Le systeme de groupe (flock) permet aux NPCs de former et se comporter comme des unites coordonnees.
|
||||
|
||||
**Package:** `com.hypixel.hytale.server.flock`
|
||||
|
||||
## Apercu
|
||||
|
||||
Les groupes sont des ensembles bases sur des entites qui permettent aux NPCs de:
|
||||
- Se deplacer et agir comme une unite coordonnee
|
||||
- Partager les informations de degats entre membres
|
||||
- Apparaitre en tailles de groupe configurables
|
||||
- Avoir des leaders designes
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Systeme Groupe
|
||||
├── Composants
|
||||
│ ├── Flock - Composant entite groupe
|
||||
│ ├── FlockMembership - Reference membre
|
||||
│ └── PersistentFlockData - Donnees groupe sauvegardees
|
||||
├── Assets
|
||||
│ ├── FlockAsset - Configuration groupe
|
||||
│ ├── RangeSizeFlockAsset - Taille par plage
|
||||
│ └── WeightedSizeFlockAsset - Taille ponderee
|
||||
├── Systemes
|
||||
│ ├── FlockSystems - Logique groupe principale
|
||||
│ ├── FlockMembershipSystems - Gestion membres
|
||||
│ └── FlockDeathSystems - Gestion mort
|
||||
└── Composants NPC
|
||||
├── BodyMotionFlock - Comportement mouvement
|
||||
├── ActionFlockJoin/Leave - Actions joindre/quitter
|
||||
└── SensorFlockLeader - Detection leader
|
||||
```
|
||||
|
||||
## Composant Flock
|
||||
|
||||
L'entite groupe contient l'etat partage:
|
||||
|
||||
```java
|
||||
public class Flock implements Component<EntityStore> {
|
||||
// Donnees degats partagees pour coordination combat
|
||||
private DamageData currentDamageData;
|
||||
private DamageData nextDamageData;
|
||||
|
||||
// Donnees degats specifiques leader
|
||||
private DamageData currentLeaderDamageData;
|
||||
private DamageData nextLeaderDamageData;
|
||||
|
||||
// Configuration groupe persistante
|
||||
private PersistentFlockData flockData;
|
||||
|
||||
// Statut de suppression
|
||||
public enum FlockRemovedStatus {
|
||||
NOT_REMOVED,
|
||||
DISSOLVED,
|
||||
UNLOADED
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Composant FlockMembership
|
||||
|
||||
Chaque NPC membre a un composant d'appartenance:
|
||||
|
||||
```java
|
||||
public class FlockMembership implements Component<EntityStore> {
|
||||
// Reference vers l'entite groupe
|
||||
private Ref<EntityStore> flockRef;
|
||||
}
|
||||
```
|
||||
|
||||
## Creation de Groupes
|
||||
|
||||
### Spawn avec Groupe
|
||||
|
||||
```java
|
||||
// Faire apparaitre un NPC avec son groupe
|
||||
Ref<EntityStore> flockRef = FlockPlugin.trySpawnFlock(
|
||||
npcRef, // Reference NPC initial
|
||||
npc, // Composant NPC
|
||||
store, // Store entite
|
||||
roleIndex, // Index role NPC
|
||||
position, // Position spawn
|
||||
rotation, // Rotation spawn
|
||||
flockDefinition, // Config FlockAsset (determine taille)
|
||||
postSpawnCallback // Appele pour chaque membre spawne
|
||||
);
|
||||
```
|
||||
|
||||
### Creer Groupe Vide
|
||||
|
||||
```java
|
||||
// Creer entite groupe pour gestion manuelle des membres
|
||||
Ref<EntityStore> flockRef = FlockPlugin.createFlock(store, role);
|
||||
|
||||
// Ou avec configuration explicite
|
||||
Ref<EntityStore> flockRef = FlockPlugin.createFlock(
|
||||
store,
|
||||
flockAsset, // Configuration FlockAsset
|
||||
allowedRoles // Roles pouvant rejoindre
|
||||
);
|
||||
```
|
||||
|
||||
### Rejoindre Groupe Existant
|
||||
|
||||
```java
|
||||
// Ajouter NPC a groupe existant
|
||||
FlockMembershipSystems.join(npcRef, flockRef, store);
|
||||
```
|
||||
|
||||
## Assets de Groupe
|
||||
|
||||
### FlockAsset
|
||||
|
||||
Configuration de base pour groupes:
|
||||
|
||||
```java
|
||||
public class FlockAsset {
|
||||
// Identifiant asset
|
||||
private String id;
|
||||
|
||||
// Choisir taille groupe pour spawn
|
||||
public abstract int pickFlockSize();
|
||||
}
|
||||
```
|
||||
|
||||
### RangeSizeFlockAsset
|
||||
|
||||
Groupe avec taille aleatoire dans plage:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "RangeSize",
|
||||
"Id": "wolf_pack",
|
||||
"MinSize": 3,
|
||||
"MaxSize": 8
|
||||
}
|
||||
```
|
||||
|
||||
### WeightedSizeFlockAsset
|
||||
|
||||
Groupe avec taille aleatoire ponderee:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "WeightedSize",
|
||||
"Id": "deer_herd",
|
||||
"Sizes": [
|
||||
{ "Size": 2, "Weight": 1 },
|
||||
{ "Size": 4, "Weight": 2 },
|
||||
{ "Size": 6, "Weight": 1 }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Composants Core NPC
|
||||
|
||||
### BodyMotionFlock
|
||||
|
||||
Controle comportement mouvement de groupe:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "Flock",
|
||||
"SeparationWeight": 1.5,
|
||||
"AlignmentWeight": 1.0,
|
||||
"CohesionWeight": 1.0
|
||||
}
|
||||
```
|
||||
|
||||
### ActionFlockJoin
|
||||
|
||||
Rejoindre un groupe:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "JoinFlock",
|
||||
"FlockId": "wolf_pack"
|
||||
}
|
||||
```
|
||||
|
||||
### ActionFlockLeave
|
||||
|
||||
Quitter groupe actuel:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "LeaveFlock"
|
||||
}
|
||||
```
|
||||
|
||||
### SensorFlockLeader
|
||||
|
||||
Detecter leader du groupe:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "FlockLeader",
|
||||
"Output": "leader_ref"
|
||||
}
|
||||
```
|
||||
|
||||
### EntityFilterFlock
|
||||
|
||||
Filtrer entites par appartenance groupe:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "Flock",
|
||||
"IncludeSelf": false,
|
||||
"OnlyMembers": true
|
||||
}
|
||||
```
|
||||
|
||||
## Partage de Degats
|
||||
|
||||
Les groupes partagent informations de combat:
|
||||
|
||||
```java
|
||||
// Obtenir donnees degats du groupe
|
||||
Flock flock = store.getComponent(flockRef, Flock.getComponentType());
|
||||
DamageData damageData = flock.getDamageData();
|
||||
|
||||
// Suivre kills pour le groupe
|
||||
flock.onTargetKilled(componentAccessor, targetRef);
|
||||
```
|
||||
|
||||
### Double Buffering
|
||||
|
||||
Les donnees de degats utilisent double buffering pour eviter conditions de course:
|
||||
|
||||
```java
|
||||
// Appele chaque tick
|
||||
flock.swapDamageDataBuffers();
|
||||
// currentDamageData contient donnees du tick precedent
|
||||
// nextDamageData accumule donnees du tick actuel
|
||||
```
|
||||
|
||||
## Conditions
|
||||
|
||||
### FlockSizeCondition
|
||||
|
||||
Verifier taille groupe dans prise de decision:
|
||||
|
||||
```json
|
||||
{
|
||||
"Type": "FlockSize",
|
||||
"Min": 2,
|
||||
"Max": 10
|
||||
}
|
||||
```
|
||||
|
||||
## Acces au Plugin
|
||||
|
||||
```java
|
||||
FlockPlugin flockPlugin = FlockPlugin.get();
|
||||
|
||||
// Types de composants
|
||||
ComponentType<EntityStore, Flock> flockType =
|
||||
flockPlugin.getFlockComponentType();
|
||||
ComponentType<EntityStore, FlockMembership> membershipType =
|
||||
flockPlugin.getFlockMembershipComponentType();
|
||||
ComponentType<EntityStore, PersistentFlockData> dataType =
|
||||
flockPlugin.getPersistentFlockDataComponentType();
|
||||
```
|
||||
|
||||
## Methodes Utilitaires
|
||||
|
||||
```java
|
||||
// Verifier si entite dans un groupe
|
||||
boolean isMember = FlockPlugin.isFlockMember(npcRef, store);
|
||||
|
||||
// Obtenir reference groupe depuis entite
|
||||
Ref<EntityStore> flockRef = FlockPlugin.getFlockReference(npcRef, store);
|
||||
|
||||
// Obtenir composant groupe depuis entite
|
||||
Flock flock = FlockPlugin.getFlock(store, npcRef);
|
||||
```
|
||||
|
||||
## Comportement de Spawn des Groupes
|
||||
|
||||
Lors du spawn d'un groupe:
|
||||
1. NPC initial est cree
|
||||
2. Entite groupe est creee avec appartenance
|
||||
3. Membres additionnels spawn au meme emplacement
|
||||
4. Membres se dispersent avec leger offset aleatoire
|
||||
5. Chaque membre rejoint le groupe
|
||||
|
||||
```java
|
||||
// Membres spawn avec offset aleatoire
|
||||
memberTransform.getPosition().assign(
|
||||
x + RandomExtra.randomRange(-0.5, 0.5),
|
||||
offsetY,
|
||||
z + RandomExtra.randomRange(-0.5, 0.5)
|
||||
);
|
||||
```
|
||||
Reference in New Issue
Block a user