Medici needs nothing but NeoForge. Every integration is optional: code lives in mod/src/main/java/de/benkl/medici/compat/<modid>/,
compiles against the mod's API only, and runs only when ModList says the mod is loaded. Versions tested against: ATM10 8.4.
| mod | what you get | how |
|---|---|---|
| Curios | purses in the belt slot pay and pick up coins like purses in the inventory | compat/curios, data/curios/tags/item/belt.json, data/medici/curios/entities/medici.json |
| Jade | owner of every Medici block; shop offers (sells/buys, sold out greyed); coin slot and turnstile prices; ticket printer venue; rental status; mint press status and today's decree left; strongbox contents (owner only) | compat/jade/MediciJadePlugin |
| JEI (EMI via JEI) | Minting category (metal + die → coins, FE, time) with the mint press as catalyst; info pages for coins, antique coins, trading house, bank counter | compat/jei/MediciJeiPlugin |
| Patchouli | The Merchant's Handbook (medici:merchants_handbook): 9 chapters; recipe: book + gold nugget (only when Patchouli is loaded) |
data only: data/medici/patchouli_books, assets/medici/patchouli_books |
| FTB Teams | a party team is a house: shared daily mint allowance, team bank account, team members manage each other's Medici blocks; the house crest is stored on the team (medici:crest team property) and its colour follows the team colour |
compat/ftbteams |
| FTB Ranks (or any permission mod) | medici:admin permission node (default: operators) to manage anyone's Medici blocks |
NeoForge PermissionAPI, econ/Permissions |
| FTB Chunks | customers can use vending machines, stalls, coin slots, turnstiles, ticket gates, rental chests and bank counters inside claims | block tag ftbchunks:interact_whitelist |
| FTB Quests | coins are ordinary item rewards; sample chapter in examples/quests |
data only |
| CC:Tweaked | peripherals medici_shop (getOffers, getTill, getOwner), medici_access (getPrice, getCount, getOwner), medici_mint (getStatus, getDecreeLeft); events medici_payment(side, kind, pennies, player), medici_pass(side, player), medici_ticket(side, player, venue, kind). Read-only: computers can't change prices |
compat/cc/CcCompat; examples in examples/cc |
| Create | coins are valid price tags for Create's table-cloth shops (any item is); Medici blocks are create:non_movable (contraptions can't carry them off); coin slots, turnstiles and ticket gates drive contraptions by redstone ; the die press: a striking block under a Mechanical Press strikes coins from the house's decree share (no pressing recipe makes coins, so no other press can); Ponder scenes for the die press, a funnel-fed vending machine and a ticket gate starting a ride; deployers and other fake players can't buy unless automationCustomers is on |
compat/create (DiePress, MediciPonder), schematics from tools/ponder/schematics.py; game tests with -PwithCompat drive a real press |
| SecurityCraft | reinforced doors, trapdoors and fence gates ignore plain redstone; Medici's coin slot, ticket gate and turnstile are registered door activators, so one placed next to a reinforced door (or behind one solid block) opens it while it pulses: a pay door that can't be picked. Universal Block Remover only removes SecurityCraft's own blocks, so it can't touch Medici blocks; Medici ownership shows in Jade, not in SecurityCraft's overlays (that would need SecurityCraft's IOwnable on our block entities, making it a hard dependency) |
compat/securitycraft/MediciDoorActivator (IMC registerDoorActivator); game test with -PwithCompat |
| AE2, Refined Storage, pipes, Create funnels | shops take stock and give coins on faces the owner opens; the mint press gives coins out of its bottom; the strongbox opens no face unless set | item handler capability with per-face modes; 10,000-step stress test in game tests, manual matrix in compat-report (#28) |
| KubeJS | MediciEvents.purchase/mint/transfer/ticket/merchantWishes (cancellable), the MediciDecree binding (read the supply, burn coins for pack sinks), the medici:minting recipe schema; examples: claim charters, waystone tolls, a quest shop, an exchange |
compat/kubejs (kubejs.plugins.txt), NeoForge events in api/MediciEvent, schema in data/medici/kubejs/recipe_schema; modpack-devs; game tests run a real script and every example |
| MineColonies | tavern visitors may ask for groats (common) or ducats (rare) as their recruitment price, next to MineColonies' own food and goods; the coins are spent out of circulation | data only: data/minecolonies/colony/recruitment_items/medici_*.json (ignored without MineColonies) |
| Chipped, Rechiseled | the building set's variants cycle in Chipped's workbenches and chisel, and in Rechiseled's chisel (with slabs and stairs) | data only: chipped:workbench recipe over item tags medici:chisel/<group> (needs Chipped), data/medici/chiseling_recipes/ |
| Domum Ornamentum | our full stone, plaster, marble, brick, wood and roof blocks are materials in the architect's cutter; roof tiles and lead sheet are shingle materials | block tags domum_ornamentum:default, domum_ornamentum:shingles_roof |
| Fusion, CTM | connected textures for Istrian ashlar, the five polished marbles and leaded glass; without either, the plain textures tile | Fusion: model modifiers and *_connected models in the built-in pack resourcepacks/medici_fusion, added only when Fusion is installed (compat/FusionPack), plus the 5-piece textures; CTM: ctm section in the base texture's .mcmeta + *_ctm sheets (tools/art/connected-textures.mjs) |
| FramedBlocks, Create copycats | every full Medici building block works as camouflage or copycat material | vanilla rules, nothing to add; no blacklist entries needed |
| Lootr | Lootr rolls the same loot tables per player, so every player finds their own coins and antique coins | global loot modifier medici:coins_in_chests |
| Plantations | the Dealer, contracts, the Dead Drop and shop customers pay in Medici coins from the street purse (plantations:street), funded by the decree's street share; coins they take in go back to that purse, sinks are burned through the ledger. No money is made from nothing (ECONOMY §2) |
Plantations calls de.benkl.medici.api.MediciTreasury (compiled against medici-<version>-api.jar), code on Plantations' side |
API notes
- Curios 9.5.1:
CuriosApi.getCuriosInventory(player).findCurios(predicate); slots are data (beltassigned to players). - Jade 15.10:
@WailaPlugin,IBlockComponentProvider(client) +IServerDataProvider<BlockAccessor>(server data). - JEI 19.70:
IRecipeCategorywithgetWidth/getHeight(no background), recipes from the client recipe manager. - FTB Teams 2101.1:
FTBTeamsAPI.api().getManager().getTeamForPlayerID(uuid), party teams only. - Create 6.0.10: a press over a depot is driven by the depot's
TransportedItemStackHandlerBehaviourasking the press'sBeltProcessingBehaviour, which needs acreate:pressingrecipe. The striking block instead startsMechanicalPressBlockEntity.getPressingBehaviour().start(Mode.BELT)itself and strikes whenrunningTicksreachesCYCLE / 2(the head is down). Create sends its sync packets to every player, which mock game-test players can't receive, so Create tests run on their own (-PwithCompat, namespacemedici_compat). - SecurityCraft 1.10.2.1:
ReinforcedDoorBlock.neighborChangedopens only ifBlockUtils.hasActiveSCBlockNextTo, which asks everyIDoorActivatorregistered through IMCregisterDoorActivator(SecurityCraftAPI). An activator whose block entity isn'tIOwnablecounts for any door owner. - MineColonies 1.1.1406 (spike #54): visitors are
IVisitorDatacitizens spawned by the colony'sVisitorManager; their recruitment price comes fromdata/<ns>/colony/recruitment_items/*.json(item,rarity, read byRecruitmentItemsListener), and special visitors fromdata/<ns>/visitors/*.json. There's no public hook to make an outside entity a tavern visitor, so the Merchant stays at Medici's trading house; a Medici visitor JSON could add a named Venetian visitor, but visitors become citizens, not traders. A Venetian style pack would be Structurize blueprints (blueprints/<pack>/pack.json+.blueprintfiles made in game with the scan tool): a build job for later, not code. Coins MineColonies consumes aren't seen by the mint ledger, so the decree counts them as still in circulation and mints a little less; that errs on the safe side. - CC:Tweaked 1.120:
PeripheralCapability.get()block capability;IComputerAccess.queueEventon attached computers.
The Arts (concept §4.9)
| mod | what you get | how |
|---|---|---|
| Curios | carnival masks in the head slot, drawn over the helmet | data/medici/curios/entities/medici.json (head slot), item tag curios:head ← #medici:carnival_masks, compat/curios/CuriosArts* (ICurioRenderer) |
| Jade | studio easel: the commission, for whom, hours left; busts/statues: sitter and sculptor; fresco tiles: title; shop signs: the shop below; portraits and illuminated maps: motif, sitters, signature | compat/jade/ArtsJade |
| JEI | info pages for the studio easel, the pigments and commissioned art | compat/jei/ArtsJei |
| FTB Teams | team mates in the studio can be painted (team mate or group portrait); a crest belongs to the house | houses (econ/Houses) |
| FTB Chunks (any claim mod) | a colossus is only built where the patron may place blocks: the corners and centre of its footprint go through BlockEvent.EntityPlaceEvent first |
arts/ColossusContractItem.mayBuild |
| KubeJS | de.benkl.medici.arts.CommissionEvent (cancellable): change the price, swap the catalogue (pools) or refuse; bind it with NativeEvents.onEvent(...) until a MediciEvents.commission binding exists |
NeoForge event bus |
| Mekanism, Create | any c:dusts/lapis (enrichment, crushing) makes ultramarine |
recipe medici:ultramarine_from_dust |
| Cosmetic Armor Reworked | nothing extra needed: masks are helmets, which its cosmetic helmet slot takes | none |
API notes (Minecraft 1.21.1 / NeoForge 21.1.265, read from the decompiled sources; details in ADR 004):
PaintingVariant(width, height, assetId), registryminecraft:painting_variant, 1..16 per side; only variants in#minecraft:placeableare picked byPainting.create;HangingEntityItemappliesentity_data(id+variant).Painting.dropItemdropsItems.PAINTINGwithout the variant →mixin/PaintingMixinformedici:variants.BannerPattern(assetId, translationKey), registryminecraft:banner_pattern; textures intextures/entity/banner/andentity/shield/(the atlases take every namespace);BannerPatternItem(TagKey<BannerPattern>)for the loom.ResolvableProfile(GameProfile)keeps the signedtexturesproperty;SkinManager.getOrLoad(GameProfile)on the client.- NeoForge:
IEntityWithComplexSpawn,IItemExtension.getArmorTexture(stack, entity, slot, layer, inner),ModelEvent.ModifyBakingResult+BakedModelWrapper+ModelData,QuadBakingVertexConsumer,RenderNameTagEvent.setCanRender(TriState). - Curios 9.5.1:
CuriosRendererRegistry.register(item, () -> renderer),ICurioRenderer.followHeadRotations.
