ENFRKOantony langlois
projets

Waterbird and Bananas

visiterautreJavaMinecraftFabric API
Oiseau aquatique dans MinecraftOiseau aquatique près d’une bananeOiseau aquatique vu de gaucheOiseau aquatique vu de droite

Résumé du projet

Les joueurs de Minecraft découvrent un oiseau aquatique qui apparaît naturellement, qu'ils peuvent attirer, apprivoiser, faire suivre et commander de s'asseoir, ainsi qu'une banane qui accorde un bref effet de vitesse. Le mod sépare la simulation partagée du rendu client, réutilise les systèmes natifs de créatures apprivoisables et fournit des modèles, textures et quatre états d'animation personnalisés.

Architecture

in game
Client · interaction
Joueur Minecraft
use item · interact
Mange des bananes, attire ou apprivoise les oiseaux aquatiques, puis fait alterner un oiseau possédé entre suivi et position assise
bananecontrôle du propriétairebascule assise
Java
Exécution · hôte du mod
Minecraft + Fabric
fabric.mod.json
Charge des points d'entrée distincts pour le code principal, le client et la génération de données de Minecraft 1.21.1
Fabric API
Cycle de vie · initialisation commune
Initialiseur Waterbird
Waterbird.java · onInitialize
Enregistre la banane, les attributs de l'oiseau aquatique et son intégration à l'apparition dans l'Overworld
ParrotEntity
Domaine · créature apprivoisable
WaterbirdEntity
entity/custom/WaterbirdEntity.java
Gère l'apprivoisement par la banane, les objectifs de position assise et de suivi, les attributs et les états d'attente, de vol et assis
1 apprivoisement sur 1020 points de viesuivi du propriétaireobjectif assis
Fabric client
Client · présentation
Modèle + moteur de rendu
WaterbirdClient.java · entity/client
Enregistre la couche de modèle et le moteur de rendu, puis choisit l'animation de marche, d'attente, de vol ou de position assise
Fabric API
Monde · règle de génération
Règles d'apparition dans l'Overworld
world/gen/ModEntityGeneration.java
Ajoute l'apparition de créatures dans les biomes de l'Overworld avec un poids de 12 et des groupes de 1 à 3
waterbird
Données · registres du jeu
Registre des objets + entités
ModItems.java · ModEntities.java
Associe des identifiants stables à l'objet banane et au type d'entité oiseau aquatique
resources
Données · ressources visuelles
Modèles, textures + langue
src/main/resources/assets/waterbird
Fournit le modèle de la banane, les textures de l'entité et de l'objet, l'icône, les noms et l'infobulle

Suivez le chargement, l'interaction, la simulation et le rendu à travers le mod.

Déploiement : Mod JAR → dossier de mods Fabric · client ou serveur Minecraft

Résultats

  • 1 sur 10 · chance d'apprivoisement avec une banane
  • 10 s · effet de vitesse de la banane
  • 1 à 3 · taille du groupe d'apparition naturelle
  • 4 · états d'animation modélisés

Compétences démontrées : séparation du cycle de vie Fabric · interaction d'entité pilotée par le serveur · comportement de créature apprivoisable fondé sur des objectifs · animation client pilotée par l'état · raccordement des ressources et registres

Problèmes et solutions

Conserver une logique de jeu pilotée par le serveur tout en intégrant un petit mod aux systèmes existants de Minecraft.

▓ Étendre ParrotEntity pour le comportement apprivoisable

Problème : L'oiseau aquatique doit gérer l'apprivoisement, le propriétaire, le vol, le suivi et la position assise sans reconstruire toute la mécanique des créatures passives de Minecraft.

Créer une sous-classe de ParrotEntity, conserver son cycle de vie, puis ajouter l'interaction avec la banane ainsi que les objectifs et attributs propres à l'oiseau aquatique.

  • Option rejetée : une implémentation personnalisée de MobEntity, car elle dupliquerait la propriété, l'état d'apprivoisement et le comportement de déplacement
  • Compromis accepté : le comportement hérité du perroquet limite les futures spécialisations
  • Résultat : une entité compacte prend en charge l'apprivoisement, le suivi, la position assise et le vol

█ Confier l'apprivoisement et la position assise au serveur

Problème : Le propriétaire et l'état assis doivent rester cohérents pour chaque joueur du monde.

Consommer la banane et modifier l'état d'apprivoisement ou assis sur le serveur, tout en renvoyant à Minecraft la réussite de l'interaction selon le côté d'exécution.

  • Option rejetée : la mutation d'état côté client, car elle pourrait afficher une réussite sans état persistant dans le monde
  • Compromis accepté : le code d'interaction doit distinguer le côté serveur du côté client
  • Résultat : le serveur possède l'état, tandis que les clients reçoivent les mises à jour d'entité et particules standard

▒ Séparer l'initialisation commune de celle du client

Problème : L'enregistrement des entités et leur apparition dans le monde doivent fonctionner sur les serveurs, mais les classes de modèle et de rendu sont réservées au client.

Utiliser des points d'entrée Fabric distincts pour le code principal et le client, avec l'enregistrement du rendu isolé dans WaterbirdClient.

  • Option rejetée : enregistrer le rendu depuis l'initialisation commune, car les serveurs dédiés ne peuvent pas charger les classes client
  • Compromis accepté : la configuration associée est répartie entre deux points d'entrée
  • Résultat : le même mod JAR se charge dans les environnements client et serveur

▤ Piloter l'animation depuis l'état de l'entité

Problème : La marche, le vol, l'attente et la position assise exigent des poses distinctes qui suivent le comportement réel de l'entité.

Mettre à jour les états d'animation côté client à chaque tick et laisser le modèle combiner le mouvement avec les séquences d'attente, de vol et de position assise.

  • Option rejetée : une boucle générique unique, car le vol et la position assise exigent des poses visiblement différentes
  • Compromis accepté : la priorité des états et les transitions résident dans une logique de tick écrite à la main
  • Résultat : quatre états modélisés répondent directement au mouvement, au vol et à la position assise

▚ Réutiliser la banane comme aliment et moyen d'interaction

Problème : Les joueurs ont besoin d'un objet facile à comprendre, utile à la fois pour eux et pour la nouvelle créature.

Enregistrer une banane qui restaure la faim, accorde un effet de vitesse de 10 secondes, attire les oiseaux aquatiques et tente de les apprivoiser.

  • Option rejetée : un jeton d'apprivoisement séparé, car il ajouterait un objet à usage unique
  • Compromis accepté : l'équilibrage de la nourriture et de l'apprivoisement partage désormais une même ressource
  • Résultat : un objet relie l'inventaire, les effets du joueur, l'attraction par l'IA et la propriété