Medici Download v1.2.1
The ledger · docs

Integrations

What Medici does with each mod in All the Mods 10.

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 (belt assigned to players).
  • Jade 15.10: @WailaPlugin, IBlockComponentProvider (client) + IServerDataProvider<BlockAccessor> (server data).
  • JEI 19.70: IRecipeCategory with getWidth/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 TransportedItemStackHandlerBehaviour asking the press's BeltProcessingBehaviour, which needs a create:pressing recipe. The striking block instead starts MechanicalPressBlockEntity.getPressingBehaviour().start(Mode.BELT) itself and strikes when runningTicks reaches CYCLE / 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, namespace medici_compat).
  • SecurityCraft 1.10.2.1: ReinforcedDoorBlock.neighborChanged opens only if BlockUtils.hasActiveSCBlockNextTo, which asks every IDoorActivator registered through IMC registerDoorActivator (SecurityCraftAPI). An activator whose block entity isn't IOwnable counts for any door owner.
  • MineColonies 1.1.1406 (spike #54): visitors are IVisitorData citizens spawned by the colony's VisitorManager; their recruitment price comes from data/<ns>/colony/recruitment_items/*.json (item, rarity, read by RecruitmentItemsListener), and special visitors from data/<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 + .blueprint files 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.queueEvent on 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), registry minecraft:painting_variant, 1..16 per side; only variants in #minecraft:placeable are picked by Painting.create; HangingEntityItem applies entity_data (id + variant).
  • Painting.dropItem drops Items.PAINTING without the variant → mixin/PaintingMixin for medici: variants.
  • BannerPattern(assetId, translationKey), registry minecraft:banner_pattern; textures in textures/entity/banner/ and entity/shield/ (the atlases take every namespace); BannerPatternItem(TagKey<BannerPattern>) for the loom.
  • ResolvableProfile(GameProfile) keeps the signed textures property; 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.