--- title: Boutique type: docs weight: 5 --- Le systeme de boutique fournit le commerce via des boutiques NPC et des systemes de troc. **Package:** `com.hypixel.hytale.builtin.adventure.shop` ## Architecture ``` ShopPlugin ├── Types de Boutique │ ├── ShopAsset - Definitions boutique statiques │ └── BarterShopAsset - Boutiques de troc dynamiques ├── Elements │ ├── ShopElement - Entree item boutique │ └── Integration ChoiceElement ├── Interactions │ └── GiveItemInteraction ├── Pages │ ├── ShopPage - Page UI boutique │ ├── ShopPageSupplier │ └── BarterPage - Page UI troc └── Etat └── BarterShopState - Etat troc persistant ``` ## Types de Boutique ### ShopAsset Boutiques statiques avec contenu fixe: ```java public class ShopAsset implements JsonAssetWithMap> { protected String id; protected ChoiceElement[] elements; // Items boutique public String getId(); public ChoiceElement[] getElements(); } ``` **Emplacement Asset:** `Shops/` ### BarterShopAsset Boutiques dynamiques avec echanges rotatifs: ```java public class BarterShopAsset implements JsonAssetWithMap> { // Trading base sur le troc avec mecanique de rafraichissement } ``` **Emplacement Asset:** `BarterShops/` ## Configuration de Boutique ### Exemple Boutique Statique ```yaml # Shops/general_store.json { "Id": "general_store", "Content": [ { "Type": "ShopElement", "Item": "bread", "Price": 5, "Currency": "gold_coin" }, { "Type": "ShopElement", "Item": "torch", "Price": 2, "Currency": "gold_coin" } ] } ``` ### Composants Boutique Troc ```java public class BarterShopState { // Etat persistant pour boutiques de troc public static void initialize(Path dataDirectory); public static void shutdown(); } public class TradeSlot { /* Slot d'echange de base */ } public class FixedTradeSlot extends TradeSlot { /* Echange fixe */ } public class PoolTradeSlot extends TradeSlot { /* Aleatoire depuis pool */ } public class WeightedTrade { /* Echange aleatoire pondere */ } public class BarterItemStack { /* Items pour troc */ } public class BarterTrade { /* Definition complete d'echange */ } public class RefreshInterval { /* Timing de rafraichissement */ } ``` ## Elements de Boutique ### ShopElement Enregistre comme type d'element de choix: ```java getCodecRegistry(ChoiceElement.CODEC).register("ShopElement", ShopElement.class, ShopElement.CODEC); ``` ## Interactions ### GiveItemInteraction Interaction de choix qui donne des items au joueur: ```java getCodecRegistry(ChoiceInteraction.CODEC).register("GiveItem", GiveItemInteraction.class, GiveItemInteraction.CODEC); ``` ## Integration UI ### Page Boutique Page UI personnalisee pour boutiques: ```java getCodecRegistry(OpenCustomUIInteraction.PAGE_CODEC).register( "Shop", ShopPageSupplier.class, ShopPageSupplier.CODEC ); ``` ### Ouvrir une Boutique ```yaml # Definition d'interaction { "Type": "OpenCustomUI", "Page": { "Type": "Shop", "ShopId": "general_store" } } ``` ## Utilisation de l'API ### Obtenir les Assets Boutique ```java // Obtenir le store d'assets boutique AssetStore> store = ShopAsset.getAssetStore(); // Obtenir boutique specifique ShopAsset shop = ShopAsset.getAssetMap().getAsset("general_store"); // Obtenir boutique troc BarterShopAsset barterShop = BarterShopAsset.getAssetMap().getAsset("traveling_merchant"); ``` ### Instance Plugin Boutique ```java ShopPlugin shop = ShopPlugin.get(); ``` ## Persistance Etat Troc L'etat des boutiques de troc est sauvegarde/charge automatiquement: ```java // Appele dans start() BarterShopState.initialize(this.getDataDirectory()); // Appele dans shutdown() BarterShopState.shutdown(); ``` ## Dependances d'Assets Les boutiques chargent apres les items: ```java HytaleAssetStore.builder(ShopAsset.class, new DefaultAssetMap()) .setPath("Shops") .loadsAfter(Item.class) // Assurer que items sont charges d'abord .build(); ```