Skip to content

Declare Duct

unfamily edited this page Aug 11, 2026 · 1 revision

Declare Duct

Type: another_dynamics:declare_duct
Path: data/<namespace>/load/**/*.json
Reload: /reload

Defines a logical duct id: transport kinds, batch/rate/speed, filter bank sizes, module slots, rendering, and feature restrictions. Creative stacks use the shared duct item + logical-id component; you do not register a new block class from datapack alone (builtin items already cover shipped types).

Minimal example

{
  "type": "another_dynamics:declare_duct",
  "id": "mypack:fast_item_duct",
  "name": "duct.mypack.fast_item_duct",
  "put_in_creative_menu": true,
  "module_slots": 1,
  "can_transport": [
    {
      "dec": "item",
      "batch": { "default": 64, "max": -1 },
      "rate": { "default": 5, "min": 1 },
      "speed": { "default": 5, "min": 2 },
      "filter": {
        "deny": 8,
        "allow": 8,
        "deny_hybrid": 4,
        "allow_hybrid": 4
      }
    }
  ],
  "connect_with_compatbile": true,
  "disabled_features": [],
  "rendering": {
    "always_opaque": false,
    "default_texture": "another_dynamics:block/duct/item/item_duct_0_light",
    "model_default": "another_dynamics:block/simple_duct_default",
    "model_line": "another_dynamics:block/simple_duct_line"
  }
}

Top-level fields

Field Required Description
type yes another_dynamics:declare_duct
id yes Logical duct id (namespace:path)
name no Lang key for display
put_in_creative_menu no Default false if omitted by loader rules; builtin files set true
sound no e.g. metallic
module_slots no Face module capacity (integer ≥ 0)
can_transport yes Array of transport entries (see below)
connect_with_compatbile no Typo alias kept; whether to connect with compatible networks
disabled_features no Feature keys to disable (also alias disabled_feathures)
forbidden_features no Hard-forbid keys (same vocabulary as disabled)
module_features no Reserved / unused in current balance packs
restrictions no Optional object wrapping feature fields instead of root
rendering no Textures / models / always_opaque
neoforge:conditions no Standard NeoForge load conditions (e.g. mod_loaded)

can_transport[]

Each entry needs dec plus kind-specific stats.

item / fluid / mek_gas

Field Description
batch.default / batch.max Transfer quantity; max: -1 = uncapped
rate.default / rate.min Action interval (ticks); lower = faster
speed.default / speed.min Travel time along ducts; lower = faster
filter.allow / deny / allow_hybrid / deny_hybrid Base filter line counts
move_radioactive (mek_gas only) allow radioactive chemicals

forge_energy

Field Description
extract Default extract amount
transfer Max transfer
ray_color Optional hex color for energy ray visuals

mek_heat

Field Description
insulation Heat moved per action

If Mekanism chemical/heat APIs are unavailable or gated off (see Tags and Compatibility), mek_gas / mek_heat entries are skipped at load with a warning.

Feature keys (disabled_features / forbidden_features)

Keys are lowercased by the loader. Unknown keys log a warning.

Special

Key Effect
special:channel Disables channel / multi-lane controls
special:modules Disables module slots UI/behavior (special:upgrades is accepted as alias)

Filter syntax families

Key Blocks lines starting with
filter:item exact id / -id style
filter:tag #
filter:modid @
filter:nbt ?
filter:predefined & macros
filter:remote_node remote destination binding

Modes / routing / lists

Generated patterns (see DuctFeatureKeys):

  • mode:<nodemode> — e.g. mode:extraction, mode:retrieving
  • routing:nearest | farthest | middlest | round_robin | random
  • list:<context>:allow | deny | precedence
    Context examples: list:extraction:allow, list:extraction_filtering:extractor:deny, list:retrieving_extraction:retriever:precedence

Use these to strip modes or list editing from a duct type without changing Java.

Builtin logical ids (shipped)

Id Notes
another_dynamics:item_duct Items
another_dynamics:fluid_duct Fluids
another_dynamics:flux_duct FE
another_dynamics:gas_duct Mek gas + neoforge:mod_loaded mekanism
another_dynamics:heat_duct Heat insulation 10; module_slots: 1; Mek condition
another_dynamics:universal_duct All kinds in one definition

Project ducts are a separate block (not a declare_duct logical type for conversion targets).

Pack tips

  • Override balance by shipping replacement JSON with the same id and higher datapack priority, or add new ids and wire recipes/items yourself.
  • Extra module slots or alternate tiers need both datapack definitions and matching registered items/recipes.
  • Prefer disabled_features over forking Java for simple pack constraints.